diff --git a/.github/workflows/spec-check.yml b/.github/workflows/spec-check.yml index ecbc247..e585a67 100644 --- a/.github/workflows/spec-check.yml +++ b/.github/workflows/spec-check.yml @@ -21,7 +21,7 @@ jobs: - name: Download latest OpenAPI spec from monorepo run: | - gh api repos/devhelmhq/mono/contents/docs/openapi/monitoring-api.yaml \ + gh api repos/devhelmhq/mono/contents/docs/openapi/monitoring-api.json \ -H "Accept: application/vnd.github.raw+json" \ -o docs/openapi/monitoring-api.json env: diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index d3dfb3f..97856bf 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -183,6 +183,86 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, @@ -212,17 +292,97 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}": { - "put": { + "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", @@ -234,16 +394,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertChannelRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -254,15 +404,95 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": { + "put": { "tags": [ "Alert Channels" ], - "summary": "Soft-delete an alert channel and return affected policy summary", - "operationId": "delete_10", + "summary": "Update an alert channel's name and re-encrypt config", + "operationId": "update_14", "parameters": [ { "name": "id", @@ -274,27 +504,115 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertChannelRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/DeleteChannelResult" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}/deliveries": { - "get": { + }, + "delete": { "tags": [ "Alert Channels" ], - "summary": "List delivery history for an alert channel", - "operationId": "listDeliveries_1", + "summary": "Soft-delete an alert channel and return affected policy summary", + "operationId": "delete_10", "parameters": [ { "name": "id", @@ -312,70 +630,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" + "$ref": "#/components/schemas/DeleteChannelResult" } } } - } - } - } - }, - "/api/v1/alert-channels/{id}/test": { - "post": { - "tags": [ - "Alert Channels" - ], - "summary": "Test a saved alert channel's connectivity", - "operationId": "test_2", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$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" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$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" } } } @@ -383,14 +718,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/attempts": { + "/api/v1/alert-channels/{id}/deliveries": { "get": { "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": "List delivery history for an alert channel", + "operationId": "listDeliveries_1", "parameters": [ { "name": "id", @@ -408,7 +742,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + "$ref": "#/components/schemas/TableValueResultAlertDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -416,14 +830,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", @@ -441,122 +854,198 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } - } - } - } - }, - "/api/v1/api-keys": { - "get": { - "tags": [ - "API Keys" - ], - "summary": "List API keys", - "operationId": "list_13", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultApiKeyDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ - "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" } } } - } - } - } - }, - "/api/v1/api-keys/{id}": { - "delete": { - "tags": [ - "API Keys" - ], - "summary": "Delete API key", - "operationId": "delete_11", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - }, - "patch": { - "tags": [ - "API Keys" - ], - "summary": "Update API key", - "operationId": "update_15", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateApiKeyRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$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" } } } @@ -564,21 +1053,22 @@ } } }, - "/api/v1/api-keys/{id}/regenerate": { - "post": { + "/api/v1/alert-deliveries/{id}/attempts": { + "get": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Regenerate API key", - "operationId": "regenerate", + "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" } } ], @@ -588,7 +1078,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -596,21 +1166,22 @@ } } }, - "/api/v1/api-keys/{id}/revoke": { + "/api/v1/alert-deliveries/{id}/retry": { "post": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Revoke API key", - "operationId": "revoke_1", + "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" } } ], @@ -620,93 +1191,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" } } } - } - } - } - }, - "/api/v1/audit-log": { - "get": { - "tags": [ - "Audit Log" - ], - "summary": "List audit events for the current organization", - "operationId": "list_19", - "parameters": [ - { - "name": "action", - "in": "query", - "required": false, - "schema": { - "type": "string" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "actorId", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "resourceType", - "in": "query", - "required": false, - "schema": { - "type": "string" + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultAuditEventDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -714,178 +1279,100 @@ } } }, - "/api/v1/auth/me": { + "/api/v1/api-keys": { "get": { "tags": [ - "API Auth" + "API Keys" ], - "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", + "summary": "List API keys", + "operationId": "list_13", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + "$ref": "#/components/schemas/TableValueResultApiKeyDto" } } } - } - } - } - }, - "/api/v1/categories": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List categories with service counts", - "operationId": "listCategories", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultCategoryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/dashboard/overview": { - "get": { - "tags": [ - "Dashboard" - ], - "summary": "Dashboard overview", - "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", - "operationId": "overview", - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/deploy/lock": { - "get": { - "tags": [ - "Deploy Lock" - ], - "summary": "Get current deploy lock", - "description": "Returns the active deploy lock for the current workspace, if any.", - "operationId": "current", - "responses": { - "200": { - "description": "OK", + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "post": { - "tags": [ - "Deploy Lock" - ], - "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" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/deploy/lock/{lockId}": { - "delete": { - "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" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/deploy/lock/force": { - "delete": { - "tags": [ - "Deploy Lock" - ], - "summary": "Force-release deploy lock", - "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", - "operationId": "forceRelease", - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/environments": { - "get": { - "tags": [ - "Environments" - ], - "summary": "List environments", - "operationId": "list_12", - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -894,15 +1381,15 @@ }, "post": { "tags": [ - "Environments" + "API Keys" ], - "summary": "Create environment", - "operationId": "create_13", + "summary": "Create API key", + "operationId": "create_14", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateEnvironmentRequest" + "$ref": "#/components/schemas/CreateApiKeyRequest" } } }, @@ -914,7 +1401,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -922,148 +1489,124 @@ } } }, - "/api/v1/environments/{slug}": { - "get": { + "/api/v1/api-keys/{id}": { + "delete": { "tags": [ - "Environments" + "API Keys" ], - "summary": "Get environment by slug", - "operationId": "get_7", + "summary": "Delete API key", + "operationId": "delete_11", "parameters": [ { - "name": "slug", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "put": { - "tags": [ - "Environments" - ], - "summary": "Update environment", - "operationId": "update_13", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEnvironmentRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Environments" - ], - "summary": "Delete environment", - "operationId": "delete_9", - "parameters": [ - { - "name": "slug", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/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" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } } } }, - "post": { + "patch": { "tags": [ - "Heartbeat" + "API Keys" ], - "summary": "Record a heartbeat ping (POST)", - "description": "Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.", - "operationId": "pingPost", + "summary": "Update API key", + "operationId": "update_15", "parameters": [ { - "name": "token", + "name": "id", "in": "path", - "description": "Ping endpoint token for the heartbeat monitor", "required": true, "schema": { - "type": "string" + "type": "integer", + "format": "int32" } } ], @@ -1071,20 +1614,11 @@ "content": { "application/json": { "schema": { - "type": "string" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - }, - "*/*": { - "schema": { - "type": "string" + "$ref": "#/components/schemas/UpdateApiKeyRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -1092,102 +1626,87 @@ "content": { "*/*": { "schema": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } - } - } - } - }, - "/api/v1/incidents": { - "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" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "post": { - "tags": [ - "Incidents" - ], - "summary": "Create a manual incident", - "operationId": "create_12", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateManualIncidentRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/incidents/{id}": { - "get": { - "tags": [ - "Incidents" - ], - "summary": "Get incident details including update timeline", - "operationId": "get_10", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1195,154 +1714,111 @@ } } }, - "/api/v1/incidents/{id}/resolve": { + "/api/v1/api-keys/{id}/regenerate": { "post": { "tags": [ - "Incidents" + "API Keys" ], - "summary": "Resolve an incident", - "operationId": "resolve", + "summary": "Regenerate API key", + "operationId": "regenerate", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } - } - } - } - }, - "/api/v1/incidents/{id}/updates": { - "post": { - "tags": [ - "Incidents" - ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/integrations": { - "get": { - "tags": [ - "Integrations" - ], - "summary": "List all supported integration types", - "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", - "operationId": "list_18", - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/invites": { - "get": { - "tags": [ - "Invites" - ], - "summary": "List invites", - "operationId": "list_10", - "responses": { - "200": { - "description": "OK", + }, + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultInviteDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "post": { - "tags": [ - "Invites" - ], - "summary": "Create invite", - "operationId": "create_11", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1350,16 +1826,16 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { + "/api/v1/api-keys/{id}/revoke": { "post": { "tags": [ - "Invites" + "API Keys" ], - "summary": "Resend invite", - "operationId": "resend", + "summary": "Revoke API key", + "operationId": "revoke_1", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { @@ -1374,7 +1850,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1382,57 +1938,75 @@ } } }, - "/api/v1/invites/{inviteId}/revoke": { - "post": { + "/api/v1/audit-log": { + "get": { "tags": [ - "Invites" + "Audit Log" ], - "summary": "Revoke invite", - "operationId": "revoke", + "summary": "List audit events for the current organization", + "operationId": "list_19", "parameters": [ { - "name": "inviteId", - "in": "path", - "required": true, + "name": "action", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "required": false, "schema": { "type": "integer", "format": "int32" } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/maintenance-windows": { - "get": { - "tags": [ - "Maintenance Windows" - ], - "summary": "List maintenance windows for the authenticated org", - "description": "Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).", - "operationId": "list_9", - "parameters": [ + }, { - "name": "monitorId", + "name": "resourceType", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", "in": "query", - "description": "Filter by monitor UUID", "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date-time" } }, { - "name": "filter", + "name": "to", "in": "query", - "description": "Filter by status: 'active' or 'upcoming'", "required": false, "schema": { - "type": "string" + "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 } } ], @@ -1442,37 +2016,11687 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "$ref": "#/components/schemas/TableValueResultAuditEventDto" } } } - } - } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/auth/me": { + "get": { + "tags": [ + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/categories": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "List categories with service counts", + "operationId": "listCategories", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultCategoryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/dashboard/overview": { + "get": { + "tags": [ + "Dashboard" + ], + "summary": "Dashboard overview", + "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", + "operationId": "overview", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDashboardOverviewDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/deploy/lock": { + "get": { + "tags": [ + "Deploy Lock" + ], + "summary": "Get current deploy lock", + "description": "Returns the active deploy lock for the current workspace, if any.", + "operationId": "current", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Deploy Lock" + ], + "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" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/deploy/lock/{lockId}": { + "delete": { + "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" + } + } + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/deploy/lock/force": { + "delete": { + "tags": [ + "Deploy Lock" + ], + "summary": "Force-release deploy lock", + "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", + "operationId": "forceRelease", + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List environments", + "operationId": "list_12", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Environments" + ], + "summary": "Create environment", + "operationId": "create_13", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEnvironmentRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/environments/{slug}": { + "get": { + "tags": [ + "Environments" + ], + "summary": "Get environment by slug", + "operationId": "get_7", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Environments" + ], + "summary": "Update environment", + "operationId": "update_13", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEnvironmentRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseEnvironmentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Environments" + ], + "summary": "Delete environment", + "operationId": "delete_9", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Heartbeat" + ], + "summary": "Record a heartbeat ping (POST)", + "description": "Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.", + "operationId": "pingPost", + "parameters": [ + { + "name": "token", + "in": "path", + "description": "Ping endpoint token for the heartbeat monitor", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + }, + "*/*": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/HeartbeatPingResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/incidents": { + "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" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Incidents" + ], + "summary": "Create a manual incident", + "operationId": "create_12", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateManualIncidentRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/incidents/{id}": { + "get": { + "tags": [ + "Incidents" + ], + "summary": "Get incident details including update timeline", + "operationId": "get_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/incidents/{id}/resolve": { + "post": { + "tags": [ + "Incidents" + ], + "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/SingleValueResponseIncidentDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/incidents/{id}/updates": { + "post": { + "tags": [ + "Incidents" + ], + "summary": "Add an update to an incident (optionally change status)", + "operationId": "addUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/integrations": { + "get": { + "tags": [ + "Integrations" + ], + "summary": "List all supported integration types", + "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", + "operationId": "list_18", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultIntegrationDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/invites": { + "get": { + "tags": [ + "Invites" + ], + "summary": "List invites", + "operationId": "list_10", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultInviteDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Invites" + ], + "summary": "Create invite", + "operationId": "create_11", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateInviteRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseInviteDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/invites/{inviteId}/resend": { + "post": { + "tags": [ + "Invites" + ], + "summary": "Resend invite", + "operationId": "resend", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseInviteDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/invites/{inviteId}/revoke": { + "post": { + "tags": [ + "Invites" + ], + "summary": "Revoke invite", + "operationId": "revoke", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/maintenance-windows": { + "get": { + "tags": [ + "Maintenance Windows" + ], + "summary": "List maintenance windows for the authenticated org", + "description": "Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).", + "operationId": "list_9", + "parameters": [ + { + "name": "monitorId", + "in": "query", + "description": "Filter by monitor UUID", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Maintenance Windows" + ], + "summary": "Create a maintenance window", + "description": "Creates a new maintenance window. Set monitorId to null to create an org-wide window that suppresses alerts for all monitors.", + "operationId": "create_10", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMaintenanceWindowRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/maintenance-windows/{id}": { + "get": { + "tags": [ + "Maintenance Windows" + ], + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "put": { + "tags": [ + "Maintenance Windows" + ], + "summary": "Update a maintenance window", + "operationId": "update_12", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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": [ + "Maintenance Windows" + ], + "summary": "Delete a maintenance window", + "operationId": "delete_8", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/members": { + "get": { + "tags": [ + "Members" + ], + "summary": "List organization members", + "operationId": "list_17", + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/monitors": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "List monitors for the authenticated org", + "operationId": "list_8", + "parameters": [ + { + "name": "enabled", + "in": "query", + "description": "Filter by enabled state", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT" + ] + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical)", + "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": "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "post": { + "tags": [ + "Monitors" + ], + "summary": "Create a new monitor", + "operationId": "create_9", + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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": "Soft-delete a monitor", + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/monitors/{id}/pause": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Pause a monitor (set enabled=false)", + "operationId": "pause", + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "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" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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" + } + } + } + }, + "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" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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 monitor (set enabled=true)", + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test.", + "operationId": "testExisting", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}/uptime": { + "get": { + "tags": [ + "Check Results" + ], + "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.", + "operationId": "getUptime", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "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", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/UptimeDto" + } + } + } + }, + "400": { + "description": "Invalid window parameter", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Monitor does not belong to the caller's org", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + } + } + } + }, + "404": { + "description": "Monitor not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + } + } + } + }, + "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/monitors/{id}/versions": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "List version history for a monitor", + "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", + "operationId": "listVersions", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}/versions/{version}": { + "get": { + "tags": [ + "Monitors" + ], + "summary": "Get a specific version snapshot for a monitor", + "description": "Returns the full monitor config snapshot captured at the given version number.", + "operationId": "getVersion", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{monitorId}/alert-channels": { + "put": { + "tags": [ + "Monitor Alert Channels" + ], + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetAlertChannelsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseListUUID" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{monitorId}/assertions": { + "post": { + "tags": [ + "Monitor Assertions" + ], + "summary": "Add an assertion to a monitor", + "operationId": "add", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssertionRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{monitorId}/assertions/{assertionId}": { + "put": { + "tags": [ + "Monitor Assertions" + ], + "summary": "Update an assertion on a monitor", + "operationId": "update_10", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssertionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Monitor Assertions" + ], + "summary": "Remove an assertion from a monitor", + "operationId": "remove_1", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/monitors/{monitorId}/auth": { + "put": { + "tags": [ + "Monitor Auth" + ], + "summary": "Update authentication config for a monitor", + "operationId": "update_9", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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 Auth" + ], + "summary": "Set authentication config for a monitor", + "operationId": "set", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Monitor Auth" + ], + "summary": "Remove authentication config from a monitor", + "operationId": "remove", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{monitorId}/policy": { + "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" + } + } + ], + "responses": { + "200": { + "description": "Policy found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/IncidentPolicyDto" + } + } + } + }, + "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": "Monitor or policy not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "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" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Policy updated", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/IncidentPolicyDto" + } + } + } + }, + "400": { + "description": "Validation error in JSONB shape", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + } + } + } + }, + "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": "Monitor or policy not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/bulk": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", + "operationId": "bulkAction", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkMonitorActionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/test": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Ad-hoc monitor test", + "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers.", + "operationId": "testAdHoc", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorTestRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-dispatches": { + "get": { + "tags": [ + "Notification Dispatches" + ], + "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": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-dispatches/{id}": { + "get": { + "tags": [ + "Notification Dispatches" + ], + "summary": "Get a single dispatch with full escalation and delivery history", + "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", + "operationId": "getById_3", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { + "tags": [ + "Notification Dispatches" + ], + "summary": "Acknowledge a notification dispatch", + "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", + "operationId": "acknowledge", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-policies": { + "get": { + "tags": [ + "Notification Policies" + ], + "summary": "List all notification policies for the authenticated org", + "operationId": "list_7", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Notification Policies" + ], + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_8", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-policies/{id}": { + "get": { + "tags": [ + "Notification Policies" + ], + "summary": "Get a notification policy by ID", + "operationId": "getById_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Notification Policies" + ], + "summary": "Update a notification policy", + "operationId": "update_7", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-policies/{id}/dispatches": { + "get": { + "tags": [ + "Notification Policies" + ], + "summary": "List all dispatches (firing history) for a notification policy", + "operationId": "listDispatches", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/notification-policies/{id}/test": { + "post": { + "tags": [ + "Notification Policies" + ], + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestNotificationPolicyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/notifications": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "List notifications for the current user", + "operationId": "list_16", + "parameters": [ + { + "name": "unreadOnly", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultNotificationDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/notifications/{id}/read": { + "put": { + "tags": [ + "Notifications" + ], + "summary": "Mark a notification as read", + "operationId": "markRead", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/notifications/unread-count": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "Get unread notification count", + "operationId": "unreadCount", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseLong" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/org": { + "get": { + "tags": [ + "Organizations" + ], + "summary": "Get the current organization", + "operationId": "get_4", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Organizations" + ], + "summary": "Update the current organization", + "operationId": "update_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups": { + "get": { + "tags": [ + "Resource Groups" + ], + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_6", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Resource Groups" + ], + "summary": "Create a new resource group", + "operationId": "create_7", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateResourceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups/{id}": { + "get": { + "tags": [ + "Resource Groups" + ], + "summary": "Get a resource group by id with member statuses and inherited settings", + "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", + "operationId": "get_3", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "includeMetrics", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Resource Groups" + ], + "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Resource Groups" + ], + "summary": "Delete a resource group (cascades to member rows)", + "operationId": "delete_5", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups/{id}/health": { + "get": { + "tags": [ + "Resource Groups" + ], + "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", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups/{id}/members": { + "post": { + "tags": [ + "Resource Groups" + ], + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups/{id}/members/{memberId}": { + "delete": { + "tags": [ + "Resource Groups" + ], + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "memberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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 secrets", + "operationId": "list_5", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultSecretDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Secrets" + ], + "summary": "Create secret", + "operationId": "create_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSecretRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{key}": { + "put": { + "tags": [ + "Secrets" + ], + "summary": "Update secret", + "operationId": "update_4", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseSecretDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Secrets" + ], + "summary": "Delete secret", + "operationId": "delete_4", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/service-subscriptions": { + "get": { + "tags": [ + "Service Subscriptions" + ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_15", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/service-subscriptions/{id}": { + "get": { + "tags": [ + "Service Subscriptions" + ], + "summary": "Get a subscription by its ID", + "operationId": "get_10", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": [ + "Service Subscriptions" + ], + "summary": "Remove a subscription by its ID", + "description": "Removes a specific subscription (whole-service or component-level). 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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/service-subscriptions/{id}/alert-sensitivity": { + "patch": { + "tags": [ + "Service Subscriptions" + ], + "summary": "Update alert sensitivity for a subscription", + "description": "Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents).", + "operationId": "updateAlertSensitivity", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/service-subscriptions/{slug}": { "post": { "tags": [ - "Maintenance Windows" + "Service Subscriptions" + ], + "summary": "Subscribe to a service or a component of a service", + "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. Free tier: max 10 subscriptions. Paid tier: unlimited.", + "operationId": "subscribe_1", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceSubscribeRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/services": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "List all enabled services (cursor-paginated)", + "operationId": "listServices", + "parameters": [ + { + "name": "category", + "in": "query", + "description": "Filter by category (exact match)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Filter by current overall_status (exact match)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "published", + "in": "query", + "description": "Filter by published status for pSEO pages", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/services/{slugOrId}": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", + "operationId": "getService", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/services/{slugOrId}/components": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "List active components for a service with current status and inline uptime", + "operationId": "getComponents", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/services/{slugOrId}/components/{componentId}/uptime": { + "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", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "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": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/services/{slugOrId}/components/uptime": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "Batch daily uptime data for all leaf components", + "description": "Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. 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": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] + } + }, + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/services/{slugOrId}/days/{date}": { + "get": { + "tags": [ + "Status Data" ], - "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": "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": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "date", + "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", + "required": true, + "schema": { + "type": "string", + "format": "date" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/services/{slugOrId}/incidents": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + } + } + } + }, + "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" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$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" } } } @@ -1480,16 +13704,24 @@ } } }, - "/api/v1/maintenance-windows/{id}": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { "get": { "tags": [ - "Maintenance Windows" + "Status Data" ], - "summary": "Get a single maintenance window by ID", - "operationId": "getById_2", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { - "name": "id", + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -1504,91 +13736,109 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } - } - } - }, - "put": { - "tags": [ - "Maintenance Windows" - ], - "summary": "Update a maintenance window", - "operationId": "update_12", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Maintenance Windows" - ], - "summary": "Delete a maintenance window", - "operationId": "delete_8", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/members": { + "/api/v1/services/{slugOrId}/live-status": { "get": { "tags": [ - "Members" + "Status Data" ], - "summary": "List organization members", - "operationId": "list_17", + "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": "pageable", - "in": "query", + "name": "slugOrId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string" } } ], @@ -1598,191 +13848,251 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMemberDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } - } - } - } - }, - "/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" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/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" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } }, - "/api/v1/members/{userId}/status": { - "put": { + "/api/v1/services/{slugOrId}/maintenances": { + "get": { "tags": [ - "Members" + "Status Data" ], - "summary": "Change member status", - "operationId": "changeStatus", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { - "name": "userId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string" + } + }, + { + "name": "status", + "in": "query", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + } } } }, - "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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/monitors": { + "/api/v1/services/{slugOrId}/poll-results": { "get": { "tags": [ - "Monitors" + "Status Data" ], - "summary": "List monitors for the authenticated org", - "operationId": "list_8", + "summary": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { - "name": "enabled", - "in": "query", - "description": "Filter by enabled state", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "type", - "in": "query", - "description": "Filter by monitor type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT" - ] - } - }, - { - "name": "managedBy", - "in": "query", - "description": "Filter by managed-by source", - "required": false, - "schema": { - "type": "string", - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM" - ] - } - }, - { - "name": "tags", - "in": "query", - "description": "Filter by tag names, comma-separated (e.g. prod,critical)", - "required": false, + "name": "slugOrId", + "in": "path", + "required": true, "schema": { "type": "string" } }, { - "name": "search", + "name": "cursor", "in": "query", - "description": "Case-insensitive name search", + "description": "ISO 8601 timestamp cursor from a previous response", "required": false, "schema": { "type": "string" } }, { - "name": "environmentId", + "name": "limit", "in": "query", - "description": "Filter by environment ID", + "description": "Page size (1–100, default 50)", "required": false, "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -1792,153 +14102,122 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } - } - } - }, - "post": { - "tags": [ - "Monitors" - ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$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" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/SingleValueResponseMonitorDto" + "$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" + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/poll-summary": { + "get": { "tags": [ - "Monitors" + "Status Data" ], - "summary": "Soft-delete a monitor", - "operationId": "delete_7", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/monitors/{id}/pause": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Pause a monitor (set enabled=false)", - "operationId": "pause", - "parameters": [ + }, { - "name": "id", - "in": "path", - "required": true, + "name": "window", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d" + ] } } ], @@ -1948,7 +14227,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -1956,121 +14315,292 @@ } } }, - "/api/v1/monitors/{id}/results": { + "/api/v1/services/{slugOrId}/uptime": { "get": { "tags": [ - "Check Results" + "Status Data" ], - "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": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "from", + "name": "period", "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "description": "Time window", "required": false, "schema": { "type": "string", - "format": "date-time" + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] } }, { - "name": "to", + "name": "granularity", "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", + "description": "Bucket granularity", "required": false, "schema": { "type": "string", - "format": "date-time" + "enum": [ + "hourly", + "daily", + "monthly" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "BearerAuth": [] + } + ] + } + }, + "/api/v1/services/incidents": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", + "parameters": [ { - "name": "cursor", + "name": "from", "in": "query", - "description": "Opaque cursor from a previous response for pagination", + "description": "Earliest start date (ISO 8601 date)", "required": false, "schema": { - "type": "string" + "type": "string", + "format": "date" } }, { - "name": "limit", + "name": "status", "in": "query", - "description": "Maximum results per page (1–200)", + "description": "Filter: active (unresolved), resolved, or omit for all", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 + "type": "string", + "enum": [ + "active", + "resolved" + ] + } }, { - "name": "region", + "name": "category", "in": "query", - "description": "Filter by region (e.g. us-east)", + "description": "Filter by service category", "required": false, "schema": { "type": "string" } }, { - "name": "passed", + "name": "pageable", "in": "query", - "description": "Filter by pass/fail status", - "required": false, + "required": true, "schema": { - "type": "boolean" + "$ref": "#/components/schemas/Pageable" } } ], "responses": { "200": { - "description": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPage" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } }, "400": { - "description": "Invalid query parameters", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "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" + } + } + } + }, + "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" } } } @@ -2078,109 +14608,101 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { + "/api/v1/services/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" - ] - } - } + "Status Data" ], + "summary": "Global status summary across all services", + "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", + "operationId": "getGlobalStatusSummary", "responses": { "200": { - "description": "Results summary", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" } } } }, "400": { - "description": "Invalid chartWindow parameter", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } }, "403": { - "description": "Monitor does not belong to the caller's org", + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "404": { - "description": "Monitor not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/monitors/{id}/resume": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Resume a monitor (set enabled=true)", - "operationId": "resume", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2188,64 +14710,100 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { - "post": { + "/api/v1/status-pages": { + "get": { "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" - } - } + "Status Pages" ], + "summary": "List status pages for the workspace", + "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } - } - } - } - }, - "/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" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2254,104 +14812,107 @@ }, "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" - } - } + "Status Pages" ], + "summary": "Create a status page", + "operationId": "create_5", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/CreateStatusPageRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } - } - } - }, - "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" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/monitors/{id}/test": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Test an existing monitor", - "description": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test.", - "operationId": "testExisting", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$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" } } } @@ -2359,14 +14920,13 @@ } } }, - "/api/v1/monitors/{id}/uptime": { + "/api/v1/status-pages/{id}": { "get": { "tags": [ - "Check Results" + "Status Pages" ], - "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.", - "operationId": "getUptime", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", @@ -2376,160 +14936,110 @@ "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/SingleValueResponseStatusPageDto" } } } }, "400": { - "description": "Invalid window parameter", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "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" } } } - } - } - } - }, - "/api/v1/monitors/{id}/versions": { - "get": { - "tags": [ - "Monitors" - ], - "summary": "List version history for a monitor", - "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", - "operationId": "listVersions", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], - "responses": { - "200": { - "description": "OK", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/monitors/{id}/versions/{version}": { - "get": { - "tags": [ - "Monitors" - ], - "summary": "Get a specific version snapshot for a monitor", - "description": "Returns the full monitor config snapshot captured at the given version number.", - "operationId": "getVersion", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - } - }, - "/api/v1/monitors/{monitorId}/alert-channels": { + }, "put": { "tags": [ - "Monitor Alert Channels" + "Status Pages" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -2542,7 +15052,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" + "$ref": "#/components/schemas/UpdateStatusPageRequest" } } }, @@ -2554,100 +15064,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } - } - } - } - }, - "/api/v1/monitors/{monitorId}/assertions": { - "post": { - "tags": [ - "Monitor Assertions" - ], - "summary": "Add an assertion to a monitor", - "operationId": "add", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { - "tags": [ - "Monitor Assertions" - ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "assertionId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2656,22 +15153,13 @@ }, "delete": { "tags": [ - "Monitor Assertions" + "Status Pages" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "summary": "Delete a status page", + "operationId": "delete_3", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -2683,20 +15171,100 @@ "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/{monitorId}/auth": { - "put": { + "/api/v1/status-pages/{id}/components": { + "get": { "tags": [ - "Monitor Auth" + "Status Pages" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -2705,23 +15273,93 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -2730,13 +15368,13 @@ }, "post": { "tags": [ - "Monitor Auth" + "Status Pages" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Add a component to the status page", + "operationId": "createComponent", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -2749,7 +15387,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, @@ -2761,92 +15399,114 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } - } - } - }, - "delete": { - "tags": [ - "Monitor Auth" - ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", - "parameters": [ - { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/monitors/{monitorId}/policy": { - "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" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "Policy found", + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } }, "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" + } + } + } + }, + "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}/components/{componentId}": { "put": { "tags": [ - "Incident Policies" + "Status Pages" ], - "summary": "Update incident policy for a monitor", - "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", - "operationId": "update_8", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { - "name": "monitorId", + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "componentId", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -2858,7 +15518,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" } } }, @@ -2866,177 +15526,103 @@ }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } }, "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" } } } }, - "404": { - "description": "Monitor or policy not found", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/monitors/bulk": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Bulk action on monitors", - "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", - "operationId": "bulkAction", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" - } - } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/monitors/test": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Ad-hoc monitor test", - "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers.", - "operationId": "testAdHoc", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/notification-dispatches": { - "get": { - "tags": [ - "Notification Dispatches" - ], - "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": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/notification-dispatches/{id}": { - "get": { - "tags": [ - "Notification Dispatches" - ], - "summary": "Get a single dispatch with full escalation and delivery history", - "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", - "operationId": "getById_3", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - } - }, - "/api/v1/notification-dispatches/{id}/acknowledge": { - "post": { + }, + "delete": { "tags": [ - "Notification Dispatches" + "Status Pages" ], - "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": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { "name": "id", @@ -3046,65 +15632,97 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "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/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/notification-policies": { - "get": { - "tags": [ - "Notification Policies" - ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "post": { - "tags": [ - "Notification Policies" - ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$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" } } } @@ -3112,13 +15730,13 @@ } } }, - "/api/v1/notification-policies/{id}": { + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { "get": { "tags": [ - "Notification Policies" + "Status Pages" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "Get component uptime history (daily rollups)", + "operationId": "componentUptime_1", "parameters": [ { "name": "id", @@ -3128,6 +15746,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": { @@ -3136,19 +15773,101 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentUptimeDayDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}/components/reorder": { "put": { "tags": [ - "Notification Policies" + "Status Pages" ], - "summary": "Update a notification policy", - "operationId": "update_7", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { "name": "id", @@ -3164,56 +15883,106 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + "$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/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Notification Policies" - ], - "summary": "Delete a notification policy", - "operationId": "delete_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/notification-policies/{id}/dispatches": { + "/api/v1/status-pages/{id}/domains": { "get": { "tags": [ - "Notification Policies" + "Status Pages" ], - "summary": "List all dispatches (firing history) for a notification policy", - "operationId": "listDispatches", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { "name": "id", @@ -3231,21 +16000,99 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/notification-policies/{id}/test": { + }, "post": { "tags": [ - "Notification Policies" + "Status Pages" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -3261,71 +16108,99 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" + "$ref": "#/components/schemas/AddCustomDomainRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } - } - } - } - }, - "/api/v1/notifications": { - "get": { - "tags": [ - "Notifications" - ], - "summary": "List notifications for the current user", - "operationId": "list_16", - "parameters": [ - { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" + "$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" } } } @@ -3333,159 +16208,113 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ - "Notifications" + "Status Pages" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" + } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], "responses": { "204": { "description": "No Content" - } - } - } - }, - "/api/v1/notifications/read-all": { - "put": { - "tags": [ - "Notifications" - ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/notifications/unread-count": { - "get": { - "tags": [ - "Notifications" - ], - "summary": "Get unread notification count", - "operationId": "unreadCount", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/org": { - "get": { - "tags": [ - "Organizations" - ], - "summary": "Get the current organization", - "operationId": "get_4", - "responses": { - "200": { - "description": "OK", + }, + "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/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "put": { - "tags": [ - "Organizations" - ], - "summary": "Update the current organization", - "operationId": "update_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/resource-groups": { - "get": { - "tags": [ - "Resource Groups" - ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "post": { - "tags": [ - "Resource Groups" - ], - "summary": "Create a new resource group", - "operationId": "create_7", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3493,14 +16322,13 @@ } } }, - "/api/v1/resource-groups/{id}": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + "post": { "tags": [ - "Resource Groups" + "Status Pages" ], - "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": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { "name": "id", @@ -3512,12 +16340,12 @@ } }, { - "name": "includeMetrics", - "in": "query", - "required": false, + "name": "domainId", + "in": "path", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], @@ -3527,85 +16355,101 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } - } - } - }, - "put": { - "tags": [ - "Resource Groups" - ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Resource Groups" - ], - "summary": "Delete a resource group (cascades to member rows)", - "operationId": "delete_5", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/status-pages/{id}/groups": { "get": { "tags": [ - "Resource Groups" + "Status Pages" ], - "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": "List component groups with nested components", + "operationId": "listGroups", "parameters": [ { "name": "id", @@ -3623,21 +16467,99 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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/resource-groups/{id}/members": { + }, "post": { "tags": [ - "Resource Groups" + "Status Pages" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { "name": "id", @@ -3653,7 +16575,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" } } }, @@ -3665,7 +16587,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3673,13 +16675,13 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/status-pages/{id}/groups/{groupId}": { + "put": { "tags": [ - "Resource Groups" + "Status Pages" ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { "name": "id", @@ -3691,7 +16693,7 @@ } }, { - "name": "memberId", + "name": "groupId", "in": "path", "required": true, "schema": { @@ -3700,97 +16702,103 @@ } } ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/secrets": { - "get": { - "tags": [ - "Secrets" - ], - "summary": "List secrets", - "operationId": "list_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } - } - } - }, - "post": { - "tags": [ - "Secrets" - ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/secrets/{key}": { - "put": { - "tags": [ - "Secrets" - ], - "summary": "Update secret", - "operationId": "update_4", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3799,41 +16807,110 @@ }, "delete": { "tags": [ - "Secrets" + "Status Pages" ], - "summary": "Delete secret", - "operationId": "delete_4", + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", "parameters": [ { - "name": "key", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" + } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], "responses": { "204": { "description": "No Content" - } - } - } - }, - "/api/v1/service-subscriptions": { - "get": { - "tags": [ - "Service Subscriptions" - ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_15", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -3841,13 +16918,13 @@ } } }, - "/api/v1/service-subscriptions/{id}": { + "/api/v1/status-pages/{id}/incidents": { "get": { "tags": [ - "Service Subscriptions" + "Status Pages" ], - "summary": "Get a subscription by its ID", - "operationId": "get_9", + "summary": "List incidents for this status page (filterable by status, paginated)", + "operationId": "listIncidents", "parameters": [ { "name": "id", @@ -3857,6 +16934,31 @@ "type": "string", "format": "uuid" } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -3865,96 +16967,107 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } - } - } - }, - "delete": { - "tags": [ - "Service Subscriptions" - ], - "summary": "Remove a subscription by its ID", - "description": "Removes a specific subscription (whole-service or component-level). No-op if not found.", - "operationId": "unsubscribe_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { - "tags": [ - "Service Subscriptions" - ], - "summary": "Update alert sensitivity for a subscription", - "description": "Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents).", - "operationId": "updateAlertSensitivity", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$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/service-subscriptions/{slug}": { + }, "post": { "tags": [ - "Service Subscriptions" + "Status Pages" ], - "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. Free tier: max 10 subscriptions. Paid tier: unlimited.", - "operationId": "subscribe_1", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { - "name": "slug", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -3962,10 +17075,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" } } - } + }, + "required": true }, "responses": { "201": { @@ -3973,139 +17087,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } - } - } - } - }, - "/api/v1/services": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", - "parameters": [ - { - "name": "category", - "in": "query", - "description": "Filter by category (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by current overall_status (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "published", - "in": "query", - "description": "Filter by published status for pSEO pages", - "required": false, - "schema": { - "type": "boolean" - } }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 20)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 - } - } - ], - "responses": { - "200": { - "description": "OK", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", - "operationId": "getService", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/components": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List active components for a service with current status and inline uptime", - "operationId": "getComponents", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -4113,45 +17175,31 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "/api/v1/status-pages/{id}/incidents/{incidentId}": { "get": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "Get daily uptime data for a component", - "operationId": "getComponentUptime", + "summary": "Get incident details with timeline", + "operationId": "getIncident", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "componentId", + "name": "incidentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } } ], "responses": { @@ -4160,179 +17208,236 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/components/uptime": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "Batch daily uptime data for all leaf components", - "description": "Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request.", - "operationId": "getBatchComponentUptime", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/SingleValueResponseMapStringListComponentUptimeDayDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - } - }, - "/api/v1/services/{slugOrId}/days/{date}": { - "get": { + }, + "put": { "tags": [ - "Status Data" + "Status Pages" ], - "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": "Update an incident", + "operationId": "updateIncident", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "date", + "name": "incidentId", "in": "path", - "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "date" + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/incidents": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - } - }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "Delete an incident", + "operationId": "deleteIncident", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { @@ -4346,138 +17451,85 @@ } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/live-status": { - "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", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/maintenances": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } }, - { - "name": "status", - "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/{slugOrId}/poll-results": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -4485,44 +17537,113 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { + "post": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "summary": "Dismiss a draft incident (deletes it permanently)", + "operationId": "dismissIncident", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "window", - "in": "query", - "description": "Time window", - "required": false, + "name": "incidentId", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "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/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -4530,192 +17651,168 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ - "Status Data" + "Status Pages" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "period", - "in": "query", - "description": "Time window", - "required": false, "schema": { "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] + "format": "uuid" } }, { - "name": "granularity", - "in": "query", - "description": "Bucket granularity", - "required": false, + "name": "incidentId", + "in": "path", + "required": true, "schema": { "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } - } - }, - "security": [ - { - "BearerAuth": [] - } - ] - } - }, - "/api/v1/services/incidents": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", - "parameters": [ - { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "category", - "in": "query", - "description": "Filter by service category", - "required": false, - "schema": { - "type": "string" + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/services/summary": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "Global status summary across all services", - "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", - "operationId": "getGlobalStatusSummary", - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/status-pages": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "List status pages for the workspace", - "operationId": "list_4", - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } } } - }, + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { "post": { "tags": [ "Status Pages" ], - "summary": "Create a status page", - "operationId": "create_5", + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } }, @@ -4725,53 +17822,103 @@ "201": { "description": "Created", "content": { - "*/*": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/SingleValueResponseStatusPageDto" + "$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", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - }, + } + }, + "/api/v1/status-pages/{id}/layout/reorder": { "put": { "tags": [ "Status Pages" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", "parameters": [ { "name": "id", @@ -4787,56 +17934,106 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" + "$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/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Status Pages" - ], - "summary": "Delete a status page", - "operationId": "delete_3", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/status-pages/{id}/components": { + "/api/v1/status-pages/{id}/subscribers": { "get": { "tags": [ "Status Pages" ], - "summary": "List all components", - "operationId": "listComponents", + "summary": "List confirmed subscribers (paginated)", + "operationId": "listSubscribers", "parameters": [ { "name": "id", @@ -4846,6 +18043,14 @@ "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { @@ -4854,7 +18059,87 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" } } } @@ -4865,8 +18150,8 @@ "tags": [ "Status Pages" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "summary": "Add a subscriber (immediately confirmed, skips double opt-in)", + "operationId": "addSubscriber", "parameters": [ { "name": "id", @@ -4882,7 +18167,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" + "$ref": "#/components/schemas/AdminAddSubscriberRequest" } } }, @@ -4894,70 +18179,101 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { - "tags": [ - "Status Pages" - ], - "summary": "Update a component", - "operationId": "updateComponent", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } } } - }, + } + }, + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { "delete": { "tags": [ "Status Pages" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "summary": "Remove a subscriber", + "operationId": "removeSubscriber", "parameters": [ { "name": "id", @@ -4969,7 +18285,7 @@ } }, { - "name": "componentId", + "name": "subscriberId", "in": "path", "required": true, "schema": { @@ -4981,44 +18297,104 @@ "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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}/components/{componentId}/uptime": { + "/api/v1/tags": { "get": { "tags": [ - "Status Pages" + "Tags" ], - "summary": "Get component uptime history (daily rollups)", - "operationId": "componentUptime_1", + "summary": "List tags for the authenticated organization", + "operationId": "list_3", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "days", + "name": "pageable", "in": "query", - "required": false, + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 90 + "$ref": "#/components/schemas/Pageable" } } ], @@ -5028,56 +18404,210 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$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" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/status-pages/{id}/components/reorder": { - "put": { + }, + "post": { "tags": [ - "Status Pages" - ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Tags" ], + "summary": "Create a new tag", + "operationId": "create_4", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" + "$ref": "#/components/schemas/CreateTagRequest" } } }, "required": true }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/status-pages/{id}/domains": { + "/api/v1/tags/{id}": { "get": { "tags": [ - "Status Pages" - ], - "summary": "List custom domains", - "operationId": "listDomains", + "Tags" + ], + "summary": "Get a tag by ID", + "operationId": "getById", "parameters": [ { "name": "id", @@ -5095,19 +18625,99 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" } } } } } }, - "post": { + "put": { "tags": [ - "Status Pages" + "Tags" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "Update a tag's name and/or color", + "operationId": "update_2", "parameters": [ { "name": "id", @@ -5123,138 +18733,111 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" + "$ref": "#/components/schemas/UpdateTagRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseTagDto" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { - "tags": [ - "Status Pages" - ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "409": { + "description": "Conflict — the request collides with current resource state", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/groups": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "List component groups with nested components", - "operationId": "listGroups", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } } } }, - "post": { + "delete": { "tags": [ - "Status Pages" + "Tags" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "Delete a tag (cascades to all monitor associations)", + "operationId": "delete_2", "parameters": [ { "name": "id", @@ -5266,23 +18849,86 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -5290,123 +18936,116 @@ } } }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + "/api/v1/vaults/rotate": { + "post": { "tags": [ - "Status Pages" + "Vault" ], - "summary": "Update a component group", - "operationId": "updateGroup", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Rotate DEK", + "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", + "operationId": "rotateDek", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + } + } } }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Status Pages" - ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/status-pages/{id}/incidents": { + "/api/v1/webhooks": { "get": { "tags": [ - "Status Pages" + "Webhooks" ], - "summary": "List incidents for this status page (filterable by status, paginated)", - "operationId": "listIncidents", + "summary": "List webhook endpoints for the authenticated org", + "operationId": "list_2", "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - } - } - }, { "name": "pageable", "in": "query", @@ -5422,217 +19061,210 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" } } } - } - } - }, - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an 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": { + "post": { "tags": [ - "Status Pages" - ], - "summary": "Update an incident", - "operationId": "updateIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Webhooks" ], + "summary": "Register a new webhook endpoint", + "operationId": "create_3", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + "$ref": "#/components/schemas/CreateWebhookEndpointRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" } } } - } - } - }, - "delete": { - "tags": [ - "Status Pages" - ], - "summary": "Delete an incident", - "operationId": "deleteIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Dismiss a draft incident (deletes it permanently)", - "operationId": "dismissIncident", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/webhooks/{id}": { + "get": { "tags": [ - "Status Pages" + "Webhooks" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "Get a single webhook endpoint", + "operationId": "get_1", "parameters": [ { "name": "id", @@ -5642,98 +19274,107 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { - "tags": [ - "Status Pages" - ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "404": { + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/status-pages/{id}/layout/reorder": { + }, + "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" + } + } + } + } + } + }, "put": { "tags": [ - "Status Pages" + "Webhooks" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "Update a webhook endpoint", + "operationId": "update_1", "parameters": [ { "name": "id", @@ -5749,64 +19390,111 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" } } }, "required": true }, - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/status-pages/{id}/subscribers": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "List confirmed subscribers (paginated)", - "operationId": "listSubscribers", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" } } } } } }, - "post": { + "delete": { "tags": [ - "Status Pages" + "Webhooks" ], - "summary": "Add a subscriber (immediately confirmed, skips double opt-in)", - "operationId": "addSubscriber", + "summary": "Delete a webhook endpoint", + "operationId": "delete_1", "parameters": [ { "name": "id", @@ -5818,23 +19506,86 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -5842,13 +19593,13 @@ } } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/webhooks/{id}/deliveries": { + "get": { "tags": [ - "Status Pages" + "Webhooks" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "summary": "List recent deliveries for a webhook endpoint", + "operationId": "listDeliveries", "parameters": [ { "name": "id", @@ -5860,36 +19611,13 @@ } }, { - "name": "subscriberId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/tags": { - "get": { - "tags": [ - "Tags" - ], - "summary": "List tags for the authenticated organization", - "operationId": "list_3", - "parameters": [ - { - "name": "pageable", + "name": "limit", "in": "query", - "required": true, + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32", + "default": 20 } } ], @@ -5899,80 +19627,101 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" } } } - } - } - }, - "post": { - "tags": [ - "Tags" - ], - "summary": "Create a new tag", - "operationId": "create_4", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTagRequest" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/tags/{id}": { - "get": { - "tags": [ - "Tags" - ], - "summary": "Get a tag by ID", - "operationId": "getById", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/ErrorResponse" } } } } } - }, - "put": { + } + }, + "/api/v1/webhooks/{id}/test": { + "post": { "tags": [ - "Tags" + "Webhooks" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "Send a test delivery to a webhook endpoint", + "operationId": "test", "parameters": [ { "name": "id", @@ -5988,11 +19737,10 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" + "$ref": "#/components/schemas/TestWebhookEndpointRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -6000,52 +19748,189 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" } } } - } - } - }, - "delete": { - "tags": [ - "Tags" - ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" } } } }, - "/api/v1/vaults/rotate": { - "post": { + "/api/v1/webhooks/events": { + "get": { "tags": [ - "Vault" + "Webhooks" ], - "summary": "Rotate DEK", - "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", - "operationId": "rotateDek", + "summary": "List all available webhook event types", + "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", + "operationId": "listEvents", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + "$ref": "#/components/schemas/WebhookEventCatalogResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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" } } } @@ -6053,59 +19938,100 @@ } } }, - "/api/v1/webhooks": { + "/api/v1/webhooks/signing-secret": { "get": { "tags": [ "Webhooks" ], - "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", - "parameters": [ - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], + "summary": "Get signing secret metadata for the authenticated org", + "operationId": "getSigningSecretInfo", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" } } } - } - } - }, - "post": { - "tags": [ - "Webhooks" - ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "201": { - "description": "Created", + "500": { + "description": "Internal server error — see the message field for details", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6113,136 +20039,100 @@ } } }, - "/api/v1/webhooks/{id}": { - "get": { + "/api/v1/webhooks/signing-secret/rotate": { + "post": { "tags": [ "Webhooks" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "Generate or rotate the organization webhook signing secret", + "operationId": "rotateSigningSecret", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseString" } } } - } - } - }, - "put": { - "tags": [ - "Webhooks" - ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden — the actor lacks permission for this resource", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - }, - "delete": { - "tags": [ - "Webhooks" - ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "204": { - "description": "No Content" - } - } - } - }, - "/api/v1/webhooks/{id}/deliveries": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6250,135 +20140,110 @@ } } }, - "/api/v1/webhooks/{id}/test": { - "post": { + "/api/v1/workspaces": { + "get": { "tags": [ - "Webhooks" + "Workspaces" ], - "summary": "Send a test delivery to a webhook endpoint", - "operationId": "test", + "summary": "List workspaces", + "operationId": "list_1", "parameters": [ { - "name": "id", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "string", - "format": "uuid" + "$ref": "#/components/schemas/Pageable" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/TableValueResultWorkspaceDto" } } } - } - } - } - }, - "/api/v1/webhooks/events": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "List all available webhook event types", - "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", - "operationId": "listEvents", - "responses": { - "200": { - "description": "OK", + }, + "400": { + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/WebhookEventCatalogResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/webhooks/signing-secret": { - "get": { - "tags": [ - "Webhooks" - ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", - "responses": { - "200": { - "description": "OK", + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/webhooks/signing-secret/rotate": { - "post": { - "tags": [ - "Webhooks" - ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", - "responses": { - "200": { - "description": "OK", + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/SingleValueResponseString" + "$ref": "#/components/schemas/ErrorResponse" } } } - } - } - } - }, - "/api/v1/workspaces": { - "get": { - "tags": [ - "Workspaces" - ], - "summary": "List workspaces", - "operationId": "list_1", - "parameters": [ - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } } - } - ], - "responses": { - "200": { - "description": "OK", + }, + "503": { + "description": "Service unavailable — try again shortly", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -6411,6 +20276,86 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } @@ -6443,6 +20388,86 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, @@ -6483,6 +20508,86 @@ } } } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, @@ -6506,6 +20611,86 @@ "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", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } } @@ -6780,7 +20965,10 @@ "eventType", "id", "incidentId", - "status" + "status", + "stepNumber", + "fireCount", + "attemptCount" ], "type": "object", "properties": { @@ -6879,40 +21067,37 @@ }, "ApiKeyAuthConfig": { "required": [ + "type", "headerName" - ], - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" - }, - { - "type": "object", - "properties": { - "headerName": { - "minLength": 1, - "pattern": "^[A-Za-z0-9\\-_]+$", - "type": "string", - "description": "HTTP header name that carries the API key" - }, - "vaultSecretId": { - "type": "string", - "description": "Vault secret ID for the API key value", - "format": "uuid", - "nullable": true - } - }, - "required": [ - "headerName" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "api_key" ] + }, + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "HTTP header name that carries the API key" + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the API key value", + "format": "uuid", + "nullable": true } - ] + } }, "ApiKeyCreateResponse": { "required": [ "createdAt", "key", - "name" + "name", + "id" ], "type": "object", "properties": { @@ -6950,7 +21135,8 @@ "createdAt", "key", "name", - "updatedAt" + "updatedAt", + "id" ], "type": "object", "properties": { @@ -7000,69 +21186,11 @@ }, "description": "API key for programmatic access to the DevHelm API" }, - "AssertionConfig": { - "required": [ - "type" - ], - "type": "object", - "properties": { - "type": { - "type": "string" - } - }, - "description": "New assertion configuration (full replacement)", - "discriminator": { - "propertyName": "type", - "mapping": { - "status_code": "#/components/schemas/StatusCodeAssertion", - "response_time": "#/components/schemas/ResponseTimeAssertion", - "body_contains": "#/components/schemas/BodyContainsAssertion", - "json_path": "#/components/schemas/JsonPathAssertion", - "header_value": "#/components/schemas/HeaderValueAssertion", - "regex_body": "#/components/schemas/RegexBodyAssertion", - "dns_resolves": "#/components/schemas/DnsResolvesAssertion", - "dns_response_time": "#/components/schemas/DnsResponseTimeAssertion", - "dns_expected_ips": "#/components/schemas/DnsExpectedIpsAssertion", - "dns_expected_cname": "#/components/schemas/DnsExpectedCnameAssertion", - "dns_record_contains": "#/components/schemas/DnsRecordContainsAssertion", - "dns_record_equals": "#/components/schemas/DnsRecordEqualsAssertion", - "dns_txt_contains": "#/components/schemas/DnsTxtContainsAssertion", - "dns_min_answers": "#/components/schemas/DnsMinAnswersAssertion", - "dns_max_answers": "#/components/schemas/DnsMaxAnswersAssertion", - "dns_response_time_warn": "#/components/schemas/DnsResponseTimeWarnAssertion", - "dns_ttl_low": "#/components/schemas/DnsTtlLowAssertion", - "dns_ttl_high": "#/components/schemas/DnsTtlHighAssertion", - "mcp_connects": "#/components/schemas/McpConnectsAssertion", - "mcp_response_time": "#/components/schemas/McpResponseTimeAssertion", - "mcp_has_capability": "#/components/schemas/McpHasCapabilityAssertion", - "mcp_tool_available": "#/components/schemas/McpToolAvailableAssertion", - "mcp_min_tools": "#/components/schemas/McpMinToolsAssertion", - "mcp_protocol_version": "#/components/schemas/McpProtocolVersionAssertion", - "mcp_response_time_warn": "#/components/schemas/McpResponseTimeWarnAssertion", - "mcp_tool_count_changed": "#/components/schemas/McpToolCountChangedAssertion", - "ssl_expiry": "#/components/schemas/SslExpiryAssertion", - "response_size": "#/components/schemas/ResponseSizeAssertion", - "redirect_count": "#/components/schemas/RedirectCountAssertion", - "redirect_target": "#/components/schemas/RedirectTargetAssertion", - "response_time_warn": "#/components/schemas/ResponseTimeWarnAssertion", - "tcp_connects": "#/components/schemas/TcpConnectsAssertion", - "tcp_response_time": "#/components/schemas/TcpResponseTimeAssertion", - "tcp_response_time_warn": "#/components/schemas/TcpResponseTimeWarnAssertion", - "icmp_reachable": "#/components/schemas/IcmpReachableAssertion", - "icmp_response_time": "#/components/schemas/IcmpResponseTimeAssertion", - "icmp_response_time_warn": "#/components/schemas/IcmpResponseTimeWarnAssertion", - "icmp_packet_loss": "#/components/schemas/IcmpPacketLossAssertion", - "heartbeat_received": "#/components/schemas/HeartbeatReceivedAssertion", - "heartbeat_max_interval": "#/components/schemas/HeartbeatMaxIntervalAssertion", - "heartbeat_interval_drift": "#/components/schemas/HeartbeatIntervalDriftAssertion", - "heartbeat_payload_contains": "#/components/schemas/HeartbeatPayloadContainsAssertion" - } - } - }, "AssertionResultDto": { "required": [ "severity", - "type" + "type", + "passed" ], "type": "object", "properties": { @@ -7107,7 +21235,8 @@ "required": [ "assertionType", "message", - "severity" + "severity", + "passed" ], "type": "object", "properties": { @@ -7190,7 +21319,8 @@ "AuditEventDto": { "required": [ "action", - "createdAt" + "createdAt", + "id" ], "type": "object", "properties": { @@ -7272,65 +21402,83 @@ }, "BasicAuthConfig": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] }, - { + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding Basic auth username and password", + "format": "uuid", + "nullable": true + } + }, + "required": [ + "type" + ] + }, + "BatchComponentUptimeDto": { + "required": [ + "components" + ], + "type": "object", + "properties": { + "components": { "type": "object", - "properties": { - "vaultSecretId": { - "type": "string", - "description": "Vault secret ID holding Basic auth username and password", - "format": "uuid", - "nullable": true + "additionalProperties": { + "type": "array", + "description": "Map of component ID → list of per-day uptime entries (oldest → newest)", + "items": { + "$ref": "#/components/schemas/ComponentUptimeDayDto" } - } + }, + "description": "Map of component ID → list of per-day uptime entries (oldest → newest)" } - ] + }, + "description": "Batch daily uptime per component, keyed by component ID" }, "BearerAuthConfig": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "bearer" + ] }, - { - "type": "object", - "properties": { - "vaultSecretId": { - "type": "string", - "description": "Vault secret ID holding the bearer token value", - "format": "uuid", - "nullable": true - } - } + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding the bearer token value", + "format": "uuid", + "nullable": true } + }, + "required": [ + "type" ] }, "BodyContainsAssertion": { "required": [ + "type", "substring" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "substring": { - "minLength": 1, - "type": "string", - "description": "Substring that must appear in the response body" - } - }, - "required": [ - "substring" + "properties": { + "type": { + "type": "string", + "enum": [ + "body_contains" ] + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in the response body" } - ] + } }, "BulkMonitorActionRequest": { "required": [ @@ -7352,7 +21500,7 @@ }, "action": { "type": "string", - "description": "Action to perform: PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG", + "description": "Action to apply to every monitor in the bulk request", "enum": [ "PAUSE", "RESUME", @@ -7410,7 +21558,8 @@ }, "CategoryDto": { "required": [ - "category" + "category", + "serviceCount" ], "type": "object", "properties": { @@ -7465,30 +21614,6 @@ }, "description": "Update an organization member's status" }, - "ChannelConfig": { - "required": [ - "channelType" - ], - "type": "object", - "properties": { - "channelType": { - "type": "string" - } - }, - "description": "New channel configuration (full replacement, not partial update)", - "discriminator": { - "propertyName": "channelType", - "mapping": { - "email": "#/components/schemas/EmailChannelConfig", - "slack": "#/components/schemas/SlackChannelConfig", - "webhook": "#/components/schemas/WebhookChannelConfig", - "pagerduty": "#/components/schemas/PagerDutyChannelConfig", - "opsgenie": "#/components/schemas/OpsGenieChannelConfig", - "teams": "#/components/schemas/TeamsChannelConfig", - "discord": "#/components/schemas/DiscordChannelConfig" - } - } - }, "ChartBucketDto": { "required": [ "bucket" @@ -7612,7 +21737,8 @@ "required": [ "id", "region", - "timestamp" + "timestamp", + "passed" ], "type": "object", "properties": { @@ -7671,24 +21797,42 @@ "description": "A single check result from a monitor run" }, "CheckTypeDetailsDto": { - "required": [ - "check_type" - ], - "type": "object", - "properties": { - "check_type": { - "type": "string" - } - }, "description": "Check-type-specific details — polymorphic by check_type discriminator", "discriminator": { - "propertyName": "check_type" - } + "propertyName": "check_type", + "mapping": { + "http": "#/components/schemas/Http", + "tcp": "#/components/schemas/Tcp", + "icmp": "#/components/schemas/Icmp", + "dns": "#/components/schemas/Dns", + "mcp_server": "#/components/schemas/McpServer" + } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/Http" + }, + { + "$ref": "#/components/schemas/Tcp" + }, + { + "$ref": "#/components/schemas/Icmp" + }, + { + "$ref": "#/components/schemas/Dns" + }, + { + "$ref": "#/components/schemas/McpServer" + } + ] }, "ComponentImpact": { "required": [ "componentId", - "componentName" + "componentName", + "uptimePercentage", + "partialOutageSeconds", + "majorOutageSeconds" ], "type": "object", "properties": { @@ -7726,7 +21870,8 @@ }, "ComponentPosition": { "required": [ - "componentId" + "componentId", + "displayOrder" ], "type": "object", "properties": { @@ -7774,40 +21919,51 @@ }, "ComponentUptimeDayDto": { "required": [ - "date" + "date", + "source", + "partialOutageSeconds", + "majorOutageSeconds", + "degradedSeconds", + "uptimePercentage" ], "type": "object", "properties": { "date": { "type": "string", - "description": "Start-of-day timestamp for this bucket (UTC midnight)", + "description": "Date of the daily bucket (ISO 8601)", "format": "date-time" }, "partialOutageSeconds": { "type": "integer", - "description": "Seconds of partial outage on this day", + "description": "Seconds of partial outage observed on this day", "format": "int32" }, "majorOutageSeconds": { "type": "integer", - "description": "Seconds of major outage on this day", + "description": "Seconds of major outage observed on this day", + "format": "int32" + }, + "degradedSeconds": { + "type": "integer", + "description": "Seconds the component spent in degraded performance on this day", "format": "int32" }, "uptimePercentage": { "type": "number", - "description": "Computed uptime percentage using weighted formula", + "description": "Computed uptime percentage for the day", "format": "double" }, - "incidents": { - "type": "array", - "description": "Incidents that overlapped this day", - "nullable": true, - "items": { - "$ref": "#/components/schemas/IncidentRef" - } + "eventsJson": { + "type": "string", + "description": "Incident event references for this day as raw JSON", + "nullable": true + }, + "source": { + "type": "string", + "description": "Data source: vendor_reported or incident_derived" } }, - "description": "Daily uptime data for a status page component" + "description": "Daily uptime data for a component" }, "ComponentUptimeSummaryDto": { "required": [ @@ -7846,7 +22002,9 @@ }, "ConfirmationPolicy": { "required": [ - "type" + "type", + "minRegionsFailing", + "maxWaitSeconds" ], "type": "object", "properties": { @@ -7932,8 +22090,7 @@ }, "CreateAssertionRequest": { "required": [ - "config", - "severity" + "config" ], "type": "object", "properties": { @@ -8069,7 +22226,8 @@ }, "severity": { "type": "string", - "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing)", + "description": "Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL)", + "nullable": true, "enum": [ "fail", "warn" @@ -8081,7 +22239,8 @@ "CreateEnvironmentRequest": { "required": [ "name", - "slug" + "slug", + "isDefault" ], "type": "object", "properties": { @@ -8345,11 +22504,8 @@ }, "CreateNotificationPolicyRequest": { "required": [ - "enabled", "escalation", - "matchRules", - "name", - "priority" + "name" ], "type": "object", "properties": { @@ -8362,6 +22518,7 @@ "matchRules": { "type": "array", "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)", + "nullable": true, "items": { "$ref": "#/components/schemas/MatchRule" } @@ -8372,12 +22529,14 @@ "enabled": { "type": "boolean", "description": "Whether this policy is enabled (default true)", + "nullable": true, "default": true }, "priority": { "type": "integer", "description": "Evaluation priority; higher value = evaluated first (default 0)", "format": "int32", + "nullable": true, "default": 0 } }, @@ -8856,35 +23015,10 @@ }, "description": "Create a new workspace within the organization" }, - "CursorPage": { - "required": [ - "data" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "description": "Items on this page", - "items": { - "type": "object", - "description": "Items on this page" - } - }, - "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" - }, "CursorPageCheckResultDto": { "required": [ - "data" + "data", + "hasMore" ], "type": "object", "properties": { @@ -8909,7 +23043,8 @@ }, "CursorPageServiceCatalogDto": { "required": [ - "data" + "data", + "hasMore" ], "type": "object", "properties": { @@ -8934,7 +23069,8 @@ }, "CursorPageServicePollResultDto": { "required": [ - "data" + "data", + "hasMore" ], "type": "object", "properties": { @@ -8979,7 +23115,8 @@ "id", "impact", "status", - "title" + "title", + "scheduled" ], "type": "object", "properties": { @@ -9041,7 +23178,11 @@ }, "DekRotationResultDto": { "required": [ - "rotatedAt" + "rotatedAt", + "previousDekVersion", + "newDekVersion", + "secretsReEncrypted", + "channelsReEncrypted" ], "type": "object", "properties": { @@ -9098,7 +23239,8 @@ "attemptedAt", "deliveryId", "id", - "status" + "status", + "attemptNumber" ], "type": "object", "properties": { @@ -9202,423 +23344,454 @@ }, "DiscordChannelConfig": { "required": [ + "channelType", "webhookUrl" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "discord" + ] + }, + "webhookUrl": { + "minLength": 1, + "type": "string", + "description": "Discord webhook URL" + }, + "mentionRoleId": { + "type": "string", + "description": "Optional Discord role ID to mention in notifications", + "nullable": true + } + } + }, + "Dns": { + "type": "object", + "description": "DNS check-type-specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "dns" + ] + }, + "hostname": { + "type": "string", + "description": "Target hostname", + "nullable": true + }, + "requestedTypes": { + "type": "array", + "description": "Requested DNS record types", + "nullable": true, + "items": { + "type": "string", + "description": "Requested DNS record types", + "nullable": true + } + }, + "usedResolver": { + "type": "string", + "description": "Resolver used for lookup", + "nullable": true }, - { + "records": { "type": "object", - "properties": { - "webhookUrl": { - "minLength": 1, - "type": "string", - "description": "Discord webhook URL" - }, - "mentionRoleId": { - "type": "string", - "description": "Optional Discord role ID to mention in notifications", + "additionalProperties": { + "type": "array", + "description": "Resolved DNS records keyed by record type", + "nullable": true, + "items": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Resolved DNS records keyed by record type", + "nullable": true + }, + "description": "Resolved DNS records keyed by record type", "nullable": true } }, - "required": [ - "webhookUrl" - ] + "description": "Resolved DNS records keyed by record type", + "nullable": true + }, + "attempts": { + "type": "array", + "description": "DNS resolution attempts", + "nullable": true, + "items": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "DNS resolution attempts", + "nullable": true + }, + "description": "DNS resolution attempts", + "nullable": true + } + }, + "failureKind": { + "type": "string", + "description": "Kind of DNS failure, if any", + "nullable": true } + }, + "required": [ + "check_type" ] }, "DnsExpectedCnameAssertion": { "required": [ + "type", "value" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "value": { - "minLength": 1, - "type": "string", - "description": "Expected CNAME target the resolution must include" - } - }, - "required": [ - "value" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_expected_cname" ] + }, + "value": { + "minLength": 1, + "type": "string", + "description": "Expected CNAME target the resolution must include" } - ] + } }, "DnsExpectedIpsAssertion": { "required": [ + "type", "ips" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "ips": { - "minItems": 1, - "type": "array", - "description": "Allowed IP addresses; at least one resolved address must match", - "items": { - "type": "string", - "description": "Allowed IP addresses; at least one resolved address must match" - } - } - }, - "required": [ - "ips" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_expected_ips" ] + }, + "ips": { + "minItems": 1, + "type": "array", + "description": "Allowed IP addresses; at least one resolved address must match", + "items": { + "type": "string", + "description": "Allowed IP addresses; at least one resolved address must match" + } } - ] + } }, "DnsMaxAnswersAssertion": { "required": [ - "recordType" + "type", + "recordType", + "max" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "recordType": { - "minLength": 1, - "type": "string", - "description": "DNS record type whose answer count is checked" - }, - "max": { - "type": "integer", - "description": "Maximum number of answers allowed for that record type", - "format": "int32" - } - }, - "required": [ - "recordType", - "max" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_max_answers" ] + }, + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type whose answer count is checked" + }, + "max": { + "type": "integer", + "description": "Maximum number of answers allowed for that record type", + "format": "int32" } - ] + } }, "DnsMinAnswersAssertion": { "required": [ - "recordType" + "type", + "recordType", + "min" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "recordType": { - "minLength": 1, - "type": "string", - "description": "DNS record type whose answer count is checked" - }, - "min": { - "type": "integer", - "description": "Minimum number of answers required for that record type", - "format": "int32" - } - }, - "required": [ - "recordType", - "min" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_min_answers" ] + }, + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type whose answer count is checked" + }, + "min": { + "type": "integer", + "description": "Minimum number of answers required for that record type", + "format": "int32" } - ] + } }, "DnsMonitorConfig": { "required": [ "hostname" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "hostname": { + "minLength": 1, + "type": "string", + "description": "Domain name to resolve" }, - { - "type": "object", - "properties": { - "hostname": { - "minLength": 1, - "type": "string", - "description": "Domain name to resolve" - }, - "recordTypes": { - "type": "array", - "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", - "nullable": true, - "items": { - "type": "string", - "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", - "nullable": true, - "enum": [ - "A", - "AAAA", - "CNAME", - "MX", - "NS", - "TXT", - "SRV", - "SOA", - "CAA", - "PTR" - ] - } - }, - "nameservers": { - "type": "array", - "description": "Custom nameservers to query (uses system defaults if omitted)", - "nullable": true, - "items": { - "type": "string", - "description": "Custom nameservers to query (uses system defaults if omitted)", - "nullable": true - } - }, - "timeoutMs": { - "type": "integer", - "description": "Per-query timeout in milliseconds", - "format": "int32", - "nullable": true - }, - "totalTimeoutMs": { - "type": "integer", - "description": "Total timeout for all queries in milliseconds", - "format": "int32", - "nullable": true - } - }, - "required": [ - "hostname" - ] + "recordTypes": { + "type": "array", + "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", + "nullable": true, + "items": { + "type": "string", + "description": "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR", + "nullable": true, + "enum": [ + "A", + "AAAA", + "CNAME", + "MX", + "NS", + "TXT", + "SRV", + "SOA", + "CAA", + "PTR" + ] + } + }, + "nameservers": { + "type": "array", + "description": "Custom nameservers to query (uses system defaults if omitted)", + "nullable": true, + "items": { + "type": "string", + "description": "Custom nameservers to query (uses system defaults if omitted)", + "nullable": true + } + }, + "timeoutMs": { + "type": "integer", + "description": "Per-query timeout in milliseconds", + "format": "int32", + "nullable": true + }, + "totalTimeoutMs": { + "type": "integer", + "description": "Total timeout for all queries in milliseconds", + "format": "int32", + "nullable": true } - ] + } }, "DnsRecordContainsAssertion": { "required": [ + "type", "recordType", "substring" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "recordType": { - "minLength": 1, - "type": "string", - "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" - }, - "substring": { - "minLength": 1, - "type": "string", - "description": "Substring that must appear in a matching record value" - } - }, - "required": [ - "recordType", - "substring" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_record_contains" ] + }, + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in a matching record value" } - ] + } }, "DnsRecordEqualsAssertion": { "required": [ + "type", "recordType", "value" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "recordType": { - "minLength": 1, - "type": "string", - "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" - }, - "value": { - "minLength": 1, - "type": "string", - "description": "Expected DNS record value for an exact match" - } - }, - "required": [ - "recordType", - "value" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_record_equals" ] + }, + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "value": { + "minLength": 1, + "type": "string", + "description": "Expected DNS record value for an exact match" } - ] + } }, "DnsResolvesAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_resolves" + ] } + }, + "required": [ + "type" ] }, "DnsResponseTimeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxMs": { - "type": "integer", - "description": "Maximum allowed DNS resolution time in milliseconds", - "format": "int32" - } - }, - "required": [ - "maxMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_response_time" ] + }, + "maxMs": { + "type": "integer", + "description": "Maximum allowed DNS resolution time in milliseconds", + "format": "int32" } + }, + "required": [ + "type", + "maxMs" ] }, "DnsResponseTimeWarnAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "warnMs": { - "type": "integer", - "description": "DNS resolution time in milliseconds that triggers a warning only", - "format": "int32" - } - }, - "required": [ - "warnMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_response_time_warn" ] - } - ] - }, - "DnsTtlHighAssertion": { - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" }, - { - "type": "object", - "properties": { - "maxTtl": { - "type": "integer", - "description": "Maximum TTL in seconds before a high-TTL warning is raised", - "format": "int32" - } - }, - "required": [ - "maxTtl" + "warnMs": { + "type": "integer", + "description": "DNS resolution time in milliseconds that triggers a warning only", + "format": "int32" + } + }, + "required": [ + "type", + "warnMs" + ] + }, + "DnsTtlHighAssertion": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_ttl_high" ] + }, + "maxTtl": { + "type": "integer", + "description": "Maximum TTL in seconds before a high-TTL warning is raised", + "format": "int32" } + }, + "required": [ + "type", + "maxTtl" ] }, "DnsTtlLowAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "minTtl": { - "type": "integer", - "description": "Minimum acceptable TTL in seconds before a warning is raised", - "format": "int32" - } - }, - "required": [ - "minTtl" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_ttl_low" ] + }, + "minTtl": { + "type": "integer", + "description": "Minimum acceptable TTL in seconds before a warning is raised", + "format": "int32" } + }, + "required": [ + "type", + "minTtl" ] }, "DnsTxtContainsAssertion": { "required": [ + "type", "substring" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "substring": { - "minLength": 1, - "type": "string", - "description": "Substring that must appear in at least one TXT record" - } - }, - "required": [ - "substring" + "properties": { + "type": { + "type": "string", + "enum": [ + "dns_txt_contains" ] + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in at least one TXT record" } - ] + } }, "EmailChannelConfig": { "required": [ + "channelType", "recipients" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" - }, - { - "type": "object", - "properties": { - "recipients": { - "minItems": 1, - "type": "array", - "description": "Email addresses to send notifications to", - "items": { - "type": "string", - "description": "Email addresses to send notifications to", - "format": "email" - } - } - }, - "required": [ - "recipients" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "email" ] + }, + "recipients": { + "minItems": 1, + "type": "array", + "description": "Email addresses to send notifications to", + "items": { + "type": "string", + "description": "Email addresses to send notifications to", + "format": "email" + } } - ] + } }, "EntitlementDto": { "required": [ - "key" + "key", + "value", + "defaultValue", + "overridden" ], "type": "object", "properties": { @@ -9650,7 +23823,10 @@ "name", "slug", "updatedAt", - "variables" + "variables", + "orgId", + "monitorCount", + "isDefault" ], "type": "object", "properties": { @@ -9704,6 +23880,39 @@ }, "description": "Environment with variable substitutions for monitor configs" }, + "ErrorResponse": { + "required": [ + "message", + "status", + "timestamp" + ], + "type": "object", + "properties": { + "status": { + "type": "integer", + "description": "HTTP status code (mirrors the response status line)", + "format": "int32", + "example": 404 + }, + "message": { + "type": "string", + "description": "Human-readable error message; safe to surface to end users", + "example": "Monitor not found" + }, + "timestamp": { + "type": "integer", + "description": "Server time when the error was produced (epoch milliseconds)", + "format": "int64", + "example": 1737302400000 + } + }, + "description": "Uniform error envelope returned for every non-2xx response", + "example": { + "status": 404, + "message": "Monitor not found", + "timestamp": 1737302400000 + } + }, "EscalationChain": { "required": [ "steps" @@ -9733,7 +23942,8 @@ }, "EscalationStep": { "required": [ - "channelIds" + "channelIds", + "delayMinutes" ], "type": "object", "properties": { @@ -9789,7 +23999,15 @@ }, "GlobalStatusSummaryDto": { "required": [ - "servicesWithIssues" + "servicesWithIssues", + "totalServices", + "operationalCount", + "degradedCount", + "partialOutageCount", + "majorOutageCount", + "maintenanceCount", + "unknownCount", + "activeIncidentCount" ], "type": "object", "properties": { @@ -9868,130 +24086,112 @@ }, "HeaderAuthConfig": { "required": [ + "type", "headerName" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorAuthConfig" - }, - { - "type": "object", - "properties": { - "headerName": { - "minLength": 1, - "pattern": "^[A-Za-z0-9\\-_]+$", - "type": "string", - "description": "Custom HTTP header name for the secret value" - }, - "vaultSecretId": { - "type": "string", - "description": "Vault secret ID for the header value", - "format": "uuid", - "nullable": true - } - }, - "required": [ - "headerName" + "properties": { + "type": { + "type": "string", + "enum": [ + "header" ] + }, + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "Custom HTTP header name for the secret value" + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the header value", + "format": "uuid", + "nullable": true } - ] + } }, "HeaderValueAssertion": { "required": [ - "expected", + "type", "headerName", + "expected", "operator" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "header_value" + ] }, - { - "type": "object", - "properties": { - "headerName": { - "minLength": 1, - "type": "string", - "description": "HTTP header name to assert on" - }, - "expected": { - "minLength": 1, - "type": "string", - "description": "Expected value to compare against" - }, - "operator": { - "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] - } - }, - "required": [ - "headerName", - "expected", - "operator" + "headerName": { + "minLength": 1, + "type": "string", + "description": "HTTP header name to assert on" + }, + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected value to compare against" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" ] } - ] + } }, "HeartbeatIntervalDriftAssertion": { "required": [ + "type", "maxDeviationPercent" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxDeviationPercent": { - "maximum": 100, - "minimum": 1, - "type": "integer", - "description": "Max percent drift from expected ping interval before warning (non-fatal)", - "format": "int32" - } - }, - "required": [ - "maxDeviationPercent" + "properties": { + "type": { + "type": "string", + "enum": [ + "heartbeat_interval_drift" ] + }, + "maxDeviationPercent": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Max percent drift from expected ping interval before warning (non-fatal)", + "format": "int32" } - ] + } }, "HeartbeatMaxIntervalAssertion": { "required": [ + "type", "maxSeconds" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxSeconds": { - "minimum": 1, - "type": "integer", - "description": "Maximum allowed gap in seconds between consecutive heartbeat pings", - "format": "int32" - } - }, - "required": [ - "maxSeconds" + "properties": { + "type": { + "type": "string", + "enum": [ + "heartbeat_max_interval" ] + }, + "maxSeconds": { + "minimum": 1, + "type": "integer", + "description": "Maximum allowed gap in seconds between consecutive heartbeat pings", + "format": "int32" } - ] + } }, "HeartbeatMonitorConfig": { "required": [ @@ -9999,70 +24199,103 @@ "gracePeriod" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "expectedInterval": { + "maximum": 86400, + "minimum": 1, + "type": "integer", + "description": "Expected heartbeat interval in seconds", + "format": "int32" }, - { - "type": "object", - "properties": { - "expectedInterval": { - "maximum": 86400, - "minimum": 1, - "type": "integer", - "description": "Expected heartbeat interval in seconds", - "format": "int32" - }, - "gracePeriod": { - "minimum": 1, - "type": "integer", - "description": "Grace period in seconds before marking as down", - "format": "int32" - } - }, - "required": [ - "expectedInterval", - "gracePeriod" - ] + "gracePeriod": { + "minimum": 1, + "type": "integer", + "description": "Grace period in seconds before marking as down", + "format": "int32" } - ] + } }, "HeartbeatPayloadContainsAssertion": { "required": [ + "type", "path", "value" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "heartbeat_payload_contains" + ] }, - { - "type": "object", - "properties": { - "path": { - "minLength": 1, - "type": "string", - "description": "JSONPath expression into the heartbeat ping JSON payload" - }, - "value": { - "type": "string", - "description": "Expected value to compare against at that path" - } - }, - "required": [ - "path", - "value" + "path": { + "minLength": 1, + "type": "string", + "description": "JSONPath expression into the heartbeat ping JSON payload" + }, + "value": { + "type": "string", + "description": "Expected value to compare against at that path" + } + } + }, + "HeartbeatPingResponse": { + "required": [ + "ok" + ], + "type": "object", + "properties": { + "ok": { + "type": "boolean", + "description": "Always true on a 2xx response", + "example": true + } + }, + "description": "Acknowledgement that a heartbeat ping was accepted" + }, + "HeartbeatReceivedAssertion": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "heartbeat_received" ] } + }, + "required": [ + "type" ] }, - "HeartbeatReceivedAssertion": { + "Http": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "description": "HTTP check-type-specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "http" + ] + }, + "timing": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Request phase timing breakdown", + "nullable": true + }, + "description": "Request phase timing breakdown", + "nullable": true + }, + "bodyTruncated": { + "type": "boolean", + "description": "Whether the response body was truncated before storage", + "nullable": true } + }, + "required": [ + "check_type" ] }, "HttpMonitorConfig": { @@ -10071,174 +24304,218 @@ "url" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "url": { + "minLength": 1, + "type": "string", + "description": "Target URL to send requests to" }, - { + "method": { + "type": "string", + "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD", + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE", + "HEAD" + ] + }, + "customHeaders": { "type": "object", - "properties": { - "url": { - "minLength": 1, - "type": "string", - "description": "Target URL to send requests to" - }, - "method": { - "type": "string", - "description": "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD", - "enum": [ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "HEAD" - ] - }, - "customHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Additional HTTP headers to include in requests", - "nullable": true - }, - "description": "Additional HTTP headers to include in requests", - "nullable": true - }, - "requestBody": { - "type": "string", - "description": "Request body content for POST/PUT/PATCH methods", - "nullable": true - }, - "contentType": { - "type": "string", - "description": "Content-Type header value for the request body", - "nullable": true - }, - "verifyTls": { - "type": "boolean", - "description": "Whether to verify TLS certificates (default: true)", - "nullable": true - } + "additionalProperties": { + "type": "string", + "description": "Additional HTTP headers to include in requests", + "nullable": true }, - "required": [ - "url", - "method" + "description": "Additional HTTP headers to include in requests", + "nullable": true + }, + "requestBody": { + "type": "string", + "description": "Request body content for POST/PUT/PATCH methods", + "nullable": true + }, + "contentType": { + "type": "string", + "description": "Content-Type header value for the request body", + "nullable": true + }, + "verifyTls": { + "type": "boolean", + "description": "Whether to verify TLS certificates (default: true)", + "nullable": true + } + } + }, + "Icmp": { + "required": [ + "check_type", + "host" + ], + "type": "object", + "description": "ICMP (ping) check-type-specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "icmp" ] + }, + "host": { + "type": "string", + "description": "Target host", + "example": "1.1.1.1" + }, + "packetsSent": { + "type": "integer", + "description": "Number of ICMP packets sent", + "format": "int32", + "nullable": true + }, + "packetsReceived": { + "type": "integer", + "description": "Number of ICMP packets received", + "format": "int32", + "nullable": true + }, + "packetLoss": { + "type": "number", + "description": "Packet loss percentage", + "format": "double", + "nullable": true, + "example": 0 + }, + "avgRttMs": { + "type": "number", + "description": "Average round-trip time in ms", + "format": "double", + "nullable": true + }, + "minRttMs": { + "type": "number", + "description": "Minimum round-trip time in ms", + "format": "double", + "nullable": true + }, + "maxRttMs": { + "type": "number", + "description": "Maximum round-trip time in ms", + "format": "double", + "nullable": true + }, + "jitterMs": { + "type": "number", + "description": "Jitter in ms", + "format": "double", + "nullable": true } - ] + } }, "IcmpMonitorConfig": { "required": [ "host" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "host": { + "minLength": 1, + "type": "string", + "description": "Target hostname or IP address to ping" }, - { - "type": "object", - "properties": { - "host": { - "minLength": 1, - "type": "string", - "description": "Target hostname or IP address to ping" - }, - "packetCount": { - "maximum": 20, - "minimum": 1, - "type": "integer", - "description": "Number of ICMP packets to send", - "format": "int32", - "nullable": true - }, - "timeoutMs": { - "type": "integer", - "description": "Ping timeout in milliseconds", - "format": "int32", - "nullable": true - } - }, - "required": [ - "host" - ] + "packetCount": { + "maximum": 20, + "minimum": 1, + "type": "integer", + "description": "Number of ICMP packets to send", + "format": "int32", + "nullable": true + }, + "timeoutMs": { + "type": "integer", + "description": "Ping timeout in milliseconds", + "format": "int32", + "nullable": true } - ] + } }, "IcmpPacketLossAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxPercent": { - "maximum": 100, - "exclusiveMaximum": false, - "minimum": 0, - "exclusiveMinimum": false, - "type": "number", - "description": "Maximum allowed packet loss percentage before the check fails (0–100)", - "format": "double" - } - }, - "required": [ - "maxPercent" + "properties": { + "type": { + "type": "string", + "enum": [ + "icmp_packet_loss" ] + }, + "maxPercent": { + "maximum": 100, + "exclusiveMaximum": false, + "minimum": 0, + "exclusiveMinimum": false, + "type": "number", + "description": "Maximum allowed packet loss percentage before the check fails (0–100)", + "format": "double" } + }, + "required": [ + "type", + "maxPercent" ] }, "IcmpReachableAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "icmp_reachable" + ] } + }, + "required": [ + "type" ] }, "IcmpResponseTimeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxMs": { - "type": "integer", - "description": "Maximum average ICMP round-trip time in milliseconds", - "format": "int32" - } - }, - "required": [ - "maxMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "icmp_response_time" ] + }, + "maxMs": { + "type": "integer", + "description": "Maximum average ICMP round-trip time in milliseconds", + "format": "int32" } + }, + "required": [ + "type", + "maxMs" ] }, "IcmpResponseTimeWarnAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "warnMs": { - "type": "integer", - "description": "ICMP round-trip time in milliseconds that triggers a warning only", - "format": "int32" - } - }, - "required": [ - "warnMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "icmp_response_time_warn" ] + }, + "warnMs": { + "type": "integer", + "description": "ICMP round-trip time in milliseconds that triggers a warning only", + "format": "int32" } + }, + "required": [ + "type", + "warnMs" ] }, "IncidentDetailDto": { @@ -10274,7 +24551,10 @@ "severity", "source", "status", - "updatedAt" + "updatedAt", + "organizationId", + "reopenCount", + "statusPageVisible" ], "type": "object", "properties": { @@ -10434,22 +24714,22 @@ }, "monitorName": { "type": "string", - "description": "Name of the associated monitor; populated on list responses", + "description": "Name of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, "serviceName": { "type": "string", - "description": "Name of the associated service; populated on list responses", + "description": "Name of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, "serviceSlug": { "type": "string", - "description": "Slug of the associated service; populated on list responses", + "description": "Slug of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, "monitorType": { "type": "string", - "description": "Type of the associated monitor; populated on list responses", + "description": "Type of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true }, "resourceGroupId": { @@ -10460,7 +24740,7 @@ }, "resourceGroupName": { "type": "string", - "description": "Name of the resource group; populated on list responses", + "description": "Name of the resource group; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null.", "nullable": true } }, @@ -10471,6 +24751,7 @@ "properties": { "status": { "type": "string", + "description": "Filter by incident lifecycle status; null returns every status", "nullable": true, "enum": [ "WATCHING", @@ -10481,6 +24762,7 @@ }, "severity": { "type": "string", + "description": "Filter by severity; null returns every severity", "nullable": true, "enum": [ "DOWN", @@ -10490,6 +24772,7 @@ }, "source": { "type": "string", + "description": "Filter by where the incident originated (auto, manual, third-party)", "nullable": true, "enum": [ "AUTOMATIC", @@ -10501,49 +24784,60 @@ }, "monitorId": { "type": "string", + "description": "Only return incidents tied to this monitor ID", "format": "uuid", "nullable": true }, "serviceId": { "type": "string", + "description": "Only return incidents tied to this service ID (third-party services)", "format": "uuid", "nullable": true }, "resourceGroupId": { "type": "string", + "description": "Only return incidents whose monitor belongs to this resource group", "format": "uuid", "nullable": true }, "tagId": { "type": "string", + "description": "Only return incidents whose monitor carries this tag", "format": "uuid", "nullable": true }, "environmentId": { "type": "string", + "description": "Only return incidents whose monitor lives in this environment", "format": "uuid", "nullable": true }, "startedFrom": { "type": "string", + "description": "Earliest startedAt to include (inclusive, ISO 8601)", "format": "date-time", "nullable": true }, "startedTo": { "type": "string", + "description": "Latest startedAt to include (inclusive, ISO 8601)", "format": "date-time", "nullable": true }, "page": { "minimum": 0, "type": "integer", - "format": "int32" + "description": "Zero-based page index (default: 0)", + "format": "int32", + "example": 0 }, "size": { "maximum": 200, "minimum": 1, "type": "integer", - "format": "int32" + "description": "Number of incidents per page (1–200, default: 10)", + "format": "int32", + "example": 10 } }, "required": [ @@ -10662,7 +24956,8 @@ "required": [ "createdAt", "id", - "incidentId" + "incidentId", + "notifySubscribers" ], "type": "object", "properties": { @@ -10837,7 +25132,8 @@ "required": [ "email", "expiresAt", - "roleOffered" + "roleOffered", + "inviteId" ], "type": "object", "properties": { @@ -10881,53 +25177,48 @@ }, "JsonPathAssertion": { "required": [ + "type", + "path", "expected", - "operator", - "path" + "operator" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "json_path" + ] }, - { - "type": "object", - "properties": { - "path": { - "minLength": 1, - "type": "string", - "description": "JSONPath expression to extract a value from the response body" - }, - "expected": { - "minLength": 1, - "type": "string", - "description": "Expected value to compare against" - }, - "operator": { - "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] - } - }, - "required": [ - "path", - "expected", - "operator" + "path": { + "minLength": 1, + "type": "string", + "description": "JSONPath expression to extract a value from the response body" + }, + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected value to compare against" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" ] } - ] + } }, "KeyInfo": { "required": [ "createdAt", - "name" + "name", + "id" ], "type": "object", "properties": { @@ -10968,7 +25259,8 @@ "statusPageId", "statusPageName", "statusPageSlug", - "title" + "title", + "scheduled" ], "type": "object", "properties": { @@ -11076,7 +25368,9 @@ "createdAt", "endsAt", "id", - "startsAt" + "startsAt", + "organizationId", + "suppressAlerts" ], "type": "object", "properties": { @@ -11176,121 +25470,169 @@ }, "McpConnectsAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_connects" + ] } + }, + "required": [ + "type" ] }, "McpHasCapabilityAssertion": { "required": [ + "type", "capability" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "capability": { - "minLength": 1, - "type": "string", - "description": "Capability name the server must advertise, e.g. tools or resources" - } - }, - "required": [ - "capability" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_has_capability" ] + }, + "capability": { + "minLength": 1, + "type": "string", + "description": "Capability name the server must advertise, e.g. tools or resources" } - ] + } }, "McpMinToolsAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "min": { - "type": "integer", - "description": "Minimum number of tools the server must expose", - "format": "int32" - } - }, - "required": [ - "min" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_min_tools" ] + }, + "min": { + "type": "integer", + "description": "Minimum number of tools the server must expose", + "format": "int32" } + }, + "required": [ + "type", + "min" ] }, "McpProtocolVersionAssertion": { "required": [ + "type", "version" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "version": { - "minLength": 1, - "type": "string", - "description": "Expected MCP protocol version string from the server handshake" - } - }, - "required": [ - "version" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_protocol_version" ] + }, + "version": { + "minLength": 1, + "type": "string", + "description": "Expected MCP protocol version string from the server handshake" } - ] + } }, "McpResponseTimeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxMs": { - "type": "integer", - "description": "Maximum allowed MCP check duration in milliseconds", - "format": "int32" - } - }, - "required": [ - "maxMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_response_time" ] + }, + "maxMs": { + "type": "integer", + "description": "Maximum allowed MCP check duration in milliseconds", + "format": "int32" } + }, + "required": [ + "type", + "maxMs" ] }, "McpResponseTimeWarnAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_response_time_warn" + ] }, - { + "warnMs": { + "type": "integer", + "description": "MCP check duration in milliseconds that triggers a warning only", + "format": "int32" + } + }, + "required": [ + "type", + "warnMs" + ] + }, + "McpServer": { + "type": "object", + "description": "MCP server check-type-specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "mcp_server" + ] + }, + "url": { + "type": "string", + "description": "MCP server URL", + "nullable": true + }, + "protocolVersion": { + "type": "string", + "description": "MCP protocol version", + "nullable": true + }, + "serverInfo": { "type": "object", - "properties": { - "warnMs": { - "type": "integer", - "description": "MCP check duration in milliseconds that triggers a warning only", - "format": "int32" - } + "additionalProperties": { + "type": "object", + "description": "MCP server info (name, version, etc.)", + "nullable": true }, - "required": [ - "warnMs" - ] + "description": "MCP server info (name, version, etc.)", + "nullable": true + }, + "toolCount": { + "type": "integer", + "description": "Number of tools exposed", + "format": "int32", + "nullable": true + }, + "resourceCount": { + "type": "integer", + "description": "Number of resources exposed", + "format": "int32", + "nullable": true + }, + "promptCount": { + "type": "integer", + "description": "Number of prompts exposed", + "format": "int32", + "nullable": true } + }, + "required": [ + "check_type" ] }, "McpServerMonitorConfig": { @@ -11298,88 +25640,72 @@ "command" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "command": { + "minLength": 1, + "type": "string", + "description": "Command to execute to start the MCP server" }, - { + "args": { + "type": "array", + "description": "Command-line arguments for the MCP server process", + "nullable": true, + "items": { + "type": "string", + "description": "Command-line arguments for the MCP server process", + "nullable": true + } + }, + "env": { "type": "object", - "properties": { - "command": { - "minLength": 1, - "type": "string", - "description": "Command to execute to start the MCP server" - }, - "args": { - "type": "array", - "description": "Command-line arguments for the MCP server process", - "nullable": true, - "items": { - "type": "string", - "description": "Command-line arguments for the MCP server process", - "nullable": true - } - }, - "env": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Environment variables to pass to the MCP server process", - "nullable": true - }, - "description": "Environment variables to pass to the MCP server process", - "nullable": true - } + "additionalProperties": { + "type": "string", + "description": "Environment variables to pass to the MCP server process", + "nullable": true }, - "required": [ - "command" - ] + "description": "Environment variables to pass to the MCP server process", + "nullable": true } - ] + } }, "McpToolAvailableAssertion": { "required": [ + "type", "toolName" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "toolName": { - "minLength": 1, - "type": "string", - "description": "MCP tool name that must appear in the server's tool list" - } - }, - "required": [ - "toolName" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_tool_available" ] + }, + "toolName": { + "minLength": 1, + "type": "string", + "description": "MCP tool name that must appear in the server's tool list" } - ] + } }, "McpToolCountChangedAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "expectedCount": { - "type": "integer", - "description": "Expected tool count; warns when the live count differs", - "format": "int32" - } - }, - "required": [ - "expectedCount" + "properties": { + "type": { + "type": "string", + "enum": [ + "mcp_tool_count_changed" ] + }, + "expectedCount": { + "type": "integer", + "description": "Expected tool count; warns when the live count differs", + "format": "int32" } + }, + "required": [ + "type", + "expectedCount" ] }, "MemberDto": { @@ -11387,7 +25713,8 @@ "createdAt", "email", "orgRole", - "status" + "status", + "userId" ], "type": "object", "properties": { @@ -11639,15 +25966,6 @@ } }, "MonitorAuthConfig": { - "required": [ - "type" - ], - "type": "object", - "properties": { - "type": { - "type": "string" - } - }, "description": "New authentication configuration (full replacement)", "discriminator": { "propertyName": "type", @@ -11657,7 +25975,21 @@ "header": "#/components/schemas/HeaderAuthConfig", "api_key": "#/components/schemas/ApiKeyAuthConfig" } - } + }, + "oneOf": [ + { + "$ref": "#/components/schemas/BearerAuthConfig" + }, + { + "$ref": "#/components/schemas/BasicAuthConfig" + }, + { + "$ref": "#/components/schemas/HeaderAuthConfig" + }, + { + "$ref": "#/components/schemas/ApiKeyAuthConfig" + } + ] }, "MonitorAuthDto": { "required": [ @@ -11703,10 +26035,6 @@ } } }, - "MonitorConfig": { - "type": "object", - "description": "Protocol-specific monitor configuration" - }, "MonitorDto": { "required": [ "config", @@ -11716,7 +26044,10 @@ "name", "regions", "type", - "updatedAt" + "updatedAt", + "organizationId", + "frequencySeconds", + "enabled" ], "type": "object", "properties": { @@ -11984,7 +26315,8 @@ }, "MonitorTestResultDto": { "required": [ - "assertionResults" + "assertionResults", + "passed" ], "type": "object", "properties": { @@ -12056,7 +26388,8 @@ "createdAt", "id", "monitorId", - "snapshot" + "snapshot", + "version" ], "type": "object", "properties": { @@ -12136,7 +26469,8 @@ "incidentId", "policyId", "status", - "updatedAt" + "updatedAt", + "currentStep" ], "type": "object", "properties": { @@ -12235,7 +26569,9 @@ "required": [ "createdAt", "title", - "type" + "type", + "id", + "read" ], "type": "object", "properties": { @@ -12286,7 +26622,10 @@ "id", "matchRules", "name", - "updatedAt" + "updatedAt", + "organizationId", + "enabled", + "priority" ], "type": "object", "properties": { @@ -12339,37 +26678,34 @@ }, "OpsGenieChannelConfig": { "required": [ + "channelType", "apiKey" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" - }, - { - "type": "object", - "properties": { - "apiKey": { - "minLength": 1, - "type": "string", - "description": "OpsGenie API key for alert creation" - }, - "region": { - "type": "string", - "description": "OpsGenie API region: us or eu", - "nullable": true - } - }, - "required": [ - "apiKey" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "opsgenie" ] + }, + "apiKey": { + "minLength": 1, + "type": "string", + "description": "OpsGenie API key for alert creation" + }, + "region": { + "type": "string", + "description": "OpsGenie API region: us or eu", + "nullable": true } - ] + } }, "OrganizationDto": { "required": [ "email", - "name" + "name", + "id" ], "type": "object", "properties": { @@ -12407,7 +26743,8 @@ }, "OrgInfo": { "required": [ - "name" + "name", + "id" ], "type": "object", "properties": { @@ -12451,32 +26788,28 @@ }, "PagerDutyChannelConfig": { "required": [ + "channelType", "routingKey" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" - }, - { - "type": "object", - "properties": { - "routingKey": { - "minLength": 1, - "type": "string", - "description": "PagerDuty Events API v2 routing (integration) key" - }, - "severityOverride": { - "type": "string", - "description": "Override PagerDuty severity mapping", - "nullable": true - } - }, - "required": [ - "routingKey" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pagerduty" ] + }, + "routingKey": { + "minLength": 1, + "type": "string", + "description": "PagerDuty Events API v2 routing (integration) key" + }, + "severityOverride": { + "type": "string", + "description": "Override PagerDuty severity mapping", + "nullable": true } - ] + } }, "PageSection": { "type": "object", @@ -12508,7 +26841,8 @@ "required": [ "entitlements", "tier", - "usage" + "usage", + "trialActive" ], "type": "object", "properties": { @@ -12560,7 +26894,8 @@ }, "PollChartBucketDto": { "required": [ - "bucket" + "bucket", + "totalPolls" ], "type": "object", "properties": { @@ -12696,93 +27031,84 @@ "cooldownMinutes" ] }, - "RedirectCountAssertion": { - "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxCount": { - "type": "integer", - "description": "Maximum number of HTTP redirects allowed before the check fails", - "format": "int32" - } - }, - "required": [ - "maxCount" + "RedirectCountAssertion": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "redirect_count" ] + }, + "maxCount": { + "type": "integer", + "description": "Maximum number of HTTP redirects allowed before the check fails", + "format": "int32" } + }, + "required": [ + "type", + "maxCount" ] }, "RedirectTargetAssertion": { "required": [ + "type", "expected", "operator" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "redirect_target" + ] }, - { - "type": "object", - "properties": { - "expected": { - "minLength": 1, - "type": "string", - "description": "Expected final URL after following redirects" - }, - "operator": { - "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] - } - }, - "required": [ - "expected", - "operator" + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected final URL after following redirects" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" ] } - ] + } }, "RegexBodyAssertion": { "required": [ + "type", "pattern" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "pattern": { - "minLength": 1, - "type": "string", - "description": "Regular expression the response body must match" - } - }, - "required": [ - "pattern" + "properties": { + "type": { + "type": "string", + "enum": [ + "regex_body" ] + }, + "pattern": { + "minLength": 1, + "type": "string", + "description": "Regular expression the response body must match" } - ] + } }, "RegionStatusDto": { "required": [ "region", - "timestamp" + "timestamp", + "passed" ], "type": "object", "properties": { @@ -12878,14 +27204,12 @@ "description": "Reorder page-level layout: groups and ungrouped components share one ordering" }, "ResolveIncidentRequest": { - "required": [ - "body" - ], "type": "object", "properties": { "body": { "type": "string", - "description": "Optional resolution message or post-mortem notes" + "description": "Optional resolution message or post-mortem notes", + "nullable": true } } }, @@ -12896,7 +27220,9 @@ "id", "name", "slug", - "updatedAt" + "updatedAt", + "organizationId", + "suppressMemberAlerts" ], "type": "object", "properties": { @@ -13026,7 +27352,10 @@ }, "ResourceGroupHealthDto": { "required": [ - "status" + "status", + "totalMembers", + "operationalCount", + "activeIncidents" ], "type": "object", "properties": { @@ -13195,65 +27524,62 @@ }, "ResponseSizeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxBytes": { - "type": "integer", - "description": "Maximum response body size in bytes before the check fails", - "format": "int32" - } - }, - "required": [ - "maxBytes" + "properties": { + "type": { + "type": "string", + "enum": [ + "response_size" ] + }, + "maxBytes": { + "type": "integer", + "description": "Maximum response body size in bytes before the check fails", + "format": "int32" } + }, + "required": [ + "type", + "maxBytes" ] }, "ResponseTimeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "thresholdMs": { - "type": "integer", - "description": "Maximum allowed response time in milliseconds before the check fails", - "format": "int32" - } - }, - "required": [ - "thresholdMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "response_time" ] + }, + "thresholdMs": { + "type": "integer", + "description": "Maximum allowed response time in milliseconds before the check fails", + "format": "int32" } + }, + "required": [ + "type", + "thresholdMs" ] }, "ResponseTimeWarnAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "warnMs": { - "type": "integer", - "description": "HTTP response time in milliseconds that triggers a warning only", - "format": "int32" - } - }, - "required": [ - "warnMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "response_time_warn" ] + }, + "warnMs": { + "type": "integer", + "description": "HTTP response time in milliseconds that triggers a warning only", + "format": "int32" } + }, + "required": [ + "type", + "warnMs" ] }, "ResultSummaryDto": { @@ -13307,7 +27633,9 @@ }, "RetryStrategy": { "required": [ - "type" + "type", + "maxRetries", + "interval" ], "type": "object", "properties": { @@ -13413,7 +27741,8 @@ "id", "key", "updatedAt", - "valueHash" + "valueHash", + "dekVersion" ], "type": "object", "properties": { @@ -13485,7 +27814,12 @@ "id", "name", "slug", - "updatedAt" + "updatedAt", + "pollingIntervalSeconds", + "enabled", + "published", + "componentCount", + "activeIncidentCount" ], "type": "object", "properties": { @@ -13569,7 +27903,12 @@ "lastSeenAt", "lifecycleStatus", "name", - "status" + "status", + "showcase", + "onlyShowIfDegraded", + "hasUptime", + "displayAggregatedUptime", + "isGroup" ], "type": "object", "properties": { @@ -13679,7 +28018,10 @@ "required": [ "components", "date", - "incidents" + "incidents", + "totalPartialOutageSeconds", + "totalMajorOutageSeconds", + "totalDegradedSeconds" ], "type": "object", "properties": { @@ -13704,6 +28046,11 @@ "description": "Sum of major outage seconds across all leaf components", "format": "int64" }, + "totalDegradedSeconds": { + "type": "integer", + "description": "Sum of degraded performance seconds across all leaf components", + "format": "int64" + }, "components": { "type": "array", "description": "Per-component impact rows for the day (only components with uptime data)", @@ -13732,7 +28079,9 @@ "name", "recentIncidents", "slug", - "updatedAt" + "updatedAt", + "pollingIntervalSeconds", + "enabled" ], "type": "object", "properties": { @@ -13983,7 +28332,8 @@ }, "ServiceLiveStatusDto": { "required": [ - "componentStatuses" + "componentStatuses", + "activeIncidentCount" ], "type": "object", "properties": { @@ -14014,7 +28364,10 @@ "ServicePollResultDto": { "required": [ "serviceId", - "timestamp" + "timestamp", + "passed", + "componentCount", + "degradedCount" ], "type": "object", "properties": { @@ -14076,7 +28429,9 @@ "ServicePollSummaryDto": { "required": [ "chartData", - "window" + "window", + "totalPolls", + "passedPolls" ], "type": "object", "properties": { @@ -14169,7 +28524,9 @@ "serviceId", "slug", "subscribedAt", - "subscriptionId" + "subscriptionId", + "pollingIntervalSeconds", + "enabled" ], "type": "object", "properties": { @@ -14390,6 +28747,17 @@ } } }, + "SingleValueResponseBatchComponentUptimeDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BatchComponentUptimeDto" + } + } + }, "SingleValueResponseBulkMonitorActionResult": { "required": [ "data" @@ -14527,23 +28895,6 @@ } } }, - "SingleValueResponseMapStringListComponentUptimeDayDto": { - "required": [ - "data" - ], - "type": "object", - "properties": { - "data": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ComponentUptimeDayDto" - } - } - } - } - }, "SingleValueResponseMonitorAssertionDto": { "required": [ "data" @@ -14931,91 +29282,81 @@ }, "SlackChannelConfig": { "required": [ + "channelType", "webhookUrl" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" - }, - { - "type": "object", - "properties": { - "webhookUrl": { - "minLength": 1, - "type": "string", - "description": "Slack incoming webhook URL" - }, - "mentionText": { - "type": "string", - "description": "Optional mention text included in notifications, e.g. @channel", - "nullable": true - } - }, - "required": [ - "webhookUrl" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "slack" ] + }, + "webhookUrl": { + "minLength": 1, + "type": "string", + "description": "Slack incoming webhook URL" + }, + "mentionText": { + "type": "string", + "description": "Optional mention text included in notifications, e.g. @channel", + "nullable": true } - ] + } }, "SslExpiryAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "minDaysRemaining": { - "type": "integer", - "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold", - "format": "int32" - } - }, - "required": [ - "minDaysRemaining" + "properties": { + "type": { + "type": "string", + "enum": [ + "ssl_expiry" ] + }, + "minDaysRemaining": { + "type": "integer", + "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold", + "format": "int32" } + }, + "required": [ + "type", + "minDaysRemaining" ] }, "StatusCodeAssertion": { "required": [ + "type", "expected", "operator" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "status_code" + ] }, - { - "type": "object", - "properties": { - "expected": { - "minLength": 1, - "type": "string", - "description": "Expected status code, range pattern, or wildcard such as 2xx" - }, - "operator": { - "type": "string", - "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", - "enum": [ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range" - ] - } - }, - "required": [ - "expected", - "operator" + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected status code, range pattern, or wildcard such as 2xx" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" ] } - ] + } }, "StatusPageBranding": { "type": "object", @@ -15128,7 +29469,11 @@ "name", "statusPageId", "type", - "updatedAt" + "updatedAt", + "showUptime", + "displayOrder", + "pageOrder", + "excludeFromOverall" ], "type": "object", "properties": { @@ -15216,7 +29561,10 @@ "id", "name", "statusPageId", - "updatedAt" + "updatedAt", + "displayOrder", + "pageOrder", + "collapsed" ], "type": "object", "properties": { @@ -15239,29 +29587,69 @@ "type": "integer", "format": "int32" }, - "pageOrder": { + "pageOrder": { + "type": "integer", + "format": "int32" + }, + "collapsed": { + "type": "boolean" + }, + "components": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/StatusPageComponentDto" + } + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + } + }, + "StatusPageComponentUptimeDayDto": { + "required": [ + "date", + "partialOutageSeconds", + "majorOutageSeconds", + "uptimePercentage" + ], + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "Start-of-day timestamp for this bucket (UTC midnight)", + "format": "date-time" + }, + "partialOutageSeconds": { + "type": "integer", + "description": "Seconds of partial outage on this day", + "format": "int32" + }, + "majorOutageSeconds": { "type": "integer", + "description": "Seconds of major outage on this day", "format": "int32" }, - "collapsed": { - "type": "boolean" + "uptimePercentage": { + "type": "number", + "description": "Computed uptime percentage using weighted formula", + "format": "double" }, - "components": { + "incidents": { "type": "array", + "description": "Incidents that overlapped this day", "nullable": true, "items": { - "$ref": "#/components/schemas/StatusPageComponentDto" + "$ref": "#/components/schemas/IncidentRef" } - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" } - } + }, + "description": "Daily uptime data for a status page component" }, "StatusPageCustomDomainDto": { "required": [ @@ -15272,7 +29660,8 @@ "updatedAt", "verificationCnameTarget", "verificationMethod", - "verificationToken" + "verificationToken", + "primary" ], "type": "object", "properties": { @@ -15339,7 +29728,10 @@ "name", "slug", "updatedAt", - "visibility" + "visibility", + "organizationId", + "workspaceId", + "enabled" ], "type": "object", "properties": { @@ -15456,7 +29848,9 @@ "status", "statusPageId", "title", - "updatedAt" + "updatedAt", + "scheduled", + "autoResolve" ], "type": "object", "properties": { @@ -15567,7 +29961,8 @@ "body", "createdAt", "id", - "status" + "status", + "notifySubscribers" ], "type": "object", "properties": { @@ -15613,7 +30008,8 @@ "required": [ "createdAt", "email", - "id" + "id", + "confirmed" ], "type": "object", "properties": { @@ -15658,7 +30054,9 @@ }, "TableValueResultAlertChannelDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15688,7 +30086,9 @@ }, "TableValueResultAlertDeliveryDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15718,7 +30118,9 @@ }, "TableValueResultApiKeyDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15748,7 +30150,9 @@ }, "TableValueResultAuditEventDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15778,7 +30182,9 @@ }, "TableValueResultCategoryDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15808,7 +30214,9 @@ }, "TableValueResultComponentUptimeDayDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15838,7 +30246,9 @@ }, "TableValueResultDeliveryAttemptDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15868,7 +30278,9 @@ }, "TableValueResultEnvironmentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15898,7 +30310,9 @@ }, "TableValueResultIncidentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15928,7 +30342,9 @@ }, "TableValueResultIntegrationDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15958,7 +30374,9 @@ }, "TableValueResultInviteDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -15988,7 +30406,9 @@ }, "TableValueResultMaintenanceWindowDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16018,7 +30438,9 @@ }, "TableValueResultMemberDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16048,7 +30470,9 @@ }, "TableValueResultMonitorDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16078,7 +30502,9 @@ }, "TableValueResultMonitorVersionDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16108,7 +30534,9 @@ }, "TableValueResultNotificationDispatchDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16138,7 +30566,9 @@ }, "TableValueResultNotificationDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16168,7 +30598,9 @@ }, "TableValueResultNotificationPolicyDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16198,7 +30630,9 @@ }, "TableValueResultResourceGroupDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16228,7 +30662,9 @@ }, "TableValueResultScheduledMaintenanceDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16258,7 +30694,9 @@ }, "TableValueResultSecretDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16288,7 +30726,9 @@ }, "TableValueResultServiceComponentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16318,7 +30758,9 @@ }, "TableValueResultServiceIncidentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16348,7 +30790,9 @@ }, "TableValueResultServiceSubscriptionDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16378,7 +30822,9 @@ }, "TableValueResultStatusPageComponentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16408,7 +30854,9 @@ }, "TableValueResultStatusPageComponentGroupDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16436,9 +30884,43 @@ } } }, + "TableValueResultStatusPageComponentUptimeDayDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StatusPageComponentUptimeDayDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, "TableValueResultStatusPageCustomDomainDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16468,7 +30950,9 @@ }, "TableValueResultStatusPageDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16498,7 +30982,9 @@ }, "TableValueResultStatusPageIncidentDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16528,7 +31014,9 @@ }, "TableValueResultStatusPageSubscriberDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16558,7 +31046,9 @@ }, "TableValueResultTagDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16588,7 +31078,9 @@ }, "TableValueResultWebhookDeliveryDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16618,7 +31110,9 @@ }, "TableValueResultWebhookEndpointDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16648,7 +31142,9 @@ }, "TableValueResultWorkspaceDto": { "required": [ - "data" + "data", + "hasNext", + "hasPrev" ], "type": "object", "properties": { @@ -16682,7 +31178,8 @@ "createdAt", "id", "name", - "updatedAt" + "updatedAt", + "organizationId" ], "type": "object", "properties": { @@ -16719,117 +31216,139 @@ }, "description": "Tag for organizing and filtering monitors" }, + "Tcp": { + "required": [ + "check_type", + "host", + "port", + "connected" + ], + "type": "object", + "description": "TCP check-type-specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "tcp" + ] + }, + "host": { + "type": "string", + "description": "Target host", + "example": "db.example.com" + }, + "port": { + "type": "integer", + "description": "Target port", + "format": "int32", + "example": 5432 + }, + "connected": { + "type": "boolean", + "description": "Whether a TCP connection was established" + } + } + }, "TcpConnectsAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" + "properties": { + "type": { + "type": "string", + "enum": [ + "tcp_connects" + ] } + }, + "required": [ + "type" ] }, "TcpMonitorConfig": { "required": [ - "host" + "host", + "port" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/MonitorConfig" + "properties": { + "host": { + "minLength": 1, + "type": "string", + "description": "Target hostname or IP address" }, - { - "type": "object", - "properties": { - "host": { - "minLength": 1, - "type": "string", - "description": "Target hostname or IP address" - }, - "port": { - "maximum": 65535, - "minimum": 1, - "type": "integer", - "description": "TCP port to connect to", - "format": "int32" - }, - "timeoutMs": { - "type": "integer", - "description": "Connection timeout in milliseconds", - "format": "int32", - "nullable": true - } - }, - "required": [ - "host", - "port" - ] + "port": { + "maximum": 65535, + "minimum": 1, + "type": "integer", + "description": "TCP port to connect to", + "format": "int32" + }, + "timeoutMs": { + "type": "integer", + "description": "Connection timeout in milliseconds", + "format": "int32", + "nullable": true } - ] + } }, "TcpResponseTimeAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "maxMs": { - "type": "integer", - "description": "Maximum TCP connect time in milliseconds before the check fails", - "format": "int32" - } - }, - "required": [ - "maxMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "tcp_response_time" ] + }, + "maxMs": { + "type": "integer", + "description": "Maximum TCP connect time in milliseconds before the check fails", + "format": "int32" } + }, + "required": [ + "type", + "maxMs" ] }, "TcpResponseTimeWarnAssertion": { "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/AssertionConfig" - }, - { - "type": "object", - "properties": { - "warnMs": { - "type": "integer", - "description": "TCP connect time in milliseconds that triggers a warning only", - "format": "int32" - } - }, - "required": [ - "warnMs" + "properties": { + "type": { + "type": "string", + "enum": [ + "tcp_response_time_warn" ] + }, + "warnMs": { + "type": "integer", + "description": "TCP connect time in milliseconds that triggers a warning only", + "format": "int32" } + }, + "required": [ + "type", + "warnMs" ] }, "TeamsChannelConfig": { "required": [ + "channelType", "webhookUrl" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" - }, - { - "type": "object", - "properties": { - "webhookUrl": { - "minLength": 1, - "type": "string", - "description": "Microsoft Teams incoming webhook URL" - } - }, - "required": [ - "webhookUrl" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "teams" ] + }, + "webhookUrl": { + "minLength": 1, + "type": "string", + "description": "Microsoft Teams incoming webhook URL" } - ] + } }, "TestAlertChannelRequest": { "required": [ @@ -16867,7 +31386,8 @@ }, "TestChannelResult": { "required": [ - "message" + "message", + "success" ], "type": "object", "properties": { @@ -16882,7 +31402,8 @@ "TestMatchResult": { "required": [ "matchedRules", - "unmatchedRules" + "unmatchedRules", + "matched" ], "type": "object", "properties": { @@ -17453,9 +31974,24 @@ }, "config": { "nullable": true, - "allOf": [ + "oneOf": [ + { + "$ref": "#/components/schemas/DnsMonitorConfig" + }, + { + "$ref": "#/components/schemas/HeartbeatMonitorConfig" + }, + { + "$ref": "#/components/schemas/HttpMonitorConfig" + }, + { + "$ref": "#/components/schemas/IcmpMonitorConfig" + }, + { + "$ref": "#/components/schemas/McpServerMonitorConfig" + }, { - "$ref": "#/components/schemas/MonitorConfig" + "$ref": "#/components/schemas/TcpMonitorConfig" } ] }, @@ -18009,7 +32545,8 @@ }, "UptimeBucketDto": { "required": [ - "timestamp" + "timestamp", + "totalPolls" ], "type": "object", "properties": { @@ -18080,42 +32617,38 @@ }, "WebhookChannelConfig": { "required": [ + "channelType", "url" ], "type": "object", - "allOf": [ - { - "$ref": "#/components/schemas/ChannelConfig" + "properties": { + "channelType": { + "type": "string", + "enum": [ + "webhook" + ] }, - { + "url": { + "minLength": 1, + "type": "string", + "description": "Webhook endpoint URL that receives alert payloads" + }, + "signingSecret": { + "type": "string", + "description": "Optional HMAC signing secret for payload verification", + "nullable": true + }, + "customHeaders": { "type": "object", - "properties": { - "url": { - "minLength": 1, - "type": "string", - "description": "Webhook endpoint URL that receives alert payloads" - }, - "signingSecret": { - "type": "string", - "description": "Optional HMAC signing secret for payload verification", - "nullable": true - }, - "customHeaders": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Additional HTTP headers to include in webhook requests", - "nullable": true - }, - "description": "Additional HTTP headers to include in webhook requests", - "nullable": true - } + "additionalProperties": { + "type": "string", + "description": "Additional HTTP headers to include in webhook requests", + "nullable": true }, - "required": [ - "url" - ] + "description": "Additional HTTP headers to include in webhook requests", + "nullable": true } - ] + } }, "WebhookDeliveryDto": { "required": [ @@ -18124,7 +32657,9 @@ "eventId", "eventType", "id", - "status" + "status", + "attemptCount", + "maxAttempts" ], "type": "object", "properties": { @@ -18194,7 +32729,9 @@ "id", "subscribedEvents", "updatedAt", - "url" + "url", + "enabled", + "consecutiveFailures" ], "type": "object", "properties": { @@ -18308,7 +32845,8 @@ }, "WebhookTestResult": { "required": [ - "message" + "message", + "success" ], "type": "object", "properties": { @@ -18334,7 +32872,9 @@ "required": [ "createdAt", "name", - "updatedAt" + "updatedAt", + "id", + "orgId" ], "type": "object", "properties": { diff --git a/eslint.config.js b/eslint.config.js index b7d6c8c..2cf93cc 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,12 +3,23 @@ import tsparser from '@typescript-eslint/parser' export default [ { - files: ['src/**/*.ts', 'test/**/*.ts'], + ignores: [ + 'dist/', + 'node_modules/', + 'src/lib/api.generated.ts', + 'src/lib/api-zod.generated.ts', + 'src/lib/spec-facts.generated.ts', + 'src/lib/descriptions.generated.ts', + ], + }, + { + files: ['src/**/*.ts'], languageOptions: { parser: tsparser, parserOptions: { ecmaVersion: 2022, sourceType: 'module', + project: './tsconfig.eslint.json', }, }, plugins: { @@ -16,12 +27,45 @@ export default [ }, rules: { ...tseslint.configs.recommended.rules, - '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-unused-vars': ['error', {argsIgnorePattern: '^_'}], + // Type-safety rules — promoted to error for src/ to keep production + // code free of untyped boundary leaks. Tests below opt out because + // Vitest matchers like expect.objectContaining legitimately return any. + '@typescript-eslint/no-unsafe-assignment': 'error', + '@typescript-eslint/no-unsafe-return': 'error', + '@typescript-eslint/no-unsafe-call': 'error', + '@typescript-eslint/no-unsafe-member-access': 'error', + '@typescript-eslint/no-unsafe-argument': 'error', 'no-console': 'off', }, }, { - ignores: ['dist/', 'node_modules/', 'src/lib/api-zod.generated.ts'], + files: ['test/**/*.ts'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + project: './tsconfig.eslint.json', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + }, + rules: { + ...tseslint.configs.recommended.rules, + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-unused-vars': ['error', {argsIgnorePattern: '^_'}], + // Tests freely interact with `any`-typed mocks and Vitest matchers. + // Keeping unsafe-* off avoids noise without materially weakening + // production code (covered by the src/ block above). + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + 'no-console': 'off', + }, }, ] diff --git a/package-lock.json b/package-lock.json index 46215e5..f3f5ff2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,25 @@ "node": ">=18.0.0" } }, + "../mini/packages/openapi-tools": { + "name": "@devhelm/openapi-tools", + "version": "0.1.0", + "extraneous": true, + "license": "MIT", + "dependencies": { + "openapi-zod-client": "^1.18.0" + }, + "bin": { + "devhelm-openapi": "dist/cli.js" + }, + "devDependencies": { + "@types/node": "20.16.11", + "openapi3-ts": "^4.5.0", + "typescript": "^5.7.0", + "vitest": "^3.2.4", + "zod": "^3.25.76" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "11.7.2", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", diff --git a/scripts/generate-zod.mjs b/scripts/generate-zod.mjs index fef05f0..f588a22 100644 --- a/scripts/generate-zod.mjs +++ b/scripts/generate-zod.mjs @@ -2,19 +2,17 @@ /** * Generate Zod schemas from the OpenAPI spec for CLI validation. * - * Applies the same Springdoc preprocessing as the dashboard's sync-schema, + * Uses @devhelm/openapi-tools for preprocessing (shared with all surfaces), * then runs openapi-zod-client to produce typed Zod schemas that the YAML * validation layer imports. * * Usage: node scripts/generate-zod.mjs - * - * Preprocessing logic is kept in sync with packages/openapi-tools in the - * monorepo. If you change preprocessing there, update it here too. */ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { preprocessSpec, rewriteUnionsAsDiscriminated } from './lib/preprocess.mjs'; import { generateZodClientFromOpenAPI } from 'openapi-zod-client'; const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -22,71 +20,6 @@ const ROOT = join(__dirname, '..'); const SPEC_PATH = join(ROOT, 'docs/openapi/monitoring-api.json'); const OUTPUT_PATH = join(ROOT, 'src/lib/api-zod.generated.ts'); -// ── Springdoc preprocessing (synced from packages/openapi-tools) ────── - -function setRequiredFields(spec) { - const schemas = spec.components?.schemas ?? {}; - for (const schema of Object.values(schemas)) { - if (schema.type !== 'object' || !schema.properties) continue; - if (Array.isArray(schema.required)) { - for (const [prop, propSchema] of Object.entries(schema.properties)) { - if (propSchema.nullable) continue; - if (propSchema.oneOf && !schema.required.includes(prop)) { - schema.required.push(prop); - } - } - continue; - } - const required = []; - for (const [prop, propSchema] of Object.entries(schema.properties)) { - if (propSchema.nullable) continue; - if (propSchema.allOf) continue; - required.push(prop); - } - if (required.length > 0) schema.required = required; - } -} - -function setRequiredOnAllOfMembers(spec) { - const schemas = spec.components?.schemas ?? {}; - for (const schema of Object.values(schemas)) { - if (!Array.isArray(schema.allOf)) continue; - for (const member of schema.allOf) { - if (!member.properties) continue; - if (Array.isArray(member.required)) continue; - const required = []; - for (const [prop, propSchema] of Object.entries(member.properties)) { - if (propSchema.nullable) continue; - if (propSchema.allOf) continue; - required.push(prop); - } - if (required.length > 0) member.required = required; - } - } -} - -function pushRequiredIntoAllOf(spec) { - const schemas = spec.components?.schemas ?? {}; - for (const schema of Object.values(schemas)) { - if (!Array.isArray(schema.required) || !Array.isArray(schema.allOf)) continue; - for (const member of schema.allOf) { - if (!member.properties) continue; - const memberRequired = []; - for (const field of schema.required) { - if (field in member.properties) memberRequired.push(field); - } - if (memberRequired.length > 0) { - member.required = member.required - ? [...new Set([...member.required, ...memberRequired])] - : memberRequired; - } - } - } -} - -// ── Post-processing (strip Zodios client, keep only Zod schemas) ───── -// Same approach as sdk-js/scripts/generate-schemas.js - function extractSchemas(raw) { const lines = raw.split('\n'); const kept = []; @@ -99,16 +32,109 @@ function extractSchemas(raw) { kept.join('\n') + '\n'; } -// ── Main ────────────────────────────────────────────────────────────── +const FACTS_PATH = join(ROOT, 'src/lib/spec-facts.generated.ts'); + +/** + * Extract enum values and constraints from the OpenAPI spec to produce + * a spec-facts file. These constants replace hand-maintained arrays in + * zod-schemas.ts and schema.ts — if the API adds a new enum value or + * changes a constraint, re-running zodgen picks it up automatically. + */ +function generateSpecFacts(spec) { + const schemas = spec.components?.schemas ?? {}; + + function enumsFrom(schemaName, propName) { + const s = schemas[schemaName]; + if (!s) return null; + if (s.properties?.[propName]?.enum) return s.properties[propName].enum; + // Array-typed property whose items carry the enum + // (e.g. DnsMonitorConfig.recordTypes is `string[]` with enum on items). + if (s.properties?.[propName]?.items?.enum) { + return s.properties[propName].items.enum; + } + if (s.allOf) { + for (const member of s.allOf) { + if (member.properties?.[propName]?.enum) return member.properties[propName].enum; + if (member.properties?.[propName]?.items?.enum) return member.properties[propName].items.enum; + } + } + return null; + } + + const facts = { + MONITOR_TYPES: enumsFrom('CreateMonitorRequest', 'type'), + HTTP_METHODS: enumsFrom('HttpMonitorConfig', 'method'), + DNS_RECORD_TYPES: enumsFrom('DnsMonitorConfig', 'recordTypes'), + INCIDENT_SEVERITIES: enumsFrom('CreateManualIncidentRequest', 'severity'), + ASSERTION_SEVERITIES: enumsFrom('CreateAssertionRequest', 'severity'), + CHANNEL_TYPES: enumsFrom('AlertChannelDto', 'channelType'), + TRIGGER_RULE_TYPES: enumsFrom('TriggerRule', 'type'), + TRIGGER_SCOPES: enumsFrom('TriggerRule', 'scope'), + TRIGGER_SEVERITIES: enumsFrom('TriggerRule', 'severity'), + TRIGGER_AGGREGATIONS: enumsFrom('TriggerRule', 'aggregationType'), + ALERT_SENSITIVITIES: enumsFrom('ServiceSubscriptionDto', 'alertSensitivity'), + HEALTH_THRESHOLD_TYPES: enumsFrom('CreateResourceGroupRequest', 'healthThresholdType'), + STATUS_PAGE_VISIBILITIES: enumsFrom('CreateStatusPageRequest', 'visibility'), + STATUS_PAGE_INCIDENT_MODES: enumsFrom('CreateStatusPageRequest', 'incidentMode'), + STATUS_PAGE_COMPONENT_TYPES: enumsFrom('CreateStatusPageComponentRequest', 'type'), + SP_INCIDENT_IMPACTS: enumsFrom('CreateStatusPageIncidentRequest', 'impact'), + SP_INCIDENT_STATUSES: enumsFrom('CreateStatusPageIncidentRequest', 'status'), + AUTH_TYPES: enumsFrom('MonitorAuthDto', 'authType'), + MANAGED_BY: enumsFrom('CreateMonitorRequest', 'managedBy'), + // ``operator`` is duplicated across StatusCodeAssertion, HeaderValueAssertion, + // JsonPathAssertion, ResponseSizeAssertion, etc. — pull from one + // representative schema. The validator and Zod layer share this single + // tuple so a spec change to the comparison operators is picked up + // automatically by re-running ``zodgen``. + COMPARISON_OPERATORS: enumsFrom('StatusCodeAssertion', 'operator'), + }; + + const lines = [ + '// Auto-generated from OpenAPI spec. DO NOT EDIT.', + '// Re-run `npm run zodgen` to regenerate.', + '', + ]; + + for (const [name, values] of Object.entries(facts)) { + if (!values) { + lines.push(`// WARNING: ${name} — enum not found in spec`); + continue; + } + const items = values.map(v => `'${v}'`).join(', '); + lines.push(`export const ${name} = [${items}] as const`); + const typeName = name.split('_').map(w => w[0] + w.slice(1).toLowerCase()).join(''); + lines.push(`export type ${typeName} = (typeof ${name})[number]`); + lines.push(''); + } + + writeFileSync(FACTS_PATH, lines.join('\n') + '\n', 'utf8'); + console.log(`Generated spec facts (${Object.keys(facts).length} enums) → ${FACTS_PATH}`); +} async function main() { console.log('Reading spec from', SPEC_PATH); const spec = JSON.parse(readFileSync(SPEC_PATH, 'utf8')); - setRequiredFields(spec); - setRequiredOnAllOfMembers(spec); - pushRequiredIntoAllOf(spec); + const { flattened, inlinedDiscriminators, inlinedNullableDeductions } = + preprocessSpec(spec); console.log(`Preprocessed spec (${Object.keys(spec.components?.schemas ?? {}).length} schemas)`); + if (flattened.length > 0) { + console.log(` Flattened circular oneOf: ${flattened.join(', ')}`); + } + if (inlinedDiscriminators.length > 0) { + console.log( + ` Inlined discriminator subtypes: ${inlinedDiscriminators + .map((u) => `${u.parent}(${u.discriminator})`) + .join(', ')}`, + ); + } + if (inlinedNullableDeductions && inlinedNullableDeductions.length > 0) { + console.log( + ` Inlined nullable deduction refs for: ${inlinedNullableDeductions.join(', ')}`, + ); + } + + generateSpecFacts(spec); mkdirSync(dirname(OUTPUT_PATH), { recursive: true }); @@ -117,11 +143,20 @@ async function main() { distPath: OUTPUT_PATH, options: { exportSchemas: true, + // Strict objects everywhere — generated `.passthrough()` calls erase + // type narrowing in consumers (e.g. CLI YAML validators). Also + // required so `z.union([...])` correctly rejects non-matching + // variants instead of silently stripping subtype-specific fields. + additionalPropertiesDefaultValue: false, + strictObjects: true, }, }); const raw = readFileSync(OUTPUT_PATH, 'utf8'); - const clean = extractSchemas(raw); + let clean = extractSchemas(raw); + // Post-process: convert `z.union([...])` → `z.discriminatedUnion("type", [...])` + // for hierarchies the preprocessor inlined. + clean = rewriteUnionsAsDiscriminated(clean, inlinedDiscriminators); writeFileSync(OUTPUT_PATH, clean, 'utf8'); const schemaCount = (clean.match(/^const /gm) || []).length; diff --git a/scripts/lib/preprocess.mjs b/scripts/lib/preprocess.mjs new file mode 100644 index 0000000..0b6fd80 --- /dev/null +++ b/scripts/lib/preprocess.mjs @@ -0,0 +1,359 @@ +/** + * Vendored OpenAPI spec preprocessing for Zod schema generation. + * + * Identical logic to @devhelm/openapi-tools/preprocess in the upstream + * mono repo. Vendored here so the CLI build is self-contained and + * doesn't depend on a sibling-checkout file: dependency that breaks CI + * the moment it runs anywhere outside the dev workstation. + * + * Springdoc (the Java OpenAPI generator) has quirks that produce specs + * incompatible with openapi-zod-client / openapi-typescript: + * + * 1. Missing `required` arrays on object schemas — Springdoc only + * populates `required` when @NotBlank/@NotNull annotations exist. + * Primitive `int` fields and unannotated non-nullable fields get + * omitted, so the codegen makes them optional (`.partial()`). + * + * 2. `required` at schema root while `properties` live inside `allOf` — + * openapi-zod-client processes each allOf member independently and + * generates `.partial()` for inner objects without their own + * `required`. + * + * 3. Discriminator-based polymorphic types (`@JsonTypeInfo`) emit: + * - parent: `{type: object, properties: {: {type: string}}, discriminator}` + * - subtype: `{allOf: [{$ref: parent}, {type: object, properties: {...}}]}` + * which downstream codegens handle inconsistently and which lose all + * union information at nullable use sites. Pass A inlines parent + * props into each subtype + overloads the discriminator field with a + * `string` enum literal; pass B rewrites the parent itself as a + * `oneOf` of subtype refs (preserving the discriminator). + * + * 4. Circular `oneOf` + `allOf` back-references — openapi-zod-client + * turns these into `z.lazy()` with broken type inference. After the + * discriminator inline pass these no longer exist for the inlined + * hierarchies, but other (non-discriminated) cycles may still occur. + * + * These functions mutate the spec in-place. + */ + +function isSchemaObj(v) { + return v && typeof v === 'object' && !('$ref' in v); +} + +function getSchemas(spec) { + return spec.components?.schemas ?? {}; +} + +export function setRequiredFields(spec) { + const schemas = getSchemas(spec); + for (const schema of Object.values(schemas)) { + if (schema.type !== 'object' || !schema.properties) continue; + const existing = Array.isArray(schema.required) ? schema.required : []; + for (const [prop, raw] of Object.entries(schema.properties)) { + if (!isSchemaObj(raw)) continue; + if (raw.nullable) continue; + if (raw.allOf) continue; + if ('default' in raw) continue; + if (!existing.includes(prop)) existing.push(prop); + } + if (existing.length > 0) schema.required = existing; + } +} + +export function setRequiredOnAllOfMembers(spec) { + const schemas = getSchemas(spec); + for (const schema of Object.values(schemas)) { + if (!Array.isArray(schema.allOf)) continue; + for (const member of schema.allOf) { + if (!isSchemaObj(member)) continue; + if (!member.properties) continue; + if (Array.isArray(member.required)) continue; + const required = []; + for (const [prop, raw] of Object.entries(member.properties)) { + if (!isSchemaObj(raw)) continue; + if (raw.nullable) continue; + if (raw.allOf) continue; + if ('default' in raw) continue; + required.push(prop); + } + if (required.length > 0) member.required = required; + } + } +} + +export function pushRequiredIntoAllOf(spec) { + const schemas = getSchemas(spec); + for (const schema of Object.values(schemas)) { + if (!Array.isArray(schema.required) || !Array.isArray(schema.allOf)) continue; + for (const member of schema.allOf) { + if (!isSchemaObj(member)) continue; + if (!member.properties) continue; + const memberRequired = []; + for (const field of schema.required) { + if (field in member.properties) memberRequired.push(field); + } + if (memberRequired.length > 0) { + member.required = member.required + ? [...new Set([...member.required, ...memberRequired])] + : memberRequired; + } + } + } +} + +function inlineSubtype(subtype, parent, parentName, discProp, discValue) { + const allOf = subtype.allOf ?? []; + let inlineMember; + for (const m of allOf) { + if (!isSchemaObj(m)) continue; + inlineMember = m; + break; + } + + const mergedProps = {}; + if (parent.properties) Object.assign(mergedProps, parent.properties); + if (inlineMember?.properties) Object.assign(mergedProps, inlineMember.properties); + if (subtype.properties) Object.assign(mergedProps, subtype.properties); + + mergedProps[discProp] = { type: 'string', enum: [discValue] }; + + const requiredSet = new Set(); + for (const r of parent.required ?? []) requiredSet.add(r); + for (const r of inlineMember?.required ?? []) requiredSet.add(r); + for (const r of subtype.required ?? []) requiredSet.add(r); + requiredSet.add(discProp); + + const description = subtype.description ?? inlineMember?.description; + + delete subtype.allOf; + subtype.type = 'object'; + subtype.properties = mergedProps; + subtype.required = Array.from(requiredSet); + if (description) subtype.description = description; + + void parentName; +} + +/** + * Inline discriminator subtypes and rewrite the parent as a `oneOf` of + * subtype refs (with discriminator preserved). Returns metadata for each + * rewritten hierarchy so callers can post-process generated code. + */ +export function inlineDiscriminatorSubtypesWithInfo(spec) { + const schemas = getSchemas(spec); + const result = []; + + for (const [parentName, parent] of Object.entries(schemas)) { + const disc = parent.discriminator; + if (!disc?.propertyName || !disc.mapping) continue; + const discProp = disc.propertyName; + + const subtypeNames = new Map(); + for (const [value, ref] of Object.entries(disc.mapping)) { + if (typeof ref !== 'string') continue; + const name = ref.split('/').pop(); + if (name && schemas[name]) subtypeNames.set(name, value); + } + if (subtypeNames.size === 0) continue; + + for (const [subtypeName, discValue] of subtypeNames) { + inlineSubtype(schemas[subtypeName], parent, parentName, discProp, discValue); + } + + const subtypeRefs = Array.from(subtypeNames.keys()).map((name) => ({ + $ref: `#/components/schemas/${name}`, + })); + const description = parent.description; + const rewritten = { oneOf: subtypeRefs, discriminator: disc }; + if (description) rewritten.description = description; + + delete parent.type; + delete parent.properties; + delete parent.required; + delete parent.allOf; + Object.assign(parent, rewritten); + + result.push({ + parent: parentName, + discriminator: discProp, + subtypes: Array.from(subtypeNames.keys()), + }); + } + return result; +} + +export function flattenCircularOneOf(spec) { + const schemas = getSchemas(spec); + const flattened = []; + for (const [name, schema] of Object.entries(schemas)) { + if (!Array.isArray(schema.oneOf)) continue; + const isCircular = schema.oneOf.some((member) => { + const ref = '$ref' in member ? member.$ref : undefined; + const refName = ref?.split('/').pop(); + const refSchema = refName ? schemas[refName] : undefined; + if (!refSchema || !Array.isArray(refSchema.allOf)) return false; + return refSchema.allOf.some( + (a) => '$ref' in a && a.$ref === `#/components/schemas/${name}`, + ); + }); + if (isCircular) { + delete schema.oneOf; + flattened.push(name); + } + } + return flattened; +} + +/** + * Rewrite `{nullable: true, allOf: [{$ref: Parent}]}` wrappers into an + * inline `oneOf` of subtype refs, for Jackson `Id.DEDUCTION` hierarchies + * (e.g. `MonitorConfig`) where Springdoc emits an abstract empty parent. + * + * Without this pass, `UpdateMonitorRequest.config` resolves to an empty + * `z.object({})` and silently strips the entire config body. + */ +export function inlineNullableDeductionRefs(spec) { + const schemas = getSchemas(spec); + const rewritten = new Set(); + + const abstractParents = new Set(); + for (const [name, schema] of Object.entries(schemas)) { + const isAbstract = + !schema.oneOf && + !schema.properties && + !schema.allOf && + (schema.type === 'object' || schema.type === undefined); + if (isAbstract) abstractParents.add(name); + } + if (abstractParents.size === 0) return []; + + const subtypesByParent = new Map(); + for (const parent of abstractParents) { + const parentRef = `#/components/schemas/${parent}`; + const subs = []; + for (const [name, schema] of Object.entries(schemas)) { + if (name === parent) continue; + if (!Array.isArray(schema.allOf)) continue; + const hasBackref = schema.allOf.some( + (m) => '$ref' in m && m.$ref === parentRef, + ); + if (hasBackref) subs.push(name); + } + if (subs.length >= 2) subtypesByParent.set(parent, subs); + } + if (subtypesByParent.size === 0) return []; + + // Flatten each subtype: drop the `{$ref: parent}` entry so generated codegens + // don't intersect the subtype with the empty strict parent. + for (const [parent, subs] of subtypesByParent) { + const parentRef = `#/components/schemas/${parent}`; + for (const subName of subs) { + const sub = schemas[subName]; + if (!sub || !Array.isArray(sub.allOf)) continue; + const remaining = sub.allOf.filter( + (m) => !('$ref' in m) || m.$ref !== parentRef, + ); + if (remaining.length === sub.allOf.length) continue; + if (remaining.length === 0) { + delete sub.allOf; + } else if (remaining.length === 1 && isSchemaObj(remaining[0])) { + const inline = remaining[0]; + delete sub.allOf; + if (inline.type && !sub.type) sub.type = inline.type; + if (inline.properties) { + sub.properties = { ...(sub.properties ?? {}), ...inline.properties }; + } + if (Array.isArray(inline.required)) { + const merged = new Set([ + ...(sub.required ?? []), + ...inline.required, + ]); + sub.required = Array.from(merged); + } + if ( + inline.additionalProperties !== undefined && + sub.additionalProperties === undefined + ) { + sub.additionalProperties = inline.additionalProperties; + } + } else { + sub.allOf = remaining; + } + } + } + + const visit = (schema) => { + if (!isSchemaObj(schema)) return; + const props = schema.properties; + if (props) { + for (const raw of Object.values(props)) { + if (!isSchemaObj(raw)) continue; + if (Array.isArray(raw.allOf) && raw.allOf.length === 1) { + const m = raw.allOf[0]; + if ('$ref' in m && typeof m.$ref === 'string') { + const n = m.$ref.split('/').pop(); + const subs = n ? subtypesByParent.get(n) : undefined; + if (subs && n) { + delete raw.allOf; + raw.oneOf = subs.map((s) => ({ + $ref: `#/components/schemas/${s}`, + })); + rewritten.add(n); + } + } + } + visit(raw); + } + } + if (Array.isArray(schema.allOf)) for (const m of schema.allOf) visit(m); + if (Array.isArray(schema.oneOf)) for (const m of schema.oneOf) visit(m); + if (Array.isArray(schema.anyOf)) for (const m of schema.anyOf) visit(m); + }; + for (const schema of Object.values(schemas)) visit(schema); + + return Array.from(rewritten); +} + +export function preprocessSpec(spec) { + setRequiredFields(spec); + setRequiredOnAllOfMembers(spec); + pushRequiredIntoAllOf(spec); + // Inline discriminator subtypes BEFORE the circular-oneOf flatten so we + // don't accidentally drop the parent oneOf we just installed (the cycle + // is broken once subtypes no longer back-reference the parent). + const inlinedDiscriminators = inlineDiscriminatorSubtypesWithInfo(spec); + // Must run AFTER the discriminator pass so we don't misidentify proper + // discriminator-based parents as abstract/empty ones. + const inlinedNullableDeductions = inlineNullableDeductionRefs(spec); + const flattened = flattenCircularOneOf(spec); + return { flattened, inlinedDiscriminators, inlinedNullableDeductions }; +} + +/** + * Rewrite `z.union([A, B, C])` calls into + * `z.discriminatedUnion("", [A, B, C])` when the member set matches + * one of the supplied unions exactly (set equality). + */ +export function rewriteUnionsAsDiscriminated(source, unions) { + if (!unions || unions.length === 0) return source; + + const lookup = new Map(); + for (const u of unions) { + const key = [...u.subtypes].sort().join(','); + lookup.set(key, u.discriminator); + } + + const unionRe = + /z\.union\(\s*\[\s*([A-Z][A-Za-z0-9_]*(?:\s*,\s*[A-Z][A-Za-z0-9_]*)*)\s*,?\s*\]\s*\)/g; + + return source.replace(unionRe, (full, members) => { + const memberList = members + .split(',') + .map((s) => s.trim()) + .filter(Boolean); + const key = [...memberList].sort().join(','); + const disc = lookup.get(key); + if (!disc) return full; + return `z.discriminatedUnion("${disc}", [${memberList.join(', ')}])`; + }); +} diff --git a/src/commands/alert-channels/test.ts b/src/commands/alert-channels/test.ts index 5d6d460..572f955 100644 --- a/src/commands/alert-channels/test.ts +++ b/src/commands/alert-channels/test.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class AlertChannelsTest extends Command { static description = 'Send a test notification to an alert channel' static examples = ['<%= config.bin %> alert-channels test '] - static args = {id: Args.string({description: 'Alert channel ID', required: true})} + static args = {id: uuidArg({description: 'Alert channel ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/auth/login.ts b/src/commands/auth/login.ts index f6f0cd1..6287135 100644 --- a/src/commands/auth/login.ts +++ b/src/commands/auth/login.ts @@ -26,14 +26,17 @@ export default class AuthLogin extends Command { try { const resp = await checkedFetch(client.GET('/api/v1/auth/me')) - const me = resp.data + if (!resp.data) { + throw new Error('Empty response') + } + const me = resp.data saveContext({name: flags.name, apiUrl, token}, true) this.log('') this.log(` Authenticated successfully.`) - this.log(` Organization: ${me?.organization?.name ?? 'unknown'} (ID: ${me?.organization?.id ?? '?'})`) - this.log(` Key: ${me?.key?.name ?? 'unknown'}`) - this.log(` Plan: ${me?.plan?.tier ?? 'unknown'}`) + this.log(` Organization: ${me.organization?.name ?? 'unknown'} (ID: ${me.organization?.id ?? '?'})`) + this.log(` Key: ${me.key?.name ?? 'unknown'}`) + this.log(` Plan: ${me.plan?.tier ?? 'unknown'}`) this.log('') this.log(` Context '${flags.name}' saved to ~/.devhelm/contexts.json`) return diff --git a/src/commands/auth/me.ts b/src/commands/auth/me.ts index 3c9c09e..e597134 100644 --- a/src/commands/auth/me.ts +++ b/src/commands/auth/me.ts @@ -2,6 +2,7 @@ import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' import {formatOutput, OutputFormat} from '../../lib/output.js' +import {AuthMeResponseSchema} from '../../lib/response-schemas.js' export default class AuthMe extends Command { static description = 'Show current API key identity, organization, plan, and rate limits' @@ -12,6 +13,15 @@ export default class AuthMe extends Command { const {flags} = await this.parse(AuthMe) const client = buildClient(flags) const resp = await checkedFetch(client.GET('/api/v1/auth/me')) + if (!resp.data) { + this.error('API returned an empty response for /api/v1/auth/me') + } + + const parsed = AuthMeResponseSchema.safeParse(resp.data) + if (!parsed.success) { + this.error(`Unexpected auth/me response shape: ${parsed.error.issues.map((i) => i.message).join(', ')}`) + } + const me = resp.data const format = flags.output as OutputFormat @@ -20,10 +30,10 @@ export default class AuthMe extends Command { return } - const k = me?.key ?? {} - const o = me?.organization ?? {} - const p = me?.plan ?? {} - const r = me?.rateLimits ?? {} + const k = me.key + const o = me.organization + const p = me.plan + const r = me.rateLimits this.log('') this.log(' API Key') diff --git a/src/commands/deploy/force-unlock.ts b/src/commands/deploy/force-unlock.ts index deb7696..3cda20c 100644 --- a/src/commands/deploy/force-unlock.ts +++ b/src/commands/deploy/force-unlock.ts @@ -1,6 +1,7 @@ import {Command, Flags} from '@oclif/core' import {createApiClient, apiDelete} from '../../lib/api-client.js' import {resolveToken, resolveApiUrl} from '../../lib/auth.js' +import {urlFlag} from '../../lib/validators.js' export default class DeployForceUnlock extends Command { static description = 'Force-release a stuck deploy lock on the current workspace' @@ -16,7 +17,7 @@ export default class DeployForceUnlock extends Command { description: 'Skip confirmation prompt', default: false, }), - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/commands/deploy/index.ts b/src/commands/deploy/index.ts index f48ea1c..72e40d1 100644 --- a/src/commands/deploy/index.ts +++ b/src/commands/deploy/index.ts @@ -3,6 +3,7 @@ import {Command, Flags} from '@oclif/core' import {createApiClient, apiPost, apiDelete} from '../../lib/api-client.js' import {resolveToken, resolveApiUrl} from '../../lib/auth.js' import {EXIT_CODES} from '../../lib/errors.js' +import {urlFlag} from '../../lib/validators.js' import {loadConfig, validate, validatePlanRefs, fetchAllRefs, registerYamlPendingRefs, diff, formatPlan, changesetToJson, apply, writeState, buildStateV2, readState, emptyState, processMovedBlocks, resourceAddress, StateFileCorruptError} from '../../lib/yaml/index.js' import {checkEntitlements, formatEntitlementWarnings} from '../../lib/yaml/entitlements.js' @@ -68,7 +69,7 @@ export default class Deploy extends Command { description: 'Seconds to wait for a conflicting lock to release (0 = fail immediately)', default: 0, }), - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/commands/import.ts b/src/commands/import.ts index 6bd94df..b87d0c9 100644 --- a/src/commands/import.ts +++ b/src/commands/import.ts @@ -2,6 +2,7 @@ import {Command, Args, Flags} from '@oclif/core' import type {components} from '../lib/api.generated.js' import {createApiClient} from '../lib/api-client.js' import {resolveToken, resolveApiUrl} from '../lib/auth.js' +import {urlFlag} from '../lib/validators.js' import {fetchAllRefs} from '../lib/yaml/resolver.js' import {allHandlers} from '../lib/yaml/handlers.js' import {fetchPaginated} from '../lib/typed-api.js' @@ -37,7 +38,7 @@ export default class Import extends Command { } static flags = { - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/commands/incidents/resolve.ts b/src/commands/incidents/resolve.ts index 6e0d516..d460dfe 100644 --- a/src/commands/incidents/resolve.ts +++ b/src/commands/incidents/resolve.ts @@ -1,11 +1,12 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class IncidentsResolve extends Command { static description = 'Resolve an incident' static examples = ['<%= config.bin %> incidents resolve 42'] - static args = {id: Args.string({description: 'Incident ID', required: true})} + static args = {id: uuidArg({description: 'Incident ID', required: true})} static flags = { ...globalFlags, message: Flags.string({description: 'Resolution message'}), diff --git a/src/commands/monitors/pause.ts b/src/commands/monitors/pause.ts index e54677b..7e910b3 100644 --- a/src/commands/monitors/pause.ts +++ b/src/commands/monitors/pause.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class MonitorsPause extends Command { static description = 'Pause a monitor' static examples = ['<%= config.bin %> monitors pause 42'] - static args = {id: Args.string({description: 'Monitor ID', required: true})} + static args = {id: uuidArg({description: 'Monitor ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/monitors/results.ts b/src/commands/monitors/results.ts index 67587e0..8952df1 100644 --- a/src/commands/monitors/results.ts +++ b/src/commands/monitors/results.ts @@ -1,14 +1,15 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../lib/base-command.js' import {fetchCursorPaginated} from '../../lib/typed-api.js' import type {components} from '../../lib/api.generated.js' +import {uuidArg} from '../../lib/validators.js' type CheckResultDto = components['schemas']['CheckResultDto'] export default class MonitorsResults extends Command { static description = 'Show recent check results for a monitor' static examples = ['<%= config.bin %> monitors results 42'] - static args = {id: Args.string({description: 'Monitor ID', required: true})} + static args = {id: uuidArg({description: 'Monitor ID', required: true})} static flags = { ...globalFlags, limit: Flags.integer({description: 'Maximum number of results to show (1–1000)', default: 20}), @@ -23,12 +24,12 @@ export default class MonitorsResults extends Command { {maxItems: flags.limit}, ) display(this, items, flags.output, [ - {header: 'ID', get: (r) => String(r.id ?? '')}, - {header: 'PASSED', get: (r) => (r.passed == null ? '' : r.passed ? 'Pass' : 'Fail')}, - {header: 'RESPONSE TIME', get: (r) => (r.responseTimeMs != null ? `${r.responseTimeMs}ms` : '')}, - {header: 'CODE', get: (r) => String(r.details?.statusCode ?? '')}, - {header: 'REGION', get: (r) => String(r.region ?? '')}, - {header: 'TIMESTAMP', get: (r) => String(r.timestamp ?? '')}, + {header: 'ID', get: (r: CheckResultDto) => String(r.id ?? '')}, + {header: 'PASSED', get: (r: CheckResultDto) => (r.passed == null ? '' : r.passed ? 'Pass' : 'Fail')}, + {header: 'RESPONSE TIME', get: (r: CheckResultDto) => (r.responseTimeMs != null ? `${r.responseTimeMs}ms` : '')}, + {header: 'CODE', get: (r: CheckResultDto) => String(r.details?.statusCode ?? '')}, + {header: 'REGION', get: (r: CheckResultDto) => String(r.region ?? '')}, + {header: 'TIMESTAMP', get: (r: CheckResultDto) => String(r.timestamp ?? '')}, ]) } } diff --git a/src/commands/monitors/resume.ts b/src/commands/monitors/resume.ts index c84bfa6..8e0088a 100644 --- a/src/commands/monitors/resume.ts +++ b/src/commands/monitors/resume.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class MonitorsResume extends Command { static description = 'Resume a paused monitor' static examples = ['<%= config.bin %> monitors resume 42'] - static args = {id: Args.string({description: 'Monitor ID', required: true})} + static args = {id: uuidArg({description: 'Monitor ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/monitors/test.ts b/src/commands/monitors/test.ts index 2d37af1..49474ee 100644 --- a/src/commands/monitors/test.ts +++ b/src/commands/monitors/test.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient, display} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class MonitorsTest extends Command { static description = 'Run an ad-hoc test for a monitor' static examples = ['<%= config.bin %> monitors test 42'] - static args = {id: Args.string({description: 'Monitor ID', required: true})} + static args = {id: uuidArg({description: 'Monitor ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/monitors/versions/get.ts b/src/commands/monitors/versions/get.ts index dbe7b11..149cbd0 100644 --- a/src/commands/monitors/versions/get.ts +++ b/src/commands/monitors/versions/get.ts @@ -2,6 +2,7 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiGet} from '../../../lib/api-client.js' import type {components} from '../../../lib/api.generated.js' +import {uuidArg} from '../../../lib/validators.js' type MonitorVersionDto = components['schemas']['MonitorVersionDto'] @@ -13,7 +14,7 @@ export default class MonitorsVersionsGet extends Command { ] static args = { - id: Args.string({description: 'Monitor ID', required: true}), + id: uuidArg({description: 'Monitor ID', required: true}), version: Args.integer({description: 'Version number', required: true}), } diff --git a/src/commands/monitors/versions/list.ts b/src/commands/monitors/versions/list.ts index 54ac671..6250f41 100644 --- a/src/commands/monitors/versions/list.ts +++ b/src/commands/monitors/versions/list.ts @@ -1,7 +1,8 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' import type {components} from '../../../lib/api.generated.js' +import {uuidArg} from '../../../lib/validators.js' type MonitorVersionDto = components['schemas']['MonitorVersionDto'] @@ -13,7 +14,7 @@ export default class MonitorsVersionsList extends Command { '<%= config.bin %> monitors versions list 42 -o json', ] - static args = {id: Args.string({description: 'Monitor ID', required: true})} + static args = {id: uuidArg({description: 'Monitor ID', required: true})} static flags = { ...globalFlags, limit: Flags.integer({description: 'Maximum number of versions to show', default: 20}), @@ -29,11 +30,11 @@ export default class MonitorsVersionsList extends Command { ) const items = allVersions.slice(0, flags.limit) display(this, items, flags.output, [ - {header: 'VERSION', get: (r) => String(r.version ?? '')}, - {header: 'CHANGED VIA', get: (r) => String(r.changedVia ?? '')}, - {header: 'SUMMARY', get: (r) => r.changeSummary ?? ''}, - {header: 'CREATED AT', get: (r) => String(r.createdAt ?? '')}, - {header: 'ID', get: (r) => String(r.id ?? '')}, + {header: 'VERSION', get: (r: MonitorVersionDto) => String(r.version ?? '')}, + {header: 'CHANGED VIA', get: (r: MonitorVersionDto) => String(r.changedVia ?? '')}, + {header: 'SUMMARY', get: (r: MonitorVersionDto) => r.changeSummary ?? ''}, + {header: 'CREATED AT', get: (r: MonitorVersionDto) => String(r.createdAt ?? '')}, + {header: 'ID', get: (r: MonitorVersionDto) => String(r.id ?? '')}, ]) } } diff --git a/src/commands/notification-policies/test.ts b/src/commands/notification-policies/test.ts index 3c434c1..b397174 100644 --- a/src/commands/notification-policies/test.ts +++ b/src/commands/notification-policies/test.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class NotificationPoliciesTest extends Command { static description = 'Test a notification policy' static examples = ['<%= config.bin %> notification-policies test '] - static args = {id: Args.string({description: 'Policy ID', required: true})} + static args = {id: uuidArg({description: 'Policy ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/plan.ts b/src/commands/plan.ts index e3ca9fd..feabd51 100644 --- a/src/commands/plan.ts +++ b/src/commands/plan.ts @@ -2,6 +2,7 @@ import {Command, Flags} from '@oclif/core' import {createApiClient} from '../lib/api-client.js' import {resolveToken, resolveApiUrl} from '../lib/auth.js' import {EXIT_CODES} from '../lib/errors.js' +import {urlFlag} from '../lib/validators.js' import {loadConfig, validate, validatePlanRefs, fetchAllRefs, registerYamlPendingRefs, diff, formatPlan, changesetToJson, readState, emptyState, previewMovedBlocks, StateFileCorruptError} from '../lib/yaml/index.js' import {checkEntitlements, formatEntitlementWarnings} from '../lib/yaml/entitlements.js' @@ -42,7 +43,7 @@ export default class Plan extends Command { options: ['text', 'json'], default: 'text', }), - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/commands/state/pull.ts b/src/commands/state/pull.ts index e885bb5..cdd1891 100644 --- a/src/commands/state/pull.ts +++ b/src/commands/state/pull.ts @@ -2,6 +2,7 @@ import {Command, Flags} from '@oclif/core' import type {components} from '../../lib/api.generated.js' import {createApiClient} from '../../lib/api-client.js' import {resolveToken, resolveApiUrl} from '../../lib/auth.js' +import {urlFlag} from '../../lib/validators.js' import {fetchAllRefs} from '../../lib/yaml/resolver.js' import {allHandlers} from '../../lib/yaml/handlers.js' import {fetchPaginated} from '../../lib/typed-api.js' @@ -20,7 +21,7 @@ export default class StatePull extends Command { static flags = { 'dry-run': Flags.boolean({description: 'Show what would be written without saving', default: false}), - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/commands/status-pages/components/create.ts b/src/commands/status-pages/components/create.ts index 87e09ad..a3f613d 100644 --- a/src/commands/status-pages/components/create.ts +++ b/src/commands/status-pages/components/create.ts @@ -1,15 +1,17 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {STATUS_PAGE_COMPONENT_TYPES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesComponentsCreate extends Command { static description = 'Add a component to a status page' static examples = ['<%= config.bin %> status-pages components create --name "API" --type STATIC'] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, name: Flags.string({description: 'Component name', required: true}), - type: Flags.string({description: 'Component type', required: true, options: ['STATIC', 'MONITOR', 'GROUP']}), + type: Flags.string({description: 'Component type', required: true, options: [...STATUS_PAGE_COMPONENT_TYPES]}), 'monitor-id': Flags.string({description: 'Monitor ID (required when type=MONITOR)'}), 'resource-group-id': Flags.string({description: 'Resource group ID (required when type=GROUP)'}), 'group-id': Flags.string({description: 'Component group ID for visual grouping'}), diff --git a/src/commands/status-pages/components/delete.ts b/src/commands/status-pages/components/delete.ts index 3e8ecee..7d10c59 100644 --- a/src/commands/status-pages/components/delete.ts +++ b/src/commands/status-pages/components/delete.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesComponentsDelete extends Command { static description = 'Remove a component from a status page' static examples = ['<%= config.bin %> status-pages components delete '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'component-id': Args.string({description: 'Component ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'component-id': uuidArg({description: 'Component ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/components/list.ts b/src/commands/status-pages/components/list.ts index 72c53e2..ae8fc1d 100644 --- a/src/commands/status-pages/components/list.ts +++ b/src/commands/status-pages/components/list.ts @@ -1,14 +1,15 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import type {components} from '../../../lib/api.generated.js' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' type StatusPageComponent = components['schemas']['StatusPageComponentDto'] export default class StatusPagesComponentsList extends Command { static description = 'List components on a status page' static examples = ['<%= config.bin %> status-pages components list '] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/status-pages/components/update.ts b/src/commands/status-pages/components/update.ts index 1c32c4b..a6430d1 100644 --- a/src/commands/status-pages/components/update.ts +++ b/src/commands/status-pages/components/update.ts @@ -1,13 +1,14 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPut} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesComponentsUpdate extends Command { static description = 'Update a status page component' static examples = ['<%= config.bin %> status-pages components update --name "API v2"'] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'component-id': Args.string({description: 'Component ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'component-id': uuidArg({description: 'Component ID', required: true}), } static flags = { ...globalFlags, diff --git a/src/commands/status-pages/domains/add.ts b/src/commands/status-pages/domains/add.ts index c0bc9eb..73d8f55 100644 --- a/src/commands/status-pages/domains/add.ts +++ b/src/commands/status-pages/domains/add.ts @@ -1,11 +1,12 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesDomainsAdd extends Command { static description = 'Add a custom domain to a status page' static examples = ['<%= config.bin %> status-pages domains add --hostname status.example.com'] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, hostname: Flags.string({description: 'Custom domain hostname', required: true}), diff --git a/src/commands/status-pages/domains/list.ts b/src/commands/status-pages/domains/list.ts index 4c3118f..4b8c104 100644 --- a/src/commands/status-pages/domains/list.ts +++ b/src/commands/status-pages/domains/list.ts @@ -1,14 +1,15 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import type {components} from '../../../lib/api.generated.js' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' type StatusPageCustomDomain = components['schemas']['StatusPageCustomDomainDto'] export default class StatusPagesDomainsList extends Command { static description = 'List custom domains on a status page' static examples = ['<%= config.bin %> status-pages domains list '] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/status-pages/domains/remove.ts b/src/commands/status-pages/domains/remove.ts index c161383..4133310 100644 --- a/src/commands/status-pages/domains/remove.ts +++ b/src/commands/status-pages/domains/remove.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesDomainsRemove extends Command { static description = 'Remove a custom domain from a status page' static examples = ['<%= config.bin %> status-pages domains remove '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'domain-id': Args.string({description: 'Domain ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'domain-id': uuidArg({description: 'Domain ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/domains/verify.ts b/src/commands/status-pages/domains/verify.ts index 4d14293..ff891cf 100644 --- a/src/commands/status-pages/domains/verify.ts +++ b/src/commands/status-pages/domains/verify.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesDomainsVerify extends Command { static description = 'Verify a custom domain on a status page' static examples = ['<%= config.bin %> status-pages domains verify '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'domain-id': Args.string({description: 'Domain ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'domain-id': uuidArg({description: 'Domain ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/groups/create.ts b/src/commands/status-pages/groups/create.ts index 7491728..e1dc121 100644 --- a/src/commands/status-pages/groups/create.ts +++ b/src/commands/status-pages/groups/create.ts @@ -1,11 +1,12 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesGroupsCreate extends Command { static description = 'Create a component group on a status page' static examples = ['<%= config.bin %> status-pages groups create --name "Infrastructure"'] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, name: Flags.string({description: 'Group name', required: true}), diff --git a/src/commands/status-pages/groups/delete.ts b/src/commands/status-pages/groups/delete.ts index e5d8ff4..162204e 100644 --- a/src/commands/status-pages/groups/delete.ts +++ b/src/commands/status-pages/groups/delete.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesGroupsDelete extends Command { static description = 'Delete a component group from a status page' static examples = ['<%= config.bin %> status-pages groups delete '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'group-id': Args.string({description: 'Group ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'group-id': uuidArg({description: 'Group ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/groups/list.ts b/src/commands/status-pages/groups/list.ts index 8a9048e..4399174 100644 --- a/src/commands/status-pages/groups/list.ts +++ b/src/commands/status-pages/groups/list.ts @@ -1,14 +1,15 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import type {components} from '../../../lib/api.generated.js' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' type StatusPageComponentGroup = components['schemas']['StatusPageComponentGroupDto'] export default class StatusPagesGroupsList extends Command { static description = 'List component groups on a status page' static examples = ['<%= config.bin %> status-pages groups list '] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/commands/status-pages/groups/update.ts b/src/commands/status-pages/groups/update.ts index e32b70a..0216ffb 100644 --- a/src/commands/status-pages/groups/update.ts +++ b/src/commands/status-pages/groups/update.ts @@ -1,13 +1,14 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPut} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesGroupsUpdate extends Command { static description = 'Update a component group on a status page' static examples = ['<%= config.bin %> status-pages groups update --name "Core"'] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'group-id': Args.string({description: 'Group ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'group-id': uuidArg({description: 'Group ID', required: true}), } static flags = { ...globalFlags, diff --git a/src/commands/status-pages/incidents/create.ts b/src/commands/status-pages/incidents/create.ts index 9440d27..295e533 100644 --- a/src/commands/status-pages/incidents/create.ts +++ b/src/commands/status-pages/incidents/create.ts @@ -1,17 +1,19 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {SP_INCIDENT_IMPACTS, SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsCreate extends Command { static description = 'Create an incident on a status page' static examples = ['<%= config.bin %> status-pages incidents create --title "Outage" --impact MAJOR'] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, title: Flags.string({description: 'Incident title', required: true}), - impact: Flags.string({description: 'Incident impact', required: true, options: ['NONE', 'MINOR', 'MAJOR', 'CRITICAL']}), + impact: Flags.string({description: 'Incident impact', required: true, options: [...SP_INCIDENT_IMPACTS]}), body: Flags.string({description: 'Initial update body in markdown', required: true}), - status: Flags.string({description: 'Incident status', options: ['INVESTIGATING', 'IDENTIFIED', 'MONITORING', 'RESOLVED']}), + status: Flags.string({description: 'Incident status', options: [...SP_INCIDENT_STATUSES]}), scheduled: Flags.boolean({description: 'Whether this is a scheduled maintenance'}), } diff --git a/src/commands/status-pages/incidents/delete.ts b/src/commands/status-pages/incidents/delete.ts index 79c2af6..46f6fea 100644 --- a/src/commands/status-pages/incidents/delete.ts +++ b/src/commands/status-pages/incidents/delete.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsDelete extends Command { static description = 'Delete a status page incident' static examples = ['<%= config.bin %> status-pages incidents delete '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/incidents/dismiss.ts b/src/commands/status-pages/incidents/dismiss.ts index 9312c57..03edc16 100644 --- a/src/commands/status-pages/incidents/dismiss.ts +++ b/src/commands/status-pages/incidents/dismiss.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsDismiss extends Command { static description = 'Dismiss a draft status page incident' static examples = ['<%= config.bin %> status-pages incidents dismiss '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/incidents/get.ts b/src/commands/status-pages/incidents/get.ts index 5bae741..cfb7016 100644 --- a/src/commands/status-pages/incidents/get.ts +++ b/src/commands/status-pages/incidents/get.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiGet} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsGet extends Command { static description = 'Get a status page incident with timeline' static examples = ['<%= config.bin %> status-pages incidents get '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/incidents/list.ts b/src/commands/status-pages/incidents/list.ts index 7ad023d..2236a60 100644 --- a/src/commands/status-pages/incidents/list.ts +++ b/src/commands/status-pages/incidents/list.ts @@ -1,14 +1,15 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import type {components} from '../../../lib/api.generated.js' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' type StatusPageIncident = components['schemas']['StatusPageIncidentDto'] export default class StatusPagesIncidentsList extends Command { static description = 'List incidents on a status page' static examples = ['<%= config.bin %> status-pages incidents list '] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, limit: Flags.integer({description: 'Maximum number of incidents to show', default: 20}), diff --git a/src/commands/status-pages/incidents/post-update.ts b/src/commands/status-pages/incidents/post-update.ts index 5394520..249c5ed 100644 --- a/src/commands/status-pages/incidents/post-update.ts +++ b/src/commands/status-pages/incidents/post-update.ts @@ -1,18 +1,20 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsPostUpdate extends Command { static description = 'Post a timeline update on a status page incident' static examples = ['<%= config.bin %> status-pages incidents post-update --body "Fix deployed" --status MONITORING'] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = { ...globalFlags, body: Flags.string({description: 'Update message', required: true}), - status: Flags.string({description: 'New status', required: true, options: ['INVESTIGATING', 'IDENTIFIED', 'MONITORING', 'RESOLVED']}), + status: Flags.string({description: 'New status', required: true, options: [...SP_INCIDENT_STATUSES]}), } async run() { diff --git a/src/commands/status-pages/incidents/publish.ts b/src/commands/status-pages/incidents/publish.ts index fd15e4e..64b053c 100644 --- a/src/commands/status-pages/incidents/publish.ts +++ b/src/commands/status-pages/incidents/publish.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsPublish extends Command { static description = 'Publish a draft status page incident' static examples = ['<%= config.bin %> status-pages incidents publish '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status-pages/incidents/update.ts b/src/commands/status-pages/incidents/update.ts index 43b52dd..b0c3b21 100644 --- a/src/commands/status-pages/incidents/update.ts +++ b/src/commands/status-pages/incidents/update.ts @@ -1,19 +1,21 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPut} from '../../../lib/api-client.js' +import {SP_INCIDENT_IMPACTS, SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesIncidentsUpdate extends Command { static description = 'Update a status page incident' static examples = ['<%= config.bin %> status-pages incidents update --status RESOLVED'] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'incident-id': Args.string({description: 'Incident ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'incident-id': uuidArg({description: 'Incident ID', required: true}), } static flags = { ...globalFlags, title: Flags.string({description: 'Incident title'}), - impact: Flags.string({description: 'Incident impact', options: ['NONE', 'MINOR', 'MAJOR', 'CRITICAL']}), - status: Flags.string({description: 'Incident status', options: ['INVESTIGATING', 'IDENTIFIED', 'MONITORING', 'RESOLVED']}), + impact: Flags.string({description: 'Incident impact', options: [...SP_INCIDENT_IMPACTS]}), + status: Flags.string({description: 'Incident status', options: [...SP_INCIDENT_STATUSES]}), } async run() { diff --git a/src/commands/status-pages/subscribers/add.ts b/src/commands/status-pages/subscribers/add.ts index d949437..85e000a 100644 --- a/src/commands/status-pages/subscribers/add.ts +++ b/src/commands/status-pages/subscribers/add.ts @@ -1,11 +1,12 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesSubscribersAdd extends Command { static description = 'Add a subscriber to a status page' static examples = ['<%= config.bin %> status-pages subscribers add --email user@example.com'] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, email: Flags.string({description: 'Subscriber email address', required: true}), diff --git a/src/commands/status-pages/subscribers/list.ts b/src/commands/status-pages/subscribers/list.ts index 11f728d..e06252f 100644 --- a/src/commands/status-pages/subscribers/list.ts +++ b/src/commands/status-pages/subscribers/list.ts @@ -1,14 +1,15 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Flags} from '@oclif/core' import type {components} from '../../../lib/api.generated.js' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' type StatusPageSubscriber = components['schemas']['StatusPageSubscriberDto'] export default class StatusPagesSubscribersList extends Command { static description = 'List subscribers on a status page' static examples = ['<%= config.bin %> status-pages subscribers list '] - static args = {id: Args.string({description: 'Status page ID', required: true})} + static args = {id: uuidArg({description: 'Status page ID', required: true})} static flags = { ...globalFlags, limit: Flags.integer({description: 'Maximum number of subscribers to show', default: 20}), diff --git a/src/commands/status-pages/subscribers/remove.ts b/src/commands/status-pages/subscribers/remove.ts index 3a9b3ec..1f6b50b 100644 --- a/src/commands/status-pages/subscribers/remove.ts +++ b/src/commands/status-pages/subscribers/remove.ts @@ -1,13 +1,14 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../../lib/base-command.js' import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' export default class StatusPagesSubscribersRemove extends Command { static description = 'Remove a subscriber from a status page' static examples = ['<%= config.bin %> status-pages subscribers remove '] static args = { - id: Args.string({description: 'Status page ID', required: true}), - 'subscriber-id': Args.string({description: 'Subscriber ID', required: true}), + id: uuidArg({description: 'Status page ID', required: true}), + 'subscriber-id': uuidArg({description: 'Subscriber ID', required: true}), } static flags = {...globalFlags} diff --git a/src/commands/status.ts b/src/commands/status.ts index 51997eb..d88807d 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -3,6 +3,7 @@ import {globalFlags, buildClient} from '../lib/base-command.js' import {apiGet} from '../lib/api-client.js' import {formatOutput, OutputFormat} from '../lib/output.js' import type {components} from '../lib/api.generated.js' +import {DashboardOverviewSchema} from '../lib/response-schemas.js' type DashboardOverviewDto = components['schemas']['DashboardOverviewDto'] @@ -15,7 +16,16 @@ export default class Status extends Command { const {flags} = await this.parse(Status) const client = buildClient(flags) const resp = await apiGet<{data?: DashboardOverviewDto}>(client, '/api/v1/dashboard/overview') - const overview = resp.data ?? ({} as DashboardOverviewDto) + if (!resp.data) { + this.error('API returned an empty response for /api/v1/dashboard/overview') + } + + const parsed = DashboardOverviewSchema.safeParse(resp.data) + if (!parsed.success) { + this.error(`Unexpected dashboard response shape: ${parsed.error.issues.map((i) => i.message).join(', ')}`) + } + + const overview = parsed.data const format = flags.output as OutputFormat if (format === 'json' || format === 'yaml') { @@ -23,17 +33,17 @@ export default class Status extends Command { return } - const m = overview.monitors ?? ({} as NonNullable) - const i = overview.incidents ?? ({} as NonNullable) + const m = overview.monitors + const i = overview.incidents this.log('') this.log(' Monitors') - this.log(` Total: ${m.total ?? 0} Up: ${m.up ?? 0} Down: ${m.down ?? 0} Degraded: ${m.degraded ?? 0} Paused: ${m.paused ?? 0}`) + this.log(` Total: ${m.total} Up: ${m.up} Down: ${m.down} Degraded: ${m.degraded} Paused: ${m.paused}`) const u24 = m.avgUptime24h != null ? Number(m.avgUptime24h).toFixed(2) : '–' const u30 = m.avgUptime30d != null ? Number(m.avgUptime30d).toFixed(2) : '–' this.log(` Uptime (24h): ${u24}% Uptime (30d): ${u30}%`) this.log('') this.log(' Incidents') - this.log(` Active: ${i.active ?? 0} Resolved today: ${i.resolvedToday ?? 0} MTTR (30d): ${i.mttr30d != null ? `${Math.round(Number(i.mttr30d) / 60)}m` : '–'}`) + this.log(` Active: ${i.active} Resolved today: ${i.resolvedToday} MTTR (30d): ${i.mttr30d != null ? `${Math.round(Number(i.mttr30d) / 60)}m` : '–'}`) this.log('') } } diff --git a/src/commands/version.ts b/src/commands/version.ts index b3ea7b2..283415c 100644 --- a/src/commands/version.ts +++ b/src/commands/version.ts @@ -10,7 +10,7 @@ export default class Version extends Command { async run(): Promise { await this.parse(Version) const __dirname = dirname(fileURLToPath(import.meta.url)) - const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8')) + const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8')) as {version: string} this.log(`devhelm/${pkg.version} ${process.platform}-${process.arch} node-${process.version}`) } } diff --git a/src/commands/webhooks/test.ts b/src/commands/webhooks/test.ts index 2474361..adee1db 100644 --- a/src/commands/webhooks/test.ts +++ b/src/commands/webhooks/test.ts @@ -1,11 +1,12 @@ -import {Command, Args} from '@oclif/core' +import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' import {checkedFetch} from '../../lib/api-client.js' +import {uuidArg} from '../../lib/validators.js' export default class WebhooksTest extends Command { static description = 'Send a test event to a webhook' static examples = ['<%= config.bin %> webhooks test '] - static args = {id: Args.string({description: 'Webhook ID', required: true})} + static args = {id: uuidArg({description: 'Webhook ID', required: true})} static flags = {...globalFlags} async run() { diff --git a/src/lib/api-client.ts b/src/lib/api-client.ts index 92af3e8..c00fc68 100644 --- a/src/lib/api-client.ts +++ b/src/lib/api-client.ts @@ -1,4 +1,5 @@ import createClient, {type Middleware} from 'openapi-fetch' +import type {PathsWithMethod} from 'openapi-typescript-helpers' import type {paths, components} from './api.generated.js' import {AuthError, DevhelmError, EXIT_CODES} from './errors.js' @@ -17,8 +18,9 @@ export class ApiRequestError extends Error { private static parseBody(body: string): string { try { - const json = JSON.parse(body) - return json.message || json.error || body + const json = JSON.parse(body) as Record + const msg = json.message ?? json.error + return typeof msg === 'string' ? msg : body } catch { return body || 'Unknown API error' } @@ -90,6 +92,15 @@ export type ApiClient = ReturnType * Unwrap an openapi-fetch response: returns `data` on success, throws a typed * DevhelmError on failure (AuthError for 401/403, NOT_FOUND for 404, API for others). * Every client.GET / POST / PUT / DELETE call should be wrapped with this. + * + * Trade-off: the returned `data` is cast as `T` with no runtime validation. + * This avoids the cost of parsing every response through Zod, which matters + * for high-frequency paths (list/get). The type safety relies on the OpenAPI + * spec staying in sync with the server — compile-time only. + * + * For critical paths where a shape mismatch could cause silent misbehavior + * (e.g. entitlement checks gating deploy), callers should add explicit Zod + * validation after this call. See `response-schemas.ts` for those schemas. */ export async function checkedFetch(promise: Promise<{data?: T; error?: unknown; response: Response}>): Promise { const {data, error, response} = await promise @@ -103,31 +114,36 @@ export async function checkedFetch(promise: Promise<{data?: T; error?: unknow // ── Dynamic-path helpers ──────────────────────────────────────────────── // -// openapi-fetch requires literal path strings for type inference. When -// paths are constructed at runtime (CRUD factory, YAML applier), this -// breaks. These helpers centralize the single `as any` cast — every -// call site uses a clean, typed API. - -/* eslint-disable @typescript-eslint/no-explicit-any */ +// openapi-fetch requires literal path strings for compile-time type +// inference. When paths are built at runtime (CRUD factory, YAML +// applier), the literal inference breaks. These helpers centralize +// the assertion: the path is cast to the correct per-method path union +// (e.g. GETPath), and the options object is cast to `never` — the +// bottom type that satisfies any parameter shape without opening the +// door to unrelated type leaks the way `as any` would. + +type GETPath = PathsWithMethod +type POSTPath = PathsWithMethod +type PUTPath = PathsWithMethod +type PATCHPath = PathsWithMethod +type DELETEPath = PathsWithMethod export function apiGet(client: ApiClient, path: string, params?: object): Promise { - return checkedFetch(client.GET(path as any, (params ? {params} : {}) as any)) + return checkedFetch(client.GET(path as GETPath, (params ? {params} : {}) as never)) } export function apiPost(client: ApiClient, path: string, body: object): Promise { - return checkedFetch(client.POST(path as any, {body} as any)) + return checkedFetch(client.POST(path as POSTPath, {body} as never)) } export function apiPut(client: ApiClient, path: string, body: object): Promise { - return checkedFetch(client.PUT(path as any, {body} as any)) + return checkedFetch(client.PUT(path as PUTPath, {body} as never)) } export function apiPatch(client: ApiClient, path: string, body: object): Promise { - return checkedFetch(client.PATCH(path as any, {body} as any)) + return checkedFetch(client.PATCH(path as PATCHPath, {body} as never)) } export function apiDelete(client: ApiClient, path: string): Promise { - return checkedFetch(client.DELETE(path as any, {params: {path: {}}} as any)) + return checkedFetch(client.DELETE(path as DELETEPath, {params: {path: {}}} as never)) } - -/* eslint-enable @typescript-eslint/no-explicit-any */ diff --git a/src/lib/api-zod.generated.ts b/src/lib/api-zod.generated.ts index 97ff5f9..8d66c04 100644 --- a/src/lib/api-zod.generated.ts +++ b/src/lib/api-zod.generated.ts @@ -8,52 +8,59 @@ const pageable = z size: z.number().int().gte(1), sort: z.array(z.string()), }) - .passthrough(); -const ChannelConfig = z.object({ channelType: z.string() }).passthrough(); -const DiscordChannelConfig = ChannelConfig.and( - z - .object({ - webhookUrl: z.string().min(1), - mentionRoleId: z.string().nullish(), - }) - .passthrough() -); -const EmailChannelConfig = ChannelConfig.and( - z.object({ recipients: z.array(z.string().email()).min(1) }).passthrough() -); -const OpsGenieChannelConfig = ChannelConfig.and( - z - .object({ apiKey: z.string().min(1), region: z.string().nullish() }) - .passthrough() -); -const PagerDutyChannelConfig = ChannelConfig.and( - z - .object({ - routingKey: z.string().min(1), - severityOverride: z.string().nullish(), - }) - .passthrough() -); -const SlackChannelConfig = ChannelConfig.and( - z - .object({ - webhookUrl: z.string().min(1), - mentionText: z.string().nullish(), - }) - .passthrough() -); -const TeamsChannelConfig = ChannelConfig.and( - z.object({ webhookUrl: z.string().min(1) }).passthrough() -); -const WebhookChannelConfig = ChannelConfig.and( - z - .object({ - url: z.string().min(1), - signingSecret: z.string().nullish(), - customHeaders: z.record(z.string().nullable()).nullish(), - }) - .passthrough() -); + .strict(); +const ErrorResponse = z + .object({ + status: z.number().int(), + message: z.string(), + timestamp: z.number().int(), + }) + .strict(); +const DiscordChannelConfig = z + .object({ + channelType: z.literal("discord"), + webhookUrl: z.string().min(1), + mentionRoleId: z.string().nullish(), + }) + .strict(); +const EmailChannelConfig = z + .object({ + channelType: z.literal("email"), + recipients: z.array(z.string().email()).min(1), + }) + .strict(); +const OpsGenieChannelConfig = z + .object({ + channelType: z.literal("opsgenie"), + apiKey: z.string().min(1), + region: z.string().nullish(), + }) + .strict(); +const PagerDutyChannelConfig = z + .object({ + channelType: z.literal("pagerduty"), + routingKey: z.string().min(1), + severityOverride: z.string().nullish(), + }) + .strict(); +const SlackChannelConfig = z + .object({ + channelType: z.literal("slack"), + webhookUrl: z.string().min(1), + mentionText: z.string().nullish(), + }) + .strict(); +const TeamsChannelConfig = z + .object({ channelType: z.literal("teams"), webhookUrl: z.string().min(1) }) + .strict(); +const WebhookChannelConfig = z + .object({ + channelType: z.literal("webhook"), + url: z.string().min(1), + signingSecret: z.string().nullish(), + customHeaders: z.record(z.string().nullable()).nullish(), + }) + .strict(); const CreateAlertChannelRequest = z .object({ name: z.string().min(0).max(255), @@ -67,7 +74,7 @@ const CreateAlertChannelRequest = z WebhookChannelConfig, ]), }) - .passthrough(); + .strict(); const UpdateAlertChannelRequest = z .object({ name: z.string().min(0).max(255), @@ -81,7 +88,7 @@ const UpdateAlertChannelRequest = z WebhookChannelConfig, ]), }) - .passthrough(); + .strict(); const TestAlertChannelRequest = z .object({ config: z.union([ @@ -94,22 +101,22 @@ const TestAlertChannelRequest = z WebhookChannelConfig, ]), }) - .passthrough(); + .strict(); const CreateApiKeyRequest = z .object({ name: z.string().min(0).max(200), expiresAt: z.string().datetime({ offset: true }).nullish(), }) - .passthrough(); + .strict(); const UpdateApiKeyRequest = z .object({ name: z.string().min(0).max(200) }) - .passthrough(); + .strict(); const AcquireDeployLockRequest = z .object({ lockedBy: z.string().min(1), ttlMinutes: z.number().int().nullish(), }) - .passthrough(); + .strict(); const CreateEnvironmentRequest = z .object({ name: z.string().min(0).max(100), @@ -119,9 +126,9 @@ const CreateEnvironmentRequest = z .max(100) .regex(/^[a-z0-9][a-z0-9_-]*$/), variables: z.record(z.string().nullable()).nullish(), - isDefault: z.boolean().optional(), + isDefault: z.boolean(), }) - .passthrough(); + .strict(); const UpdateEnvironmentRequest = z .object({ name: z.string().min(0).max(100).nullable(), @@ -129,7 +136,7 @@ const UpdateEnvironmentRequest = z isDefault: z.boolean().nullable(), }) .partial() - .passthrough(); + .strict(); const params = z .object({ status: z @@ -155,7 +162,7 @@ const params = z page: z.number().int().gte(0), size: z.number().int().gte(1).lte(200), }) - .passthrough(); + .strict(); const CreateManualIncidentRequest = z .object({ title: z.string().min(1), @@ -163,8 +170,11 @@ const CreateManualIncidentRequest = z monitorId: z.string().uuid().nullish(), body: z.string().nullish(), }) - .passthrough(); -const ResolveIncidentRequest = z.object({ body: z.string() }).passthrough(); + .strict(); +const ResolveIncidentRequest = z + .object({ body: z.string().nullable() }) + .partial() + .strict(); const AddIncidentUpdateRequest = z .object({ body: z.string().nullish(), @@ -173,13 +183,13 @@ const AddIncidentUpdateRequest = z .nullish(), notifySubscribers: z.boolean(), }) - .passthrough(); + .strict(); const CreateInviteRequest = z .object({ email: z.string().min(1).email(), roleOffered: z.enum(["OWNER", "ADMIN", "MEMBER"]), }) - .passthrough(); + .strict(); const CreateMaintenanceWindowRequest = z .object({ monitorId: z.string().uuid().nullish(), @@ -189,7 +199,7 @@ const CreateMaintenanceWindowRequest = z reason: z.string().nullish(), suppressAlerts: z.boolean().nullish(), }) - .passthrough(); + .strict(); const UpdateMaintenanceWindowRequest = z .object({ monitorId: z.string().uuid().nullish(), @@ -199,10 +209,10 @@ const UpdateMaintenanceWindowRequest = z reason: z.string().nullish(), suppressAlerts: z.boolean().nullish(), }) - .passthrough(); + .strict(); const ChangeRoleRequest = z .object({ orgRole: z.enum(["OWNER", "ADMIN", "MEMBER"]) }) - .passthrough(); + .strict(); const ChangeStatusRequest = z .object({ status: z.enum([ @@ -214,260 +224,298 @@ const ChangeStatusRequest = z "DECLINED", ]), }) - .passthrough(); -const MonitorConfig = z.object({}).partial().passthrough(); -const DnsMonitorConfig = MonitorConfig.and( - z - .object({ - hostname: z.string().min(1), - recordTypes: z - .array( - z - .enum([ - "A", - "AAAA", - "CNAME", - "MX", - "NS", - "TXT", - "SRV", - "SOA", - "CAA", - "PTR", - ]) - .nullable() - ) - .nullish(), - nameservers: z.array(z.string().nullable()).nullish(), - timeoutMs: z.number().int().nullish(), - totalTimeoutMs: z.number().int().nullish(), - }) - .passthrough() -); -const HeartbeatMonitorConfig = MonitorConfig.and( - z - .object({ - expectedInterval: z.number().int().gte(1).lte(86400), - gracePeriod: z.number().int().gte(1), - }) - .passthrough() -); -const HttpMonitorConfig = MonitorConfig.and( - z - .object({ - url: z.string().min(1), - method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]), - customHeaders: z.record(z.string().nullable()).nullish(), - requestBody: z.string().nullish(), - contentType: z.string().nullish(), - verifyTls: z.boolean().nullish(), - }) - .passthrough() -); -const IcmpMonitorConfig = MonitorConfig.and( - z - .object({ - host: z.string().min(1), - packetCount: z.number().int().gte(1).lte(20).nullish(), - timeoutMs: z.number().int().nullish(), - }) - .passthrough() -); -const McpServerMonitorConfig = MonitorConfig.and( - z - .object({ - command: z.string().min(1), - args: z.array(z.string().nullable()).nullish(), - env: z.record(z.string().nullable()).nullish(), - }) - .passthrough() -); -const TcpMonitorConfig = MonitorConfig.and( - z - .object({ - host: z.string().min(1), - port: z.number().int().gte(1).lte(65535), - timeoutMs: z.number().int().nullish(), - }) - .passthrough() -); -const AssertionConfig = z.object({ type: z.string() }).passthrough(); -const BodyContainsAssertion = AssertionConfig.and( - z.object({ substring: z.string().min(1) }).passthrough() -); -const DnsExpectedCnameAssertion = AssertionConfig.and( - z.object({ value: z.string().min(1) }).passthrough() -); -const DnsExpectedIpsAssertion = AssertionConfig.and( - z.object({ ips: z.array(z.string()).min(1) }).passthrough() -); -const DnsMaxAnswersAssertion = AssertionConfig.and( - z - .object({ recordType: z.string().min(1), max: z.number().int() }) - .passthrough() -); -const DnsMinAnswersAssertion = AssertionConfig.and( - z - .object({ recordType: z.string().min(1), min: z.number().int() }) - .passthrough() -); -const DnsRecordContainsAssertion = AssertionConfig.and( - z - .object({ recordType: z.string().min(1), substring: z.string().min(1) }) - .passthrough() -); -const DnsRecordEqualsAssertion = AssertionConfig.and( - z - .object({ recordType: z.string().min(1), value: z.string().min(1) }) - .passthrough() -); -const DnsResolvesAssertion = AssertionConfig; -const DnsResponseTimeAssertion = AssertionConfig.and( - z.object({ maxMs: z.number().int() }).passthrough() -); -const DnsResponseTimeWarnAssertion = AssertionConfig.and( - z.object({ warnMs: z.number().int() }).passthrough() -); -const DnsTtlHighAssertion = AssertionConfig.and( - z.object({ maxTtl: z.number().int() }).passthrough() -); -const DnsTtlLowAssertion = AssertionConfig.and( - z.object({ minTtl: z.number().int() }).passthrough() -); -const DnsTxtContainsAssertion = AssertionConfig.and( - z.object({ substring: z.string().min(1) }).passthrough() -); -const HeaderValueAssertion = AssertionConfig.and( - z - .object({ - headerName: z.string().min(1), - expected: z.string().min(1), - operator: z.enum([ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range", - ]), - }) - .passthrough() -); -const HeartbeatIntervalDriftAssertion = AssertionConfig.and( - z - .object({ maxDeviationPercent: z.number().int().gte(1).lte(100) }) - .passthrough() -); -const HeartbeatMaxIntervalAssertion = AssertionConfig.and( - z.object({ maxSeconds: z.number().int().gte(1) }).passthrough() -); -const HeartbeatPayloadContainsAssertion = AssertionConfig.and( - z.object({ path: z.string().min(1), value: z.string() }).passthrough() -); -const HeartbeatReceivedAssertion = AssertionConfig; -const IcmpPacketLossAssertion = AssertionConfig.and( - z.object({ maxPercent: z.number().gte(0).lte(100) }).passthrough() -); -const IcmpReachableAssertion = AssertionConfig; -const IcmpResponseTimeAssertion = AssertionConfig.and( - z.object({ maxMs: z.number().int() }).passthrough() -); -const IcmpResponseTimeWarnAssertion = AssertionConfig.and( - z.object({ warnMs: z.number().int() }).passthrough() -); -const JsonPathAssertion = AssertionConfig.and( - z - .object({ - path: z.string().min(1), - expected: z.string().min(1), - operator: z.enum([ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range", - ]), - }) - .passthrough() -); -const McpConnectsAssertion = AssertionConfig; -const McpHasCapabilityAssertion = AssertionConfig.and( - z.object({ capability: z.string().min(1) }).passthrough() -); -const McpMinToolsAssertion = AssertionConfig.and( - z.object({ min: z.number().int() }).passthrough() -); -const McpProtocolVersionAssertion = AssertionConfig.and( - z.object({ version: z.string().min(1) }).passthrough() -); -const McpResponseTimeAssertion = AssertionConfig.and( - z.object({ maxMs: z.number().int() }).passthrough() -); -const McpResponseTimeWarnAssertion = AssertionConfig.and( - z.object({ warnMs: z.number().int() }).passthrough() -); -const McpToolAvailableAssertion = AssertionConfig.and( - z.object({ toolName: z.string().min(1) }).passthrough() -); -const McpToolCountChangedAssertion = AssertionConfig.and( - z.object({ expectedCount: z.number().int() }).passthrough() -); -const RedirectCountAssertion = AssertionConfig.and( - z.object({ maxCount: z.number().int() }).passthrough() -); -const RedirectTargetAssertion = AssertionConfig.and( - z - .object({ - expected: z.string().min(1), - operator: z.enum([ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range", - ]), - }) - .passthrough() -); -const RegexBodyAssertion = AssertionConfig.and( - z.object({ pattern: z.string().min(1) }).passthrough() -); -const ResponseSizeAssertion = AssertionConfig.and( - z.object({ maxBytes: z.number().int() }).passthrough() -); -const ResponseTimeAssertion = AssertionConfig.and( - z.object({ thresholdMs: z.number().int() }).passthrough() -); -const ResponseTimeWarnAssertion = AssertionConfig.and( - z.object({ warnMs: z.number().int() }).passthrough() -); -const SslExpiryAssertion = AssertionConfig.and( - z.object({ minDaysRemaining: z.number().int() }).passthrough() -); -const StatusCodeAssertion = AssertionConfig.and( - z - .object({ - expected: z.string().min(1), - operator: z.enum([ - "equals", - "contains", - "less_than", - "greater_than", - "matches", - "range", - ]), - }) - .passthrough() -); -const TcpConnectsAssertion = AssertionConfig; -const TcpResponseTimeAssertion = AssertionConfig.and( - z.object({ maxMs: z.number().int() }).passthrough() -); -const TcpResponseTimeWarnAssertion = AssertionConfig.and( - z.object({ warnMs: z.number().int() }).passthrough() -); + .strict(); +const DnsMonitorConfig = z + .object({ + hostname: z.string().min(1), + recordTypes: z + .array( + z + .enum([ + "A", + "AAAA", + "CNAME", + "MX", + "NS", + "TXT", + "SRV", + "SOA", + "CAA", + "PTR", + ]) + .nullable() + ) + .nullish(), + nameservers: z.array(z.string().nullable()).nullish(), + timeoutMs: z.number().int().nullish(), + totalTimeoutMs: z.number().int().nullish(), + }) + .strict(); +const HeartbeatMonitorConfig = z + .object({ + expectedInterval: z.number().int().gte(1).lte(86400), + gracePeriod: z.number().int().gte(1), + }) + .strict(); +const HttpMonitorConfig = z + .object({ + url: z.string().min(1), + method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]), + customHeaders: z.record(z.string().nullable()).nullish(), + requestBody: z.string().nullish(), + contentType: z.string().nullish(), + verifyTls: z.boolean().nullish(), + }) + .strict(); +const IcmpMonitorConfig = z + .object({ + host: z.string().min(1), + packetCount: z.number().int().gte(1).lte(20).nullish(), + timeoutMs: z.number().int().nullish(), + }) + .strict(); +const McpServerMonitorConfig = z + .object({ + command: z.string().min(1), + args: z.array(z.string().nullable()).nullish(), + env: z.record(z.string().nullable()).nullish(), + }) + .strict(); +const TcpMonitorConfig = z + .object({ + host: z.string().min(1), + port: z.number().int().gte(1).lte(65535), + timeoutMs: z.number().int().nullish(), + }) + .strict(); +const BodyContainsAssertion = z + .object({ type: z.literal("body_contains"), substring: z.string().min(1) }) + .strict(); +const DnsExpectedCnameAssertion = z + .object({ type: z.literal("dns_expected_cname"), value: z.string().min(1) }) + .strict(); +const DnsExpectedIpsAssertion = z + .object({ + type: z.literal("dns_expected_ips"), + ips: z.array(z.string()).min(1), + }) + .strict(); +const DnsMaxAnswersAssertion = z + .object({ + type: z.literal("dns_max_answers"), + recordType: z.string().min(1), + max: z.number().int(), + }) + .strict(); +const DnsMinAnswersAssertion = z + .object({ + type: z.literal("dns_min_answers"), + recordType: z.string().min(1), + min: z.number().int(), + }) + .strict(); +const DnsRecordContainsAssertion = z + .object({ + type: z.literal("dns_record_contains"), + recordType: z.string().min(1), + substring: z.string().min(1), + }) + .strict(); +const DnsRecordEqualsAssertion = z + .object({ + type: z.literal("dns_record_equals"), + recordType: z.string().min(1), + value: z.string().min(1), + }) + .strict(); +const DnsResolvesAssertion = z + .object({ type: z.literal("dns_resolves") }) + .strict(); +const DnsResponseTimeAssertion = z + .object({ type: z.literal("dns_response_time"), maxMs: z.number().int() }) + .strict(); +const DnsResponseTimeWarnAssertion = z + .object({ + type: z.literal("dns_response_time_warn"), + warnMs: z.number().int(), + }) + .strict(); +const DnsTtlHighAssertion = z + .object({ type: z.literal("dns_ttl_high"), maxTtl: z.number().int() }) + .strict(); +const DnsTtlLowAssertion = z + .object({ type: z.literal("dns_ttl_low"), minTtl: z.number().int() }) + .strict(); +const DnsTxtContainsAssertion = z + .object({ type: z.literal("dns_txt_contains"), substring: z.string().min(1) }) + .strict(); +const HeaderValueAssertion = z + .object({ + type: z.literal("header_value"), + headerName: z.string().min(1), + expected: z.string().min(1), + operator: z.enum([ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range", + ]), + }) + .strict(); +const HeartbeatIntervalDriftAssertion = z + .object({ + type: z.literal("heartbeat_interval_drift"), + maxDeviationPercent: z.number().int().gte(1).lte(100), + }) + .strict(); +const HeartbeatMaxIntervalAssertion = z + .object({ + type: z.literal("heartbeat_max_interval"), + maxSeconds: z.number().int().gte(1), + }) + .strict(); +const HeartbeatPayloadContainsAssertion = z + .object({ + type: z.literal("heartbeat_payload_contains"), + path: z.string().min(1), + value: z.string(), + }) + .strict(); +const HeartbeatReceivedAssertion = z + .object({ type: z.literal("heartbeat_received") }) + .strict(); +const IcmpPacketLossAssertion = z + .object({ + type: z.literal("icmp_packet_loss"), + maxPercent: z.number().gte(0).lte(100), + }) + .strict(); +const IcmpReachableAssertion = z + .object({ type: z.literal("icmp_reachable") }) + .strict(); +const IcmpResponseTimeAssertion = z + .object({ type: z.literal("icmp_response_time"), maxMs: z.number().int() }) + .strict(); +const IcmpResponseTimeWarnAssertion = z + .object({ + type: z.literal("icmp_response_time_warn"), + warnMs: z.number().int(), + }) + .strict(); +const JsonPathAssertion = z + .object({ + type: z.literal("json_path"), + path: z.string().min(1), + expected: z.string().min(1), + operator: z.enum([ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range", + ]), + }) + .strict(); +const McpConnectsAssertion = z + .object({ type: z.literal("mcp_connects") }) + .strict(); +const McpHasCapabilityAssertion = z + .object({ + type: z.literal("mcp_has_capability"), + capability: z.string().min(1), + }) + .strict(); +const McpMinToolsAssertion = z + .object({ type: z.literal("mcp_min_tools"), min: z.number().int() }) + .strict(); +const McpProtocolVersionAssertion = z + .object({ + type: z.literal("mcp_protocol_version"), + version: z.string().min(1), + }) + .strict(); +const McpResponseTimeAssertion = z + .object({ type: z.literal("mcp_response_time"), maxMs: z.number().int() }) + .strict(); +const McpResponseTimeWarnAssertion = z + .object({ + type: z.literal("mcp_response_time_warn"), + warnMs: z.number().int(), + }) + .strict(); +const McpToolAvailableAssertion = z + .object({ + type: z.literal("mcp_tool_available"), + toolName: z.string().min(1), + }) + .strict(); +const McpToolCountChangedAssertion = z + .object({ + type: z.literal("mcp_tool_count_changed"), + expectedCount: z.number().int(), + }) + .strict(); +const RedirectCountAssertion = z + .object({ type: z.literal("redirect_count"), maxCount: z.number().int() }) + .strict(); +const RedirectTargetAssertion = z + .object({ + type: z.literal("redirect_target"), + expected: z.string().min(1), + operator: z.enum([ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range", + ]), + }) + .strict(); +const RegexBodyAssertion = z + .object({ type: z.literal("regex_body"), pattern: z.string().min(1) }) + .strict(); +const ResponseSizeAssertion = z + .object({ type: z.literal("response_size"), maxBytes: z.number().int() }) + .strict(); +const ResponseTimeAssertion = z + .object({ type: z.literal("response_time"), thresholdMs: z.number().int() }) + .strict(); +const ResponseTimeWarnAssertion = z + .object({ type: z.literal("response_time_warn"), warnMs: z.number().int() }) + .strict(); +const SslExpiryAssertion = z + .object({ type: z.literal("ssl_expiry"), minDaysRemaining: z.number().int() }) + .strict(); +const StatusCodeAssertion = z + .object({ + type: z.literal("status_code"), + expected: z.string().min(1), + operator: z.enum([ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range", + ]), + }) + .strict(); +const TcpConnectsAssertion = z + .object({ type: z.literal("tcp_connects") }) + .strict(); +const TcpResponseTimeAssertion = z + .object({ type: z.literal("tcp_response_time"), maxMs: z.number().int() }) + .strict(); +const TcpResponseTimeWarnAssertion = z + .object({ + type: z.literal("tcp_response_time_warn"), + warnMs: z.number().int(), + }) + .strict(); const CreateAssertionRequest = z .object({ config: z.union([ @@ -514,10 +562,47 @@ const CreateAssertionRequest = z TcpResponseTimeAssertion, TcpResponseTimeWarnAssertion, ]), - severity: z.enum(["fail", "warn"]), + severity: z.enum(["fail", "warn"]).nullish(), + }) + .strict(); +const BearerAuthConfig = z + .object({ + type: z.literal("bearer"), + vaultSecretId: z.string().uuid().nullish(), + }) + .strict(); +const BasicAuthConfig = z + .object({ + type: z.literal("basic"), + vaultSecretId: z.string().uuid().nullish(), + }) + .strict(); +const HeaderAuthConfig = z + .object({ + type: z.literal("header"), + headerName: z + .string() + .min(1) + .regex(/^[A-Za-z0-9\-_]+$/), + vaultSecretId: z.string().uuid().nullish(), + }) + .strict(); +const ApiKeyAuthConfig = z + .object({ + type: z.literal("api_key"), + headerName: z + .string() + .min(1) + .regex(/^[A-Za-z0-9\-_]+$/), + vaultSecretId: z.string().uuid().nullish(), }) - .passthrough(); -const MonitorAuthConfig = z.object({ type: z.string() }).passthrough(); + .strict(); +const MonitorAuthConfig = z.discriminatedUnion("type", [ + BearerAuthConfig, + BasicAuthConfig, + HeaderAuthConfig, + ApiKeyAuthConfig, +]); const TriggerRule = z .object({ type: z.enum([ @@ -532,28 +617,28 @@ const TriggerRule = z severity: z.enum(["down", "degraded"]), aggregationType: z.enum(["all_exceed", "average", "p95", "max"]).nullish(), }) - .passthrough(); + .strict(); const ConfirmationPolicy = z .object({ type: z.literal("multi_region"), - minRegionsFailing: z.number().int().optional(), - maxWaitSeconds: z.number().int().optional(), + minRegionsFailing: z.number().int(), + maxWaitSeconds: z.number().int(), }) - .passthrough(); + .strict(); const RecoveryPolicy = z .object({ consecutiveSuccesses: z.number().int(), minRegionsPassing: z.number().int(), cooldownMinutes: z.number().int(), }) - .passthrough(); + .strict(); const UpdateIncidentPolicyRequest = z .object({ triggerRules: z.array(TriggerRule).min(1), confirmation: ConfirmationPolicy, recovery: RecoveryPolicy, }) - .passthrough(); + .strict(); const NewTagRequest = z .object({ name: z.string().min(0).max(100), @@ -562,14 +647,14 @@ const NewTagRequest = z .regex(/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/) .nullish(), }) - .passthrough(); + .strict(); const AddMonitorTagsRequest = z .object({ tagIds: z.array(z.string().uuid()).nullable(), newTags: z.array(NewTagRequest).nullable(), }) .partial() - .passthrough(); + .strict(); const CreateMonitorRequest = z .object({ name: z.string().min(0).max(255), @@ -593,11 +678,20 @@ const CreateMonitorRequest = z alertChannelIds: z.array(z.string().uuid()).nullish(), tags: AddMonitorTagsRequest.nullish(), }) - .passthrough(); + .strict(); const UpdateMonitorRequest = z .object({ name: z.string().min(0).max(255).nullable(), - config: MonitorConfig.nullable(), + config: z + .union([ + DnsMonitorConfig, + HeartbeatMonitorConfig, + HttpMonitorConfig, + IcmpMonitorConfig, + McpServerMonitorConfig, + TcpMonitorConfig, + ]) + .nullable(), frequencySeconds: z.number().int().nullable(), enabled: z.boolean().nullable(), regions: z.array(z.string()).nullable(), @@ -612,13 +706,13 @@ const UpdateMonitorRequest = z tags: AddMonitorTagsRequest.nullable(), }) .partial() - .passthrough(); + .strict(); const RemoveMonitorTagsRequest = z .object({ tagIds: z.array(z.string().uuid()).min(1) }) - .passthrough(); + .strict(); const SetAlertChannelsRequest = z .object({ channelIds: z.array(z.string().uuid()) }) - .passthrough(); + .strict(); const UpdateAssertionRequest = z .object({ config: z.union([ @@ -667,61 +761,17 @@ const UpdateAssertionRequest = z ]), severity: z.enum(["fail", "warn"]).nullish(), }) - .passthrough(); -const ApiKeyAuthConfig = MonitorAuthConfig.and( - z - .object({ - headerName: z - .string() - .min(1) - .regex(/^[A-Za-z0-9\-_]+$/), - vaultSecretId: z.string().uuid().nullish(), - }) - .passthrough() -); -const BasicAuthConfig = MonitorAuthConfig.and( - z - .object({ vaultSecretId: z.string().uuid().nullable() }) - .partial() - .passthrough() -); -const BearerAuthConfig = MonitorAuthConfig.and( - z - .object({ vaultSecretId: z.string().uuid().nullable() }) - .partial() - .passthrough() -); -const HeaderAuthConfig = MonitorAuthConfig.and( - z - .object({ - headerName: z - .string() - .min(1) - .regex(/^[A-Za-z0-9\-_]+$/), - vaultSecretId: z.string().uuid().nullish(), - }) - .passthrough() -); + .strict(); const UpdateMonitorAuthRequest = z .object({ - config: z.union([ - ApiKeyAuthConfig, - BasicAuthConfig, - BearerAuthConfig, - HeaderAuthConfig, - ]), + config: z.discriminatedUnion("type", [ApiKeyAuthConfig, BasicAuthConfig, BearerAuthConfig, HeaderAuthConfig]), }) - .passthrough(); + .strict(); const SetMonitorAuthRequest = z .object({ - config: z.union([ - ApiKeyAuthConfig, - BasicAuthConfig, - BearerAuthConfig, - HeaderAuthConfig, - ]), + config: z.discriminatedUnion("type", [ApiKeyAuthConfig, BasicAuthConfig, BearerAuthConfig, HeaderAuthConfig]), }) - .passthrough(); + .strict(); const BulkMonitorActionRequest = z .object({ monitorIds: z.array(z.string().uuid()).max(200), @@ -729,7 +779,7 @@ const BulkMonitorActionRequest = z tagIds: z.array(z.string().uuid()).nullish(), newTags: z.array(NewTagRequest).nullish(), }) - .passthrough(); + .strict(); const MonitorTestRequest = z .object({ type: z.enum(["HTTP", "DNS", "MCP_SERVER", "TCP", "ICMP", "HEARTBEAT"]), @@ -743,7 +793,7 @@ const MonitorTestRequest = z ]), assertions: z.array(CreateAssertionRequest).nullish(), }) - .passthrough(); + .strict(); const MatchRule = z .object({ type: z.string(), @@ -752,31 +802,31 @@ const MatchRule = z regions: z.array(z.string()).nullish(), values: z.array(z.string()).nullish(), }) - .passthrough(); + .strict(); const EscalationStep = z .object({ - delayMinutes: z.number().int().gte(0).optional(), + delayMinutes: z.number().int().gte(0), channelIds: z.array(z.string().uuid()).min(1), requireAck: z.boolean().nullish(), repeatIntervalSeconds: z.number().int().gte(1).nullish(), }) - .passthrough(); + .strict(); const EscalationChain = z .object({ steps: z.array(EscalationStep).min(1), onResolve: z.string().nullish(), onReopen: z.string().nullish(), }) - .passthrough(); + .strict(); const CreateNotificationPolicyRequest = z .object({ name: z.string().min(0).max(255), - matchRules: z.array(MatchRule), + matchRules: z.array(MatchRule).nullish(), escalation: EscalationChain, - enabled: z.boolean().default(true), - priority: z.number().int().default(0), + enabled: z.boolean().nullish().default(true), + priority: z.number().int().nullish().default(0), }) - .passthrough(); + .strict(); const UpdateNotificationPolicyRequest = z .object({ name: z.string().min(0).max(255).nullable(), @@ -786,7 +836,7 @@ const UpdateNotificationPolicyRequest = z priority: z.number().int().nullable(), }) .partial() - .passthrough(); + .strict(); const TestNotificationPolicyRequest = z .object({ severity: z.string().nullable(), @@ -799,7 +849,7 @@ const TestNotificationPolicyRequest = z resourceGroupIds: z.array(z.string().uuid()).nullable(), }) .partial() - .passthrough(); + .strict(); const UpdateOrgDetailsRequest = z .object({ name: z.string().min(0).max(200), @@ -808,14 +858,14 @@ const UpdateOrgDetailsRequest = z industry: z.string().min(0).max(100).nullish(), websiteUrl: z.string().min(0).max(255).nullish(), }) - .passthrough(); + .strict(); const RetryStrategy = z .object({ type: z.string(), - maxRetries: z.number().int().optional(), - interval: z.number().int().optional(), + maxRetries: z.number().int(), + interval: z.number().int(), }) - .passthrough(); + .strict(); const CreateResourceGroupRequest = z .object({ name: z.string().min(0).max(255), @@ -832,7 +882,7 @@ const CreateResourceGroupRequest = z confirmationDelaySeconds: z.number().int().gte(0).lte(600).nullish(), recoveryCooldownMinutes: z.number().int().gte(0).lte(60).nullish(), }) - .passthrough(); + .strict(); const UpdateResourceGroupRequest = z .object({ name: z.string().min(0).max(255), @@ -849,7 +899,7 @@ const UpdateResourceGroupRequest = z confirmationDelaySeconds: z.number().int().gte(0).lte(600).nullish(), recoveryCooldownMinutes: z.number().int().gte(0).lte(60).nullish(), }) - .passthrough(); + .strict(); const AddResourceGroupMemberRequest = z .object({ memberType: z @@ -858,16 +908,16 @@ const AddResourceGroupMemberRequest = z .regex(/monitor|service/), memberId: z.string().uuid(), }) - .passthrough(); + .strict(); const CreateSecretRequest = z .object({ key: z.string().min(0).max(255), value: z.string().min(0).max(32768), }) - .passthrough(); + .strict(); const UpdateSecretRequest = z .object({ value: z.string().min(0).max(32768) }) - .passthrough(); + .strict(); const UpdateAlertSensitivityRequest = z .object({ alertSensitivity: z @@ -875,14 +925,14 @@ const UpdateAlertSensitivityRequest = z .min(1) .regex(/ALL|INCIDENTS_ONLY|MAJOR_ONLY/), }) - .passthrough(); + .strict(); const ServiceSubscribeRequest = z .object({ componentId: z.string().uuid().nullable(), alertSensitivity: z.string().nullable(), }) .partial() - .passthrough(); + .strict(); const StatusPageBranding = z .object({ logoUrl: z @@ -890,56 +940,57 @@ const StatusPageBranding = z .min(0) .max(2048) .regex(/^https?:\/\/.*/) - .nullish(), + .nullable(), faviconUrl: z .string() .min(0) .max(2048) .regex(/^https?:\/\/.*/) - .nullish(), + .nullable(), brandColor: z .string() .min(0) .max(30) .regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/) - .nullish(), + .nullable(), pageBackground: z .string() .min(0) .max(30) .regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/) - .nullish(), + .nullable(), cardBackground: z .string() .min(0) .max(30) .regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/) - .nullish(), + .nullable(), textColor: z .string() .min(0) .max(30) .regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/) - .nullish(), + .nullable(), borderColor: z .string() .min(0) .max(30) .regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/) - .nullish(), - headerStyle: z.string().min(0).max(50).nullish(), - theme: z.string().min(0).max(50).nullish(), + .nullable(), + headerStyle: z.string().min(0).max(50).nullable(), + theme: z.string().min(0).max(50).nullable(), reportUrl: z .string() .min(0) .max(2048) .regex(/^https?:\/\/.*/) - .nullish(), + .nullable(), hidePoweredBy: z.boolean().default(false), - customCss: z.string().min(0).max(50000).nullish(), - customHeadHtml: z.string().min(0).max(50000).nullish(), + customCss: z.string().min(0).max(50000).nullable(), + customHeadHtml: z.string().min(0).max(50000).nullable(), }) - .passthrough(); + .partial() + .strict(); const CreateStatusPageRequest = z .object({ name: z.string().min(0).max(255), @@ -954,7 +1005,7 @@ const CreateStatusPageRequest = z enabled: z.boolean().nullish(), incidentMode: z.enum(["MANUAL", "REVIEW", "AUTOMATIC"]).nullish(), }) - .passthrough(); + .strict(); const UpdateStatusPageRequest = z .object({ name: z.string().min(0).max(255).nullable(), @@ -965,7 +1016,7 @@ const UpdateStatusPageRequest = z incidentMode: z.enum(["MANUAL", "REVIEW", "AUTOMATIC"]).nullable(), }) .partial() - .passthrough(); + .strict(); const CreateStatusPageComponentRequest = z .object({ name: z.string().min(0).max(255), @@ -979,7 +1030,7 @@ const CreateStatusPageComponentRequest = z excludeFromOverall: z.boolean().nullish(), startDate: z.string().nullish(), }) - .passthrough(); + .strict(); const UpdateStatusPageComponentRequest = z .object({ name: z.string().min(0).max(255).nullable(), @@ -992,17 +1043,17 @@ const UpdateStatusPageComponentRequest = z startDate: z.string().nullable(), }) .partial() - .passthrough(); + .strict(); const ComponentPosition = z .object({ componentId: z.string().uuid(), - displayOrder: z.number().int().optional(), + displayOrder: z.number().int(), groupId: z.string().uuid().nullish(), }) - .passthrough(); + .strict(); const ReorderComponentsRequest = z .object({ positions: z.array(ComponentPosition).min(1) }) - .passthrough(); + .strict(); const AddCustomDomainRequest = z .object({ hostname: z @@ -1013,7 +1064,7 @@ const AddCustomDomainRequest = z /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/ ), }) - .passthrough(); + .strict(); const CreateStatusPageComponentGroupRequest = z .object({ name: z.string().min(0).max(255), @@ -1021,7 +1072,7 @@ const CreateStatusPageComponentGroupRequest = z displayOrder: z.number().int().nullish(), collapsed: z.boolean().nullish(), }) - .passthrough(); + .strict(); const UpdateStatusPageComponentGroupRequest = z .object({ name: z.string().min(0).max(255).nullable(), @@ -1030,7 +1081,7 @@ const UpdateStatusPageComponentGroupRequest = z collapsed: z.boolean().nullable(), }) .partial() - .passthrough(); + .strict(); const AffectedComponent = z .object({ componentId: z.string().uuid(), @@ -1042,7 +1093,7 @@ const AffectedComponent = z "UNDER_MAINTENANCE", ]), }) - .passthrough(); + .strict(); const CreateStatusPageIncidentRequest = z .object({ title: z.string().min(0).max(500), @@ -1058,7 +1109,7 @@ const CreateStatusPageIncidentRequest = z autoResolve: z.boolean().nullish(), notifySubscribers: z.boolean().nullish(), }) - .passthrough(); + .strict(); const UpdateStatusPageIncidentRequest = z .object({ title: z.string().min(0).max(500).nullable(), @@ -1076,7 +1127,7 @@ const UpdateStatusPageIncidentRequest = z .nullable(), }) .partial() - .passthrough(); + .strict(); const PublishStatusPageIncidentRequest = z .object({ title: z.string().min(0).max(500).nullable(), @@ -1089,7 +1140,7 @@ const PublishStatusPageIncidentRequest = z notifySubscribers: z.boolean().nullable(), }) .partial() - .passthrough(); + .strict(); const CreateStatusPageIncidentUpdateRequest = z .object({ status: z.enum(["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]), @@ -1097,29 +1148,29 @@ const CreateStatusPageIncidentUpdateRequest = z notifySubscribers: z.boolean().nullish(), affectedComponents: z.array(AffectedComponent).nullish(), }) - .passthrough(); + .strict(); const PageSection = z .object({ groupId: z.string().uuid().nullish(), componentId: z.string().uuid().nullish(), pageOrder: z.number().int(), }) - .passthrough(); + .strict(); const GroupComponentOrder = z .object({ groupId: z.string().uuid(), positions: z.array(ComponentPosition).min(1), }) - .passthrough(); + .strict(); const ReorderPageLayoutRequest = z .object({ sections: z.array(PageSection).min(1), groupOrders: z.array(GroupComponentOrder).nullish(), }) - .passthrough(); + .strict(); const AdminAddSubscriberRequest = z .object({ email: z.string().min(1).email() }) - .passthrough(); + .strict(); const CreateTagRequest = z .object({ name: z.string().min(0).max(100), @@ -1128,7 +1179,7 @@ const CreateTagRequest = z .regex(/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/) .nullish(), }) - .passthrough(); + .strict(); const UpdateTagRequest = z .object({ name: z.string().min(0).max(100).nullable(), @@ -1138,14 +1189,14 @@ const UpdateTagRequest = z .nullable(), }) .partial() - .passthrough(); + .strict(); const CreateWebhookEndpointRequest = z .object({ url: z.string().min(0).max(2048), description: z.string().min(0).max(255).nullish(), subscribedEvents: z.array(z.string().min(1)).min(1), }) - .passthrough(); + .strict(); const UpdateWebhookEndpointRequest = z .object({ url: z.string().min(0).max(2048).nullable(), @@ -1154,21 +1205,19 @@ const UpdateWebhookEndpointRequest = z enabled: z.boolean().nullable(), }) .partial() - .passthrough(); + .strict(); const TestWebhookEndpointRequest = z .object({ eventType: z.string().nullable() }) .partial() - .passthrough(); -const CreateWorkspaceRequest = z - .object({ name: z.string().min(1) }) - .passthrough(); + .strict(); +const CreateWorkspaceRequest = z.object({ name: z.string().min(1) }).strict(); const UpdateWorkspaceRequest = z .object({ name: z.string().min(0).max(200) }) - .passthrough(); + .strict(); export const schemas = { pageable, - ChannelConfig, + ErrorResponse, DiscordChannelConfig, EmailChannelConfig, OpsGenieChannelConfig, @@ -1193,14 +1242,12 @@ export const schemas = { UpdateMaintenanceWindowRequest, ChangeRoleRequest, ChangeStatusRequest, - MonitorConfig, DnsMonitorConfig, HeartbeatMonitorConfig, HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, TcpMonitorConfig, - AssertionConfig, BodyContainsAssertion, DnsExpectedCnameAssertion, DnsExpectedIpsAssertion, @@ -1244,6 +1291,10 @@ export const schemas = { TcpResponseTimeAssertion, TcpResponseTimeWarnAssertion, CreateAssertionRequest, + BearerAuthConfig, + BasicAuthConfig, + HeaderAuthConfig, + ApiKeyAuthConfig, MonitorAuthConfig, TriggerRule, ConfirmationPolicy, @@ -1256,10 +1307,6 @@ export const schemas = { RemoveMonitorTagsRequest, SetAlertChannelsRequest, UpdateAssertionRequest, - ApiKeyAuthConfig, - BasicAuthConfig, - BearerAuthConfig, - HeaderAuthConfig, UpdateMonitorAuthRequest, SetMonitorAuthRequest, BulkMonitorActionRequest, diff --git a/src/lib/api.generated.ts b/src/lib/api.generated.ts index d4888b6..cf35cbc 100644 --- a/src/lib/api.generated.ts +++ b/src/lib/api.generated.ts @@ -29,7 +29,8 @@ export interface paths { path?: never; cookie?: never; }; - get?: never; + /** Get a single alert channel by id */ + get: operations["get_8"]; /** Update an alert channel's name and re-encrypt config */ put: operations["update_14"]; post?: never; @@ -426,7 +427,7 @@ export interface paths { cookie?: never; }; /** Get incident details including update timeline */ - get: operations["get_10"]; + get: operations["get_11"]; put?: never; post?: never; delete?: never; @@ -1389,7 +1390,7 @@ export interface paths { cookie?: never; }; /** Get a subscription by its ID */ - get: operations["get_9"]; + get: operations["get_10"]; put?: never; post?: never; /** @@ -1500,7 +1501,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get daily uptime data for a component */ + /** + * 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. + */ get: operations["getComponentUptime"]; put?: never; post?: never; @@ -1519,7 +1523,7 @@ export interface paths { }; /** * Batch daily uptime data for all leaf components - * @description Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. + * @description Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. 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. */ get: operations["getBatchComponentUptime"]; put?: never; @@ -2423,17 +2427,17 @@ export interface components { * Format: int32 * @description 1-based escalation step this delivery belongs to */ - stepNumber?: number; + stepNumber: number; /** * Format: int32 * @description Fire sequence within the step: 1 = initial, 2+ = repeat re-fires */ - fireCount?: number; + fireCount: number; /** * Format: int32 * @description Number of delivery attempts made */ - attemptCount?: number; + attemptCount: number; /** * Format: date-time * @description When the last attempt was made @@ -2454,7 +2458,12 @@ export interface components { /** Format: date-time */ createdAt: string; }; - ApiKeyAuthConfig: Omit & { + ApiKeyAuthConfig: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "api_key"; /** @description HTTP header name that carries the API key */ headerName: string; /** @@ -2462,12 +2471,6 @@ export interface components { * @description Vault secret ID for the API key value */ vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "api_key"; }; /** @description Created API key with the full key value — store it now, it won't be shown again */ ApiKeyCreateResponse: { @@ -2475,7 +2478,7 @@ export interface components { * Format: int32 * @description Unique API key identifier */ - id?: number; + id: number; /** @description Human-readable name for this API key */ name: string; /** @description Full API key value in dh_live_* format; store this now */ @@ -2497,7 +2500,7 @@ export interface components { * Format: int32 * @description Unique API key identifier */ - id?: number; + id: number; /** @description Human-readable name for this API key */ name: string; /** @description Full API key value in dh_live_* format */ @@ -2528,10 +2531,6 @@ export interface components { */ expiresAt?: string | null; }; - /** @description New assertion configuration (full replacement) */ - AssertionConfig: { - type: string; - }; /** @description Result of evaluating a single assertion against a check result */ AssertionResultDto: { /** @@ -2540,7 +2539,7 @@ export interface components { */ type: string; /** @description Whether the assertion passed */ - passed?: boolean; + passed: boolean; /** * @description Assertion severity * @enum {string} @@ -2566,7 +2565,7 @@ export interface components { */ assertionType: "status_code" | "response_time" | "body_contains" | "json_path" | "header_value" | "regex_body" | "dns_resolves" | "dns_response_time" | "dns_expected_ips" | "dns_expected_cname" | "dns_record_contains" | "dns_record_equals" | "dns_txt_contains" | "dns_min_answers" | "dns_max_answers" | "dns_response_time_warn" | "dns_ttl_low" | "dns_ttl_high" | "mcp_connects" | "mcp_response_time" | "mcp_has_capability" | "mcp_tool_available" | "mcp_min_tools" | "mcp_protocol_version" | "mcp_response_time_warn" | "mcp_tool_count_changed" | "ssl_expiry" | "response_size" | "redirect_count" | "redirect_target" | "response_time_warn" | "tcp_connects" | "tcp_response_time" | "tcp_response_time_warn" | "icmp_reachable" | "icmp_response_time" | "icmp_response_time_warn" | "icmp_packet_loss" | "heartbeat_received" | "heartbeat_max_interval" | "heartbeat_interval_drift" | "heartbeat_payload_contains"; /** @description Whether the assertion passed */ - passed?: boolean; + passed: boolean; /** * @description Assertion severity: FAIL or WARN * @enum {string} @@ -2584,7 +2583,7 @@ export interface components { * Format: int64 * @description Unique audit event identifier */ - id?: number; + id: number; /** * Format: int32 * @description User ID who performed the action; null for system actions @@ -2617,48 +2616,49 @@ export interface components { plan: components["schemas"]["PlanInfo"]; rateLimits: components["schemas"]["RateLimitInfo"]; }; - BasicAuthConfig: Omit & { - /** - * Format: uuid - * @description Vault secret ID holding Basic auth username and password - */ - vaultSecretId?: string | null; - } & { + BasicAuthConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "basic"; - }; - BearerAuthConfig: Omit & { /** * Format: uuid - * @description Vault secret ID holding the bearer token value + * @description Vault secret ID holding Basic auth username and password */ vaultSecretId?: string | null; - } & { + }; + /** @description Batch daily uptime per component, keyed by component ID */ + BatchComponentUptimeDto: { + /** @description Map of component ID → list of per-day uptime entries (oldest → newest) */ + components: { + [key: string]: components["schemas"]["ComponentUptimeDayDto"][]; + }; + }; + BearerAuthConfig: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ type: "bearer"; - }; - BodyContainsAssertion: Omit & { - /** @description Substring that must appear in the response body */ - substring: string; - } & { /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * Format: uuid + * @description Vault secret ID holding the bearer token value */ + vaultSecretId?: string | null; + }; + BodyContainsAssertion: { + /** @enum {string} */ type: "body_contains"; + /** @description Substring that must appear in the response body */ + substring: string; }; /** @description Request body for performing a bulk action on multiple monitors */ BulkMonitorActionRequest: { /** @description IDs of monitors to act on (max 200) */ monitorIds: string[]; /** - * @description Action to perform: PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG + * @description Action to apply to every monitor in the bulk request * @enum {string} */ action: "PAUSE" | "RESUME" | "DELETE" | "ADD_TAG" | "REMOVE_TAG"; @@ -2682,7 +2682,7 @@ export interface components { * Format: int64 * @description Number of services in this category */ - serviceCount?: number; + serviceCount: number; }; /** @description Update an organization member's role */ ChangeRoleRequest: { @@ -2700,10 +2700,6 @@ export interface components { */ status: "INVITED" | "ACTIVE" | "SUSPENDED" | "LEFT" | "REMOVED" | "DECLINED"; }; - /** @description New channel configuration (full replacement, not partial update) */ - ChannelConfig: { - channelType: string; - }; /** @description Aggregated metrics for a time bucket */ ChartBucketDto: { /** @@ -2797,7 +2793,7 @@ export interface components { * @description Whether the check passed * @example true */ - passed?: boolean; + passed: boolean; /** @description Reason for failure when passed=false */ failureReason?: string | null; /** @description Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing */ @@ -2810,9 +2806,7 @@ export interface components { checkId?: string | null; }; /** @description Check-type-specific details — polymorphic by check_type discriminator */ - CheckTypeDetailsDto: { - check_type: string; - }; + CheckTypeDetailsDto: components["schemas"]["Http"] | components["schemas"]["Tcp"] | components["schemas"]["Icmp"] | components["schemas"]["Dns"] | components["schemas"]["McpServer"]; /** @description One component's uptime contribution for the day */ ComponentImpact: { /** @@ -2828,17 +2822,17 @@ export interface components { * Format: double * @description Computed uptime % for this component on this day */ - uptimePercentage?: number; + uptimePercentage: number; /** * Format: int32 * @description Seconds of partial outage observed on this day */ - partialOutageSeconds?: number; + partialOutageSeconds: number; /** * Format: int32 * @description Seconds of major outage observed on this day */ - majorOutageSeconds?: number; + majorOutageSeconds: number; }; /** @description A single component position */ ComponentPosition: { @@ -2851,7 +2845,7 @@ export interface components { * Format: int32 * @description New display order (0-based) */ - displayOrder?: number; + displayOrder: number; /** * Format: uuid * @description Target group ID, null for ungrouped @@ -2867,30 +2861,37 @@ export interface components { /** @description Current component status, e.g. operational, degraded_performance */ status: string; }; - /** @description Daily uptime data for a status page component */ + /** @description Daily uptime data for a component */ ComponentUptimeDayDto: { /** * Format: date-time - * @description Start-of-day timestamp for this bucket (UTC midnight) + * @description Date of the daily bucket (ISO 8601) */ date: string; /** * Format: int32 - * @description Seconds of partial outage on this day + * @description Seconds of partial outage observed on this day */ - partialOutageSeconds?: number; + partialOutageSeconds: number; /** * Format: int32 - * @description Seconds of major outage on this day + * @description Seconds of major outage observed on this day + */ + majorOutageSeconds: number; + /** + * Format: int32 + * @description Seconds the component spent in degraded performance on this day */ - majorOutageSeconds?: number; + degradedSeconds: number; /** * Format: double - * @description Computed uptime percentage using weighted formula + * @description Computed uptime percentage for the day */ - uptimePercentage?: number; - /** @description Incidents that overlapped this day */ - incidents?: components["schemas"]["IncidentRef"][] | null; + uptimePercentage: number; + /** @description Incident event references for this day as raw JSON */ + eventsJson?: string | null; + /** @description Data source: vendor_reported or incident_derived */ + source: string; }; /** @description Inline uptime percentages for 24h, 7d, 30d */ ComponentUptimeSummaryDto: { @@ -2929,12 +2930,12 @@ export interface components { * Format: int32 * @description Minimum failing regions required to confirm an incident */ - minRegionsFailing?: number; + minRegionsFailing: number; /** * Format: int32 * @description Maximum seconds to wait for enough regions to fail after first trigger */ - maxWaitSeconds?: number; + maxWaitSeconds: number; }; CreateAlertChannelRequest: { /** @description Human-readable name for this alert channel */ @@ -2954,10 +2955,10 @@ export interface components { CreateAssertionRequest: { config: components["schemas"]["BodyContainsAssertion"] | components["schemas"]["DnsExpectedCnameAssertion"] | components["schemas"]["DnsExpectedIpsAssertion"] | components["schemas"]["DnsMaxAnswersAssertion"] | components["schemas"]["DnsMinAnswersAssertion"] | components["schemas"]["DnsRecordContainsAssertion"] | components["schemas"]["DnsRecordEqualsAssertion"] | components["schemas"]["DnsResolvesAssertion"] | components["schemas"]["DnsResponseTimeAssertion"] | components["schemas"]["DnsResponseTimeWarnAssertion"] | components["schemas"]["DnsTtlHighAssertion"] | components["schemas"]["DnsTtlLowAssertion"] | components["schemas"]["DnsTxtContainsAssertion"] | components["schemas"]["HeaderValueAssertion"] | components["schemas"]["HeartbeatIntervalDriftAssertion"] | components["schemas"]["HeartbeatMaxIntervalAssertion"] | components["schemas"]["HeartbeatPayloadContainsAssertion"] | components["schemas"]["HeartbeatReceivedAssertion"] | components["schemas"]["IcmpPacketLossAssertion"] | components["schemas"]["IcmpReachableAssertion"] | components["schemas"]["IcmpResponseTimeAssertion"] | components["schemas"]["IcmpResponseTimeWarnAssertion"] | components["schemas"]["JsonPathAssertion"] | components["schemas"]["McpConnectsAssertion"] | components["schemas"]["McpHasCapabilityAssertion"] | components["schemas"]["McpMinToolsAssertion"] | components["schemas"]["McpProtocolVersionAssertion"] | components["schemas"]["McpResponseTimeAssertion"] | components["schemas"]["McpResponseTimeWarnAssertion"] | components["schemas"]["McpToolAvailableAssertion"] | components["schemas"]["McpToolCountChangedAssertion"] | components["schemas"]["RedirectCountAssertion"] | components["schemas"]["RedirectTargetAssertion"] | components["schemas"]["RegexBodyAssertion"] | components["schemas"]["ResponseSizeAssertion"] | components["schemas"]["ResponseTimeAssertion"] | components["schemas"]["ResponseTimeWarnAssertion"] | components["schemas"]["SslExpiryAssertion"] | components["schemas"]["StatusCodeAssertion"] | components["schemas"]["TcpConnectsAssertion"] | components["schemas"]["TcpResponseTimeAssertion"] | components["schemas"]["TcpResponseTimeWarnAssertion"]; /** - * @description Outcome severity: FAIL (fails the check) or WARN (warns without failing) - * @enum {string} + * @description Outcome severity: FAIL (fails the check) or WARN (warns without failing, default: FAIL) + * @enum {string|null} */ - severity: "fail" | "warn"; + severity?: "fail" | "warn" | null; }; CreateEnvironmentRequest: { /** @description Human-readable environment name */ @@ -2969,7 +2970,7 @@ export interface components { [key: string]: string | null; } | null; /** @description Whether this is the default environment for new monitors */ - isDefault?: boolean; + isDefault: boolean; }; /** @description Invite a new member to the organization by email */ CreateInviteRequest: { @@ -3064,19 +3065,19 @@ export interface components { /** @description Human-readable name for this policy */ name: string; /** @description Match rules to evaluate (all must pass; omit or empty for catch-all) */ - matchRules: components["schemas"]["MatchRule"][]; + matchRules?: components["schemas"]["MatchRule"][] | null; escalation: components["schemas"]["EscalationChain"]; /** * @description Whether this policy is enabled (default true) * @default true */ - enabled: boolean; + enabled: boolean | null; /** * Format: int32 * @description Evaluation priority; higher value = evaluated first (default 0) * @default 0 */ - priority: number; + priority: number | null; }; /** @description Request body for creating a resource group */ CreateResourceGroupRequest: { @@ -3272,22 +3273,13 @@ export interface components { name: string; }; /** @description Cursor-paginated response for time-series and append-only data */ - CursorPage: { - /** @description Items on this page */ - data: Record[]; - /** @description Opaque cursor for the next page; null when there are no more results */ - nextCursor?: string | null; - /** @description Whether more results exist beyond this page */ - hasMore?: boolean; - }; - /** @description Cursor-paginated response for time-series and append-only data */ CursorPageCheckResultDto: { /** @description Items on this page */ data: components["schemas"]["CheckResultDto"][]; /** @description Opaque cursor for the next page; null when there are no more results */ nextCursor?: string | null; /** @description Whether more results exist beyond this page */ - hasMore?: boolean; + hasMore: boolean; }; /** @description Cursor-paginated response for time-series and append-only data */ CursorPageServiceCatalogDto: { @@ -3296,7 +3288,7 @@ export interface components { /** @description Opaque cursor for the next page; null when there are no more results */ nextCursor?: string | null; /** @description Whether more results exist beyond this page */ - hasMore?: boolean; + hasMore: boolean; }; /** @description Cursor-paginated response for time-series and append-only data */ CursorPageServicePollResultDto: { @@ -3305,7 +3297,7 @@ export interface components { /** @description Opaque cursor for the next page; null when there are no more results */ nextCursor?: string | null; /** @description Whether more results exist beyond this page */ - hasMore?: boolean; + hasMore: boolean; }; /** @description Combined dashboard overview for monitors and incidents */ DashboardOverviewDto: { @@ -3332,7 +3324,7 @@ export interface components { */ impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; /** @description True for scheduled maintenances; false for unplanned incidents */ - scheduled?: boolean; + scheduled: boolean; /** * Format: date-time * @description Incident start timestamp @@ -3352,22 +3344,22 @@ export interface components { * Format: int32 * @description DEK version before rotation */ - previousDekVersion?: number; + previousDekVersion: number; /** * Format: int32 * @description DEK version after rotation */ - newDekVersion?: number; + newDekVersion: number; /** * Format: int32 * @description Number of secrets re-encrypted with the new DEK */ - secretsReEncrypted?: number; + secretsReEncrypted: number; /** * Format: int32 * @description Number of alert channels re-encrypted with the new DEK */ - channelsReEncrypted?: number; + channelsReEncrypted: number; /** * Format: date-time * @description Timestamp when the rotation was performed @@ -3397,7 +3389,7 @@ export interface components { * Format: int32 * @description 1-based attempt number */ - attemptNumber?: number; + attemptNumber: number; /** @description Outcome: SUCCESS, FAILED, TIMEOUT, ERROR */ status: string; /** @@ -3445,39 +3437,55 @@ export interface components { */ expiresAt: string; }; - DiscordChannelConfig: Omit & { + DiscordChannelConfig: { + /** @enum {string} */ + channelType: "discord"; /** @description Discord webhook URL */ webhookUrl: string; /** @description Optional Discord role ID to mention in notifications */ mentionRoleId?: string | null; - } & { + }; + /** @description DNS check-type-specific details */ + Dns: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ - channelType: "discord"; + check_type: "dns"; + /** @description Target hostname */ + hostname?: string | null; + /** @description Requested DNS record types */ + requestedTypes?: (string | null)[] | null; + /** @description Resolver used for lookup */ + usedResolver?: string | null; + /** @description Resolved DNS records keyed by record type */ + records?: { + [key: string]: ({ + [key: string]: Record | null; + } | null)[] | null; + } | null; + /** @description DNS resolution attempts */ + attempts?: ({ + [key: string]: Record | null; + } | null)[] | null; + /** @description Kind of DNS failure, if any */ + failureKind?: string | null; }; - DnsExpectedCnameAssertion: Omit & { + DnsExpectedCnameAssertion: { + /** @enum {string} */ + type: "dns_expected_cname"; /** @description Expected CNAME target the resolution must include */ value: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_expected_cname"; }; - DnsExpectedIpsAssertion: Omit & { + DnsExpectedIpsAssertion: { + /** @enum {string} */ + type: "dns_expected_ips"; /** @description Allowed IP addresses; at least one resolved address must match */ ips: string[]; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_expected_ips"; }; - DnsMaxAnswersAssertion: Omit & { + DnsMaxAnswersAssertion: { + /** @enum {string} */ + type: "dns_max_answers"; /** @description DNS record type whose answer count is checked */ recordType: string; /** @@ -3485,14 +3493,10 @@ export interface components { * @description Maximum number of answers allowed for that record type */ max: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_max_answers"; }; - DnsMinAnswersAssertion: Omit & { + DnsMinAnswersAssertion: { + /** @enum {string} */ + type: "dns_min_answers"; /** @description DNS record type whose answer count is checked */ recordType: string; /** @@ -3500,14 +3504,8 @@ export interface components { * @description Minimum number of answers required for that record type */ min: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_min_answers"; }; - DnsMonitorConfig: components["schemas"]["MonitorConfig"] & { + DnsMonitorConfig: { /** @description Domain name to resolve */ hostname: string; /** @description DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR */ @@ -3525,108 +3523,73 @@ export interface components { */ totalTimeoutMs?: number | null; }; - DnsRecordContainsAssertion: Omit & { + DnsRecordContainsAssertion: { + /** @enum {string} */ + type: "dns_record_contains"; /** @description DNS record type to assert on (A, AAAA, CNAME, MX, TXT) */ recordType: string; /** @description Substring that must appear in a matching record value */ substring: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_record_contains"; }; - DnsRecordEqualsAssertion: Omit & { + DnsRecordEqualsAssertion: { + /** @enum {string} */ + type: "dns_record_equals"; /** @description DNS record type to assert on (A, AAAA, CNAME, MX, TXT) */ recordType: string; /** @description Expected DNS record value for an exact match */ value: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_record_equals"; }; - DnsResolvesAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ + DnsResolvesAssertion: { + /** @enum {string} */ type: "dns_resolves"; }; - DnsResponseTimeAssertion: Omit & { + DnsResponseTimeAssertion: { + /** @enum {string} */ + type: "dns_response_time"; /** * Format: int32 * @description Maximum allowed DNS resolution time in milliseconds */ maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_response_time"; }; - DnsResponseTimeWarnAssertion: Omit & { + DnsResponseTimeWarnAssertion: { + /** @enum {string} */ + type: "dns_response_time_warn"; /** * Format: int32 * @description DNS resolution time in milliseconds that triggers a warning only */ warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_response_time_warn"; }; - DnsTtlHighAssertion: Omit & { + DnsTtlHighAssertion: { + /** @enum {string} */ + type: "dns_ttl_high"; /** * Format: int32 * @description Maximum TTL in seconds before a high-TTL warning is raised */ maxTtl: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_ttl_high"; }; - DnsTtlLowAssertion: Omit & { + DnsTtlLowAssertion: { + /** @enum {string} */ + type: "dns_ttl_low"; /** * Format: int32 * @description Minimum acceptable TTL in seconds before a warning is raised */ minTtl: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_ttl_low"; }; - DnsTxtContainsAssertion: Omit & { + DnsTxtContainsAssertion: { + /** @enum {string} */ + type: "dns_txt_contains"; /** @description Substring that must appear in at least one TXT record */ substring: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_txt_contains"; }; - EmailChannelConfig: Omit & { + EmailChannelConfig: { + /** @enum {string} */ + channelType: "email"; /** @description Email addresses to send notifications to */ recipients: string[]; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "email"; }; /** @description A single resolved entitlement for the organization */ EntitlementDto: { @@ -3636,14 +3599,14 @@ export interface components { * Format: int64 * @description Effective limit value (overrides applied) */ - value?: number; + value: number; /** * Format: int64 * @description Plan-tier default value before overrides */ - defaultValue?: number; + defaultValue: number; /** @description Whether this entitlement has an org-level override */ - overridden?: boolean; + overridden: boolean; }; /** @description Environment with variable substitutions for monitor configs */ EnvironmentDto: { @@ -3656,7 +3619,7 @@ export interface components { * Format: int32 * @description Organization this environment belongs to */ - orgId?: number; + orgId: number; /** @description Human-readable environment name */ name: string; /** @description URL-safe identifier */ @@ -3679,9 +3642,36 @@ export interface components { * Format: int32 * @description Number of monitors using this environment */ - monitorCount?: number; + monitorCount: number; /** @description Whether this is the default environment for new monitors */ - isDefault?: boolean; + isDefault: boolean; + }; + /** + * @description Uniform error envelope returned for every non-2xx response + * @example { + * "status": 404, + * "message": "Monitor not found", + * "timestamp": 1737302400000 + * } + */ + ErrorResponse: { + /** + * Format: int32 + * @description HTTP status code (mirrors the response status line) + * @example 404 + */ + status: number; + /** + * @description Human-readable error message; safe to surface to end users + * @example Monitor not found + */ + message: string; + /** + * Format: int64 + * @description Server time when the error was produced (epoch milliseconds) + * @example 1737302400000 + */ + timestamp: number; }; /** @description Escalation chain defining which channels to notify; null preserves current */ EscalationChain: { @@ -3698,7 +3688,7 @@ export interface components { * Format: int32 * @description Minutes to wait before executing this step (0 = immediate) */ - delayMinutes?: number; + delayMinutes: number; /** @description Alert channel IDs to notify in this step */ channelIds: string[]; /** @description Whether an acknowledgment is required before escalating */ @@ -3725,42 +3715,42 @@ export interface components { * Format: int32 * @description Total number of services in the catalog */ - totalServices?: number; + totalServices: number; /** * Format: int32 * @description Number of services currently fully operational */ - operationalCount?: number; + operationalCount: number; /** * Format: int32 * @description Number of services with degraded status */ - degradedCount?: number; + degradedCount: number; /** * Format: int32 * @description Number of services with partial outage */ - partialOutageCount?: number; + partialOutageCount: number; /** * Format: int32 * @description Number of services with major outage */ - majorOutageCount?: number; + majorOutageCount: number; /** * Format: int32 * @description Number of services currently under maintenance */ - maintenanceCount?: number; + maintenanceCount: number; /** * Format: int32 * @description Number of services with unknown or null status */ - unknownCount?: number; + unknownCount: number; /** * Format: int64 * @description Total number of active incidents across all services */ - activeIncidentCount?: number; + activeIncidentCount: number; /** @description Services that are not fully operational */ servicesWithIssues: components["schemas"]["ServiceCatalogDto"][]; }; @@ -3774,7 +3764,12 @@ export interface components { /** @description Ordered component IDs with their within-group display order */ positions: components["schemas"]["ComponentPosition"][]; }; - HeaderAuthConfig: Omit & { + HeaderAuthConfig: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: "header"; /** @description Custom HTTP header name for the secret value */ headerName: string; /** @@ -3782,14 +3777,10 @@ export interface components { * @description Vault secret ID for the header value */ vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "header"; }; - HeaderValueAssertion: Omit & { + HeaderValueAssertion: { + /** @enum {string} */ + type: "header_value"; /** @description HTTP header name to assert on */ headerName: string; /** @description Expected value to compare against */ @@ -3799,40 +3790,26 @@ export interface components { * @enum {string} */ operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "header_value"; }; - HeartbeatIntervalDriftAssertion: Omit & { + HeartbeatIntervalDriftAssertion: { + /** @enum {string} */ + type: "heartbeat_interval_drift"; /** * Format: int32 * @description Max percent drift from expected ping interval before warning (non-fatal) */ maxDeviationPercent: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_interval_drift"; }; - HeartbeatMaxIntervalAssertion: Omit & { + HeartbeatMaxIntervalAssertion: { + /** @enum {string} */ + type: "heartbeat_max_interval"; /** * Format: int32 * @description Maximum allowed gap in seconds between consecutive heartbeat pings */ maxSeconds: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_max_interval"; }; - HeartbeatMonitorConfig: components["schemas"]["MonitorConfig"] & { + HeartbeatMonitorConfig: { /** * Format: int32 * @description Expected heartbeat interval in seconds @@ -3844,26 +3821,41 @@ export interface components { */ gracePeriod: number; }; - HeartbeatPayloadContainsAssertion: Omit & { + HeartbeatPayloadContainsAssertion: { + /** @enum {string} */ + type: "heartbeat_payload_contains"; /** @description JSONPath expression into the heartbeat ping JSON payload */ path: string; /** @description Expected value to compare against at that path */ value: string; - } & { + }; + /** @description Acknowledgement that a heartbeat ping was accepted */ + HeartbeatPingResponse: { /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * @description Always true on a 2xx response + * @example true */ - type: "heartbeat_payload_contains"; + ok: boolean; }; - HeartbeatReceivedAssertion: Omit & { + HeartbeatReceivedAssertion: { + /** @enum {string} */ + type: "heartbeat_received"; + }; + /** @description HTTP check-type-specific details */ + Http: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ - type: "heartbeat_received"; + check_type: "http"; + /** @description Request phase timing breakdown */ + timing?: { + [key: string]: Record | null; + } | null; + /** @description Whether the response body was truncated before storage */ + bodyTruncated?: boolean | null; }; - HttpMonitorConfig: components["schemas"]["MonitorConfig"] & { + HttpMonitorConfig: { /** @description Target URL to send requests to */ url: string; /** @@ -3882,65 +3874,99 @@ export interface components { /** @description Whether to verify TLS certificates (default: true) */ verifyTls?: boolean | null; }; - IcmpMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** @description Target hostname or IP address to ping */ + /** @description ICMP (ping) check-type-specific details */ + Icmp: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + check_type: "icmp"; + /** + * @description Target host + * @example 1.1.1.1 + */ host: string; /** * Format: int32 - * @description Number of ICMP packets to send + * @description Number of ICMP packets sent */ - packetCount?: number | null; + packetsSent?: number | null; /** * Format: int32 - * @description Ping timeout in milliseconds + * @description Number of ICMP packets received */ - timeoutMs?: number | null; - }; - IcmpPacketLossAssertion: Omit & { + packetsReceived?: number | null; /** * Format: double - * @description Maximum allowed packet loss percentage before the check fails (0–100) + * @description Packet loss percentage + * @example 0 */ - maxPercent: number; - } & { + packetLoss?: number | null; /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * Format: double + * @description Average round-trip time in ms */ - type: "icmp_packet_loss"; - }; - IcmpReachableAssertion: Omit & { + avgRttMs?: number | null; /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * Format: double + * @description Minimum round-trip time in ms */ - type: "icmp_reachable"; - }; - IcmpResponseTimeAssertion: Omit & { + minRttMs?: number | null; /** - * Format: int32 - * @description Maximum average ICMP round-trip time in milliseconds + * Format: double + * @description Maximum round-trip time in ms */ - maxMs: number; - } & { + maxRttMs?: number | null; /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * Format: double + * @description Jitter in ms */ - type: "icmp_response_time"; + jitterMs?: number | null; }; - IcmpResponseTimeWarnAssertion: Omit & { + IcmpMonitorConfig: { + /** @description Target hostname or IP address to ping */ + host: string; /** * Format: int32 - * @description ICMP round-trip time in milliseconds that triggers a warning only + * @description Number of ICMP packets to send */ - warnMs: number; - } & { + packetCount?: number | null; /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} + * Format: int32 + * @description Ping timeout in milliseconds + */ + timeoutMs?: number | null; + }; + IcmpPacketLossAssertion: { + /** @enum {string} */ + type: "icmp_packet_loss"; + /** + * Format: double + * @description Maximum allowed packet loss percentage before the check fails (0–100) */ + maxPercent: number; + }; + IcmpReachableAssertion: { + /** @enum {string} */ + type: "icmp_reachable"; + }; + IcmpResponseTimeAssertion: { + /** @enum {string} */ + type: "icmp_response_time"; + /** + * Format: int32 + * @description Maximum average ICMP round-trip time in milliseconds + */ + maxMs: number; + }; + IcmpResponseTimeWarnAssertion: { + /** @enum {string} */ type: "icmp_response_time_warn"; + /** + * Format: int32 + * @description ICMP round-trip time in milliseconds that triggers a warning only + */ + warnMs: number; }; IncidentDetailDto: { incident: components["schemas"]["IncidentDto"]; @@ -3963,7 +3989,7 @@ export interface components { * Format: int32 * @description Organization this incident belongs to */ - organizationId?: number; + organizationId: number; /** * @description Incident origin: MONITOR, SERVICE, or MANUAL * @enum {string} @@ -3989,14 +4015,14 @@ export interface components { * Format: int32 * @description Number of times this incident has been reopened */ - reopenCount?: number; + reopenCount: number; /** * Format: int32 * @description User who created the incident (manual incidents only) */ createdByUserId?: number | null; /** @description Whether this incident is visible on the status page */ - statusPageVisible?: boolean; + statusPageVisible: boolean; /** * Format: uuid * @description Linked vendor service incident ID; null for monitor incidents @@ -4048,46 +4074,84 @@ export interface components { * @description Timestamp when the incident was last updated */ updatedAt: string; - /** @description Name of the associated monitor; populated on list responses */ + /** @description Name of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null. */ monitorName?: string | null; - /** @description Name of the associated service; populated on list responses */ + /** @description Name of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null. */ serviceName?: string | null; - /** @description Slug of the associated service; populated on list responses */ + /** @description Slug of the associated service; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null. */ serviceSlug?: string | null; - /** @description Type of the associated monitor; populated on list responses */ + /** @description Type of the associated monitor; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null. */ monitorType?: string | null; /** * Format: uuid * @description Resource group that owns this incident; null when not group-managed */ resourceGroupId?: string | null; - /** @description Name of the resource group; populated on list responses */ + /** @description Name of the resource group; populated on list responses. Omitted from JSON (undefined to SDKs) on detail responses, treat missing as null. */ resourceGroupName?: string | null; }; IncidentFilterParams: { - /** @enum {string|null} */ + /** + * @description Filter by incident lifecycle status; null returns every status + * @enum {string|null} + */ status?: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED" | null; - /** @enum {string|null} */ + /** + * @description Filter by severity; null returns every severity + * @enum {string|null} + */ severity?: "DOWN" | "DEGRADED" | "MAINTENANCE" | null; - /** @enum {string|null} */ + /** + * @description Filter by where the incident originated (auto, manual, third-party) + * @enum {string|null} + */ source?: "AUTOMATIC" | "MANUAL" | "MONITORS" | "STATUS_DATA" | "RESOURCE_GROUP" | null; - /** Format: uuid */ + /** + * Format: uuid + * @description Only return incidents tied to this monitor ID + */ monitorId?: string | null; - /** Format: uuid */ + /** + * Format: uuid + * @description Only return incidents tied to this service ID (third-party services) + */ serviceId?: string | null; - /** Format: uuid */ + /** + * Format: uuid + * @description Only return incidents whose monitor belongs to this resource group + */ resourceGroupId?: string | null; - /** Format: uuid */ + /** + * Format: uuid + * @description Only return incidents whose monitor carries this tag + */ tagId?: string | null; - /** Format: uuid */ + /** + * Format: uuid + * @description Only return incidents whose monitor lives in this environment + */ environmentId?: string | null; - /** Format: date-time */ + /** + * Format: date-time + * @description Earliest startedAt to include (inclusive, ISO 8601) + */ startedFrom?: string | null; - /** Format: date-time */ + /** + * Format: date-time + * @description Latest startedAt to include (inclusive, ISO 8601) + */ startedTo?: string | null; - /** Format: int32 */ + /** + * Format: int32 + * @description Zero-based page index (default: 0) + * @example 0 + */ page: number; - /** Format: int32 */ + /** + * Format: int32 + * @description Number of incidents per page (1–200, default: 10) + * @example 10 + */ size: number; }; /** @description Incident detection, confirmation, and recovery policy for a monitor */ @@ -4160,7 +4224,7 @@ export interface components { body?: string | null; /** @enum {string|null} */ createdBy?: "SYSTEM" | "USER" | null; - notifySubscribers?: boolean; + notifySubscribers: boolean; /** Format: date-time */ createdAt: string; }; @@ -4197,7 +4261,7 @@ export interface components { * Format: int32 * @description Unique invite identifier */ - inviteId?: number; + inviteId: number; /** @description Email address the invite was sent to */ email: string; /** @@ -4221,7 +4285,9 @@ export interface components { */ revokedAt?: string | null; }; - JsonPathAssertion: Omit & { + JsonPathAssertion: { + /** @enum {string} */ + type: "json_path"; /** @description JSONPath expression to extract a value from the response body */ path: string; /** @description Expected value to compare against */ @@ -4231,12 +4297,6 @@ export interface components { * @enum {string} */ operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "json_path"; }; /** @description API key metadata */ KeyInfo: { @@ -4244,7 +4304,7 @@ export interface components { * Format: int32 * @description Key ID */ - id?: number; + id: number; /** @description Human-readable key name */ name: string; /** @@ -4275,7 +4335,7 @@ export interface components { status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; /** @enum {string} */ impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - scheduled?: boolean; + scheduled: boolean; /** Format: date-time */ publishedAt?: string | null; }; @@ -4324,7 +4384,7 @@ export interface components { * Format: int32 * @description Organization this maintenance window belongs to */ - organizationId?: number; + organizationId: number; /** * Format: date-time * @description Scheduled start of the maintenance window @@ -4340,7 +4400,7 @@ export interface components { /** @description Human-readable reason for the maintenance */ reason?: string | null; /** @description Whether alerts are suppressed during this window */ - suppressAlerts?: boolean; + suppressAlerts: boolean; /** * Format: date-time * @description Timestamp when the window was created @@ -4360,73 +4420,81 @@ export interface components { /** @description Values list for multi-value rules like monitor_type_in */ values?: string[] | null; }; - McpConnectsAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ + McpConnectsAssertion: { + /** @enum {string} */ type: "mcp_connects"; }; - McpHasCapabilityAssertion: Omit & { + McpHasCapabilityAssertion: { + /** @enum {string} */ + type: "mcp_has_capability"; /** @description Capability name the server must advertise, e.g. tools or resources */ capability: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_has_capability"; }; - McpMinToolsAssertion: Omit & { + McpMinToolsAssertion: { + /** @enum {string} */ + type: "mcp_min_tools"; /** * Format: int32 * @description Minimum number of tools the server must expose */ min: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_min_tools"; }; - McpProtocolVersionAssertion: Omit & { + McpProtocolVersionAssertion: { + /** @enum {string} */ + type: "mcp_protocol_version"; /** @description Expected MCP protocol version string from the server handshake */ version: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_protocol_version"; }; - McpResponseTimeAssertion: Omit & { + McpResponseTimeAssertion: { + /** @enum {string} */ + type: "mcp_response_time"; /** * Format: int32 * @description Maximum allowed MCP check duration in milliseconds */ maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_response_time"; }; - McpResponseTimeWarnAssertion: Omit & { + McpResponseTimeWarnAssertion: { + /** @enum {string} */ + type: "mcp_response_time_warn"; /** * Format: int32 * @description MCP check duration in milliseconds that triggers a warning only */ warnMs: number; - } & { + }; + /** @description MCP server check-type-specific details */ + McpServer: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ - type: "mcp_response_time_warn"; + check_type: "mcp_server"; + /** @description MCP server URL */ + url?: string | null; + /** @description MCP protocol version */ + protocolVersion?: string | null; + /** @description MCP server info (name, version, etc.) */ + serverInfo?: { + [key: string]: Record | null; + } | null; + /** + * Format: int32 + * @description Number of tools exposed + */ + toolCount?: number | null; + /** + * Format: int32 + * @description Number of resources exposed + */ + resourceCount?: number | null; + /** + * Format: int32 + * @description Number of prompts exposed + */ + promptCount?: number | null; }; - McpServerMonitorConfig: components["schemas"]["MonitorConfig"] & { + McpServerMonitorConfig: { /** @description Command to execute to start the MCP server */ command: string; /** @description Command-line arguments for the MCP server process */ @@ -4436,28 +4504,20 @@ export interface components { [key: string]: string | null; } | null; }; - McpToolAvailableAssertion: Omit & { + McpToolAvailableAssertion: { + /** @enum {string} */ + type: "mcp_tool_available"; /** @description MCP tool name that must appear in the server's tool list */ toolName: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_tool_available"; }; - McpToolCountChangedAssertion: Omit & { + McpToolCountChangedAssertion: { + /** @enum {string} */ + type: "mcp_tool_count_changed"; /** * Format: int32 * @description Expected tool count; warns when the live count differs */ expectedCount: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_tool_count_changed"; }; /** @description Organization member with role and status */ MemberDto: { @@ -4465,7 +4525,7 @@ export interface components { * Format: int32 * @description User identifier of the member */ - userId?: number; + userId: number; /** @description Member email address */ email: string; /** @description Member display name; null if not set */ @@ -4498,9 +4558,7 @@ export interface components { severity: "fail" | "warn"; }; /** @description New authentication configuration (full replacement) */ - MonitorAuthConfig: { - type: string; - }; + MonitorAuthConfig: components["schemas"]["BearerAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["HeaderAuthConfig"] | components["schemas"]["ApiKeyAuthConfig"]; MonitorAuthDto: { /** Format: uuid */ id: string; @@ -4510,8 +4568,6 @@ export interface components { authType: "bearer" | "basic" | "header" | "api_key"; config: components["schemas"]["ApiKeyAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["BearerAuthConfig"] | components["schemas"]["HeaderAuthConfig"]; }; - /** @description Protocol-specific monitor configuration */ - MonitorConfig: Record; /** @description Full monitor representation */ MonitorDto: { /** @@ -4523,7 +4579,7 @@ export interface components { * Format: int32 * @description Organization this monitor belongs to */ - organizationId?: number; + organizationId: number; /** @description Human-readable name for this monitor */ name: string; /** @enum {string} */ @@ -4533,9 +4589,9 @@ export interface components { * Format: int32 * @description Check frequency in seconds (30–86400) */ - frequencySeconds?: number; + frequencySeconds: number; /** @description Whether the monitor is active */ - enabled?: boolean; + enabled: boolean; /** @description Probe regions where checks are executed */ regions: string[]; /** @@ -4624,7 +4680,7 @@ export interface components { assertions?: components["schemas"]["CreateAssertionRequest"][] | null; }; MonitorTestResultDto: { - passed?: boolean; + passed: boolean; error?: string | null; /** Format: int32 */ statusCode?: number | null; @@ -4658,7 +4714,7 @@ export interface components { * Format: int32 * @description Monotonically increasing version number */ - version?: number; + version: number; snapshot: components["schemas"]["MonitorDto"]; /** * Format: int32 @@ -4718,7 +4774,7 @@ export interface components { * Format: int32 * @description 1-based index of the currently active escalation step */ - currentStep?: number; + currentStep: number; /** * Format: int32 * @description Total number of escalation steps in the policy (null if policy has been deleted) @@ -4758,7 +4814,7 @@ export interface components { * Format: int64 * @description Unique notification identifier */ - id?: number; + id: number; /** @description Notification category (e.g. incident, monitor, team) */ type: string; /** @description Short notification title */ @@ -4770,7 +4826,7 @@ export interface components { /** @description ID of the resource this notification is about */ resourceId?: string | null; /** @description Whether the notification has been read */ - read?: boolean; + read: boolean; /** * Format: date-time * @description Timestamp when the notification was created @@ -4788,19 +4844,19 @@ export interface components { * Format: int32 * @description Organization this policy belongs to */ - organizationId?: number; + organizationId: number; /** @description Human-readable name for this policy */ name: string; /** @description Match rules (all must pass; empty = catch-all) */ matchRules: components["schemas"]["MatchRule"][]; escalation: components["schemas"]["EscalationChain"]; /** @description Whether this policy is active */ - enabled?: boolean; + enabled: boolean; /** * Format: int32 * @description Evaluation order; higher value = evaluated first */ - priority?: number; + priority: number; /** * Format: date-time * @description Timestamp when the policy was created @@ -4812,17 +4868,13 @@ export interface components { */ updatedAt: string; }; - OpsGenieChannelConfig: Omit & { + OpsGenieChannelConfig: { + /** @enum {string} */ + channelType: "opsgenie"; /** @description OpsGenie API key for alert creation */ apiKey: string; /** @description OpsGenie API region: us or eu */ region?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "opsgenie"; }; /** @description Organization account details */ OrganizationDto: { @@ -4830,7 +4882,7 @@ export interface components { * Format: int32 * @description Unique organization identifier */ - id?: number; + id: number; /** @description Organization name */ name: string; /** @description Billing and contact email */ @@ -4848,7 +4900,7 @@ export interface components { * Format: int32 * @description Organization ID */ - id?: number; + id: number; /** @description Organization name */ name: string; }; @@ -4859,17 +4911,13 @@ export interface components { size: number; sort: string[]; }; - PagerDutyChannelConfig: Omit & { + PagerDutyChannelConfig: { + /** @enum {string} */ + channelType: "pagerduty"; /** @description PagerDuty Events API v2 routing (integration) key */ routingKey: string; /** @description Override PagerDuty severity mapping */ severityOverride?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "pagerduty"; }; /** @description A top-level page section (either a group or an ungrouped component) */ PageSection: { @@ -4899,7 +4947,7 @@ export interface components { /** @description Subscription status (null if no subscription) */ subscriptionStatus?: string | null; /** @description Whether the org is on a trial */ - trialActive?: boolean; + trialActive: boolean; /** * Format: date-time * @description Trial expiry (null if not trialing) @@ -4938,7 +4986,7 @@ export interface components { * @description Total polls in this bucket * @example 60 */ - totalPolls?: number; + totalPolls: number; }; PublishStatusPageIncidentRequest: { /** @description Customer-facing title; null keeps draft value */ @@ -4996,20 +5044,18 @@ export interface components { */ cooldownMinutes: number; }; - RedirectCountAssertion: Omit & { + RedirectCountAssertion: { + /** @enum {string} */ + type: "redirect_count"; /** * Format: int32 * @description Maximum number of HTTP redirects allowed before the check fails */ maxCount: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "redirect_count"; }; - RedirectTargetAssertion: Omit & { + RedirectTargetAssertion: { + /** @enum {string} */ + type: "redirect_target"; /** @description Expected final URL after following redirects */ expected: string; /** @@ -5017,22 +5063,12 @@ export interface components { * @enum {string} */ operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "redirect_target"; }; - RegexBodyAssertion: Omit & { + RegexBodyAssertion: { + /** @enum {string} */ + type: "regex_body"; /** @description Regular expression the response body must match */ pattern: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "regex_body"; }; /** @description Latest check result for a single region */ RegionStatusDto: { @@ -5045,7 +5081,7 @@ export interface components { * @description Whether the last check in this region passed * @example true */ - passed?: boolean; + passed: boolean; /** * Format: int32 * @description Response time in milliseconds for the last check @@ -5079,7 +5115,7 @@ export interface components { }; ResolveIncidentRequest: { /** @description Optional resolution message or post-mortem notes */ - body: string; + body?: string | null; }; /** @description Resource group with health summary and optional member details */ ResourceGroupDto: { @@ -5092,7 +5128,7 @@ export interface components { * Format: int32 * @description Organization this group belongs to */ - organizationId?: number; + organizationId: number; /** @description Human-readable group name */ name: string; /** @description URL-safe group identifier */ @@ -5127,7 +5163,7 @@ export interface components { /** @description Health threshold value */ healthThresholdValue?: number | null; /** @description When true, member-level incidents skip notification dispatch; only group alerts fire */ - suppressMemberAlerts?: boolean; + suppressMemberAlerts: boolean; /** * Format: int32 * @description Seconds to wait after health threshold breach before creating group incident @@ -5163,17 +5199,17 @@ export interface components { * Format: int32 * @description Total number of members in the group */ - totalMembers?: number; + totalMembers: number; /** * Format: int32 * @description Number of members currently in operational status */ - operationalCount?: number; + operationalCount: number; /** * Format: int32 * @description Number of members with an active incident or non-operational status */ - activeIncidents?: number; + activeIncidents: number; /** * @description Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured. * @enum {string|null} @@ -5257,44 +5293,32 @@ export interface components { /** @description Environment name; monitors only */ environmentName?: string | null; }; - ResponseSizeAssertion: Omit & { + ResponseSizeAssertion: { + /** @enum {string} */ + type: "response_size"; /** * Format: int32 * @description Maximum response body size in bytes before the check fails */ maxBytes: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_size"; }; - ResponseTimeAssertion: Omit & { + ResponseTimeAssertion: { + /** @enum {string} */ + type: "response_time"; /** * Format: int32 * @description Maximum allowed response time in milliseconds before the check fails */ thresholdMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_time"; }; - ResponseTimeWarnAssertion: Omit & { + ResponseTimeWarnAssertion: { + /** @enum {string} */ + type: "response_time_warn"; /** * Format: int32 * @description HTTP response time in milliseconds that triggers a warning only */ warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_time_warn"; }; /** @description Dashboard summary: current status, per-region latest results, and chart data */ ResultSummaryDto: { @@ -5328,12 +5352,12 @@ export interface components { * Format: int32 * @description Maximum number of retries after a failed check */ - maxRetries?: number; + maxRetries: number; /** * Format: int32 * @description Delay between retry attempts in seconds */ - interval?: number; + interval: number; }; /** @description A scheduled maintenance window from a vendor status page */ ScheduledMaintenanceDto: { @@ -5390,7 +5414,7 @@ export interface components { * Format: int32 * @description DEK version at the time of last encryption */ - dekVersion?: number; + dekVersion: number; /** @description SHA-256 hex digest of the current plaintext; use for change detection */ valueHash: string; /** @@ -5427,18 +5451,18 @@ export interface components { logoUrl?: string | null; adapterType: string; /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; - published?: boolean; + pollingIntervalSeconds: number; + enabled: boolean; + published: boolean; overallStatus?: string | null; /** Format: date-time */ createdAt: string; /** Format: date-time */ updatedAt: string; /** Format: int64 */ - componentCount?: number; + componentCount: number; /** Format: int64 */ - activeIncidentCount?: number; + activeIncidentCount: number; dataCompleteness: string; /** * Format: double @@ -5458,8 +5482,8 @@ export interface components { groupId?: string | null; /** Format: int32 */ position?: number | null; - showcase?: boolean; - onlyShowIfDegraded?: boolean; + showcase: boolean; + onlyShowIfDegraded: boolean; /** Format: date-time */ startDate?: string | null; /** Format: date-time */ @@ -5471,13 +5495,13 @@ export interface components { */ dataType: string; /** @description Whether uptime data is available for this component */ - hasUptime?: boolean; + hasUptime: boolean; /** @description Geographic region for regional components (AWS, GCP, Azure) */ region?: string | null; /** @description Display name of the parent group */ groupName?: string | null; /** @description Group-only: render an aggregated uptime bar above this group's children */ - displayAggregatedUptime?: boolean; + displayAggregatedUptime: boolean; /** * Format: int32 * @description Group-only count of visible leaf children; null for leaves @@ -5490,7 +5514,7 @@ export interface components { firstSeenAt: string; /** Format: date-time */ lastSeenAt: string; - isGroup?: boolean; + isGroup: boolean; }; /** @description One-day rollup for a public service status page: aggregated uptime, per-component impact, and incidents that overlapped the day. Powers the click/hover-to-expand panel under each uptime bar. */ ServiceDayDetailDto: { @@ -5508,12 +5532,17 @@ export interface components { * Format: int64 * @description Sum of partial outage seconds across all leaf components */ - totalPartialOutageSeconds?: number; + totalPartialOutageSeconds: number; /** * Format: int64 * @description Sum of major outage seconds across all leaf components */ - totalMajorOutageSeconds?: number; + totalMajorOutageSeconds: number; + /** + * Format: int64 + * @description Sum of degraded performance seconds across all leaf components + */ + totalDegradedSeconds: number; /** @description Per-component impact rows for the day (only components with uptime data) */ components: components["schemas"]["ComponentImpact"][]; /** @description Incidents that were active at any point during this day (started before day end, resolved after day start) */ @@ -5530,8 +5559,8 @@ export interface components { logoUrl?: string | null; adapterType: string; /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; + pollingIntervalSeconds: number; + enabled: boolean; /** Format: date-time */ createdAt: string; /** Format: date-time */ @@ -5599,7 +5628,7 @@ export interface components { * Format: int32 * @description Number of currently unresolved incidents */ - activeIncidentCount?: number; + activeIncidentCount: number; /** @description ISO 8601 timestamp of the last status poll */ lastPolledAt?: string | null; }; @@ -5636,7 +5665,7 @@ export interface components { * @description Whether the poll succeeded * @example true */ - passed?: boolean; + passed: boolean; /** @description Reason for failure when passed=false */ failureReason?: string | null; /** @@ -5644,13 +5673,13 @@ export interface components { * @description Number of components reported by the service * @example 12 */ - componentCount?: number; + componentCount: number; /** * Format: int32 * @description Number of degraded or non-operational components * @example 1 */ - degradedCount?: number; + degradedCount: number; }; /** @description Aggregated poll metrics and chart data for a service */ ServicePollSummaryDto: { @@ -5665,13 +5694,13 @@ export interface components { * @description Total number of polls executed * @example 4320 */ - totalPolls?: number; + totalPolls: number; /** * Format: int64 * @description Number of polls that succeeded * @example 4318 */ - passedPolls?: number; + passedPolls: number; /** * Format: double * @description Average response time in milliseconds; null when no data @@ -5725,8 +5754,8 @@ export interface components { officialStatusUrl?: string | null; adapterType: string; /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; + pollingIntervalSeconds: number; + enabled: boolean; /** @description Logo URL from the service catalog */ logoUrl?: string | null; /** @description Current overall status; null when the service has never been polled */ @@ -5797,6 +5826,9 @@ export interface components { SingleValueResponseAuthMeResponse: { data: components["schemas"]["AuthMeResponse"]; }; + SingleValueResponseBatchComponentUptimeDto: { + data: components["schemas"]["BatchComponentUptimeDto"]; + }; SingleValueResponseBulkMonitorActionResult: { data: components["schemas"]["BulkMonitorActionResult"]; }; @@ -5834,11 +5866,6 @@ export interface components { SingleValueResponseMaintenanceWindowDto: { data: components["schemas"]["MaintenanceWindowDto"]; }; - SingleValueResponseMapStringListComponentUptimeDayDto: { - data: { - [key: string]: components["schemas"]["ComponentUptimeDayDto"][]; - }; - }; SingleValueResponseMonitorAssertionDto: { data: components["schemas"]["MonitorAssertionDto"]; }; @@ -5944,32 +5971,26 @@ export interface components { SingleValueResponseWorkspaceDto: { data: components["schemas"]["WorkspaceDto"]; }; - SlackChannelConfig: Omit & { + SlackChannelConfig: { + /** @enum {string} */ + channelType: "slack"; /** @description Slack incoming webhook URL */ webhookUrl: string; /** @description Optional mention text included in notifications, e.g. @channel */ mentionText?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "slack"; }; - SslExpiryAssertion: Omit & { + SslExpiryAssertion: { + /** @enum {string} */ + type: "ssl_expiry"; /** * Format: int32 * @description Minimum days before TLS certificate expiry; fails or warns below this threshold */ minDaysRemaining: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "ssl_expiry"; }; - StatusCodeAssertion: Omit & { + StatusCodeAssertion: { + /** @enum {string} */ + type: "status_code"; /** @description Expected status code, range pattern, or wildcard such as 2xx */ expected: string; /** @@ -5977,12 +5998,6 @@ export interface components { * @enum {string} */ operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "status_code"; }; /** @description Updated branding configuration; null preserves current */ StatusPageBranding: { @@ -6033,12 +6048,12 @@ export interface components { resourceGroupId?: string | null; /** @enum {string} */ currentStatus: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE"; - showUptime?: boolean; + showUptime: boolean; /** Format: int32 */ - displayOrder?: number; + displayOrder: number; /** Format: int32 */ - pageOrder?: number; - excludeFromOverall?: boolean; + pageOrder: number; + excludeFromOverall: boolean; /** Format: date-time */ startDate?: string | null; /** Format: date-time */ @@ -6054,22 +6069,47 @@ export interface components { name: string; description?: string | null; /** Format: int32 */ - displayOrder?: number; + displayOrder: number; /** Format: int32 */ - pageOrder?: number; - collapsed?: boolean; + pageOrder: number; + collapsed: boolean; components?: components["schemas"]["StatusPageComponentDto"][] | null; /** Format: date-time */ createdAt: string; /** Format: date-time */ updatedAt: string; }; - StatusPageCustomDomainDto: { - /** Format: uuid */ - id: string; - hostname: string; - /** @enum {string} */ - status: "PENDING_VERIFICATION" | "VERIFICATION_FAILED" | "VERIFIED" | "SSL_PENDING" | "ACTIVE" | "FAILED" | "REMOVED"; + /** @description Daily uptime data for a status page component */ + StatusPageComponentUptimeDayDto: { + /** + * Format: date-time + * @description Start-of-day timestamp for this bucket (UTC midnight) + */ + date: string; + /** + * Format: int32 + * @description Seconds of partial outage on this day + */ + partialOutageSeconds: number; + /** + * Format: int32 + * @description Seconds of major outage on this day + */ + majorOutageSeconds: number; + /** + * Format: double + * @description Computed uptime percentage using weighted formula + */ + uptimePercentage: number; + /** @description Incidents that overlapped this day */ + incidents?: components["schemas"]["IncidentRef"][] | null; + }; + StatusPageCustomDomainDto: { + /** Format: uuid */ + id: string; + hostname: string; + /** @enum {string} */ + status: "PENDING_VERIFICATION" | "VERIFICATION_FAILED" | "VERIFIED" | "SSL_PENDING" | "ACTIVE" | "FAILED" | "REMOVED"; /** @enum {string} */ verificationMethod: "CNAME" | "TXT"; verificationToken: string; @@ -6081,22 +6121,22 @@ export interface components { createdAt: string; /** Format: date-time */ updatedAt: string; - primary?: boolean; + primary: boolean; }; StatusPageDto: { /** Format: uuid */ id: string; /** Format: int32 */ - organizationId?: number; + organizationId: number; /** Format: int32 */ - workspaceId?: number; + workspaceId: number; name: string; slug: string; description?: string | null; branding: components["schemas"]["StatusPageBranding"]; /** @enum {string} */ visibility: "PUBLIC" | "PASSWORD" | "IP_RESTRICTED"; - enabled?: boolean; + enabled: boolean; /** @enum {string} */ incidentMode: "MANUAL" | "REVIEW" | "AUTOMATIC"; /** Format: int32 */ @@ -6127,12 +6167,12 @@ export interface components { status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; /** @enum {string} */ impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - scheduled?: boolean; + scheduled: boolean; /** Format: date-time */ scheduledFor?: string | null; /** Format: date-time */ scheduledUntil?: string | null; - autoResolve?: boolean; + autoResolve: boolean; /** Format: uuid */ incidentId?: string | null; /** Format: date-time */ @@ -6162,7 +6202,7 @@ export interface components { createdBy?: "USER" | "SYSTEM" | null; /** Format: int32 */ createdByUserId?: number | null; - notifySubscribers?: boolean; + notifySubscribers: boolean; /** Format: date-time */ createdAt: string; }; @@ -6170,7 +6210,7 @@ export interface components { /** Format: uuid */ id: string; email: string; - confirmed?: boolean; + confirmed: boolean; /** Format: date-time */ createdAt: string; }; @@ -6183,8 +6223,8 @@ export interface components { }; TableValueResultAlertChannelDto: { data: components["schemas"]["AlertChannelDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6192,8 +6232,8 @@ export interface components { }; TableValueResultAlertDeliveryDto: { data: components["schemas"]["AlertDeliveryDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6201,8 +6241,8 @@ export interface components { }; TableValueResultApiKeyDto: { data: components["schemas"]["ApiKeyDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6210,8 +6250,8 @@ export interface components { }; TableValueResultAuditEventDto: { data: components["schemas"]["AuditEventDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6219,8 +6259,8 @@ export interface components { }; TableValueResultCategoryDto: { data: components["schemas"]["CategoryDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6228,8 +6268,8 @@ export interface components { }; TableValueResultComponentUptimeDayDto: { data: components["schemas"]["ComponentUptimeDayDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6237,8 +6277,8 @@ export interface components { }; TableValueResultDeliveryAttemptDto: { data: components["schemas"]["DeliveryAttemptDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6246,8 +6286,8 @@ export interface components { }; TableValueResultEnvironmentDto: { data: components["schemas"]["EnvironmentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6255,8 +6295,8 @@ export interface components { }; TableValueResultIncidentDto: { data: components["schemas"]["IncidentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6264,8 +6304,8 @@ export interface components { }; TableValueResultIntegrationDto: { data: components["schemas"]["IntegrationDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6273,8 +6313,8 @@ export interface components { }; TableValueResultInviteDto: { data: components["schemas"]["InviteDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6282,8 +6322,8 @@ export interface components { }; TableValueResultMaintenanceWindowDto: { data: components["schemas"]["MaintenanceWindowDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6291,8 +6331,8 @@ export interface components { }; TableValueResultMemberDto: { data: components["schemas"]["MemberDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6300,8 +6340,8 @@ export interface components { }; TableValueResultMonitorDto: { data: components["schemas"]["MonitorDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6309,8 +6349,8 @@ export interface components { }; TableValueResultMonitorVersionDto: { data: components["schemas"]["MonitorVersionDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6318,8 +6358,8 @@ export interface components { }; TableValueResultNotificationDispatchDto: { data: components["schemas"]["NotificationDispatchDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6327,8 +6367,8 @@ export interface components { }; TableValueResultNotificationDto: { data: components["schemas"]["NotificationDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6336,8 +6376,8 @@ export interface components { }; TableValueResultNotificationPolicyDto: { data: components["schemas"]["NotificationPolicyDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6345,8 +6385,8 @@ export interface components { }; TableValueResultResourceGroupDto: { data: components["schemas"]["ResourceGroupDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6354,8 +6394,8 @@ export interface components { }; TableValueResultScheduledMaintenanceDto: { data: components["schemas"]["ScheduledMaintenanceDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6363,8 +6403,8 @@ export interface components { }; TableValueResultSecretDto: { data: components["schemas"]["SecretDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6372,8 +6412,8 @@ export interface components { }; TableValueResultServiceComponentDto: { data: components["schemas"]["ServiceComponentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6381,8 +6421,8 @@ export interface components { }; TableValueResultServiceIncidentDto: { data: components["schemas"]["ServiceIncidentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6390,8 +6430,8 @@ export interface components { }; TableValueResultServiceSubscriptionDto: { data: components["schemas"]["ServiceSubscriptionDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6399,8 +6439,8 @@ export interface components { }; TableValueResultStatusPageComponentDto: { data: components["schemas"]["StatusPageComponentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6408,8 +6448,17 @@ export interface components { }; TableValueResultStatusPageComponentGroupDto: { data: components["schemas"]["StatusPageComponentGroupDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; + /** Format: int64 */ + totalElements?: number | null; + /** Format: int32 */ + totalPages?: number | null; + }; + TableValueResultStatusPageComponentUptimeDayDto: { + data: components["schemas"]["StatusPageComponentUptimeDayDto"][]; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6417,8 +6466,8 @@ export interface components { }; TableValueResultStatusPageCustomDomainDto: { data: components["schemas"]["StatusPageCustomDomainDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6426,8 +6475,8 @@ export interface components { }; TableValueResultStatusPageDto: { data: components["schemas"]["StatusPageDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6435,8 +6484,8 @@ export interface components { }; TableValueResultStatusPageIncidentDto: { data: components["schemas"]["StatusPageIncidentDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6444,8 +6493,8 @@ export interface components { }; TableValueResultStatusPageSubscriberDto: { data: components["schemas"]["StatusPageSubscriberDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6453,8 +6502,8 @@ export interface components { }; TableValueResultTagDto: { data: components["schemas"]["TagDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6462,8 +6511,8 @@ export interface components { }; TableValueResultWebhookDeliveryDto: { data: components["schemas"]["WebhookDeliveryDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6471,8 +6520,8 @@ export interface components { }; TableValueResultWebhookEndpointDto: { data: components["schemas"]["WebhookEndpointDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6480,8 +6529,8 @@ export interface components { }; TableValueResultWorkspaceDto: { data: components["schemas"]["WorkspaceDto"][]; - hasNext?: boolean; - hasPrev?: boolean; + hasNext: boolean; + hasPrev: boolean; /** Format: int64 */ totalElements?: number | null; /** Format: int32 */ @@ -6498,7 +6547,7 @@ export interface components { * Format: int32 * @description Organization this tag belongs to */ - organizationId?: number; + organizationId: number; /** @description Tag name, unique within the org */ name: string; /** @description Hex color code for display (e.g. #6B7280) */ @@ -6514,14 +6563,32 @@ export interface components { */ updatedAt: string; }; - TcpConnectsAssertion: Omit & { + /** @description TCP check-type-specific details */ + Tcp: { /** * @description discriminator enum property added by openapi-typescript * @enum {string} */ + check_type: "tcp"; + /** + * @description Target host + * @example db.example.com + */ + host: string; + /** + * Format: int32 + * @description Target port + * @example 5432 + */ + port: number; + /** @description Whether a TCP connection was established */ + connected: boolean; + }; + TcpConnectsAssertion: { + /** @enum {string} */ type: "tcp_connects"; }; - TcpMonitorConfig: components["schemas"]["MonitorConfig"] & { + TcpMonitorConfig: { /** @description Target hostname or IP address */ host: string; /** @@ -6535,54 +6602,42 @@ export interface components { */ timeoutMs?: number | null; }; - TcpResponseTimeAssertion: Omit & { + TcpResponseTimeAssertion: { + /** @enum {string} */ + type: "tcp_response_time"; /** * Format: int32 * @description Maximum TCP connect time in milliseconds before the check fails */ maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "tcp_response_time"; }; - TcpResponseTimeWarnAssertion: Omit & { + TcpResponseTimeWarnAssertion: { + /** @enum {string} */ + type: "tcp_response_time_warn"; /** * Format: int32 * @description TCP connect time in milliseconds that triggers a warning only */ warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "tcp_response_time_warn"; }; - TeamsChannelConfig: Omit & { + TeamsChannelConfig: { + /** @enum {string} */ + channelType: "teams"; /** @description Microsoft Teams incoming webhook URL */ webhookUrl: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "teams"; }; /** @description Alert channel configuration to test without saving */ TestAlertChannelRequest: { config: components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["WebhookChannelConfig"]; }; TestChannelResult: { - success?: boolean; + success: boolean; message: string; }; /** @description Result of a dry-run match evaluation against a notification policy */ TestMatchResult: { /** @description Whether the policy would match the supplied incident context */ - matched?: boolean; + matched: boolean; /** @description Rules that passed evaluation */ matchedRules: string[]; /** @description Rules that did not pass evaluation */ @@ -6759,7 +6814,7 @@ export interface components { UpdateMonitorRequest: { /** @description New monitor name; null preserves current */ name?: string | null; - config?: components["schemas"]["MonitorConfig"] | null; + config?: (components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]) | null; /** * Format: int32 * @description New check frequency in seconds (30–86400); null preserves current @@ -6991,7 +7046,7 @@ export interface components { * @description Total number of polls recorded in this bucket * @example 12 */ - totalPolls?: number; + totalPolls: number; }; /** @description Uptime statistics aggregated from continuous aggregates */ UptimeDto: { @@ -7026,7 +7081,9 @@ export interface components { */ p95LatencyMs?: number | null; }; - WebhookChannelConfig: Omit & { + WebhookChannelConfig: { + /** @enum {string} */ + channelType: "webhook"; /** @description Webhook endpoint URL that receives alert payloads */ url: string; /** @description Optional HMAC signing secret for payload verification */ @@ -7035,12 +7092,6 @@ export interface components { customHeaders?: { [key: string]: string | null; } | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "webhook"; }; WebhookDeliveryDto: { /** Format: uuid */ @@ -7051,9 +7102,9 @@ export interface components { eventType: string; status: string; /** Format: int32 */ - attemptCount?: number; + attemptCount: number; /** Format: int32 */ - maxAttempts?: number; + maxAttempts: number; /** Format: int32 */ responseStatus?: number | null; /** Format: int32 */ @@ -7082,12 +7133,12 @@ export interface components { /** @description Event types this endpoint is subscribed to */ subscribedEvents: string[]; /** @description Whether delivery is enabled for this endpoint */ - enabled?: boolean; + enabled: boolean; /** * Format: int32 * @description Number of consecutive delivery failures */ - consecutiveFailures?: number; + consecutiveFailures: number; /** @description Reason the endpoint was auto-disabled */ disabledReason?: string | null; /** @@ -7124,7 +7175,7 @@ export interface components { maskedSecret?: string | null; }; WebhookTestResult: { - success?: boolean; + success: boolean; /** Format: int32 */ statusCode?: number | null; message: string; @@ -7137,7 +7188,7 @@ export interface components { * Format: int32 * @description Unique workspace identifier */ - id?: number; + id: number; /** * Format: date-time * @description Timestamp when the workspace was created @@ -7154,7 +7205,7 @@ export interface components { * Format: int32 * @description Organization this workspace belongs to */ - orgId?: number; + orgId: number; }; }; responses: never; @@ -7185,6 +7236,78 @@ export interface operations { "*/*": components["schemas"]["TableValueResultAlertChannelDto"]; }; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; create_15: { @@ -7209,147 +7332,81 @@ export interface operations { "*/*": components["schemas"]["SingleValueResponseAlertChannelDto"]; }; }; - }; - }; - update_14: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateAlertChannelRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseAlertChannelDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_10: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["DeleteChannelResult"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listDeliveries_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultAlertDeliveryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - test_2: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - testConfig: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TestAlertChannelRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listAttempts: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultDeliveryAttemptDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - retry: { + get_8: { parameters: { query?: never; header?: never; @@ -7366,87 +7423,95 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseAlertDeliveryDto"]; + "*/*": components["schemas"]["SingleValueResponseAlertChannelDto"]; }; }; - }; - }; - list_13: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultApiKeyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_14: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateApiKeyRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_11: { - parameters: { - query?: never; - header?: never; - path: { - id: number; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - update_15: { + update_14: { parameters: { query?: never; header?: never; path: { - id: number; + id: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateApiKeyRequest"]; + "application/json": components["schemas"]["UpdateAlertChannelRequest"]; }; }; responses: { @@ -7456,39 +7521,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseApiKeyDto"]; + "*/*": components["schemas"]["SingleValueResponseAlertChannelDto"]; }; }; - }; - }; - regenerate: { - parameters: { - query?: never; - header?: never; - path: { - id: number; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - revoke_1: { + delete_10: { parameters: { query?: never; header?: never; path: { - id: number; + id: string; }; cookie?: never; }; @@ -7500,300 +7615,183 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseApiKeyDto"]; + "*/*": components["schemas"]["DeleteChannelResult"]; }; }; - }; - }; - list_19: { - parameters: { - query?: { - action?: string; - actorId?: number; - resourceType?: string; - from?: string; - to?: string; - page?: number; - size?: number; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultAuditEventDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - me_1: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseAuthMeResponse"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listCategories: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultCategoryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - overview: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseDashboardOverviewDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - current: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseDeployLockDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - acquire: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AcquireDeployLockRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseDeployLockDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - release: { + listDeliveries_1: { parameters: { query?: never; header?: never; path: { - lockId: string; + id: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultAlertDeliveryDto"]; + }; }; - }; - }; - forceRelease: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - list_12: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultEnvironmentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_13: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateEnvironmentRequest"]; - }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - get_7: { - parameters: { - query?: never; - header?: never; - path: { - slug: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_13: { - parameters: { - query?: never; - header?: never; - path: { - slug: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateEnvironmentRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_9: { - parameters: { - query?: never; - header?: never; - path: { - slug: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - pingGet: { + test_2: { parameters: { query?: never; header?: never; path: { - /** @description Ping endpoint token for the heartbeat monitor */ - token: string; + id: string; }; cookie?: never; }; @@ -7805,124 +7803,93 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": { - [key: string]: boolean; - }; + "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; }; }; - }; - }; - pingPost: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Ping endpoint token for the heartbeat monitor */ - token: string; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": string; - "text/plain": string; - "*/*": string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": { - [key: string]: boolean; - }; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - list_11: { - parameters: { - query: { - params: components["schemas"]["IncidentFilterParams"]; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_12: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateManualIncidentRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - get_10: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - resolve: { + testConfig: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: { + requestBody: { content: { - "application/json": components["schemas"]["ResolveIncidentRequest"]; + "application/json": components["schemas"]["TestAlertChannelRequest"]; }; }; responses: { @@ -7932,107 +7899,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; }; }; - }; - }; - addUpdate: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AddIncidentUpdateRequest"]; - }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - list_18: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultIntegrationDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - list_10: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultInviteDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_11: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateInviteRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - resend: { + listAttempts: { parameters: { query?: never; header?: never; path: { - inviteId: number; + id: string; }; cookie?: never; }; @@ -8044,81 +7993,84 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + "*/*": components["schemas"]["TableValueResultDeliveryAttemptDto"]; }; }; - }; - }; - revoke: { - parameters: { - query?: never; - header?: never; - path: { - inviteId: number; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - list_9: { - parameters: { - query?: { - /** @description Filter by monitor UUID */ - monitorId?: string; - /** @description Filter by status: 'active' or 'upcoming' */ - filter?: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMaintenanceWindowDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_10: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateMaintenanceWindowRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - getById_2: { + retry: { parameters: { query?: never; header?: never; @@ -8135,182 +8087,176 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "*/*": components["schemas"]["SingleValueResponseAlertDeliveryDto"]; }; }; - }; - }; - update_12: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateMaintenanceWindowRequest"]; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_8: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - list_17: { - parameters: { - query: { - pageable: components["schemas"]["Pageable"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMemberDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - remove_2: { - parameters: { - query?: never; - header?: never; - path: { - userId: number; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - changeRole: { + list_13: { parameters: { query?: never; header?: never; - path: { - userId: number; - }; + path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ChangeRoleRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; - }; - }; - }; - changeStatus: { - parameters: { - query?: never; - header?: never; - path: { - userId: number; + content: { + "*/*": components["schemas"]["TableValueResultApiKeyDto"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ChangeStatusRequest"]; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description No Content */ - 204: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - list_8: { - parameters: { - query: { - /** @description Filter by enabled state */ - enabled?: boolean; - /** @description Filter by monitor type */ - type?: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - /** @description Filter by managed-by source */ - managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM"; - /** @description Filter by tag names, comma-separated (e.g. prod,critical) */ - tags?: string; - /** @description Case-insensitive name search */ - search?: string; - /** @description Filter by environment ID */ - environmentId?: string; - pageable: components["schemas"]["Pageable"]; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMonitorDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - create_9: { + create_14: { parameters: { query?: never; header?: never; @@ -8319,7 +8265,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["CreateMonitorRequest"]; + "application/json": components["schemas"]["CreateApiKeyRequest"]; }; }; responses: { @@ -8329,340 +8275,279 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; }; }; - }; - }; - get_6: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_11: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateMonitorRequest"]; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_7: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - pause: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - getResults: { + delete_11: { parameters: { - query?: { - /** @description Start of time range (ISO 8601, inclusive); defaults to 24 hours ago */ - from?: string; - /** @description End of time range (ISO 8601, inclusive); defaults to now */ - to?: string; - /** @description Opaque cursor from a previous response for pagination */ - cursor?: string; - /** - * @description Maximum results per page (1–200) - * @example 50 - */ - limit?: number; - /** @description Filter by region (e.g. us-east) */ - region?: string; - /** @description Filter by pass/fail status */ - passed?: boolean; - }; + query?: never; header?: never; path: { - id: string; + id: number; }; cookie?: never; }; requestBody?: never; responses: { - /** @description Paginated check results */ - 200: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPage"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Invalid query parameters */ - 400: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ + /** @description Forbidden — the actor lacks permission for this resource */ 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getSummary: { - parameters: { - query?: { - /** @description Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets */ - chartWindow?: "24h" | "7d" | "30d" | "90d"; - }; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Results summary */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["ResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Invalid chartWindow parameter */ - 400: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ - 403: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ - 404: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - resume: { + update_15: { parameters: { query?: never; header?: never; path: { - id: string; + id: number; }; cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ + requestBody: { + content: { + "application/json": components["schemas"]["UpdateApiKeyRequest"]; + }; + }; + responses: { + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseApiKeyDto"]; }; }; - }; - }; - rotateToken: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getMonitorTags: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultTagDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - addMonitorTags: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AddMonitorTagsRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultTagDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - removeMonitorTags: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RemoveMonitorTagsRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - testExisting: { + regenerate: { parameters: { query?: never; header?: never; path: { - id: string; + id: number; }; cookie?: never; }; @@ -8674,94 +8559,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; }; }; - }; - }; - getUptime: { - parameters: { - query?: { - /** @description Time window for uptime calculation */ - window?: "24h" | "7d" | "30d" | "90d"; - }; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Uptime statistics */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["UptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Invalid window parameter */ - 400: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ + /** @description Forbidden — the actor lacks permission for this resource */ 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listVersions: { - parameters: { - query: { - pageable: components["schemas"]["Pageable"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - id: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMonitorVersionDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - getVersion: { + revoke_1: { parameters: { query?: never; header?: never; path: { - id: string; - version: number; + id: number; }; cookie?: never; }; @@ -8773,125 +8653,99 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorVersionDto"]; + "*/*": components["schemas"]["SingleValueResponseApiKeyDto"]; }; }; - }; - }; - setChannels: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SetAlertChannelsRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseListUUID"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - add: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateAssertionRequest"]; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_10: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - assertionId: string; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateAssertionRequest"]; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - remove_1: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - assertionId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - update_9: { + list_19: { parameters: { - query?: never; - header?: never; - path: { - monitorId: string; + query?: { + action?: string; + actorId?: number; + resourceType?: string; + from?: string; + to?: string; + page?: number; + size?: number; }; + header?: never; + path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateMonitorAuthRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -8899,146 +8753,91 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; + "*/*": components["schemas"]["TableValueResultAuditEventDto"]; }; }; - }; - }; - set: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["SetMonitorAuthRequest"]; - }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - remove: { - parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; - content?: never; - }; - }; - }; - get_5: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Monitor UUID */ - monitorId: string; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Policy found */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["IncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor or policy not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_8: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Monitor UUID */ - monitorId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateIncidentPolicyRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Policy updated */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["IncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Validation error in JSONB shape */ - 400: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor or policy not found */ - 404: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - bulkAction: { + me_1: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["BulkMonitorActionRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -9046,103 +8845,84 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseBulkMonitorActionResult"]; + "*/*": components["schemas"]["SingleValueResponseAuthMeResponse"]; }; }; - }; - }; - testAdHoc: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["MonitorTestRequest"]; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listByIncident: { - parameters: { - query: { - /** @description UUID of the incident to inspect */ - incident_id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getById_3: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - acknowledge: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - list_7: { + listCategories: { parameters: { query?: never; header?: never; @@ -9157,110 +8937,88 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationPolicyDto"]; + "*/*": components["schemas"]["TableValueResultCategoryDto"]; }; }; - }; - }; - create_8: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateNotificationPolicyRequest"]; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getById_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_7: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateNotificationPolicyRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_6: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - listDispatches: { + overview: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -9271,100 +9029,84 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + "*/*": components["schemas"]["SingleValueResponseDashboardOverviewDto"]; }; }; - }; - }; - test_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TestNotificationPolicyRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTestMatchResult"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - list_16: { - parameters: { - query?: { - unreadOnly?: boolean; - page?: number; - size?: number; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - markRead: { - parameters: { - query?: never; - header?: never; - path: { - id: number; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - markAllRead: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - unreadCount: { + current: { parameters: { query?: never; header?: never; @@ -9379,76 +9121,84 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseLong"]; + "*/*": components["schemas"]["SingleValueResponseDeployLockDto"]; }; }; - }; - }; - get_4: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_6: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateOrgDetailsRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - list_6: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultResourceGroupDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - create_7: { + acquire: { parameters: { query?: never; header?: never; @@ -9457,7 +9207,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["CreateResourceGroupRequest"]; + "application/json": components["schemas"]["AcquireDeployLockRequest"]; }; }; responses: { @@ -9467,67 +9217,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "*/*": components["schemas"]["SingleValueResponseDeployLockDto"]; }; }; - }; - }; - get_3: { - parameters: { - query?: { - includeMetrics?: boolean; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - id: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_5: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateResourceGroupRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - delete_5: { + release: { parameters: { query?: never; header?: never; path: { - id: string; + lockId: string; }; cookie?: never; }; @@ -9540,64 +9312,85 @@ export interface operations { }; content?: never; }; - }; - }; - getHealth: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupHealthDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - addMember_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["AddResourceGroupMemberRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupMemberDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - removeMember_1: { + forceRelease: { parameters: { query?: never; header?: never; - path: { - id: string; - memberId: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -9609,99 +9402,81 @@ export interface operations { }; content?: never; }; - }; - }; - list_5: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultSecretDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_6: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateSecretRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_4: { - parameters: { - query?: never; - header?: never; - path: { - key: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateSecretRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_4: { - parameters: { - query?: never; - header?: never; - path: { - key: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - list_15: { + list_12: { parameters: { query?: never; header?: never; @@ -9716,91 +9491,93 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceSubscriptionDto"]; + "*/*": components["schemas"]["TableValueResultEnvironmentDto"]; }; }; - }; - }; - get_9: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - unsubscribe_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - updateAlertSensitivity: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateAlertSensitivityRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - subscribe_1: { + create_13: { parameters: { query?: never; header?: never; - path: { - slug: string; - }; + path?: never; cookie?: never; }; - requestBody?: { + requestBody: { content: { - "application/json": components["schemas"]["ServiceSubscribeRequest"]; + "application/json": components["schemas"]["CreateEnvironmentRequest"]; }; }; responses: { @@ -9810,218 +9587,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; }; }; - }; - }; - listServices: { - parameters: { - query?: { - /** @description Filter by category (exact match) */ - category?: string; - /** @description Filter by current overall_status (exact match) */ - status?: string; - /** @description Filter by published status for pSEO pages */ - published?: boolean; - /** @description Opaque cursor from a previous response */ - cursor?: string; - /** @description Page size (1–100, default 20) */ - limit?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageServiceCatalogDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getService: { - parameters: { - query?: never; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getComponents: { - parameters: { - query?: never; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceComponentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getComponentUptime: { - parameters: { - query?: { - /** @description Time window */ - period?: "7d" | "30d" | "90d" | "1y"; - }; - header?: never; - path: { - slugOrId: string; - componentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getBatchComponentUptime: { - parameters: { - query?: { - /** @description Time window */ - period?: "7d" | "30d" | "90d" | "1y"; - }; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMapStringListComponentUptimeDayDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getServiceDayDetail: { - parameters: { - query?: never; - header?: never; - path: { - slugOrId: string; - /** @description UTC calendar day in ISO format (YYYY-MM-DD) */ - date: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceDayDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listIncidents_1: { - parameters: { - query: { - /** @description Earliest start date (ISO 8601 date) */ - from?: string; - /** @description Filter: active (unresolved), resolved, or omit for all */ - status?: "active" | "resolved"; - pageable: components["schemas"]["Pageable"]; - }; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getIncident_1: { - parameters: { - query?: never; - header?: never; - path: { - slugOrId: string; - incidentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceIncidentDetailDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - getServiceLiveStatus: { + get_7: { parameters: { query?: never; header?: never; path: { - slugOrId: string; + slug: string; }; cookie?: never; }; @@ -10033,151 +9681,97 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceLiveStatusDto"]; + "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; }; }; - }; - }; - getScheduledMaintenances: { - parameters: { - query?: { - /** @description Filter by status (e.g. scheduled, in_progress, verifying, completed) */ - status?: string[]; - }; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultScheduledMaintenanceDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listPollResults: { - parameters: { - query?: { - /** @description ISO 8601 timestamp cursor from a previous response */ - cursor?: string; - /** @description Page size (1–100, default 50) */ - limit?: number; - }; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageServicePollResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getPollSummary: { - parameters: { - query?: { - /** @description Time window */ - window?: "24h" | "7d" | "30d"; - }; - header?: never; - path: { - slugOrId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServicePollSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getServiceUptime: { - parameters: { - query?: { - /** @description Time window */ - period?: "24h" | "7d" | "30d" | "90d" | "1y" | "2y" | "all"; - /** @description Bucket granularity */ - granularity?: "hourly" | "daily" | "monthly"; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - slugOrId: string; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceUptimeResponse"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listCrossServiceIncidents: { - parameters: { - query: { - /** @description Earliest start date (ISO 8601 date) */ - from?: string; - /** @description Filter: active (unresolved), resolved, or omit for all */ - status?: "active" | "resolved"; - /** @description Filter by service category */ - category?: string; - pageable: components["schemas"]["Pageable"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - getGlobalStatusSummary: { + update_13: { parameters: { query?: never; header?: never; - path?: never; + path: { + slug: string; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateEnvironmentRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -10185,109 +9779,89 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseGlobalStatusSummaryDto"]; + "*/*": components["schemas"]["SingleValueResponseEnvironmentDto"]; }; }; - }; - }; - list_4: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_5: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - get_2: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_3: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - delete_3: { + delete_9: { parameters: { query?: never; header?: never; path: { - id: string; + slug: string; }; cookie?: never; }; @@ -10300,308 +9874,286 @@ export interface operations { }; content?: never; }; - }; - }; - listComponents: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageComponentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - createComponent: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageComponentRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - updateComponent: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - componentId: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageComponentRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - deleteComponent: { + pingGet: { parameters: { query?: never; header?: never; path: { - id: string; - componentId: string; + /** @description Ping endpoint token for the heartbeat monitor */ + token: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["HeartbeatPingResponse"]; + }; }; - }; - }; - componentUptime_1: { - parameters: { - query?: { - days?: number; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - id: string; - componentId: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - reorderComponents: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["ReorderComponentsRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description No Content */ - 204: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - listDomains: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageCustomDomainDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - addDomain: { + pingPost: { parameters: { query?: never; header?: never; path: { - id: string; + /** @description Ping endpoint token for the heartbeat monitor */ + token: string; }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["AddCustomDomainRequest"]; + "application/json": string; + "text/plain": string; + "*/*": string; }; }; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + "*/*": components["schemas"]["HeartbeatPingResponse"]; }; }; - }; - }; - removeDomain: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - domainId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - verifyDomain: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - domainId: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listGroups: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageComponentGroupDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - createGroup: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageComponentGroupRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - updateGroup: { + list_11: { parameters: { - query?: never; - header?: never; - path: { - id: string; - groupId: string; + query: { + params: components["schemas"]["IncidentFilterParams"]; }; + header?: never; + path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageComponentGroupRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -10609,69 +10161,93 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + "*/*": components["schemas"]["TableValueResultIncidentDto"]; }; }; - }; - }; - deleteGroup: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - groupId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - }; - listIncidents: { - parameters: { - query: { - status?: ("INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED")[]; - pageable: components["schemas"]["Pageable"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Not found — the requested resource does not exist */ + 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - createIncident: { + create_12: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["CreateStatusPageIncidentRequest"]; + "application/json": components["schemas"]["CreateManualIncidentRequest"]; }; }; responses: { @@ -10681,158 +10257,178 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; }; }; - }; - }; - getIncident: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - incidentId: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - updateIncident: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - incidentId: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageIncidentRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - deleteIncident: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - incidentId: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - dismissIncident: { + get_11: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + }; }; - }; - }; - publishIncident: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - incidentId: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["PublishStatusPageIncidentRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - postIncidentUpdate: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - incidentId: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageIncidentUpdateRequest"]; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - reorderLayout: { + resolve: { parameters: { query?: never; header?: never; @@ -10841,46 +10437,96 @@ export interface operations { }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["ReorderPageLayoutRequest"]; + "application/json": components["schemas"]["ResolveIncidentRequest"]; }; }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + }; }; - }; - }; - listSubscribers: { - parameters: { - query: { - pageable: components["schemas"]["Pageable"]; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - header?: never; - path: { - id: string; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageSubscriberDto"]; + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - addSubscriber: { + addUpdate: { parameters: { query?: never; header?: never; @@ -10891,7 +10537,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["AdminAddSubscriberRequest"]; + "application/json": components["schemas"]["AddIncidentUpdateRequest"]; }; }; responses: { @@ -10901,37 +10547,178 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageSubscriberDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - removeSubscriber: { + list_18: { parameters: { query?: never; header?: never; - path: { - id: string; - subscriberId: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultIntegrationDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - list_3: { + list_10: { parameters: { - query: { - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -10944,12 +10731,84 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultTagDto"]; + "*/*": components["schemas"]["TableValueResultInviteDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - create_4: { + create_11: { parameters: { query?: never; header?: never; @@ -10958,7 +10817,7 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["CreateTagRequest"]; + "application/json": components["schemas"]["CreateInviteRequest"]; }; }; responses: { @@ -10968,80 +10827,12706 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTagDto"]; + "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + resend: { + parameters: { + query?: never; + header?: never; + path: { + inviteId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + revoke: { + parameters: { + query?: never; + header?: never; + path: { + inviteId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_9: { + parameters: { + query?: { + /** @description Filter by monitor UUID */ + monitorId?: string; + /** @description Filter by status: 'active' or 'upcoming' */ + filter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_10: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateMaintenanceWindowRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getById_2: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_12: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMaintenanceWindowRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_8: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_17: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMemberDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + remove_2: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + changeRole: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ChangeRoleRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + changeStatus: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ChangeStatusRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_8: { + parameters: { + query: { + /** @description Filter by enabled state */ + enabled?: boolean; + /** @description Filter by monitor type */ + type?: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; + /** @description Filter by managed-by source */ + managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM"; + /** @description Filter by tag names, comma-separated (e.g. prod,critical) */ + tags?: string; + /** @description Case-insensitive name search */ + search?: string; + /** @description Filter by environment ID */ + environmentId?: string; + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_9: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateMonitorRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_6: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_11: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMonitorRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_7: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + pause: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getResults: { + parameters: { + query?: { + /** @description Start of time range (ISO 8601, inclusive); defaults to 24 hours ago */ + from?: string; + /** @description End of time range (ISO 8601, inclusive); defaults to now */ + to?: string; + /** @description Opaque cursor from a previous response for pagination */ + cursor?: string; + /** + * @description Maximum results per page (1–200) + * @example 50 + */ + limit?: number; + /** @description Filter by region (e.g. us-east) */ + region?: string; + /** @description Filter by pass/fail status */ + passed?: boolean; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated check results */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Invalid query parameters */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getSummary: { + parameters: { + query?: { + /** @description Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets */ + chartWindow?: "24h" | "7d" | "30d" | "90d"; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Results summary */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ResultSummaryDto"]; + }; + }; + /** @description Invalid chartWindow parameter */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + resume: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + rotateToken: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + addMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AddMonitorTagsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + removeMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RemoveMonitorTagsRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + testExisting: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getUptime: { + parameters: { + query?: { + /** @description Time window for uptime calculation */ + window?: "24h" | "7d" | "30d" | "90d"; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Uptime statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UptimeDto"]; + }; + }; + /** @description Invalid window parameter */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listVersions: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMonitorVersionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getVersion: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + version: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorVersionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + setChannels: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SetAlertChannelsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseListUUID"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + add: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateAssertionRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_10: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + assertionId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateAssertionRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + remove_1: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + assertionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_9: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMonitorAuthRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + set: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SetMonitorAuthRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + remove: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_5: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Monitor UUID */ + monitorId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Policy found */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["IncidentPolicyDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor or policy not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_8: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Monitor UUID */ + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateIncidentPolicyRequest"]; + }; + }; + responses: { + /** @description Policy updated */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["IncidentPolicyDto"]; + }; + }; + /** @description Validation error in JSONB shape */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor or policy not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + bulkAction: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["BulkMonitorActionRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseBulkMonitorActionResult"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + testAdHoc: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["MonitorTestRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listByIncident: { + parameters: { + query: { + /** @description UUID of the incident to inspect */ + incident_id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getById_3: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + acknowledge: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_7: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultNotificationPolicyDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_8: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateNotificationPolicyRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getById_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_7: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateNotificationPolicyRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_6: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listDispatches: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + test_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TestNotificationPolicyRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseTestMatchResult"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_16: { + parameters: { + query?: { + unreadOnly?: boolean; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultNotificationDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + markRead: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + markAllRead: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + unreadCount: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseLong"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_4: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_6: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateOrgDetailsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_6: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultResourceGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_7: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateResourceGroupRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_3: { + parameters: { + query?: { + includeMetrics?: boolean; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_5: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateResourceGroupRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_5: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getHealth: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResourceGroupHealthDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + addMember_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AddResourceGroupMemberRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResourceGroupMemberDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + removeMember_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + memberId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_5: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultSecretDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_6: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateSecretRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_4: { + parameters: { + query?: never; + header?: never; + path: { + key: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateSecretRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_4: { + parameters: { + query?: never; + header?: never; + path: { + key: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_15: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultServiceSubscriptionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_10: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + unsubscribe_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + updateAlertSensitivity: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateAlertSensitivityRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + subscribe_1: { + parameters: { + query?: never; + header?: never; + path: { + slug: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["ServiceSubscribeRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listServices: { + parameters: { + query?: { + /** @description Filter by category (exact match) */ + category?: string; + /** @description Filter by current overall_status (exact match) */ + status?: string; + /** @description Filter by published status for pSEO pages */ + published?: boolean; + /** @description Opaque cursor from a previous response */ + cursor?: string; + /** @description Page size (1–100, default 20) */ + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageServiceCatalogDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getService: { + parameters: { + query?: never; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceDetailDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getComponents: { + parameters: { + query?: never; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultServiceComponentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getComponentUptime: { + parameters: { + query?: { + /** @description Preset time window (used when ``from`` is omitted) */ + period?: "7d" | "30d" | "90d" | "1y"; + /** @description Explicit window start (ISO date); overrides ``period`` */ + from?: string; + /** @description Explicit window end (ISO date); defaults to today */ + to?: string; + }; + header?: never; + path: { + slugOrId: string; + componentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getBatchComponentUptime: { + parameters: { + query?: { + /** @description Preset time window (used when ``from`` is omitted) */ + period?: "7d" | "30d" | "90d" | "1y"; + /** @description Explicit window start (ISO date); overrides ``period`` */ + from?: string; + /** @description Explicit window end (ISO date); defaults to today */ + to?: string; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseBatchComponentUptimeDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getServiceDayDetail: { + parameters: { + query?: never; + header?: never; + path: { + slugOrId: string; + /** @description UTC calendar day in ISO format (YYYY-MM-DD) */ + date: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceDayDetailDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listIncidents_1: { + parameters: { + query: { + /** @description Earliest start date (ISO 8601 date) */ + from?: string; + /** @description Filter: active (unresolved), resolved, or omit for all */ + status?: "active" | "resolved"; + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getIncident_1: { + parameters: { + query?: never; + header?: never; + path: { + slugOrId: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceIncidentDetailDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getServiceLiveStatus: { + parameters: { + query?: never; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceLiveStatusDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getScheduledMaintenances: { + parameters: { + query?: { + /** @description Filter by status (e.g. scheduled, in_progress, verifying, completed) */ + status?: string[]; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultScheduledMaintenanceDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listPollResults: { + parameters: { + query?: { + /** @description ISO 8601 timestamp cursor from a previous response */ + cursor?: string; + /** @description Page size (1–100, default 50) */ + limit?: number; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageServicePollResultDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getPollSummary: { + parameters: { + query?: { + /** @description Time window */ + window?: "24h" | "7d" | "30d"; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServicePollSummaryDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getServiceUptime: { + parameters: { + query?: { + /** @description Time window */ + period?: "24h" | "7d" | "30d" | "90d" | "1y" | "2y" | "all"; + /** @description Bucket granularity */ + granularity?: "hourly" | "daily" | "monthly"; + }; + header?: never; + path: { + slugOrId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceUptimeResponse"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listCrossServiceIncidents: { + parameters: { + query: { + /** @description Earliest start date (ISO 8601 date) */ + from?: string; + /** @description Filter: active (unresolved), resolved, or omit for all */ + status?: "active" | "resolved"; + /** @description Filter by service category */ + category?: string; + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getGlobalStatusSummary: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseGlobalStatusSummaryDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_4: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_5: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_2: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_3: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_3: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listComponents: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageComponentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + createComponent: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageComponentRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + updateComponent: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + componentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageComponentRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + deleteComponent: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + componentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + componentUptime_1: { + parameters: { + query?: { + days?: number; + }; + header?: never; + path: { + id: string; + componentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageComponentUptimeDayDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + reorderComponents: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ReorderComponentsRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listDomains: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageCustomDomainDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + addDomain: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AddCustomDomainRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + removeDomain: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + domainId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + verifyDomain: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + domainId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listGroups: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageComponentGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + createGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageComponentGroupRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + updateGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + groupId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageComponentGroupRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + deleteGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listIncidents: { + parameters: { + query: { + status?: ("INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED")[]; + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + createIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageIncidentRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + updateIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageIncidentRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + deleteIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + dismissIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + publishIncident: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["PublishStatusPageIncidentRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + postIncidentUpdate: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + incidentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageIncidentUpdateRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + reorderLayout: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ReorderPageLayoutRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listSubscribers: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageSubscriberDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + addSubscriber: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AdminAddSubscriberRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageSubscriberDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + removeSubscriber: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + subscriberId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_3: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_4: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateTagRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getById: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_2: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateTagRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_2: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + rotateDek: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseDekRotationResultDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_2: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultWebhookEndpointDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_3: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateWebhookEndpointRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateWebhookEndpointRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listDeliveries: { + parameters: { + query?: { + limit?: number; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultWebhookDeliveryDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + test: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["TestWebhookEndpointRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseWebhookTestResult"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listEvents: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["WebhookEventCatalogResponse"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getById: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTagDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_2: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateTagRequest"]; - }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTagDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - delete_2: { - parameters: { - query?: never; - header?: never; - path: { - id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description No Content */ - 204: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; }; }; - rotateDek: { + getSigningSecretInfo: { parameters: { query?: never; header?: never; @@ -11056,231 +23541,171 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseDekRotationResultDto"]; + "*/*": components["schemas"]["SingleValueResponseWebhookSigningSecretDto"]; }; }; - }; - }; - list_2: { - parameters: { - query: { - pageable: components["schemas"]["Pageable"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad request — the payload failed validation */ + 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultWebhookEndpointDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - create_3: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateWebhookEndpointRequest"]; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description Created */ - 201: { + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - get_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - update_1: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateWebhookEndpointRequest"]; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseWebhookEndpointDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; }; - delete_1: { + rotateSigningSecret: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; - }; - }; - }; - listDeliveries: { - parameters: { - query?: { - limit?: number; + content: { + "*/*": components["schemas"]["SingleValueResponseString"]; + }; }; - header?: never; - path: { - id: string; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Unauthorized — missing or invalid credentials */ + 401: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultWebhookDeliveryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - test: { - parameters: { - query?: never; - header?: never; - path: { - id: string; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": components["schemas"]["TestWebhookEndpointRequest"]; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; }; - }; - responses: { - /** @description OK */ - 200: { + /** @description Conflict — the request collides with current resource state */ + 409: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseWebhookTestResult"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - listEvents: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Internal server error — see the message field for details */ + 500: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["WebhookEventCatalogResponse"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - getSigningSecretInfo: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Bad gateway — an upstream provider returned an error */ + 502: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseWebhookSigningSecretDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - }; - }; - rotateSigningSecret: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description Service unavailable — try again shortly */ + 503: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseString"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; }; @@ -11305,6 +23730,78 @@ export interface operations { "*/*": components["schemas"]["TableValueResultWorkspaceDto"]; }; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; create_2: { @@ -11329,6 +23826,78 @@ export interface operations { "*/*": components["schemas"]["SingleValueResponseWorkspaceDto"]; }; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; get: { @@ -11351,6 +23920,78 @@ export interface operations { "*/*": components["schemas"]["SingleValueResponseWorkspaceDto"]; }; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; update: { @@ -11377,6 +24018,78 @@ export interface operations { "*/*": components["schemas"]["SingleValueResponseWorkspaceDto"]; }; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; delete: { @@ -11397,6 +24110,78 @@ export interface operations { }; content?: never; }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; }; }; } diff --git a/src/lib/auth.ts b/src/lib/auth.ts index e7eb849..7c04cbb 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,18 +1,24 @@ -import {existsSync, readFileSync, mkdirSync, writeFileSync} from 'node:fs' +import {existsSync, readFileSync, mkdirSync, writeFileSync, copyFileSync} from 'node:fs' import {homedir} from 'node:os' import {join} from 'node:path' +import {z} from 'zod' -export interface AuthContext { - name: string - apiUrl: string - token: string -} +const AuthContextSchema = z.object({ + name: z.string(), + apiUrl: z.string(), + token: z.string(), +}) -interface ContextsFile { - current: string - contexts: Record -} +const ContextsFileSchema = z.object({ + version: z.number().int().optional(), + current: z.string(), + contexts: z.record(z.string(), AuthContextSchema), +}) + +export type AuthContext = z.infer +type ContextsFile = z.infer +const CONTEXTS_FILE_VERSION = 1 const CONFIG_DIR = join(homedir(), '.devhelm') const CONTEXTS_PATH = join(CONFIG_DIR, 'contexts.json') @@ -50,7 +56,7 @@ export function listContexts(): {current: string; contexts: AuthContext[]} { } export function saveContext(context: AuthContext, setCurrent = true): void { - const file = readContextsFile() ?? {current: '', contexts: {}} + const file = readContextsFile() ?? {version: CONTEXTS_FILE_VERSION, current: '', contexts: {}} file.contexts[context.name] = context if (setCurrent) file.current = context.name writeContextsFile(file) @@ -81,11 +87,39 @@ export function setCurrentContext(name: string): boolean { function readContextsFile(): ContextsFile | undefined { if (!existsSync(CONTEXTS_PATH)) return undefined + let raw: string try { - return JSON.parse(readFileSync(CONTEXTS_PATH, 'utf8')) + raw = readFileSync(CONTEXTS_PATH, 'utf8') } catch { return undefined } + + let parsed: unknown + try { + parsed = JSON.parse(raw) + } catch { + backupCorruptFile() + process.stderr.write('Warning: ~/.devhelm/contexts.json contains invalid JSON. A backup was saved.\n') + return undefined + } + + const result = ContextsFileSchema.safeParse(parsed) + if (!result.success) { + backupCorruptFile() + process.stderr.write('Warning: ~/.devhelm/contexts.json has an invalid shape. A backup was saved.\n') + return undefined + } + + return result.data +} + +function backupCorruptFile(): void { + try { + const backupPath = `${CONTEXTS_PATH}.bak.${Date.now()}` + copyFileSync(CONTEXTS_PATH, backupPath) + } catch { + // Best-effort backup — don't crash if the copy fails + } } function writeContextsFile(file: ContextsFile): void { @@ -93,5 +127,6 @@ function writeContextsFile(file: ContextsFile): void { mkdirSync(CONFIG_DIR, {recursive: true}) } + file.version = CONTEXTS_FILE_VERSION writeFileSync(CONTEXTS_PATH, JSON.stringify(file, null, 2)) } diff --git a/src/lib/base-command.ts b/src/lib/base-command.ts index ca9fa6a..d81a850 100644 --- a/src/lib/base-command.ts +++ b/src/lib/base-command.ts @@ -3,6 +3,7 @@ import {createApiClient, type ApiClient} from './api-client.js' import {resolveToken, resolveApiUrl} from './auth.js' import {AuthError} from './errors.js' import {formatOutput, OutputFormat, ColumnDef} from './output.js' +import {urlFlag} from './validators.js' export const globalFlags = { output: Flags.string({ @@ -11,7 +12,7 @@ export const globalFlags = { options: ['table', 'json', 'yaml'], default: 'table', }), - 'api-url': Flags.string({description: 'Override API base URL'}), + 'api-url': urlFlag({description: 'Override API base URL'}), 'api-token': Flags.string({description: 'Override API token'}), verbose: Flags.boolean({char: 'v', description: 'Show verbose output', default: false}), } diff --git a/src/lib/crud-commands.ts b/src/lib/crud-commands.ts index 7c7f901..3bf9894 100644 --- a/src/lib/crud-commands.ts +++ b/src/lib/crud-commands.ts @@ -1,21 +1,23 @@ -import {Command, Args, Flags} from '@oclif/core' +import {Command, Args, Flags, type Interfaces} from '@oclif/core' import {globalFlags, buildClient, display} from './base-command.js' import {fetchPaginated} from './typed-api.js' import {apiGet, apiPost, apiPut, apiDelete} from './api-client.js' import type {ColumnDef} from './output.js' +import {uuidArg} from './validators.js' -// oclif flag types are structurally complex; this alias keeps ResourceConfig readable. -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type OclifFlag = any +type Arg = Interfaces.Arg export interface ResourceConfig { name: string plural: string apiPath: string + /** Field name used as the resource identifier (default: 'id'). */ idField?: string + /** Set to false to skip UUID validation on the id arg (e.g. for slug/key ids). */ + validateIdAsUuid?: boolean columns: ColumnDef[] - createFlags?: Record - updateFlags?: Record + createFlags?: Interfaces.FlagInput + updateFlags?: Interfaces.FlagInput bodyBuilder?: (flags: Record) => object updateBodyBuilder?: (flags: Record) => object } @@ -40,12 +42,19 @@ export function createListCommand(config: ResourceConfig) { return ListCmd } +function idArg(config: Pick): Arg { + const idLabel = config.idField ?? 'id' + const useUuid = config.validateIdAsUuid ?? (idLabel === 'id' || idLabel === 'subscriptionId') + if (useUuid) return uuidArg({description: `${config.name} ${idLabel}`, required: true}) + return Args.string({description: `${config.name} ${idLabel}`, required: true}) +} + export function createGetCommand(config: ResourceConfig) { const idLabel = config.idField ?? 'id' class GetCmd extends Command { static description = `Get a ${config.name} by ${idLabel}` static examples = [`<%= config.bin %> ${config.plural} get <${idLabel}>`] - static args = {[idLabel]: Args.string({description: `${config.name} ${idLabel}`, required: true})} + static args = {[idLabel]: idArg(config)} static flags = {...globalFlags} async run() { @@ -86,7 +95,7 @@ export function createUpdateCommand(config: ResourceConfig) { class UpdateCmd extends Command { static description = `Update a ${config.name}` static examples = [`<%= config.bin %> ${config.plural} update <${idLabel}>`] - static args = {[idLabel]: Args.string({description: `${config.name} ${idLabel}`, required: true})} + static args = {[idLabel]: idArg(config)} static flags = {...globalFlags, ...resourceFlags} async run() { @@ -109,7 +118,7 @@ export function createDeleteCommand(config: ResourceConfig) { class DeleteCmd extends Command { static description = `Delete a ${config.name}` static examples = [`<%= config.bin %> ${config.plural} delete <${idLabel}>`] - static args = {[idLabel]: Args.string({description: `${config.name} ${idLabel}`, required: true})} + static args = {[idLabel]: idArg(config)} static flags = {...globalFlags} async run() { diff --git a/src/lib/resources.ts b/src/lib/resources.ts index ea865eb..8888eb8 100644 --- a/src/lib/resources.ts +++ b/src/lib/resources.ts @@ -1,8 +1,18 @@ import {readFileSync} from 'node:fs' import {Flags} from '@oclif/core' +import {z} from 'zod' import {ResourceConfig} from './crud-commands.js' import type {components} from './api.generated.js' +import {schemas as apiSchemas} from './api-zod.generated.js' import {fieldDescriptions} from './descriptions.generated.js' +import {urlFlag} from './validators.js' +import { + MONITOR_TYPES, + HTTP_METHODS, + INCIDENT_SEVERITIES, + CHANNEL_TYPES, + STATUS_PAGE_INCIDENT_MODES, +} from './spec-facts.generated.js' // ── Description lookup from OpenAPI spec ─────────────────────────────── function desc(schema: string, field: string, fallback?: string): string { @@ -35,21 +45,6 @@ type CreateNotificationPolicyRequest = Schemas['CreateNotificationPolicyRequest' type UpdateNotificationPolicyRequest = Schemas['UpdateNotificationPolicyRequest'] type CreateApiKeyRequest = Schemas['CreateApiKeyRequest'] -const MONITOR_TYPES: MonitorType[] = ['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER'] -const HTTP_METHODS: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'] -const INCIDENT_SEVERITIES: IncidentSeverity[] = ['DOWN', 'DEGRADED', 'MAINTENANCE'] -const CHANNEL_TYPES = ['SLACK', 'EMAIL', 'PAGERDUTY', 'OPSGENIE', 'DISCORD', 'TEAMS', 'WEBHOOK'] as const - -const CHANNEL_TYPE_MAP: Record = { - SLACK: 'slack', - EMAIL: 'email', - PAGERDUTY: 'pagerduty', - OPSGENIE: 'opsgenie', - DISCORD: 'discord', - TEAMS: 'teams', - WEBHOOK: 'webhook', -} - // ── Resource definitions ─────────────────────────────────────────────── export const MONITORS: ResourceConfig = { @@ -70,13 +65,13 @@ export const MONITORS: ResourceConfig = { type: Flags.string({ description: desc('CreateMonitorRequest', 'type'), required: true, - options: MONITOR_TYPES, + options: [...MONITOR_TYPES], }), url: Flags.string({description: desc('HttpMonitorConfig', 'url', 'Target URL or host')}), frequency: Flags.string({description: desc('CreateMonitorRequest', 'frequencySeconds'), default: '60'}), method: Flags.string({ description: desc('HttpMonitorConfig', 'method'), - options: HTTP_METHODS, + options: [...HTTP_METHODS], }), port: Flags.string({description: desc('TcpMonitorConfig', 'port', 'TCP port to connect to')}), regions: Flags.string({description: desc('CreateMonitorRequest', 'regions')}), @@ -85,7 +80,7 @@ export const MONITORS: ResourceConfig = { name: Flags.string({description: desc('UpdateMonitorRequest', 'name')}), url: Flags.string({description: desc('HttpMonitorConfig', 'url', 'Target URL or host')}), frequency: Flags.string({description: desc('UpdateMonitorRequest', 'frequencySeconds')}), - method: Flags.string({description: desc('HttpMonitorConfig', 'method'), options: HTTP_METHODS}), + method: Flags.string({description: desc('HttpMonitorConfig', 'method'), options: [...HTTP_METHODS]}), port: Flags.string({description: desc('TcpMonitorConfig', 'port', 'TCP port to connect to')}), }, bodyBuilder: (raw) => { @@ -155,7 +150,7 @@ export const INCIDENTS: ResourceConfig = { severity: Flags.string({ description: desc('CreateManualIncidentRequest', 'severity'), required: true, - options: INCIDENT_SEVERITIES, + options: [...INCIDENT_SEVERITIES], }), 'monitor-id': Flags.string({description: desc('CreateManualIncidentRequest', 'monitorId')}), body: Flags.string({description: desc('CreateManualIncidentRequest', 'body')}), @@ -190,21 +185,20 @@ export const ALERT_CHANNELS: ResourceConfig = { options: [...CHANNEL_TYPES], }), config: Flags.string({description: 'Channel-specific configuration as JSON'}), - 'webhook-url': Flags.string({description: desc('SlackChannelConfig', 'webhookUrl', 'Slack/Discord/Teams webhook URL')}), + 'webhook-url': urlFlag({description: desc('SlackChannelConfig', 'webhookUrl', 'Slack/Discord/Teams webhook URL')}), }, updateFlags: { name: Flags.string({description: desc('UpdateAlertChannelRequest', 'name')}), type: Flags.string({description: 'Alert channel type', options: [...CHANNEL_TYPES]}), config: Flags.string({description: 'Channel-specific configuration as JSON'}), - 'webhook-url': Flags.string({description: desc('SlackChannelConfig', 'webhookUrl', 'Slack/Discord/Teams webhook URL')}), + 'webhook-url': urlFlag({description: desc('SlackChannelConfig', 'webhookUrl', 'Slack/Discord/Teams webhook URL')}), }, bodyBuilder: (raw) => { let config: CreateAlertChannelRequest['config'] | undefined if (raw.config) { - config = JSON.parse(String(raw.config)) as CreateAlertChannelRequest['config'] + config = parseAlertChannelConfigFlag(String(raw.config)) } else { - const typeKey = String(raw.type || 'SLACK').toUpperCase() - const channelType = CHANNEL_TYPE_MAP[typeKey] ?? 'slack' + const channelType = String(raw.type || 'slack').toLowerCase() if (raw['webhook-url'] !== undefined) { config = {channelType, webhookUrl: String(raw['webhook-url'])} as CreateAlertChannelRequest['config'] } else { @@ -218,6 +212,59 @@ export const ALERT_CHANNELS: ResourceConfig = { }, } +// Validates a `--config` JSON string against the per-channelType schema from +// the OpenAPI spec. Throws with a clear message if the JSON is malformed, +// the discriminator is missing, or the payload doesn't match the expected +// shape — so users see the error here rather than a generic API 400. +function parseAlertChannelConfigFlag(raw: string): CreateAlertChannelRequest['config'] { + let parsed: unknown + try { + parsed = JSON.parse(raw) + } catch (err) { + const msg = err instanceof Error ? err.message : String(err) + throw new Error(`Failed to parse --config as JSON: ${msg}`) + } + + if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { + throw new Error('--config must be a JSON object, e.g. \'{"channelType":"slack","webhookUrl":"..."}\'') + } + + const channelType = (parsed as Record).channelType + if (typeof channelType !== 'string') { + throw new Error( + `--config must include "channelType" (one of: ${[...CHANNEL_TYPES].join(', ')})`, + ) + } + + const schema = ALERT_CHANNEL_CONFIG_SCHEMAS[channelType] + if (!schema) { + throw new Error( + `Unknown channelType "${channelType}". Valid types: ${[...CHANNEL_TYPES].join(', ')}`, + ) + } + + const result = schema.safeParse(parsed) + if (!result.success) { + const issues = result.error.issues + .map((i) => `${i.path.join('.') || ''}: ${i.message}`) + .join('; ') + throw new Error(`Invalid --config payload for channelType "${channelType}": ${issues}`) + } + + return result.data as CreateAlertChannelRequest['config'] +} + +// Discriminated by `channelType` to match the API's AlertChannelConfig union. +const ALERT_CHANNEL_CONFIG_SCHEMAS: Record = { + discord: apiSchemas.DiscordChannelConfig, + email: apiSchemas.EmailChannelConfig, + opsgenie: apiSchemas.OpsGenieChannelConfig, + pagerduty: apiSchemas.PagerDutyChannelConfig, + slack: apiSchemas.SlackChannelConfig, + teams: apiSchemas.TeamsChannelConfig, + webhook: apiSchemas.WebhookChannelConfig, +} + export const NOTIFICATION_POLICIES: ResourceConfig = { name: 'notification policy', plural: 'notification-policies', @@ -353,12 +400,12 @@ export const WEBHOOKS: ResourceConfig = { {header: 'EVENTS', get: (r) => (r.subscribedEvents ?? []).join(', ')}, ], createFlags: { - url: Flags.string({description: desc('CreateWebhookEndpointRequest', 'url'), required: true}), + url: urlFlag({description: desc('CreateWebhookEndpointRequest', 'url'), required: true}), events: Flags.string({description: desc('CreateWebhookEndpointRequest', 'subscribedEvents'), required: true}), description: Flags.string({description: desc('CreateWebhookEndpointRequest', 'description')}), }, updateFlags: { - url: Flags.string({description: desc('UpdateWebhookEndpointRequest', 'url')}), + url: urlFlag({description: desc('UpdateWebhookEndpointRequest', 'url')}), events: Flags.string({description: desc('UpdateWebhookEndpointRequest', 'subscribedEvents')}), description: Flags.string({description: desc('UpdateWebhookEndpointRequest', 'description')}), }, @@ -377,6 +424,7 @@ export const API_KEYS: ResourceConfig = { name: 'API key', plural: 'api-keys', apiPath: '/api/v1/api-keys', + validateIdAsUuid: false, columns: [ {header: 'ID', get: (r) => String(r.id ?? '')}, {header: 'NAME', get: (r) => r.name ?? ''}, @@ -428,7 +476,7 @@ export const STATUS_PAGES: ResourceConfig = { // Only PUBLIC is enforced today — PASSWORD / IP_RESTRICTED exist in the // API enum but are not implemented. Expose a narrower, honest option set. visibility: Flags.string({description: 'Page visibility (PUBLIC only today)', options: ['PUBLIC']}), - 'incident-mode': Flags.string({description: desc('CreateStatusPageRequest', 'incidentMode'), options: ['MANUAL', 'REVIEW', 'AUTOMATIC']}), + 'incident-mode': Flags.string({description: desc('CreateStatusPageRequest', 'incidentMode'), options: [...STATUS_PAGE_INCIDENT_MODES]}), 'branding-file': Flags.string({description: 'Path to a JSON file with branding fields (logoUrl, brandColor, theme, customCss, …)'}), }, updateFlags: { @@ -436,7 +484,7 @@ export const STATUS_PAGES: ResourceConfig = { description: Flags.string({description: desc('UpdateStatusPageRequest', 'description')}), visibility: Flags.string({description: 'Page visibility (PUBLIC only today)', options: ['PUBLIC']}), enabled: Flags.boolean({description: 'Whether the page is enabled', allowNo: true}), - 'incident-mode': Flags.string({description: desc('UpdateStatusPageRequest', 'incidentMode'), options: ['MANUAL', 'REVIEW', 'AUTOMATIC']}), + 'incident-mode': Flags.string({description: desc('UpdateStatusPageRequest', 'incidentMode'), options: [...STATUS_PAGE_INCIDENT_MODES]}), 'branding-file': Flags.string({description: 'Path to a JSON file with branding fields; omit to preserve existing branding'}), }, bodyBuilder: (raw) => { @@ -461,12 +509,44 @@ export const STATUS_PAGES: ResourceConfig = { // is `"type": "module"` and CommonJS `require` is undefined in that context. // `readFileSync` is in the always-resolved Node core, so the import cost is // effectively zero — it's already loaded before the CLI's top-level code runs. -function loadBrandingFile(path: string): unknown { +function loadBrandingFile(path: string): components['schemas']['StatusPageBranding'] { const raw = readFileSync(path, 'utf8') + let parsed: unknown try { - return JSON.parse(raw) + parsed = JSON.parse(raw) } catch (err) { const msg = err instanceof Error ? err.message : String(err) throw new Error(`Failed to parse branding file "${path}" as JSON: ${msg}`) } + + const result = BrandingFileSchema.safeParse(parsed) + if (!result.success) { + const issues = result.error.issues + .map((i) => `${i.path.join('.') || ''}: ${i.message}`) + .join('; ') + throw new Error(`Invalid branding file "${path}": ${issues}`) + } + return result.data as components['schemas']['StatusPageBranding'] } + +// Mirrors the API's StatusPageBranding record (see api-zod.generated.ts). +// Hand-defined here (rather than reusing the generated schema) so we can +// surface clearer per-field validation errors on hex colors and URLs before +// the request hits the API. +const HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/ +const HTTP_URL_RE = /^https?:\/\/.+/ +const BrandingFileSchema = z.object({ + logoUrl: z.string().regex(HTTP_URL_RE, 'must be an http(s) URL').max(2048).optional(), + faviconUrl: z.string().regex(HTTP_URL_RE, 'must be an http(s) URL').max(2048).optional(), + brandColor: z.string().regex(HEX_COLOR_RE, 'must be a hex color, e.g. #4F46E5').optional(), + pageBackground: z.string().regex(HEX_COLOR_RE, 'must be a hex color').optional(), + cardBackground: z.string().regex(HEX_COLOR_RE, 'must be a hex color').optional(), + textColor: z.string().regex(HEX_COLOR_RE, 'must be a hex color').optional(), + borderColor: z.string().regex(HEX_COLOR_RE, 'must be a hex color').optional(), + headerStyle: z.string().max(50).optional(), + theme: z.string().max(50).optional(), + reportUrl: z.string().regex(HTTP_URL_RE, 'must be an http(s) URL').max(2048).optional(), + hidePoweredBy: z.boolean().optional(), + customCss: z.string().max(50_000).optional(), + customHeadHtml: z.string().max(50_000).optional(), +}).strict() diff --git a/src/lib/response-schemas.ts b/src/lib/response-schemas.ts new file mode 100644 index 0000000..473f631 --- /dev/null +++ b/src/lib/response-schemas.ts @@ -0,0 +1,85 @@ +/** + * Zod schemas for runtime validation of critical API responses. + * + * These are intentionally loose (.passthrough()) — they verify the structural + * contract (required fields exist with correct types) without rejecting extra + * fields the server may add in newer versions. + */ +import {z} from 'zod' + +const EntitlementDto = z + .object({ + key: z.string(), + value: z.number().optional(), + defaultValue: z.number().optional(), + overridden: z.boolean().optional(), + }) + .passthrough() + +const KeyInfo = z + .object({ + id: z.number().optional(), + name: z.string(), + createdAt: z.string(), + expiresAt: z.string().nullish(), + lastUsedAt: z.string().nullish(), + }) + .passthrough() + +const OrgInfo = z + .object({ + id: z.number().optional(), + name: z.string(), + }) + .passthrough() + +const PlanInfo = z + .object({ + tier: z.enum(['FREE', 'STARTER', 'PRO', 'TEAM', 'BUSINESS', 'ENTERPRISE']), + subscriptionStatus: z.string().nullish(), + trialActive: z.boolean().optional(), + trialExpiresAt: z.string().nullish(), + entitlements: z.record(EntitlementDto), + usage: z.record(z.number()), + }) + .passthrough() + +const RateLimitInfo = z + .object({ + requestsPerMinute: z.number(), + remaining: z.number(), + windowMs: z.number(), + }) + .passthrough() + +export const AuthMeResponseSchema = z.object({ + key: KeyInfo, + organization: OrgInfo, + plan: PlanInfo, + rateLimits: RateLimitInfo, +}) + +export const MonitorsSummarySchema = z + .object({ + total: z.number(), + up: z.number(), + down: z.number(), + degraded: z.number(), + paused: z.number(), + avgUptime24h: z.number().nullish(), + avgUptime30d: z.number().nullish(), + }) + .passthrough() + +export const IncidentsSummarySchema = z + .object({ + active: z.number(), + resolvedToday: z.number(), + mttr30d: z.number().nullish(), + }) + .passthrough() + +export const DashboardOverviewSchema = z.object({ + monitors: MonitorsSummarySchema, + incidents: IncidentsSummarySchema, +}) diff --git a/src/lib/spec-facts.generated.ts b/src/lib/spec-facts.generated.ts new file mode 100644 index 0000000..d089a0b --- /dev/null +++ b/src/lib/spec-facts.generated.ts @@ -0,0 +1,63 @@ +// Auto-generated from OpenAPI spec. DO NOT EDIT. +// Re-run `npm run zodgen` to regenerate. + +export const MONITOR_TYPES = ['HTTP', 'DNS', 'MCP_SERVER', 'TCP', 'ICMP', 'HEARTBEAT'] as const +export type MonitorTypes = (typeof MONITOR_TYPES)[number] + +export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'] as const +export type HttpMethods = (typeof HTTP_METHODS)[number] + +export const DNS_RECORD_TYPES = ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SRV', 'SOA', 'CAA', 'PTR'] as const +export type DnsRecordTypes = (typeof DNS_RECORD_TYPES)[number] + +export const INCIDENT_SEVERITIES = ['DOWN', 'DEGRADED', 'MAINTENANCE'] as const +export type IncidentSeverities = (typeof INCIDENT_SEVERITIES)[number] + +export const ASSERTION_SEVERITIES = ['fail', 'warn'] as const +export type AssertionSeverities = (typeof ASSERTION_SEVERITIES)[number] + +export const CHANNEL_TYPES = ['email', 'webhook', 'slack', 'pagerduty', 'opsgenie', 'teams', 'discord'] as const +export type ChannelTypes = (typeof CHANNEL_TYPES)[number] + +export const TRIGGER_RULE_TYPES = ['consecutive_failures', 'failures_in_window', 'response_time'] as const +export type TriggerRuleTypes = (typeof TRIGGER_RULE_TYPES)[number] + +export const TRIGGER_SCOPES = ['per_region', 'any_region'] as const +export type TriggerScopes = (typeof TRIGGER_SCOPES)[number] + +export const TRIGGER_SEVERITIES = ['down', 'degraded'] as const +export type TriggerSeverities = (typeof TRIGGER_SEVERITIES)[number] + +export const TRIGGER_AGGREGATIONS = ['all_exceed', 'average', 'p95', 'max'] as const +export type TriggerAggregations = (typeof TRIGGER_AGGREGATIONS)[number] + +export const ALERT_SENSITIVITIES = ['ALL', 'INCIDENTS_ONLY', 'MAJOR_ONLY'] as const +export type AlertSensitivities = (typeof ALERT_SENSITIVITIES)[number] + +export const HEALTH_THRESHOLD_TYPES = ['COUNT', 'PERCENTAGE'] as const +export type HealthThresholdTypes = (typeof HEALTH_THRESHOLD_TYPES)[number] + +export const STATUS_PAGE_VISIBILITIES = ['PUBLIC', 'PASSWORD', 'IP_RESTRICTED'] as const +export type StatusPageVisibilities = (typeof STATUS_PAGE_VISIBILITIES)[number] + +export const STATUS_PAGE_INCIDENT_MODES = ['MANUAL', 'REVIEW', 'AUTOMATIC'] as const +export type StatusPageIncidentModes = (typeof STATUS_PAGE_INCIDENT_MODES)[number] + +export const STATUS_PAGE_COMPONENT_TYPES = ['MONITOR', 'GROUP', 'STATIC'] as const +export type StatusPageComponentTypes = (typeof STATUS_PAGE_COMPONENT_TYPES)[number] + +export const SP_INCIDENT_IMPACTS = ['NONE', 'MINOR', 'MAJOR', 'CRITICAL'] as const +export type SpIncidentImpacts = (typeof SP_INCIDENT_IMPACTS)[number] + +export const SP_INCIDENT_STATUSES = ['INVESTIGATING', 'IDENTIFIED', 'MONITORING', 'RESOLVED'] as const +export type SpIncidentStatuses = (typeof SP_INCIDENT_STATUSES)[number] + +export const AUTH_TYPES = ['bearer', 'basic', 'header', 'api_key'] as const +export type AuthTypes = (typeof AUTH_TYPES)[number] + +export const MANAGED_BY = ['DASHBOARD', 'CLI', 'TERRAFORM'] as const +export type ManagedBy = (typeof MANAGED_BY)[number] + +export const COMPARISON_OPERATORS = ['equals', 'contains', 'less_than', 'greater_than', 'matches', 'range'] as const +export type ComparisonOperators = (typeof COMPARISON_OPERATORS)[number] + diff --git a/src/lib/validators.ts b/src/lib/validators.ts new file mode 100644 index 0000000..56d1baf --- /dev/null +++ b/src/lib/validators.ts @@ -0,0 +1,38 @@ +import {Args, Flags} from '@oclif/core' + +const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i + +async function parseUuid(input: string): Promise { + if (!UUID_RE.test(input)) { + throw new Error( + `Invalid UUID format: got '${input}', expected xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`, + ) + } + return input +} + +async function parseUrl(input: string): Promise { + try { + const url = new URL(input) + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new Error('not HTTP(S)') + } + } catch { + throw new Error( + `Invalid URL: got '${input}', expected a valid HTTP(S) URL`, + ) + } + return input +} + +export function uuidArg(options: {description: string; required?: true}) { + return Args.string({...options, required: true as const, parse: parseUuid}) +} + +export function uuidFlag(options: {description: string; required?: boolean}) { + return Flags.string({...options, parse: parseUuid}) +} + +export function urlFlag(options: {description: string; required?: boolean}) { + return Flags.string({...options, parse: parseUrl}) +} diff --git a/src/lib/yaml/entitlements.ts b/src/lib/yaml/entitlements.ts index b10403f..33d0cb8 100644 --- a/src/lib/yaml/entitlements.ts +++ b/src/lib/yaml/entitlements.ts @@ -5,6 +5,7 @@ import type {ApiClient} from '../api-client.js' import {checkedFetch} from '../api-client.js' import type {components} from '../api.generated.js' +import {AuthMeResponseSchema} from '../response-schemas.js' import type {Changeset} from './types.js' type AuthMeResponse = components['schemas']['AuthMeResponse'] @@ -46,7 +47,19 @@ export async function checkEntitlements( let data: AuthMeResponse try { const resp = await checkedFetch<{data?: AuthMeResponse}>(client.GET('/api/v1/auth/me')) - data = resp.data ?? ({} as AuthMeResponse) + if (!resp.data) { + process.stderr.write('Entitlement check skipped: API returned empty response for /api/v1/auth/me\n') + return null + } + + const parsed = AuthMeResponseSchema.safeParse(resp.data) + if (!parsed.success) { + const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') + process.stderr.write(`Entitlement check skipped: unexpected auth/me shape — ${issues}\n`) + return null + } + + data = resp.data } catch (err) { const msg = err instanceof Error ? err.message : String(err) process.stderr.write(`Entitlement check skipped: ${msg}\n`) diff --git a/src/lib/yaml/handlers.ts b/src/lib/yaml/handlers.ts index 01670b9..496ba51 100644 --- a/src/lib/yaml/handlers.ts +++ b/src/lib/yaml/handlers.ts @@ -214,6 +214,11 @@ function defineHandler( applyUpdate: h.applyUpdate, deletePath: h.deletePath, } + // SAFETY: ResourceHandler → ResourceHandler. + // Method params are contravariant, so TS rejects the direct assignment. + // defineHandler already verified all field accesses at compile time; + // the registry only calls methods with the correct concrete types + // (routed through HANDLER_MAP keyed by HandledResourceType). return handler as unknown as ResourceHandler } @@ -247,6 +252,10 @@ function sortedIds(ids: string[]): string[] { function stripNullish(value: T): T { if (value === null || value === undefined) return value if (Array.isArray(value)) { + // SAFETY: T is narrowed to an array type by the guard above, but TS + // can't re-narrow the generic. The mapped array preserves the runtime + // shape, so the cast back to T is sound. + // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- Array.isArray narrows to any[]; cast is verified by the guard return value.map((v) => stripNullish(v)) as unknown as T } if (typeof value === 'object') { @@ -648,6 +657,10 @@ const monitorHandler = defineHandler(obj: T, env: Record = process.env): T { + return walkAndInterpolate(obj, env) as T +} + +function walkAndInterpolate(node: unknown, env: Record): unknown { + if (typeof node === 'string') { + return interpolate(node, env) + } + + if (Array.isArray(node)) { + return node.map((item) => walkAndInterpolate(item, env)) + } + + if (node !== null && typeof node === 'object') { + const result: Record = {} + for (const [key, value] of Object.entries(node as Record)) { + result[key] = walkAndInterpolate(value, env) + } + return result + } + + return node +} + /** * Find all ${VAR} references in a string without resolving them. * Returns variable names (without fallback info). @@ -81,6 +113,15 @@ export function findVariables(input: string): string[] { return vars } +/** + * Find all ${VAR} references in a parsed object's string values. + */ +export function findVariablesInObject(obj: unknown): string[] { + const vars: string[] = [] + walkStrings(obj, (s) => vars.push(...findVariables(s))) + return vars +} + /** * Check which variables would fail during interpolation (no value, no default). * Returns array of missing variable names. @@ -102,3 +143,33 @@ export function findMissingVariables(input: string, env: Record = process.env, +): string[] { + const missing: string[] = [] + walkStrings(obj, (s) => missing.push(...findMissingVariables(s, env))) + return missing +} + +function walkStrings(node: unknown, visitor: (s: string) => void): void { + if (typeof node === 'string') { + visitor(node) + return + } + + if (Array.isArray(node)) { + for (const item of node) walkStrings(item, visitor) + return + } + + if (node !== null && typeof node === 'object') { + for (const value of Object.values(node as Record)) { + walkStrings(value, visitor) + } + } +} diff --git a/src/lib/yaml/parser.ts b/src/lib/yaml/parser.ts index 8a84c30..5d0ef95 100644 --- a/src/lib/yaml/parser.ts +++ b/src/lib/yaml/parser.ts @@ -10,7 +10,7 @@ import {parse as parseYaml} from 'yaml' import type {DevhelmConfig, YamlMonitor, YamlMonitorDefaults} from './schema.js' import {YAML_SECTION_KEYS} from './schema.js' -import {interpolate, findMissingVariables} from './interpolation.js' +import {interpolateObject, findMissingVariablesInObject} from './interpolation.js' import {DevhelmConfigSchema, formatZodErrors} from './zod-schemas.js' export class ParseError extends Error { @@ -31,24 +31,9 @@ export function parseConfigFile(filePath: string, resolveEnv = true): DevhelmCon const raw = readFileSync(absPath, 'utf8') - let interpolated: string - if (resolveEnv) { - const missing = findMissingVariables(raw) - if (missing.length > 0) { - throw new ParseError( - `Missing required environment variables: ${missing.join(', ')}. ` + - 'Set them or use ${VAR:-default} syntax for fallbacks.', - filePath, - ) - } - interpolated = interpolate(raw) - } else { - interpolated = raw - } - let parsed: unknown try { - parsed = parseYaml(interpolated) + parsed = parseYaml(raw) } catch (err) { throw new ParseError(`Invalid YAML: ${err instanceof Error ? err.message : String(err)}`, filePath) } @@ -57,6 +42,18 @@ export function parseConfigFile(filePath: string, resolveEnv = true): DevhelmCon throw new ParseError('Config file is empty or not a YAML object', filePath) } + if (resolveEnv) { + const missing = findMissingVariablesInObject(parsed) + if (missing.length > 0) { + throw new ParseError( + `Missing required environment variables: ${missing.join(', ')}. ` + + 'Set them or use ${VAR:-default} syntax for fallbacks.', + filePath, + ) + } + parsed = interpolateObject(parsed) + } + const result = DevhelmConfigSchema.safeParse(parsed) if (!result.success) { const messages = formatZodErrors(result.error) diff --git a/src/lib/yaml/resolver.ts b/src/lib/yaml/resolver.ts index 470afa6..c7a5ddf 100644 --- a/src/lib/yaml/resolver.ts +++ b/src/lib/yaml/resolver.ts @@ -224,6 +224,10 @@ export async function fetchAllRefs(client: ApiClient, state?: DeployState): Prom */ export function registerYamlPendingRefs(refs: ResolvedRefs, config: DevhelmConfig): void { for (const handler of allHandlers()) { + // SAFETY: handler.configKey is a YamlSectionKey, so config[key] is one + // of the typed arrays (YamlTag[] | YamlMonitor[] | ...). The handler's + // getRefKey is type-erased to accept `unknown` in the registry, matching + // the element type. We widen to unknown[] to iterate generically. const items = config[handler.configKey] as unknown[] | undefined if (!items) continue for (const item of items) { diff --git a/src/lib/yaml/schema.ts b/src/lib/yaml/schema.ts index b6fa483..bbfd57e 100644 --- a/src/lib/yaml/schema.ts +++ b/src/lib/yaml/schema.ts @@ -9,6 +9,13 @@ * anti-drift default injection. */ import type {components} from '../api.generated.js' +import { + MONITOR_TYPES, HTTP_METHODS, DNS_RECORD_TYPES, ASSERTION_SEVERITIES, + CHANNEL_TYPES, TRIGGER_RULE_TYPES, TRIGGER_SCOPES, TRIGGER_SEVERITIES, + TRIGGER_AGGREGATIONS, ALERT_SENSITIVITIES, HEALTH_THRESHOLD_TYPES, + STATUS_PAGE_INCIDENT_MODES, STATUS_PAGE_COMPONENT_TYPES, + COMPARISON_OPERATORS, +} from '../spec-facts.generated.js' type Schemas = components['schemas'] @@ -26,21 +33,17 @@ export type ComparisonOperator = Schemas['StatusCodeAssertion'] extends {type: s ? R extends {operator: infer O} ? O : never : never -// ── Enum constants for validation ────────────────────────────────────── - -export const MONITOR_TYPES: readonly MonitorType[] = ['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER'] -export const HTTP_METHODS: readonly HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'] -export const DNS_RECORD_TYPES: readonly string[] = ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SRV', 'SOA', 'CAA', 'PTR'] -export const ASSERTION_SEVERITIES: readonly AssertionSeverity[] = ['fail', 'warn'] -export const COMPARISON_OPERATORS: readonly string[] = ['equals', 'contains', 'less_than', 'greater_than', 'matches', 'range'] -export const TRIGGER_RULE_TYPES: readonly TriggerRuleType[] = ['consecutive_failures', 'failures_in_window', 'response_time'] -export const TRIGGER_SCOPES: readonly string[] = ['per_region', 'any_region'] -export const TRIGGER_SEVERITIES: readonly TriggerRuleSeverity[] = ['down', 'degraded'] -export const TRIGGER_AGGREGATIONS: readonly string[] = ['all_exceed', 'average', 'p95', 'max'] -export const CHANNEL_TYPES = ['slack', 'email', 'pagerduty', 'opsgenie', 'discord', 'teams', 'webhook'] as const +// ── Re-export generated enum constants ──────────────────────────────── +// These are auto-extracted from the OpenAPI spec via spec-facts.generated.ts. +// Previously maintained by hand — now they update automatically on `npm run zodgen`. + +export { + MONITOR_TYPES, HTTP_METHODS, DNS_RECORD_TYPES, ASSERTION_SEVERITIES, + CHANNEL_TYPES, TRIGGER_RULE_TYPES, TRIGGER_SCOPES, TRIGGER_SEVERITIES, + TRIGGER_AGGREGATIONS, ALERT_SENSITIVITIES, HEALTH_THRESHOLD_TYPES, + COMPARISON_OPERATORS, +} export type ChannelType = (typeof CHANNEL_TYPES)[number] -export const ALERT_SENSITIVITIES = ['ALL', 'INCIDENTS_ONLY', 'MAJOR_ONLY'] as const -export const HEALTH_THRESHOLD_TYPES = ['COUNT', 'PERCENTAGE'] as const export const MIN_FREQUENCY = 30 export const MAX_FREQUENCY = 86400 @@ -265,8 +268,8 @@ export type YamlChannelConfig = export interface YamlRetryStrategy { type: string - maxRetries?: number - interval?: number + maxRetries: number + interval: number } // ── Top-level YAML resource types ────────────────────────────────────── @@ -351,17 +354,19 @@ export interface YamlDependency { // ── Status Page types ────────────────────────────────────────────────── +export {STATUS_PAGE_INCIDENT_MODES, STATUS_PAGE_COMPONENT_TYPES} + // Note: the API's SpVisibility enum also declares PASSWORD and IP_RESTRICTED, // but those modes are not yet wired to storage or enforcement server-side. // YAML/CLI deliberately only accepts PUBLIC until the API implements them // so users cannot set a value that silently has no effect. -export type StatusPageVisibility = 'PUBLIC' -export type StatusPageIncidentMode = 'MANUAL' | 'REVIEW' | 'AUTOMATIC' -export type StatusPageComponentType = 'MONITOR' | 'GROUP' | 'STATIC' - -export const STATUS_PAGE_VISIBILITIES: readonly StatusPageVisibility[] = ['PUBLIC'] -export const STATUS_PAGE_INCIDENT_MODES: readonly StatusPageIncidentMode[] = ['MANUAL', 'REVIEW', 'AUTOMATIC'] -export const STATUS_PAGE_COMPONENT_TYPES: readonly StatusPageComponentType[] = ['MONITOR', 'GROUP', 'STATIC'] +// Tuple is intentionally narrowed (the spec-facts version includes +// PASSWORD and IP_RESTRICTED). Single source of truth for both the YAML +// validator and the Zod layer — see zod-schemas.ts which re-imports it. +export const STATUS_PAGE_VISIBILITIES = ['PUBLIC'] as const +export type StatusPageVisibility = (typeof STATUS_PAGE_VISIBILITIES)[number] +export type StatusPageIncidentMode = (typeof STATUS_PAGE_INCIDENT_MODES)[number] +export type StatusPageComponentType = (typeof STATUS_PAGE_COMPONENT_TYPES)[number] /** * Visual tokens applied to the public status page. Every field is optional; diff --git a/src/lib/yaml/state.ts b/src/lib/yaml/state.ts index 03a9978..ca528ac 100644 --- a/src/lib/yaml/state.ts +++ b/src/lib/yaml/state.ts @@ -10,6 +10,7 @@ */ import {existsSync, readFileSync, writeFileSync, mkdirSync} from 'node:fs' import {join, dirname} from 'node:path' +import {z} from 'zod' import type {ResourceType} from './types.js' // ── V2 types ───────────────────────────────────────────────────────────── @@ -50,6 +51,40 @@ export interface DeployStateV1 { export type DeployState = DeployStateV2 +// ── Zod schemas for state file validation ──────────────────────────────── + +const ChildStateEntrySchema = z.object({ + apiId: z.string(), + attributes: z.record(z.unknown()), +}) + +const StateEntrySchema = z.object({ + apiId: z.string(), + resourceType: z.string(), + attributes: z.record(z.unknown()), + children: z.record(ChildStateEntrySchema), +}) + +const DeployStateV2Schema = z.object({ + version: z.literal('2'), + serial: z.number(), + lastDeployedAt: z.string(), + resources: z.record(StateEntrySchema), +}) + +const StateEntryV1Schema = z.object({ + resourceType: z.string(), + refKey: z.string(), + id: z.string(), + createdAt: z.string(), +}) + +const DeployStateV1Schema = z.object({ + version: z.string().optional(), + lastDeployedAt: z.string().optional(), + resources: z.array(StateEntryV1Schema), +}) + // ── Constants ──────────────────────────────────────────────────────────── const STATE_DIR = '.devhelm' @@ -164,14 +199,25 @@ export function readState(cwd: string = process.cwd()): DeployState | undefined if (raw === null || typeof raw !== 'object') { throw new StateFileCorruptError(path, new Error('expected JSON object at top level')) } + const obj = raw as Record + + // V1 detection: explicit version "1" or legacy shape (no version + array resources) if (obj.version === '1' || (obj.version === undefined && Array.isArray(obj.resources))) { - return migrateV1(obj as unknown as DeployStateV1) + const v1 = DeployStateV1Schema.safeParse(raw) + if (!v1.success) { + const issues = v1.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') + throw new StateFileCorruptError(path, new Error(`invalid v1 state: ${issues}`)) + } + return migrateV1(v1.data as DeployStateV1) } - if (obj.version !== '2' || typeof obj.resources !== 'object' || obj.resources === null) { - throw new StateFileCorruptError(path, new Error(`unrecognized state shape (version=${String(obj.version)})`)) + + const v2 = DeployStateV2Schema.safeParse(raw) + if (!v2.success) { + const issues = v2.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') + throw new StateFileCorruptError(path, new Error(`invalid v2 state: ${issues}`)) } - return obj as unknown as DeployState + return v2.data as DeployState } export function writeState(state: DeployState, cwd: string = process.cwd()): void { diff --git a/src/lib/yaml/transform.ts b/src/lib/yaml/transform.ts index 6e4faab..0979184 100644 --- a/src/lib/yaml/transform.ts +++ b/src/lib/yaml/transform.ts @@ -30,7 +30,7 @@ export function toCreateEnvironmentRequest(env: YamlEnvironment): Schemas['Creat name: env.name, slug: env.slug, variables: env.variables ?? null, - isDefault: env.isDefault, + isDefault: env.isDefault ?? false, } } @@ -132,11 +132,17 @@ export function toCreateResourceGroupRequest( * types; we route on `monitor.type` so the type-assertion is at least * partitioned per monitor type and any shape drift surfaces as a zod * parse failure before reaching this function. + * + * SAFETY: Each YAML config type (YamlHttpConfig, etc.) is structurally + * identical to its API counterpart (HttpMonitorConfig, etc.), but + * defined in schema.ts rather than api.generated.ts, so TS treats them + * as unrelated types. Zod validation at config load time guarantees the + * shapes match before this function is reached. */ function toMonitorConfig( monitor: YamlMonitor, ): Schemas['CreateMonitorRequest']['config'] { - const cfg = monitor.config as unknown + const cfg: unknown = monitor.config switch (monitor.type) { case 'HTTP': return cfg as Schemas['HttpMonitorConfig'] case 'DNS': return cfg as Schemas['DnsMonitorConfig'] diff --git a/src/lib/yaml/validator.ts b/src/lib/yaml/validator.ts index 98de907..2aa4c64 100644 --- a/src/lib/yaml/validator.ts +++ b/src/lib/yaml/validator.ts @@ -387,7 +387,7 @@ function validateMonitorConfig(type: string, config: YamlMonitorConfig, path: st if (!('hostname' in config) || !config.hostname) ctx.error(`${path}.hostname`, 'DNS monitor requires "hostname"') if ('recordTypes' in config && config.recordTypes && Array.isArray(config.recordTypes)) { for (const rt of config.recordTypes) { - if (!DNS_RECORD_TYPES.includes(rt as string)) { + if (!(DNS_RECORD_TYPES as readonly string[]).includes(rt as string)) { ctx.error(`${path}.recordTypes`, `Invalid DNS record type "${rt}". Must be one of: ${DNS_RECORD_TYPES.join(', ')}`) } } @@ -440,7 +440,7 @@ function validateAssertionDef(assertion: YamlAssertion, path: string, ctx: Valid function validateAssertionConfig(type: string, config: Record, path: string, ctx: ValidationContext): void { const needsOperator = ['status_code', 'header_value', 'json_path', 'redirect_target'] if (needsOperator.includes(type)) { - if (config.operator && !COMPARISON_OPERATORS.includes(config.operator as string)) { + if (config.operator && !(COMPARISON_OPERATORS as readonly string[]).includes(config.operator as string)) { ctx.error(`${path}.config.operator`, `Invalid operator. Must be one of: ${COMPARISON_OPERATORS.join(', ')}`) } } @@ -479,7 +479,7 @@ function validateIncidentPolicy(policy: YamlIncidentPolicy, path: string, ctx: V if (!TRIGGER_SEVERITIES.includes(rule.severity)) { ctx.error(`${rpath}.severity`, `Must be one of: ${TRIGGER_SEVERITIES.join(', ')}`) } - if (rule.aggregationType && !TRIGGER_AGGREGATIONS.includes(rule.aggregationType as string)) { + if (rule.aggregationType && !(TRIGGER_AGGREGATIONS as readonly string[]).includes(rule.aggregationType as string)) { ctx.error(`${rpath}.aggregationType`, `Must be one of: ${TRIGGER_AGGREGATIONS.join(', ')}`) } } diff --git a/src/lib/yaml/zod-schemas.ts b/src/lib/yaml/zod-schemas.ts index a580f96..7e57569 100644 --- a/src/lib/yaml/zod-schemas.ts +++ b/src/lib/yaml/zod-schemas.ts @@ -8,9 +8,10 @@ * it only composes generated schemas into dispatch maps and top-level * structural schemas. * - * Enum constants are re-declared as `as const` tuples because Zod's - * `z.enum` requires a literal tuple type. The parity test in - * `zod-schemas.test.ts` asserts they stay in sync with schema.ts. + * Enum constants are imported from spec-facts.generated.ts (auto-extracted + * from the OpenAPI spec). The parity test in zod-schemas.test.ts asserts + * they stay in sync with schema.ts. The spec-field-parity test verifies + * every YAML field maps to a real API request field. * * Auth schemas remain hand-written because the YAML format uses a * `secret` field that doesn't exist in the API (the CLI resolves it @@ -19,6 +20,35 @@ import {z} from 'zod' import {schemas as apiSchemas} from '../api-zod.generated.js' +import { + MONITOR_TYPES, HTTP_METHODS, DNS_RECORD_TYPES, ASSERTION_SEVERITIES, + CHANNEL_TYPES, TRIGGER_RULE_TYPES, TRIGGER_SCOPES, TRIGGER_SEVERITIES, + TRIGGER_AGGREGATIONS, ALERT_SENSITIVITIES, HEALTH_THRESHOLD_TYPES, + STATUS_PAGE_INCIDENT_MODES, STATUS_PAGE_COMPONENT_TYPES, +} from '../spec-facts.generated.js' +import {STATUS_PAGE_VISIBILITIES, MIN_FREQUENCY, MAX_FREQUENCY} from './schema.js' + +// ── Enum constants not (yet) expressed as OpenAPI enums ─────────────── +// These are the known valid values from the API source code, hardcoded +// here because the OpenAPI spec uses free-form `string` for these fields. +// Kept in sync manually — the parity test will catch drift. + +/** Match rule types supported by the notification policy engine. */ +export const MATCH_RULE_TYPES = [ + 'severity_gte', 'monitor_id_in', 'region_in', 'incident_status', + 'monitor_type_in', 'service_id_in', 'resource_group_id_in', 'component_name_in', +] as const + +/** Retry strategy kinds for resource group defaults. */ +export const RETRY_STRATEGY_TYPES = ['fixed'] as const + +/** All known webhook event type identifiers from the event catalog. */ +export const WEBHOOK_EVENT_TYPES = [ + 'monitor.created', 'monitor.updated', 'monitor.deleted', + 'incident.created', 'incident.resolved', 'incident.reopened', + 'service.status_changed', 'service.component_changed', + 'service.incident_created', 'service.incident_updated', 'service.incident_resolved', +] as const // ── Assertion config schemas (imported from generated OpenAPI Zod) ──── // Maps wire-format type strings (from AssertionConfig discriminator) @@ -96,25 +126,13 @@ const MONITOR_TYPE_CONFIG_SCHEMAS: Record = { MCP_SERVER: apiSchemas.McpServerMonitorConfig, } -// ── Constants (kept in sync with schema.ts via parity test) ────────── - -const MONITOR_TYPES = ['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER'] as const -const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'] as const -const DNS_RECORD_TYPES = ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SRV', 'SOA', 'CAA', 'PTR'] as const -const ASSERTION_SEVERITIES = ['fail', 'warn'] as const -const CHANNEL_TYPES = ['slack', 'email', 'pagerduty', 'opsgenie', 'discord', 'teams', 'webhook'] as const -const TRIGGER_RULE_TYPES = ['consecutive_failures', 'failures_in_window', 'response_time'] as const -const TRIGGER_SCOPES = ['per_region', 'any_region'] as const -const TRIGGER_SEVERITIES = ['down', 'degraded'] as const -const TRIGGER_AGGREGATIONS = ['all_exceed', 'average', 'p95', 'max'] as const -const ALERT_SENSITIVITIES = ['ALL', 'INCIDENTS_ONLY', 'MAJOR_ONLY'] as const -const HEALTH_THRESHOLD_TYPES = ['COUNT', 'PERCENTAGE'] as const -const STATUS_PAGE_VISIBILITIES = ['PUBLIC'] as const -const STATUS_PAGE_INCIDENT_MODES = ['MANUAL', 'REVIEW', 'AUTOMATIC'] as const -const STATUS_PAGE_COMPONENT_TYPES = ['MONITOR', 'GROUP', 'STATIC'] as const - -const MIN_FREQUENCY = 30 -const MAX_FREQUENCY = 86400 +// ── Constants ──────────────────────────────────────────────────────── +// Enum tuples are imported from spec-facts.generated.ts (auto-extracted +// from the OpenAPI spec). STATUS_PAGE_VISIBILITIES, MIN_FREQUENCY, and +// MAX_FREQUENCY come from schema.ts so the validator and Zod layer share +// a single source of truth — STATUS_PAGE_VISIBILITIES is intentionally +// narrowed (the spec also accepts PASSWORD and IP_RESTRICTED, but those +// modes are not yet wired to storage or enforcement server-side). export const _ZOD_ENUMS = { MONITOR_TYPES, HTTP_METHODS, DNS_RECORD_TYPES, ASSERTION_SEVERITIES, @@ -122,15 +140,19 @@ export const _ZOD_ENUMS = { TRIGGER_AGGREGATIONS, ALERT_SENSITIVITIES, HEALTH_THRESHOLD_TYPES, STATUS_PAGE_VISIBILITIES, STATUS_PAGE_INCIDENT_MODES, STATUS_PAGE_COMPONENT_TYPES, MIN_FREQUENCY, MAX_FREQUENCY, + MATCH_RULE_TYPES, RETRY_STRATEGY_TYPES, WEBHOOK_EVENT_TYPES, } as const // ── Assertion schema (dispatches by config.type to generated schemas) ─ const AssertionSchema = z.object({ - config: z.object({type: z.string()}).passthrough(), + config: z.record(z.unknown()).refine( + (c) => typeof c.type === 'string', + {message: 'config.type is required and must be a string'}, + ), severity: z.enum(ASSERTION_SEVERITIES).optional(), -}).superRefine((data, ctx) => { - const assertionType = data.config.type +}).strict().superRefine((data, ctx) => { + const assertionType = data.config.type as string const configSchema = ASSERTION_CONFIG_SCHEMAS[assertionType] if (!configSchema) { ctx.addIssue({ @@ -239,7 +261,7 @@ const EscalationChainSchema = z.object({ // ── Match rule schema ──────────────────────────────────────────────── const MatchRuleSchema = z.object({ - type: z.string(), + type: z.enum(MATCH_RULE_TYPES), value: z.string().optional(), monitorNames: z.array(z.string()).optional(), regions: z.array(z.string()).optional(), @@ -261,9 +283,9 @@ export const ChannelConfigSchema = z.union([ // ── Retry strategy schema ──────────────────────────────────────────── const RetryStrategySchema = z.object({ - type: z.string(), - maxRetries: z.number().int().positive().optional(), - interval: z.number().int().positive().optional(), + type: z.enum(RETRY_STRATEGY_TYPES), + maxRetries: z.number().int().positive(), + interval: z.number().int().positive(), }).strict() // ── Top-level resource schemas ─────────────────────────────────────── @@ -287,9 +309,22 @@ const SecretSchema = z.object({ const AlertChannelSchema = z.object({ name: z.string(), - config: z.object({channelType: z.enum(CHANNEL_TYPES)}).passthrough(), -}).superRefine((data, ctx) => { - const configSchema = CHANNEL_CONFIG_SCHEMAS[data.config.channelType] + config: z.record(z.unknown()).refine( + (c) => typeof c.channelType === 'string', + {message: 'config.channelType is required'}, + ), +}).strict().superRefine((data, ctx) => { + const channelType = data.config.channelType as string + if (!(CHANNEL_TYPES as readonly string[]).includes(channelType)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: ['config', 'channelType'], + message: `Unknown channel type "${channelType}". Valid types: ${CHANNEL_TYPES.join(', ')}`, + }) + return + } + + const configSchema = CHANNEL_CONFIG_SCHEMAS[channelType] if (!configSchema) return const result = configSchema.safeParse(data.config) if (!result.success) { @@ -309,7 +344,7 @@ const NotificationPolicySchema = z.object({ const WebhookSchema = z.object({ url: z.string(), - subscribedEvents: z.array(z.string()).min(1), + subscribedEvents: z.array(z.enum(WEBHOOK_EVENT_TYPES)).min(1), description: z.string().optional(), enabled: z.boolean().optional(), }).strict() @@ -335,7 +370,7 @@ const ResourceGroupSchema = z.object({ const MonitorSchema = z.object({ name: z.string(), type: z.enum(MONITOR_TYPES), - config: z.object({}).passthrough(), + config: z.record(z.unknown()), frequencySeconds: z.number().int().min(MIN_FREQUENCY).max(MAX_FREQUENCY).optional(), enabled: z.boolean().optional(), regions: z.array(z.string()).optional(), diff --git a/src/types/openapi.d.ts b/src/types/openapi.d.ts deleted file mode 100644 index d4888b6..0000000 --- a/src/types/openapi.d.ts +++ /dev/null @@ -1,11402 +0,0 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ - -export interface paths { - "/api/v1/alert-channels": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List active alert channels for the authenticated org */ - get: operations["list_14"]; - put?: never; - /** Create a new alert channel with encrypted config */ - post: operations["create_15"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-channels/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update an alert channel's name and re-encrypt config */ - put: operations["update_14"]; - post?: never; - /** Soft-delete an alert channel and return affected policy summary */ - delete: operations["delete_10"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-channels/{id}/deliveries": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List delivery history for an alert channel */ - get: operations["listDeliveries_1"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-channels/{id}/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Test a saved alert channel's connectivity */ - post: operations["test_2"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-channels/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Test alert channel connectivity using raw config (no saved channel required) */ - post: operations["testConfig"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-deliveries/{id}/attempts": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["listAttempts"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/alert-deliveries/{id}/retry": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Retry a failed delivery - * @description Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it. - */ - post: operations["retry"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/api-keys": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List API keys */ - get: operations["list_13"]; - put?: never; - /** Create API key */ - post: operations["create_14"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/api-keys/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Delete API key */ - delete: operations["delete_11"]; - options?: never; - head?: never; - /** Update API key */ - patch: operations["update_15"]; - trace?: never; - }; - "/api/v1/api-keys/{id}/regenerate": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Regenerate API key */ - post: operations["regenerate"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/api-keys/{id}/revoke": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Revoke API key */ - post: operations["revoke_1"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/audit-log": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List audit events for the current organization */ - get: operations["list_19"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/auth/me": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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_...). - */ - get: operations["me_1"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/categories": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List categories with service counts */ - get: operations["listCategories"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/dashboard/overview": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Dashboard overview - * @description Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute. - */ - get: operations["overview"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/deploy/lock": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get current deploy lock - * @description Returns the active deploy lock for the current workspace, if any. - */ - get: operations["current"]; - put?: never; - /** - * 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. - */ - post: operations["acquire"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/deploy/lock/{lockId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** - * Release deploy lock - * @description Releases a deploy lock by ID. Only the lock holder should call this. - */ - delete: operations["release"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/deploy/lock/force": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** - * Force-release deploy lock - * @description Forcibly removes any deploy lock on the current workspace. Use to break stale locks. - */ - delete: operations["forceRelease"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List environments */ - get: operations["list_12"]; - put?: never; - /** Create environment */ - post: operations["create_13"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/environments/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get environment by slug */ - get: operations["get_7"]; - /** Update environment */ - put: operations["update_13"]; - post?: never; - /** Delete environment */ - delete: operations["delete_9"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/heartbeat/{token}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Record a heartbeat ping (GET) - * @description Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK. - */ - get: operations["pingGet"]; - put?: never; - /** - * 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. - */ - post: operations["pingPost"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/incidents": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List incidents for the authenticated org */ - get: operations["list_11"]; - put?: never; - /** Create a manual incident */ - post: operations["create_12"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/incidents/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get incident details including update timeline */ - get: operations["get_10"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/incidents/{id}/resolve": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Resolve an incident */ - post: operations["resolve"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/incidents/{id}/updates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Add an update to an incident (optionally change status) */ - post: operations["addUpdate"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/integrations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["list_18"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/invites": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List invites */ - get: operations["list_10"]; - put?: never; - /** Create invite */ - post: operations["create_11"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/invites/{inviteId}/resend": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Resend invite */ - post: operations["resend"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/invites/{inviteId}/revoke": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Revoke invite */ - post: operations["revoke"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/maintenance-windows": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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). - */ - get: operations["list_9"]; - put?: never; - /** - * 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. - */ - post: operations["create_10"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/maintenance-windows/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a single maintenance window by ID */ - get: operations["getById_2"]; - /** Update a maintenance window */ - put: operations["update_12"]; - post?: never; - /** Delete a maintenance window */ - delete: operations["delete_8"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/members": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List organization members */ - get: operations["list_17"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/members/{userId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Remove member from organization */ - delete: operations["remove_2"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/members/{userId}/role": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Change member role */ - put: operations["changeRole"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/members/{userId}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Change member status */ - put: operations["changeStatus"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List monitors for the authenticated org */ - get: operations["list_8"]; - put?: never; - /** Create a new monitor */ - post: operations["create_9"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a single monitor by id */ - get: operations["get_6"]; - /** Update a monitor */ - put: operations["update_11"]; - post?: never; - /** Soft-delete a monitor */ - delete: operations["delete_7"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/pause": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Pause a monitor (set enabled=false) */ - post: operations["pause"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/results": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getResults"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/results/summary": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getSummary"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/resume": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Resume a monitor (set enabled=true) */ - post: operations["resume"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/rotate-token": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * 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. - */ - post: operations["rotateToken"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get all tags applied to a monitor */ - get: operations["getMonitorTags"]; - put?: never; - /** Add tags to a monitor; supports existing tag IDs and inline creation of new tags */ - post: operations["addMonitorTags"]; - /** Remove tags from a monitor by their IDs */ - delete: operations["removeMonitorTags"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Test an existing monitor - * @description Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test. - */ - post: operations["testExisting"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/uptime": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getUptime"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/versions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["listVersions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{id}/versions/{version}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get a specific version snapshot for a monitor - * @description Returns the full monitor config snapshot captured at the given version number. - */ - get: operations["getVersion"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{monitorId}/alert-channels": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Replace the linked alert channel set for a monitor */ - put: operations["setChannels"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{monitorId}/assertions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Add an assertion to a monitor */ - post: operations["add"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update an assertion on a monitor */ - put: operations["update_10"]; - post?: never; - /** Remove an assertion from a monitor */ - delete: operations["remove_1"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{monitorId}/auth": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update authentication config for a monitor */ - put: operations["update_9"]; - /** Set authentication config for a monitor */ - post: operations["set"]; - /** Remove authentication config from a monitor */ - delete: operations["remove"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/{monitorId}/policy": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get incident policy for a monitor - * @description Returns the trigger rules, confirmation settings, and recovery settings for the given monitor. - */ - get: operations["get_5"]; - /** - * Update incident policy for a monitor - * @description Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving. - */ - put: operations["update_8"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/bulk": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * 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. - */ - post: operations["bulkAction"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/monitors/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * 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. - */ - post: operations["testAdHoc"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-dispatches": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["listByIncident"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-dispatches/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getById_3"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-dispatches/{id}/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * 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). - */ - post: operations["acknowledge"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-policies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all notification policies for the authenticated org */ - get: operations["list_7"]; - put?: never; - /** Create a notification policy with match rules and escalation chain */ - post: operations["create_8"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-policies/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a notification policy by ID */ - get: operations["getById_1"]; - /** Update a notification policy */ - put: operations["update_7"]; - post?: never; - /** Delete a notification policy */ - delete: operations["delete_6"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-policies/{id}/dispatches": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all dispatches (firing history) for a notification policy */ - get: operations["listDispatches"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notification-policies/{id}/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Dry-run: evaluate a policy's match rules against a supplied incident context */ - post: operations["test_1"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notifications": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List notifications for the current user */ - get: operations["list_16"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notifications/{id}/read": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Mark a notification as read */ - put: operations["markRead"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notifications/read-all": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Mark all notifications as read */ - put: operations["markAllRead"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/notifications/unread-count": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get unread notification count */ - get: operations["unreadCount"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/org": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get the current organization */ - get: operations["get_4"]; - /** Update the current organization */ - put: operations["update_6"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/resource-groups": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all resource groups for the authenticated org with health summaries */ - get: operations["list_6"]; - put?: never; - /** Create a new resource group */ - post: operations["create_7"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/resource-groups/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["get_3"]; - /** Update a resource group's name, description, alert policy, inherited settings, and health threshold */ - put: operations["update_5"]; - post?: never; - /** Delete a resource group (cascades to member rows) */ - delete: operations["delete_5"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/resource-groups/{id}/health": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getHealth"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/resource-groups/{id}/members": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Add a monitor or service member to a resource group */ - post: operations["addMember_1"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/resource-groups/{id}/members/{memberId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Remove a member from a resource group */ - delete: operations["removeMember_1"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/secrets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List secrets */ - get: operations["list_5"]; - put?: never; - /** Create secret */ - post: operations["create_6"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/secrets/{key}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update secret */ - put: operations["update_4"]; - post?: never; - /** Delete secret */ - delete: operations["delete_4"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/service-subscriptions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all service subscriptions for the organization */ - get: operations["list_15"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/service-subscriptions/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a subscription by its ID */ - get: operations["get_9"]; - put?: never; - post?: never; - /** - * Remove a subscription by its ID - * @description Removes a specific subscription (whole-service or component-level). No-op if not found. - */ - delete: operations["unsubscribe_1"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** - * Update alert sensitivity for a subscription - * @description Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents). - */ - patch: operations["updateAlertSensitivity"]; - trace?: never; - }; - "/api/v1/service-subscriptions/{slug}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * 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. Free tier: max 10 subscriptions. Paid tier: unlimited. - */ - post: operations["subscribe_1"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all enabled services (cursor-paginated) */ - get: operations["listServices"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a single service by slug or UUID with current status, components, and recent incidents */ - get: operations["getService"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/components": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List active components for a service with current status and inline uptime */ - get: operations["getComponents"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get daily uptime data for a component */ - get: operations["getComponentUptime"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/components/uptime": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Batch daily uptime data for all leaf components - * @description Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request. - */ - get: operations["getBatchComponentUptime"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/days/{date}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getServiceDayDetail"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/incidents": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List incident history for a service (paginated) */ - get: operations["listIncidents_1"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get incident detail with full update timeline */ - get: operations["getIncident_1"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/live-status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * 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. - */ - get: operations["getServiceLiveStatus"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/maintenances": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List scheduled maintenances for a service */ - get: operations["getScheduledMaintenances"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/poll-results": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List poll results for a service (cursor-paginated) */ - get: operations["listPollResults"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/poll-summary": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get aggregated poll metrics and chart data for a service */ - get: operations["getPollSummary"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/{slugOrId}/uptime": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get uptime statistics for a service - * @description Uptime data aggregated across active non-group components. - */ - get: operations["getServiceUptime"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/incidents": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List vendor incidents across all services (paginated) - * @description Cross-service vendor incident feed ordered by start date descending. - */ - get: operations["listCrossServiceIncidents"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/services/summary": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Global status summary across all services - * @description Returns aggregate counts of services by status and a list of services currently experiencing issues. - */ - get: operations["getGlobalStatusSummary"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List status pages for the workspace */ - get: operations["list_4"]; - put?: never; - /** Create a status page */ - post: operations["create_5"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a status page */ - get: operations["get_2"]; - /** Update a status page */ - put: operations["update_3"]; - post?: never; - /** Delete a status page */ - delete: operations["delete_3"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/components": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all components */ - get: operations["listComponents"]; - put?: never; - /** Add a component to the status page */ - post: operations["createComponent"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/components/{componentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update a component */ - put: operations["updateComponent"]; - post?: never; - /** Remove a component from the status page */ - delete: operations["deleteComponent"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get component uptime history (daily rollups) */ - get: operations["componentUptime_1"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/components/reorder": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Batch reorder components (and optionally move between groups) */ - put: operations["reorderComponents"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/domains": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List custom domains */ - get: operations["listDomains"]; - put?: never; - /** Add a custom domain */ - post: operations["addDomain"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/domains/{domainId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Remove a custom domain */ - delete: operations["removeDomain"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Trigger domain verification check */ - post: operations["verifyDomain"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/groups": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List component groups with nested components */ - get: operations["listGroups"]; - put?: never; - /** Create a component group */ - post: operations["createGroup"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/groups/{groupId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Update a component group */ - put: operations["updateGroup"]; - post?: never; - /** Delete a component group (components become ungrouped) */ - delete: operations["deleteGroup"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/incidents": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List incidents for this status page (filterable by status, paginated) */ - get: operations["listIncidents"]; - put?: never; - /** Create a status page incident (manual) */ - post: operations["createIncident"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get incident details with timeline */ - get: operations["getIncident"]; - /** Update an incident */ - put: operations["updateIncident"]; - post?: never; - /** Delete an incident */ - delete: operations["deleteIncident"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Dismiss a draft incident (deletes it permanently) */ - post: operations["dismissIncident"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers) */ - post: operations["publishIncident"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Post an incident timeline update */ - post: operations["postIncidentUpdate"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/layout/reorder": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - /** Reorder page-level layout: groups and ungrouped components share one ordering */ - put: operations["reorderLayout"]; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/subscribers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List confirmed subscribers (paginated) */ - get: operations["listSubscribers"]; - put?: never; - /** Add a subscriber (immediately confirmed, skips double opt-in) */ - post: operations["addSubscriber"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Remove a subscriber */ - delete: operations["removeSubscriber"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/tags": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List tags for the authenticated organization */ - get: operations["list_3"]; - put?: never; - /** Create a new tag */ - post: operations["create_4"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/tags/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a tag by ID */ - get: operations["getById"]; - /** Update a tag's name and/or color */ - put: operations["update_2"]; - post?: never; - /** Delete a tag (cascades to all monitor associations) */ - delete: operations["delete_2"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/vaults/rotate": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Rotate DEK - * @description Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes. - */ - post: operations["rotateDek"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List webhook endpoints for the authenticated org */ - get: operations["list_2"]; - put?: never; - /** Register a new webhook endpoint */ - post: operations["create_3"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/{id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a single webhook endpoint */ - get: operations["get_1"]; - /** Update a webhook endpoint */ - put: operations["update_1"]; - post?: never; - /** Delete a webhook endpoint */ - delete: operations["delete_1"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/{id}/deliveries": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List recent deliveries for a webhook endpoint */ - get: operations["listDeliveries"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/{id}/test": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Send a test delivery to a webhook endpoint */ - post: operations["test"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/events": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * List all available webhook event types - * @description Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint. - */ - get: operations["listEvents"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/signing-secret": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get signing secret metadata for the authenticated org */ - get: operations["getSigningSecretInfo"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/webhooks/signing-secret/rotate": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Generate or rotate the organization webhook signing secret */ - post: operations["rotateSigningSecret"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/workspaces": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List workspaces */ - get: operations["list_1"]; - put?: never; - /** Create workspace */ - post: operations["create_2"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/api/v1/workspaces/{workspaceId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get workspace by ID */ - get: operations["get"]; - /** Update workspace */ - put: operations["update"]; - post?: never; - /** Delete workspace */ - delete: operations["delete"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: { - /** @description Request to acquire a deploy lock for the current workspace */ - AcquireDeployLockRequest: { - /** @description Identity of the lock requester (e.g. hostname, CI job ID) */ - lockedBy: string; - /** - * Format: int32 - * @description Lock TTL in minutes (default: 30, max: 60) - * @example 30 - */ - ttlMinutes?: number | null; - }; - AddCustomDomainRequest: { - /** @description Custom hostname, e.g. status.acme.com */ - hostname: string; - }; - AddIncidentUpdateRequest: { - /** @description Update message or post-mortem notes */ - body?: string | null; - /** - * @description Updated incident status; null to keep current status - * @enum {string|null} - */ - newStatus?: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED" | null; - /** @description Whether to notify subscribers of this update */ - notifySubscribers: boolean; - }; - /** @description Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both. */ - AddMonitorTagsRequest: { - /** @description IDs of existing org tags to attach */ - tagIds?: string[] | null; - /** @description New tags to create (if not already present) and attach */ - newTags?: components["schemas"]["NewTagRequest"][] | null; - }; - /** @description Request body for adding a member to a resource group */ - AddResourceGroupMemberRequest: { - /** @description Type of member: 'monitor' or 'service' */ - memberType: string; - /** - * Format: uuid - * @description ID of the monitor or service to add - */ - memberId: string; - }; - AdminAddSubscriberRequest: { - /** - * Format: email - * @description Email address to add as a confirmed subscriber - */ - email: string; - }; - /** @description Updated affected components; null preserves current */ - AffectedComponent: { - /** - * Format: uuid - * @description Status page component ID - */ - componentId: string; - /** - * @description Component status during this incident - * @enum {string} - */ - status: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE"; - }; - /** @description Non-sensitive alert channel configuration metadata */ - AlertChannelDisplayConfig: { - /** @description Email recipients list (email channels) */ - recipients?: string[] | null; - /** @description OpsGenie API region: us or eu */ - region?: string | null; - /** @description PagerDuty severity override (critical, error, warning, info) */ - severityOverride?: string | null; - /** @description Discord role ID to mention in notifications */ - mentionRoleId?: string | null; - /** @description Custom HTTP headers for webhook requests */ - customHeaders?: { - [key: string]: string | null; - } | null; - }; - /** @description Alert channel with non-sensitive configuration metadata */ - AlertChannelDto: { - /** - * Format: uuid - * @description Unique alert channel identifier - */ - id: string; - /** @description Human-readable channel name */ - name: string; - /** - * @description Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL) - * @enum {string} - */ - channelType: "email" | "webhook" | "slack" | "pagerduty" | "opsgenie" | "teams" | "discord"; - displayConfig?: components["schemas"]["AlertChannelDisplayConfig"] | null; - /** - * Format: date-time - * @description Timestamp when the channel was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the channel was last updated - */ - updatedAt: string; - /** @description SHA-256 hash of the channel config; use for change detection */ - configHash?: string | null; - /** - * Format: date-time - * @description Timestamp of the most recent delivery attempt - */ - lastDeliveryAt?: string | null; - /** @description Outcome of the most recent delivery (SUCCESS, FAILED, etc.) */ - lastDeliveryStatus?: string | null; - }; - /** @description Delivery record for a single channel within a notification dispatch */ - AlertDeliveryDto: { - /** Format: uuid */ - id: string; - /** - * Format: uuid - * @description Incident that triggered this delivery - */ - incidentId: string; - /** - * Format: uuid - * @description Notification dispatch that created this delivery - */ - dispatchId?: string | null; - /** - * Format: uuid - * @description Alert channel ID - */ - channelId: string; - /** @description Human-readable channel name */ - channel: string; - /** @description Alert channel type (e.g. slack, email, webhook) */ - channelType: string; - /** - * @description Current delivery status - * @enum {string} - */ - status: "PENDING" | "DELIVERED" | "RETRY_PENDING" | "FAILED" | "CANCELLED"; - /** - * @description Incident lifecycle event that triggered this delivery - * @enum {string} - */ - eventType: "INCIDENT_CREATED" | "INCIDENT_RESOLVED" | "INCIDENT_REOPENED"; - /** - * Format: int32 - * @description 1-based escalation step this delivery belongs to - */ - stepNumber?: number; - /** - * Format: int32 - * @description Fire sequence within the step: 1 = initial, 2+ = repeat re-fires - */ - fireCount?: number; - /** - * Format: int32 - * @description Number of delivery attempts made - */ - attemptCount?: number; - /** - * Format: date-time - * @description When the last attempt was made - */ - lastAttemptAt?: string | null; - /** - * Format: date-time - * @description When the next retry is scheduled (null if not retrying) - */ - nextRetryAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the delivery was confirmed (null if not yet delivered) - */ - deliveredAt?: string | null; - /** @description Error message from the last failed attempt */ - errorMessage?: string | null; - /** Format: date-time */ - createdAt: string; - }; - ApiKeyAuthConfig: Omit & { - /** @description HTTP header name that carries the API key */ - headerName: string; - /** - * Format: uuid - * @description Vault secret ID for the API key value - */ - vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "api_key"; - }; - /** @description Created API key with the full key value — store it now, it won't be shown again */ - ApiKeyCreateResponse: { - /** - * Format: int32 - * @description Unique API key identifier - */ - id?: number; - /** @description Human-readable name for this API key */ - name: string; - /** @description Full API key value in dh_live_* format; store this now */ - key: string; - /** - * Format: date-time - * @description Timestamp when the key was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the key expires; null if no expiration - */ - expiresAt?: string | null; - }; - /** @description API key for programmatic access to the DevHelm API */ - ApiKeyDto: { - /** - * Format: int32 - * @description Unique API key identifier - */ - id?: number; - /** @description Human-readable name for this API key */ - name: string; - /** @description Full API key value in dh_live_* format */ - key: string; - /** - * Format: date-time - * @description Timestamp when the key was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the key was last updated - */ - updatedAt: string; - /** - * Format: date-time - * @description Timestamp of the most recent API call; null if never used - */ - lastUsedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the key was revoked; null if active - */ - revokedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the key expires; null if no expiration - */ - expiresAt?: string | null; - }; - /** @description New assertion configuration (full replacement) */ - AssertionConfig: { - type: string; - }; - /** @description Result of evaluating a single assertion against a check result */ - AssertionResultDto: { - /** - * @description Assertion type - * @example status_code - */ - type: string; - /** @description Whether the assertion passed */ - passed?: boolean; - /** - * @description Assertion severity - * @enum {string} - */ - severity: "fail" | "warn"; - /** @description Human-readable result message */ - message?: string | null; - /** - * @description Expected value - * @example 200 - */ - expected?: string | null; - /** - * @description Actual value observed - * @example 503 - */ - actual?: string | null; - }; - AssertionTestResultDto: { - /** - * @description Assertion type evaluated - * @enum {string} - */ - assertionType: "status_code" | "response_time" | "body_contains" | "json_path" | "header_value" | "regex_body" | "dns_resolves" | "dns_response_time" | "dns_expected_ips" | "dns_expected_cname" | "dns_record_contains" | "dns_record_equals" | "dns_txt_contains" | "dns_min_answers" | "dns_max_answers" | "dns_response_time_warn" | "dns_ttl_low" | "dns_ttl_high" | "mcp_connects" | "mcp_response_time" | "mcp_has_capability" | "mcp_tool_available" | "mcp_min_tools" | "mcp_protocol_version" | "mcp_response_time_warn" | "mcp_tool_count_changed" | "ssl_expiry" | "response_size" | "redirect_count" | "redirect_target" | "response_time_warn" | "tcp_connects" | "tcp_response_time" | "tcp_response_time_warn" | "icmp_reachable" | "icmp_response_time" | "icmp_response_time_warn" | "icmp_packet_loss" | "heartbeat_received" | "heartbeat_max_interval" | "heartbeat_interval_drift" | "heartbeat_payload_contains"; - /** @description Whether the assertion passed */ - passed?: boolean; - /** - * @description Assertion severity: FAIL or WARN - * @enum {string} - */ - severity: "fail" | "warn"; - /** @description Human-readable result description */ - message: string; - /** @description Expected value */ - expected?: string | null; - /** @description Actual value observed during the test */ - actual?: string | null; - }; - AuditEventDto: { - /** - * Format: int64 - * @description Unique audit event identifier - */ - id?: number; - /** - * Format: int32 - * @description User ID who performed the action; null for system actions - */ - actorId?: number | null; - /** @description Email of the actor; null for system actions */ - actorEmail?: string | null; - /** @description Audit action type (e.g. monitor.created, api_key.revoked) */ - action: string; - /** @description Type of resource affected (e.g. monitor, api_key) */ - resourceType?: string | null; - /** @description ID of the affected resource */ - resourceId?: string | null; - /** @description Human-readable name of the affected resource */ - resourceName?: string | null; - /** @description Additional context about the action */ - metadata?: { - [key: string]: Record | null; - } | null; - /** - * Format: date-time - * @description Timestamp when the action was performed - */ - createdAt: string; - }; - /** @description Identity, organization, plan, and rate-limit info for the authenticated API key */ - AuthMeResponse: { - key: components["schemas"]["KeyInfo"]; - organization: components["schemas"]["OrgInfo"]; - plan: components["schemas"]["PlanInfo"]; - rateLimits: components["schemas"]["RateLimitInfo"]; - }; - BasicAuthConfig: Omit & { - /** - * Format: uuid - * @description Vault secret ID holding Basic auth username and password - */ - vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "basic"; - }; - BearerAuthConfig: Omit & { - /** - * Format: uuid - * @description Vault secret ID holding the bearer token value - */ - vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "bearer"; - }; - BodyContainsAssertion: Omit & { - /** @description Substring that must appear in the response body */ - substring: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "body_contains"; - }; - /** @description Request body for performing a bulk action on multiple monitors */ - BulkMonitorActionRequest: { - /** @description IDs of monitors to act on (max 200) */ - monitorIds: string[]; - /** - * @description Action to perform: PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG - * @enum {string} - */ - action: "PAUSE" | "RESUME" | "DELETE" | "ADD_TAG" | "REMOVE_TAG"; - /** @description Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG) */ - tagIds?: string[] | null; - /** @description New tags to create and attach (only for ADD_TAG) */ - newTags?: components["schemas"]["NewTagRequest"][] | null; - }; - /** @description Result of a bulk monitor action, including partial-success details */ - BulkMonitorActionResult: { - /** @description IDs of monitors on which the action succeeded */ - succeeded: string[]; - /** @description Monitors on which the action failed, with the reason for each failure */ - failed: components["schemas"]["FailureDetail"][]; - }; - /** @description Service category with its count of catalog entries */ - CategoryDto: { - /** @description Category name (e.g. CI/CD, Cloud, Payments) */ - category: string; - /** - * Format: int64 - * @description Number of services in this category - */ - serviceCount?: number; - }; - /** @description Update an organization member's role */ - ChangeRoleRequest: { - /** - * @description New role to assign - * @enum {string} - */ - orgRole: "OWNER" | "ADMIN" | "MEMBER"; - }; - /** @description Update an organization member's status */ - ChangeStatusRequest: { - /** - * @description New membership status (ACTIVE or SUSPENDED) - * @enum {string} - */ - status: "INVITED" | "ACTIVE" | "SUSPENDED" | "LEFT" | "REMOVED" | "DECLINED"; - }; - /** @description New channel configuration (full replacement, not partial update) */ - ChannelConfig: { - channelType: string; - }; - /** @description Aggregated metrics for a time bucket */ - ChartBucketDto: { - /** - * Format: date-time - * @description Start of the time bucket (ISO 8601) - * @example 2026-03-12T10:00:00Z - */ - bucket: string; - /** - * Format: double - * @description Uptime percentage for this bucket; null when no data - * @example 100 - */ - uptimePercent?: number | null; - /** - * Format: double - * @description Weighted average latency in milliseconds for this bucket - * @example 120.3 - */ - avgLatencyMs?: number | null; - /** - * Format: double - * @description 95th percentile latency in milliseconds (max across regions) - * @example 250 - */ - p95LatencyMs?: number | null; - /** - * Format: double - * @description 99th percentile latency in milliseconds (max across regions) - * @example 480 - */ - p99LatencyMs?: number | null; - }; - /** @description Type-specific details captured during a check execution */ - CheckResultDetailsDto: { - /** - * Format: int32 - * @description HTTP status code of the response - * @example 200 - */ - statusCode?: number | null; - /** @description HTTP response headers */ - responseHeaders?: { - [key: string]: (string | null)[] | null; - } | null; - /** @description Raw response body snapshot (may be HTML, XML, JSON, or plain text) */ - responseBodySnapshot?: string | null; - /** @description Individual assertion evaluation results */ - assertionResults?: components["schemas"]["AssertionResultDto"][] | null; - tlsInfo?: components["schemas"]["TlsInfoDto"] | null; - /** - * Format: int32 - * @description Number of HTTP redirects followed - * @example 2 - */ - redirectCount?: number | null; - /** @description Final URL after redirects */ - redirectTarget?: string | null; - /** - * Format: int32 - * @description Response body size in bytes - * @example 4096 - */ - responseSizeBytes?: number | null; - checkDetails?: Omit | null; - }; - /** @description A single check result from a monitor run */ - CheckResultDto: { - /** - * Format: uuid - * @description Unique identifier of the check result - */ - id: string; - /** - * Format: date-time - * @description Timestamp when the check was executed (ISO 8601) - */ - timestamp: string; - /** - * @description Region where the check was executed - * @example us-east - */ - region: string; - /** - * Format: int32 - * @description Response time in milliseconds - * @example 123 - */ - responseTimeMs?: number | null; - /** - * @description Whether the check passed - * @example true - */ - passed?: boolean; - /** @description Reason for failure when passed=false */ - failureReason?: string | null; - /** @description Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing */ - severityHint?: string | null; - details?: components["schemas"]["CheckResultDetailsDto"] | null; - /** - * Format: uuid - * @description Unique execution trace ID for cross-service correlation - */ - checkId?: string | null; - }; - /** @description Check-type-specific details — polymorphic by check_type discriminator */ - CheckTypeDetailsDto: { - check_type: string; - }; - /** @description One component's uptime contribution for the day */ - ComponentImpact: { - /** - * Format: uuid - * @description Status page component UUID - */ - componentId: string; - /** @description Component display name */ - componentName: string; - /** @description Parent group display name when the component belongs to a group */ - groupName?: string | null; - /** - * Format: double - * @description Computed uptime % for this component on this day - */ - uptimePercentage?: number; - /** - * Format: int32 - * @description Seconds of partial outage observed on this day - */ - partialOutageSeconds?: number; - /** - * Format: int32 - * @description Seconds of major outage observed on this day - */ - majorOutageSeconds?: number; - }; - /** @description A single component position */ - ComponentPosition: { - /** - * Format: uuid - * @description Component ID - */ - componentId: string; - /** - * Format: int32 - * @description New display order (0-based) - */ - displayOrder?: number; - /** - * Format: uuid - * @description Target group ID, null for ungrouped - */ - groupId?: string | null; - }; - /** @description Current status of each active component */ - ComponentStatusDto: { - /** @description Component UUID */ - id: string; - /** @description Human-readable component name */ - name: string; - /** @description Current component status, e.g. operational, degraded_performance */ - status: string; - }; - /** @description Daily uptime data for a status page component */ - ComponentUptimeDayDto: { - /** - * Format: date-time - * @description Start-of-day timestamp for this bucket (UTC midnight) - */ - date: string; - /** - * Format: int32 - * @description Seconds of partial outage on this day - */ - partialOutageSeconds?: number; - /** - * Format: int32 - * @description Seconds of major outage on this day - */ - majorOutageSeconds?: number; - /** - * Format: double - * @description Computed uptime percentage using weighted formula - */ - uptimePercentage?: number; - /** @description Incidents that overlapped this day */ - incidents?: components["schemas"]["IncidentRef"][] | null; - }; - /** @description Inline uptime percentages for 24h, 7d, 30d */ - ComponentUptimeSummaryDto: { - /** - * Format: double - * @description Uptime percentage over the last 24 hours - * @example 99.95 - */ - day?: number | null; - /** - * Format: double - * @description Uptime percentage over the last 7 days - * @example 99.98 - */ - week?: number | null; - /** - * Format: double - * @description Uptime percentage over the last 30 days - * @example 99.92 - */ - month?: number | null; - /** - * @description Data source: vendor_reported or incident_derived - * @example vendor_reported - */ - source: string; - }; - /** @description Multi-region confirmation settings */ - ConfirmationPolicy: { - /** - * @description How incident confirmation is coordinated across regions - * @enum {string} - */ - type: "multi_region"; - /** - * Format: int32 - * @description Minimum failing regions required to confirm an incident - */ - minRegionsFailing?: number; - /** - * Format: int32 - * @description Maximum seconds to wait for enough regions to fail after first trigger - */ - maxWaitSeconds?: number; - }; - CreateAlertChannelRequest: { - /** @description Human-readable name for this alert channel */ - name: string; - config: components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["WebhookChannelConfig"]; - }; - CreateApiKeyRequest: { - /** @description Human-readable name to identify this API key */ - name: string; - /** - * Format: date-time - * @description Optional expiration timestamp in ISO 8601 format - */ - expiresAt?: string | null; - }; - /** @description Replace all assertions; null preserves current */ - CreateAssertionRequest: { - config: components["schemas"]["BodyContainsAssertion"] | components["schemas"]["DnsExpectedCnameAssertion"] | components["schemas"]["DnsExpectedIpsAssertion"] | components["schemas"]["DnsMaxAnswersAssertion"] | components["schemas"]["DnsMinAnswersAssertion"] | components["schemas"]["DnsRecordContainsAssertion"] | components["schemas"]["DnsRecordEqualsAssertion"] | components["schemas"]["DnsResolvesAssertion"] | components["schemas"]["DnsResponseTimeAssertion"] | components["schemas"]["DnsResponseTimeWarnAssertion"] | components["schemas"]["DnsTtlHighAssertion"] | components["schemas"]["DnsTtlLowAssertion"] | components["schemas"]["DnsTxtContainsAssertion"] | components["schemas"]["HeaderValueAssertion"] | components["schemas"]["HeartbeatIntervalDriftAssertion"] | components["schemas"]["HeartbeatMaxIntervalAssertion"] | components["schemas"]["HeartbeatPayloadContainsAssertion"] | components["schemas"]["HeartbeatReceivedAssertion"] | components["schemas"]["IcmpPacketLossAssertion"] | components["schemas"]["IcmpReachableAssertion"] | components["schemas"]["IcmpResponseTimeAssertion"] | components["schemas"]["IcmpResponseTimeWarnAssertion"] | components["schemas"]["JsonPathAssertion"] | components["schemas"]["McpConnectsAssertion"] | components["schemas"]["McpHasCapabilityAssertion"] | components["schemas"]["McpMinToolsAssertion"] | components["schemas"]["McpProtocolVersionAssertion"] | components["schemas"]["McpResponseTimeAssertion"] | components["schemas"]["McpResponseTimeWarnAssertion"] | components["schemas"]["McpToolAvailableAssertion"] | components["schemas"]["McpToolCountChangedAssertion"] | components["schemas"]["RedirectCountAssertion"] | components["schemas"]["RedirectTargetAssertion"] | components["schemas"]["RegexBodyAssertion"] | components["schemas"]["ResponseSizeAssertion"] | components["schemas"]["ResponseTimeAssertion"] | components["schemas"]["ResponseTimeWarnAssertion"] | components["schemas"]["SslExpiryAssertion"] | components["schemas"]["StatusCodeAssertion"] | components["schemas"]["TcpConnectsAssertion"] | components["schemas"]["TcpResponseTimeAssertion"] | components["schemas"]["TcpResponseTimeWarnAssertion"]; - /** - * @description Outcome severity: FAIL (fails the check) or WARN (warns without failing) - * @enum {string} - */ - severity: "fail" | "warn"; - }; - CreateEnvironmentRequest: { - /** @description Human-readable environment name */ - name: string; - /** @description URL-safe identifier (lowercase alphanumeric, hyphens, underscores) */ - slug: string; - /** @description Initial key-value variable pairs for this environment */ - variables?: { - [key: string]: string | null; - } | null; - /** @description Whether this is the default environment for new monitors */ - isDefault?: boolean; - }; - /** @description Invite a new member to the organization by email */ - CreateInviteRequest: { - /** - * Format: email - * @description Email address to invite - */ - email: string; - /** - * @description Role to assign on acceptance - * @enum {string} - */ - roleOffered: "OWNER" | "ADMIN" | "MEMBER"; - }; - CreateMaintenanceWindowRequest: { - /** - * Format: uuid - * @description Monitor to attach this maintenance window to; null for org-wide - */ - monitorId?: string | null; - /** - * Format: date-time - * @description Scheduled start of the maintenance window (ISO 8601) - */ - startsAt: string; - /** - * Format: date-time - * @description Scheduled end of the maintenance window (ISO 8601) - */ - endsAt: string; - /** @description iCal RRULE for recurring windows (max 100 chars); null for one-time */ - repeatRule?: string | null; - /** @description Human-readable reason for the maintenance */ - reason?: string | null; - /** @description Whether to suppress alerts during this window (default: true) */ - suppressAlerts?: boolean | null; - }; - CreateManualIncidentRequest: { - /** @description Short summary of the incident */ - title: string; - /** - * @description Incident severity: DOWN, DEGRADED, or MAINTENANCE - * @enum {string} - */ - severity: "DOWN" | "DEGRADED" | "MAINTENANCE"; - /** - * Format: uuid - * @description Monitor to associate with this incident - */ - monitorId?: string | null; - /** @description Detailed description or context for the incident */ - body?: string | null; - }; - CreateMonitorRequest: { - /** @description Human-readable name for this monitor */ - name: string; - /** - * @description Monitor protocol type - * @enum {string} - */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; - /** - * Format: int32 - * @description Check frequency in seconds (30–86400); null defaults to plan minimum (60s on most paid plans) - */ - frequencySeconds?: number | null; - /** @description Whether the monitor is active (default: true) */ - enabled?: boolean | null; - /** @description Probe regions to run checks from, e.g. us-east, eu-west */ - regions?: string[] | null; - /** - * @description Who manages this monitor: DASHBOARD or CLI - * @enum {string} - */ - managedBy: "DASHBOARD" | "CLI" | "TERRAFORM"; - /** - * Format: uuid - * @description Environment to associate with this monitor - */ - environmentId?: string | null; - /** @description Assertions to evaluate against each check result */ - assertions?: components["schemas"]["CreateAssertionRequest"][] | null; - auth?: Omit | null; - incidentPolicy?: components["schemas"]["UpdateIncidentPolicyRequest"] | null; - /** @description Alert channels to notify when this monitor triggers */ - alertChannelIds?: string[] | null; - tags?: components["schemas"]["AddMonitorTagsRequest"] | null; - }; - /** @description Request body for creating a notification policy */ - CreateNotificationPolicyRequest: { - /** @description Human-readable name for this policy */ - name: string; - /** @description Match rules to evaluate (all must pass; omit or empty for catch-all) */ - matchRules: components["schemas"]["MatchRule"][]; - escalation: components["schemas"]["EscalationChain"]; - /** - * @description Whether this policy is enabled (default true) - * @default true - */ - enabled: boolean; - /** - * Format: int32 - * @description Evaluation priority; higher value = evaluated first (default 0) - * @default 0 - */ - priority: number; - }; - /** @description Request body for creating a resource group */ - CreateResourceGroupRequest: { - /** @description Human-readable name for this group */ - name: string; - /** @description Optional description */ - description?: string | null; - /** - * Format: uuid - * @description Optional notification policy to apply for this group - */ - alertPolicyId?: string | null; - /** - * Format: int32 - * @description Default check frequency in seconds applied to members (30–86400) - */ - defaultFrequency?: number | null; - /** @description Default regions applied to member monitors */ - defaultRegions?: string[] | null; - defaultRetryStrategy?: components["schemas"]["RetryStrategy"] | null; - /** @description Default alert channel IDs applied to member monitors */ - defaultAlertChannels?: string[] | null; - /** - * Format: uuid - * @description Default environment ID applied to member monitors - */ - defaultEnvironmentId?: string | null; - /** - * @description Health threshold type: COUNT or PERCENTAGE - * @enum {string|null} - */ - healthThresholdType?: "COUNT" | "PERCENTAGE" | null; - /** @description Health threshold value: count (0+) or percentage (0–100) */ - healthThresholdValue?: number | null; - /** @description Suppress member-level alert notifications when group manages alerting */ - suppressMemberAlerts?: boolean | null; - /** - * Format: int32 - * @description Confirmation delay in seconds before group incident creation (0–600) - */ - confirmationDelaySeconds?: number | null; - /** - * Format: int32 - * @description Recovery cooldown in minutes after group incident resolves (0–60) - */ - recoveryCooldownMinutes?: number | null; - }; - CreateSecretRequest: { - /** @description Unique secret key within the workspace (max 255 chars) */ - key: string; - /** @description Secret value, stored encrypted (max 32KB) */ - value: string; - }; - CreateStatusPageComponentGroupRequest: { - /** @description Group display name */ - name: string; - /** @description Optional group description */ - description?: string | null; - /** - * Format: int32 - * @description Position in the group list - */ - displayOrder?: number | null; - /** @description Whether the group is collapsed by default (default: true) */ - collapsed?: boolean | null; - }; - CreateStatusPageComponentRequest: { - /** @description Component display name */ - name: string; - /** @description Optional description shown on expand */ - description?: string | null; - /** - * @description Component type: MONITOR, GROUP, or STATIC - * @enum {string} - */ - type: "MONITOR" | "GROUP" | "STATIC"; - /** - * Format: uuid - * @description Monitor ID (required when type=MONITOR) - */ - monitorId?: string | null; - /** - * Format: uuid - * @description Resource group ID (required when type=GROUP) - */ - resourceGroupId?: string | null; - /** - * Format: uuid - * @description Component group ID for visual grouping - */ - groupId?: string | null; - /** @description Whether to show the uptime bar (default: true) */ - showUptime?: boolean | null; - /** - * Format: int32 - * @description Position in the component list - */ - displayOrder?: number | null; - /** @description Exclude from overall status calculation (default: false, use true for third-party deps) */ - excludeFromOverall?: boolean | null; - /** - * Format: date - * @description Date from which to start showing uptime data - */ - startDate?: string | null; - }; - CreateStatusPageIncidentRequest: { - /** @description Customer-facing incident title */ - title: string; - /** - * @description Initial status (default: INVESTIGATING) - * @enum {string|null} - */ - status?: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED" | null; - /** - * @description Impact level: NONE, MINOR, MAJOR, or CRITICAL - * @enum {string} - */ - impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - /** @description Initial update body in markdown */ - body: string; - /** @description Component IDs affected by this incident */ - affectedComponents?: components["schemas"]["AffectedComponent"][] | null; - /** @description Whether this is a scheduled maintenance (default: false) */ - scheduled?: boolean | null; - /** - * Format: date-time - * @description Maintenance start time (required when scheduled=true) - */ - scheduledFor?: string | null; - /** - * Format: date-time - * @description Maintenance end time - */ - scheduledUntil?: string | null; - /** @description Auto-resolve at scheduledUntil (default: false) */ - autoResolve?: boolean | null; - /** @description Whether to email confirmed subscribers about this incident (default: true) */ - notifySubscribers?: boolean | null; - }; - CreateStatusPageIncidentUpdateRequest: { - /** - * @description Incident status at this point in the timeline - * @enum {string} - */ - status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; - /** @description Update body in markdown */ - body: string; - /** @description Whether to email confirmed subscribers about this update (default: true) */ - notifySubscribers?: boolean | null; - /** @description Updated affected components; null preserves current */ - affectedComponents?: components["schemas"]["AffectedComponent"][] | null; - }; - CreateStatusPageRequest: { - /** @description Human-readable name for this status page */ - name: string; - /** @description URL slug (lowercase, hyphens, globally unique) */ - slug: string; - /** @description Optional description shown below the page header */ - description?: string | null; - branding?: components["schemas"]["StatusPageBranding"] | null; - /** - * @description Page visibility: PUBLIC, PASSWORD, or IP_RESTRICTED (default: PUBLIC) - * @enum {string|null} - */ - visibility?: "PUBLIC" | "PASSWORD" | "IP_RESTRICTED" | null; - /** @description Whether the page is enabled (default: true) */ - enabled?: boolean | null; - /** - * @description Incident mode: MANUAL, REVIEW, or AUTOMATIC (default: AUTOMATIC) - * @enum {string|null} - */ - incidentMode?: "MANUAL" | "REVIEW" | "AUTOMATIC" | null; - }; - /** @description Request body for creating a tag */ - CreateTagRequest: { - /** @description Tag name, unique within the org */ - name: string; - /** @description Hex color code (defaults to #6B7280 if omitted) */ - color?: string | null; - }; - CreateWebhookEndpointRequest: { - /** @description HTTPS endpoint that receives webhook event payloads */ - url: string; - /** @description Optional human-readable description */ - description?: string | null; - /** @description Event types to deliver, e.g. monitor.created, incident.resolved */ - subscribedEvents: string[]; - }; - /** @description Create a new workspace within the organization */ - CreateWorkspaceRequest: { - /** @description Workspace name */ - name: string; - }; - /** @description Cursor-paginated response for time-series and append-only data */ - CursorPage: { - /** @description Items on this page */ - data: Record[]; - /** @description Opaque cursor for the next page; null when there are no more results */ - nextCursor?: string | null; - /** @description Whether more results exist beyond this page */ - hasMore?: boolean; - }; - /** @description Cursor-paginated response for time-series and append-only data */ - CursorPageCheckResultDto: { - /** @description Items on this page */ - data: components["schemas"]["CheckResultDto"][]; - /** @description Opaque cursor for the next page; null when there are no more results */ - nextCursor?: string | null; - /** @description Whether more results exist beyond this page */ - hasMore?: boolean; - }; - /** @description Cursor-paginated response for time-series and append-only data */ - CursorPageServiceCatalogDto: { - /** @description Items on this page */ - data: components["schemas"]["ServiceCatalogDto"][]; - /** @description Opaque cursor for the next page; null when there are no more results */ - nextCursor?: string | null; - /** @description Whether more results exist beyond this page */ - hasMore?: boolean; - }; - /** @description Cursor-paginated response for time-series and append-only data */ - CursorPageServicePollResultDto: { - /** @description Items on this page */ - data: components["schemas"]["ServicePollResultDto"][]; - /** @description Opaque cursor for the next page; null when there are no more results */ - nextCursor?: string | null; - /** @description Whether more results exist beyond this page */ - hasMore?: boolean; - }; - /** @description Combined dashboard overview for monitors and incidents */ - DashboardOverviewDto: { - monitors: components["schemas"]["MonitorsSummaryDto"]; - incidents: components["schemas"]["IncidentsSummaryDto"]; - }; - /** @description Incident that overlapped the day */ - DayIncident: { - /** - * Format: uuid - * @description Status page incident UUID - */ - id: string; - /** @description Incident title */ - title: string; - /** - * @description Lifecycle status (investigating, identified, monitoring, resolved, …) - * @enum {string} - */ - status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; - /** - * @description Severity bucket (none, minor, major, critical) - * @enum {string} - */ - impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - /** @description True for scheduled maintenances; false for unplanned incidents */ - scheduled?: boolean; - /** - * Format: date-time - * @description Incident start timestamp - */ - startedAt?: string | null; - /** - * Format: date-time - * @description Incident resolved timestamp; null while still active - */ - resolvedAt?: string | null; - /** @description Display names of components affected by this incident (deduplicated) */ - affectedComponentNames: string[]; - }; - /** @description Result of a data encryption key rotation operation */ - DekRotationResultDto: { - /** - * Format: int32 - * @description DEK version before rotation - */ - previousDekVersion?: number; - /** - * Format: int32 - * @description DEK version after rotation - */ - newDekVersion?: number; - /** - * Format: int32 - * @description Number of secrets re-encrypted with the new DEK - */ - secretsReEncrypted?: number; - /** - * Format: int32 - * @description Number of alert channels re-encrypted with the new DEK - */ - channelsReEncrypted?: number; - /** - * Format: date-time - * @description Timestamp when the rotation was performed - */ - rotatedAt: string; - }; - /** @description Summary of policies affected by channel deletion */ - DeleteChannelResult: { - /** - * Format: int32 - * @description Number of notification policies whose escalation steps were modified - */ - affectedPolicies: number; - /** - * Format: int32 - * @description Number of notification policies disabled because they had no remaining channels - */ - disabledPolicies: number; - }; - /** @description Single delivery attempt with request/response audit data */ - DeliveryAttemptDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - deliveryId: string; - /** - * Format: int32 - * @description 1-based attempt number - */ - attemptNumber?: number; - /** @description Outcome: SUCCESS, FAILED, TIMEOUT, ERROR */ - status: string; - /** - * Format: int32 - * @description HTTP response status code from the external service - */ - responseStatusCode?: number | null; - /** @description JSON payload sent to the external service */ - requestPayload?: string | null; - /** @description Response body from the external service (truncated) */ - responseBody?: string | null; - /** @description Error message if the attempt failed */ - errorMessage?: string | null; - /** - * Format: int32 - * @description Round-trip time in milliseconds - */ - responseTimeMs?: number | null; - /** @description External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID) */ - externalId?: string | null; - /** @description HTTP request headers sent to the external service */ - requestHeaders?: { - [key: string]: string | null; - } | null; - /** Format: date-time */ - attemptedAt: string; - }; - /** @description Represents an active deploy lock for a workspace */ - DeployLockDto: { - /** - * Format: uuid - * @description Unique lock identifier - */ - id: string; - /** @description Identity of the lock holder (e.g. CLI session ID, username) */ - lockedBy: string; - /** - * Format: date-time - * @description Timestamp when the lock was acquired - */ - lockedAt: string; - /** - * Format: date-time - * @description Timestamp when the lock automatically expires - */ - expiresAt: string; - }; - DiscordChannelConfig: Omit & { - /** @description Discord webhook URL */ - webhookUrl: string; - /** @description Optional Discord role ID to mention in notifications */ - mentionRoleId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "discord"; - }; - DnsExpectedCnameAssertion: Omit & { - /** @description Expected CNAME target the resolution must include */ - value: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_expected_cname"; - }; - DnsExpectedIpsAssertion: Omit & { - /** @description Allowed IP addresses; at least one resolved address must match */ - ips: string[]; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_expected_ips"; - }; - DnsMaxAnswersAssertion: Omit & { - /** @description DNS record type whose answer count is checked */ - recordType: string; - /** - * Format: int32 - * @description Maximum number of answers allowed for that record type - */ - max: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_max_answers"; - }; - DnsMinAnswersAssertion: Omit & { - /** @description DNS record type whose answer count is checked */ - recordType: string; - /** - * Format: int32 - * @description Minimum number of answers required for that record type - */ - min: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_min_answers"; - }; - DnsMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** @description Domain name to resolve */ - hostname: string; - /** @description DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, CAA, PTR */ - recordTypes?: ("A" | "AAAA" | "CNAME" | "MX" | "NS" | "TXT" | "SRV" | "SOA" | "CAA" | "PTR" | null)[] | null; - /** @description Custom nameservers to query (uses system defaults if omitted) */ - nameservers?: (string | null)[] | null; - /** - * Format: int32 - * @description Per-query timeout in milliseconds - */ - timeoutMs?: number | null; - /** - * Format: int32 - * @description Total timeout for all queries in milliseconds - */ - totalTimeoutMs?: number | null; - }; - DnsRecordContainsAssertion: Omit & { - /** @description DNS record type to assert on (A, AAAA, CNAME, MX, TXT) */ - recordType: string; - /** @description Substring that must appear in a matching record value */ - substring: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_record_contains"; - }; - DnsRecordEqualsAssertion: Omit & { - /** @description DNS record type to assert on (A, AAAA, CNAME, MX, TXT) */ - recordType: string; - /** @description Expected DNS record value for an exact match */ - value: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_record_equals"; - }; - DnsResolvesAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_resolves"; - }; - DnsResponseTimeAssertion: Omit & { - /** - * Format: int32 - * @description Maximum allowed DNS resolution time in milliseconds - */ - maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_response_time"; - }; - DnsResponseTimeWarnAssertion: Omit & { - /** - * Format: int32 - * @description DNS resolution time in milliseconds that triggers a warning only - */ - warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_response_time_warn"; - }; - DnsTtlHighAssertion: Omit & { - /** - * Format: int32 - * @description Maximum TTL in seconds before a high-TTL warning is raised - */ - maxTtl: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_ttl_high"; - }; - DnsTtlLowAssertion: Omit & { - /** - * Format: int32 - * @description Minimum acceptable TTL in seconds before a warning is raised - */ - minTtl: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_ttl_low"; - }; - DnsTxtContainsAssertion: Omit & { - /** @description Substring that must appear in at least one TXT record */ - substring: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "dns_txt_contains"; - }; - EmailChannelConfig: Omit & { - /** @description Email addresses to send notifications to */ - recipients: string[]; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "email"; - }; - /** @description A single resolved entitlement for the organization */ - EntitlementDto: { - /** @description Entitlement key */ - key: string; - /** - * Format: int64 - * @description Effective limit value (overrides applied) - */ - value?: number; - /** - * Format: int64 - * @description Plan-tier default value before overrides - */ - defaultValue?: number; - /** @description Whether this entitlement has an org-level override */ - overridden?: boolean; - }; - /** @description Environment with variable substitutions for monitor configs */ - EnvironmentDto: { - /** - * Format: uuid - * @description Unique environment identifier - */ - id: string; - /** - * Format: int32 - * @description Organization this environment belongs to - */ - orgId?: number; - /** @description Human-readable environment name */ - name: string; - /** @description URL-safe identifier */ - slug: string; - /** @description Key-value variable pairs available for interpolation */ - variables: { - [key: string]: string; - }; - /** - * Format: date-time - * @description Timestamp when the environment was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the environment was last updated - */ - updatedAt: string; - /** - * Format: int32 - * @description Number of monitors using this environment - */ - monitorCount?: number; - /** @description Whether this is the default environment for new monitors */ - isDefault?: boolean; - }; - /** @description Escalation chain defining which channels to notify; null preserves current */ - EscalationChain: { - /** @description Ordered escalation steps, evaluated in sequence */ - steps: components["schemas"]["EscalationStep"][]; - /** @description Action when the incident resolves */ - onResolve?: string | null; - /** @description Action when a resolved incident reopens */ - onReopen?: string | null; - }; - /** @description Ordered escalation steps, evaluated in sequence */ - EscalationStep: { - /** - * Format: int32 - * @description Minutes to wait before executing this step (0 = immediate) - */ - delayMinutes?: number; - /** @description Alert channel IDs to notify in this step */ - channelIds: string[]; - /** @description Whether an acknowledgment is required before escalating */ - requireAck?: boolean | null; - /** - * Format: int32 - * @description Repeat notification interval in seconds until acknowledged - */ - repeatIntervalSeconds?: number | null; - }; - /** @description Details about a single monitor that failed the bulk action */ - FailureDetail: { - /** - * Format: uuid - * @description Monitor ID that failed - */ - monitorId: string; - /** @description Human-readable reason for the failure */ - reason: string; - }; - /** @description Global status summary across all subscribed vendor services */ - GlobalStatusSummaryDto: { - /** - * Format: int32 - * @description Total number of services in the catalog - */ - totalServices?: number; - /** - * Format: int32 - * @description Number of services currently fully operational - */ - operationalCount?: number; - /** - * Format: int32 - * @description Number of services with degraded status - */ - degradedCount?: number; - /** - * Format: int32 - * @description Number of services with partial outage - */ - partialOutageCount?: number; - /** - * Format: int32 - * @description Number of services with major outage - */ - majorOutageCount?: number; - /** - * Format: int32 - * @description Number of services currently under maintenance - */ - maintenanceCount?: number; - /** - * Format: int32 - * @description Number of services with unknown or null status - */ - unknownCount?: number; - /** - * Format: int64 - * @description Total number of active incidents across all services - */ - activeIncidentCount?: number; - /** @description Services that are not fully operational */ - servicesWithIssues: components["schemas"]["ServiceCatalogDto"][]; - }; - /** @description Component ordering within a single group */ - GroupComponentOrder: { - /** - * Format: uuid - * @description Group these components belong to - */ - groupId: string; - /** @description Ordered component IDs with their within-group display order */ - positions: components["schemas"]["ComponentPosition"][]; - }; - HeaderAuthConfig: Omit & { - /** @description Custom HTTP header name for the secret value */ - headerName: string; - /** - * Format: uuid - * @description Vault secret ID for the header value - */ - vaultSecretId?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "header"; - }; - HeaderValueAssertion: Omit & { - /** @description HTTP header name to assert on */ - headerName: string; - /** @description Expected value to compare against */ - expected: string; - /** - * @description Comparison operator (equals, contains, less_than, greater_than, etc.) - * @enum {string} - */ - operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "header_value"; - }; - HeartbeatIntervalDriftAssertion: Omit & { - /** - * Format: int32 - * @description Max percent drift from expected ping interval before warning (non-fatal) - */ - maxDeviationPercent: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_interval_drift"; - }; - HeartbeatMaxIntervalAssertion: Omit & { - /** - * Format: int32 - * @description Maximum allowed gap in seconds between consecutive heartbeat pings - */ - maxSeconds: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_max_interval"; - }; - HeartbeatMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** - * Format: int32 - * @description Expected heartbeat interval in seconds - */ - expectedInterval: number; - /** - * Format: int32 - * @description Grace period in seconds before marking as down - */ - gracePeriod: number; - }; - HeartbeatPayloadContainsAssertion: Omit & { - /** @description JSONPath expression into the heartbeat ping JSON payload */ - path: string; - /** @description Expected value to compare against at that path */ - value: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_payload_contains"; - }; - HeartbeatReceivedAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "heartbeat_received"; - }; - HttpMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** @description Target URL to send requests to */ - url: string; - /** - * @description HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD - * @enum {string} - */ - method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD"; - /** @description Additional HTTP headers to include in requests */ - customHeaders?: { - [key: string]: string | null; - } | null; - /** @description Request body content for POST/PUT/PATCH methods */ - requestBody?: string | null; - /** @description Content-Type header value for the request body */ - contentType?: string | null; - /** @description Whether to verify TLS certificates (default: true) */ - verifyTls?: boolean | null; - }; - IcmpMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** @description Target hostname or IP address to ping */ - host: string; - /** - * Format: int32 - * @description Number of ICMP packets to send - */ - packetCount?: number | null; - /** - * Format: int32 - * @description Ping timeout in milliseconds - */ - timeoutMs?: number | null; - }; - IcmpPacketLossAssertion: Omit & { - /** - * Format: double - * @description Maximum allowed packet loss percentage before the check fails (0–100) - */ - maxPercent: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "icmp_packet_loss"; - }; - IcmpReachableAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "icmp_reachable"; - }; - IcmpResponseTimeAssertion: Omit & { - /** - * Format: int32 - * @description Maximum average ICMP round-trip time in milliseconds - */ - maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "icmp_response_time"; - }; - IcmpResponseTimeWarnAssertion: Omit & { - /** - * Format: int32 - * @description ICMP round-trip time in milliseconds that triggers a warning only - */ - warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "icmp_response_time_warn"; - }; - IncidentDetailDto: { - incident: components["schemas"]["IncidentDto"]; - updates: components["schemas"]["IncidentUpdateDto"][]; - statusPageIncidents?: components["schemas"]["LinkedStatusPageIncidentDto"][] | null; - }; - /** @description Incident triggered by a monitor check failure or manual creation */ - IncidentDto: { - /** - * Format: uuid - * @description Unique incident identifier - */ - id: string; - /** - * Format: uuid - * @description Monitor that triggered the incident; null for service or manual incidents - */ - monitorId?: string | null; - /** - * Format: int32 - * @description Organization this incident belongs to - */ - organizationId?: number; - /** - * @description Incident origin: MONITOR, SERVICE, or MANUAL - * @enum {string} - */ - source: "AUTOMATIC" | "MANUAL" | "MONITORS" | "STATUS_DATA" | "RESOURCE_GROUP"; - /** - * @description Current lifecycle status (OPEN, RESOLVED, etc.) - * @enum {string} - */ - status: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED"; - /** - * @description Severity level: DOWN, DEGRADED, or MAINTENANCE - * @enum {string} - */ - severity: "DOWN" | "DEGRADED" | "MAINTENANCE"; - /** @description Short summary of the incident; null for auto-generated incidents */ - title?: string | null; - /** @description Human-readable description of the trigger rule that fired */ - triggeredByRule?: string | null; - /** @description Probe regions that observed the failure */ - affectedRegions: string[]; - /** - * Format: int32 - * @description Number of times this incident has been reopened - */ - reopenCount?: number; - /** - * Format: int32 - * @description User who created the incident (manual incidents only) - */ - createdByUserId?: number | null; - /** @description Whether this incident is visible on the status page */ - statusPageVisible?: boolean; - /** - * Format: uuid - * @description Linked vendor service incident ID; null for monitor incidents - */ - serviceIncidentId?: string | null; - /** - * Format: uuid - * @description Linked service catalog ID; null for monitor incidents - */ - serviceId?: string | null; - /** @description External reference ID (e.g. PagerDuty incident ID) */ - externalRef?: string | null; - /** @description Service components affected by this incident */ - affectedComponents?: string[] | null; - /** @description Short URL linking to the incident details */ - shortlink?: string | null; - /** - * @description How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.) - * @enum {string|null} - */ - resolutionReason?: "MANUAL" | "AUTO_RECOVERED" | "AUTO_RESOLVED" | null; - /** - * Format: date-time - * @description Timestamp when the incident was detected or created - */ - startedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the incident was confirmed (multi-region confirmation) - */ - confirmedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the incident was resolved - */ - resolvedAt?: string | null; - /** - * Format: date-time - * @description Cooldown window end; new incidents suppressed until this time - */ - cooldownUntil?: string | null; - /** - * Format: date-time - * @description Timestamp when the incident record was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the incident was last updated - */ - updatedAt: string; - /** @description Name of the associated monitor; populated on list responses */ - monitorName?: string | null; - /** @description Name of the associated service; populated on list responses */ - serviceName?: string | null; - /** @description Slug of the associated service; populated on list responses */ - serviceSlug?: string | null; - /** @description Type of the associated monitor; populated on list responses */ - monitorType?: string | null; - /** - * Format: uuid - * @description Resource group that owns this incident; null when not group-managed - */ - resourceGroupId?: string | null; - /** @description Name of the resource group; populated on list responses */ - resourceGroupName?: string | null; - }; - IncidentFilterParams: { - /** @enum {string|null} */ - status?: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED" | null; - /** @enum {string|null} */ - severity?: "DOWN" | "DEGRADED" | "MAINTENANCE" | null; - /** @enum {string|null} */ - source?: "AUTOMATIC" | "MANUAL" | "MONITORS" | "STATUS_DATA" | "RESOURCE_GROUP" | null; - /** Format: uuid */ - monitorId?: string | null; - /** Format: uuid */ - serviceId?: string | null; - /** Format: uuid */ - resourceGroupId?: string | null; - /** Format: uuid */ - tagId?: string | null; - /** Format: uuid */ - environmentId?: string | null; - /** Format: date-time */ - startedFrom?: string | null; - /** Format: date-time */ - startedTo?: string | null; - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - }; - /** @description Incident detection, confirmation, and recovery policy for a monitor */ - IncidentPolicyDto: { - /** - * Format: uuid - * @description Unique incident policy identifier - */ - id: string; - /** - * Format: uuid - * @description Monitor this policy is attached to - */ - monitorId: string; - /** @description Array of trigger rules defining when an incident should be raised */ - triggerRules: components["schemas"]["TriggerRule"][]; - confirmation: components["schemas"]["ConfirmationPolicy"]; - recovery: components["schemas"]["RecoveryPolicy"]; - /** - * Format: date-time - * @description Timestamp when the policy was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the policy was last updated - */ - updatedAt: string; - /** - * Format: int32 - * @description Number of regions configured on the monitor (only set in internal API responses) - */ - monitorRegionCount?: number | null; - /** - * Format: int32 - * @description Monitor check frequency in seconds (only set in internal API responses) - */ - checkFrequencySeconds?: number | null; - }; - /** @description Lightweight reference to an incident overlapping this day */ - IncidentRef: { - /** - * Format: uuid - * @description Status page incident ID - */ - id: string; - /** @description Incident title */ - title: string; - /** @description Incident impact level */ - impact: string; - }; - /** @description Incident summary counters */ - IncidentsSummaryDto: { - /** Format: int64 */ - active: number; - /** Format: int64 */ - resolvedToday: number; - /** Format: double */ - mttr30d?: number | null; - }; - IncidentUpdateDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - incidentId: string; - /** @enum {string|null} */ - oldStatus?: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED" | null; - /** @enum {string|null} */ - newStatus?: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED" | null; - body?: string | null; - /** @enum {string|null} */ - createdBy?: "SYSTEM" | "USER" | null; - notifySubscribers?: boolean; - /** Format: date-time */ - createdAt: string; - }; - IntegrationConfigSchemaDto: { - connectionFields: components["schemas"]["IntegrationFieldDto"][]; - channelFields: components["schemas"]["IntegrationFieldDto"][]; - }; - IntegrationDto: { - type: string; - name: string; - description: string; - logoUrl: string; - authType: string; - /** @enum {string} */ - tierAvailability: "FREE" | "STARTER" | "PRO" | "TEAM" | "BUSINESS" | "ENTERPRISE"; - lifecycle: string; - setupGuideUrl: string; - configSchema: components["schemas"]["IntegrationConfigSchemaDto"]; - }; - IntegrationFieldDto: { - key: string; - label: string; - type: string; - required: boolean; - sensitive: boolean; - placeholder?: string | null; - helpText?: string | null; - options?: string[] | null; - default?: string | null; - }; - /** @description Organization invite sent to an email address */ - InviteDto: { - /** - * Format: int32 - * @description Unique invite identifier - */ - inviteId?: number; - /** @description Email address the invite was sent to */ - email: string; - /** - * @description Role that will be assigned to the invitee on acceptance - * @enum {string} - */ - roleOffered: "OWNER" | "ADMIN" | "MEMBER"; - /** - * Format: date-time - * @description Timestamp when the invite expires - */ - expiresAt: string; - /** - * Format: date-time - * @description Timestamp when the invite was accepted; null if not yet used - */ - consumedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the invite was revoked; null if active - */ - revokedAt?: string | null; - }; - JsonPathAssertion: Omit & { - /** @description JSONPath expression to extract a value from the response body */ - path: string; - /** @description Expected value to compare against */ - expected: string; - /** - * @description Comparison operator (equals, contains, less_than, greater_than, etc.) - * @enum {string} - */ - operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "json_path"; - }; - /** @description API key metadata */ - KeyInfo: { - /** - * Format: int32 - * @description Key ID - */ - id?: number; - /** @description Human-readable key name */ - name: string; - /** - * Format: date-time - * @description When the key was created - */ - createdAt: string; - /** - * Format: date-time - * @description When the key expires (null = never) - */ - expiresAt?: string | null; - /** - * Format: date-time - * @description Last time the key was used - */ - lastUsedAt?: string | null; - }; - LinkedStatusPageIncidentDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - statusPageId: string; - statusPageName: string; - statusPageSlug: string; - title: string; - /** @enum {string} */ - status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; - /** @enum {string} */ - impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - scheduled?: boolean; - /** Format: date-time */ - publishedAt?: string | null; - }; - /** @description A component affected by a scheduled maintenance window */ - MaintenanceComponentRef: { - /** - * Format: uuid - * @description Component identifier - */ - id: string; - /** @description Component name */ - name: string; - /** @description Component status at the time of the maintenance update */ - status: string; - }; - /** @description A status update within a scheduled maintenance lifecycle */ - MaintenanceUpdateDto: { - /** - * Format: uuid - * @description Unique update identifier - */ - id: string; - /** @description Status at the time of this update */ - status: string; - /** @description Update message from the vendor */ - body?: string | null; - /** - * Format: date-time - * @description Timestamp when this update was posted - */ - displayAt?: string | null; - }; - /** @description Scheduled maintenance window for a monitor */ - MaintenanceWindowDto: { - /** - * Format: uuid - * @description Unique maintenance window identifier - */ - id: string; - /** - * Format: uuid - * @description Monitor this window applies to; null for org-wide windows - */ - monitorId?: string | null; - /** - * Format: int32 - * @description Organization this maintenance window belongs to - */ - organizationId?: number; - /** - * Format: date-time - * @description Scheduled start of the maintenance window - */ - startsAt: string; - /** - * Format: date-time - * @description Scheduled end of the maintenance window - */ - endsAt: string; - /** @description iCal RRULE for recurring windows; null for one-time */ - repeatRule?: string | null; - /** @description Human-readable reason for the maintenance */ - reason?: string | null; - /** @description Whether alerts are suppressed during this window */ - suppressAlerts?: boolean; - /** - * Format: date-time - * @description Timestamp when the window was created - */ - createdAt: string; - }; - /** @description Match rules to evaluate (all must pass; omit or empty for catch-all) */ - MatchRule: { - /** @description Rule type, e.g. severity_gte, monitor_id_in, region_in */ - type: string; - /** @description Comparison value for single-value rules like severity_gte */ - value?: string | null; - /** @description Monitor UUIDs to match for monitor_id_in rules */ - monitorIds?: string[] | null; - /** @description Region codes to match for region_in rules */ - regions?: string[] | null; - /** @description Values list for multi-value rules like monitor_type_in */ - values?: string[] | null; - }; - McpConnectsAssertion: Omit & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_connects"; - }; - McpHasCapabilityAssertion: Omit & { - /** @description Capability name the server must advertise, e.g. tools or resources */ - capability: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_has_capability"; - }; - McpMinToolsAssertion: Omit & { - /** - * Format: int32 - * @description Minimum number of tools the server must expose - */ - min: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_min_tools"; - }; - McpProtocolVersionAssertion: Omit & { - /** @description Expected MCP protocol version string from the server handshake */ - version: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_protocol_version"; - }; - McpResponseTimeAssertion: Omit & { - /** - * Format: int32 - * @description Maximum allowed MCP check duration in milliseconds - */ - maxMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_response_time"; - }; - McpResponseTimeWarnAssertion: Omit & { - /** - * Format: int32 - * @description MCP check duration in milliseconds that triggers a warning only - */ - warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_response_time_warn"; - }; - McpServerMonitorConfig: components["schemas"]["MonitorConfig"] & { - /** @description Command to execute to start the MCP server */ - command: string; - /** @description Command-line arguments for the MCP server process */ - args?: (string | null)[] | null; - /** @description Environment variables to pass to the MCP server process */ - env?: { - [key: string]: string | null; - } | null; - }; - McpToolAvailableAssertion: Omit & { - /** @description MCP tool name that must appear in the server's tool list */ - toolName: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_tool_available"; - }; - McpToolCountChangedAssertion: Omit & { - /** - * Format: int32 - * @description Expected tool count; warns when the live count differs - */ - expectedCount: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "mcp_tool_count_changed"; - }; - /** @description Organization member with role and status */ - MemberDto: { - /** - * Format: int32 - * @description User identifier of the member - */ - userId?: number; - /** @description Member email address */ - email: string; - /** @description Member display name; null if not set */ - name?: string | null; - /** - * @description Member role within this organization (OWNER, ADMIN, MEMBER) - * @enum {string} - */ - orgRole: "OWNER" | "ADMIN" | "MEMBER"; - /** - * @description Membership status (ACTIVE, PENDING, SUSPENDED) - * @enum {string} - */ - status: "INVITED" | "ACTIVE" | "SUSPENDED" | "LEFT" | "REMOVED" | "DECLINED"; - /** - * Format: date-time - * @description Timestamp when the member was added to the organization - */ - createdAt: string; - }; - MonitorAssertionDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - monitorId: string; - /** @enum {string} */ - assertionType: "status_code" | "response_time" | "body_contains" | "json_path" | "header_value" | "regex_body" | "dns_resolves" | "dns_response_time" | "dns_expected_ips" | "dns_expected_cname" | "dns_record_contains" | "dns_record_equals" | "dns_txt_contains" | "dns_min_answers" | "dns_max_answers" | "dns_response_time_warn" | "dns_ttl_low" | "dns_ttl_high" | "mcp_connects" | "mcp_response_time" | "mcp_has_capability" | "mcp_tool_available" | "mcp_min_tools" | "mcp_protocol_version" | "mcp_response_time_warn" | "mcp_tool_count_changed" | "ssl_expiry" | "response_size" | "redirect_count" | "redirect_target" | "response_time_warn" | "tcp_connects" | "tcp_response_time" | "tcp_response_time_warn" | "icmp_reachable" | "icmp_response_time" | "icmp_response_time_warn" | "icmp_packet_loss" | "heartbeat_received" | "heartbeat_max_interval" | "heartbeat_interval_drift" | "heartbeat_payload_contains"; - config: components["schemas"]["BodyContainsAssertion"] | components["schemas"]["DnsExpectedCnameAssertion"] | components["schemas"]["DnsExpectedIpsAssertion"] | components["schemas"]["DnsMaxAnswersAssertion"] | components["schemas"]["DnsMinAnswersAssertion"] | components["schemas"]["DnsRecordContainsAssertion"] | components["schemas"]["DnsRecordEqualsAssertion"] | components["schemas"]["DnsResolvesAssertion"] | components["schemas"]["DnsResponseTimeAssertion"] | components["schemas"]["DnsResponseTimeWarnAssertion"] | components["schemas"]["DnsTtlHighAssertion"] | components["schemas"]["DnsTtlLowAssertion"] | components["schemas"]["DnsTxtContainsAssertion"] | components["schemas"]["HeaderValueAssertion"] | components["schemas"]["HeartbeatIntervalDriftAssertion"] | components["schemas"]["HeartbeatMaxIntervalAssertion"] | components["schemas"]["HeartbeatPayloadContainsAssertion"] | components["schemas"]["HeartbeatReceivedAssertion"] | components["schemas"]["IcmpPacketLossAssertion"] | components["schemas"]["IcmpReachableAssertion"] | components["schemas"]["IcmpResponseTimeAssertion"] | components["schemas"]["IcmpResponseTimeWarnAssertion"] | components["schemas"]["JsonPathAssertion"] | components["schemas"]["McpConnectsAssertion"] | components["schemas"]["McpHasCapabilityAssertion"] | components["schemas"]["McpMinToolsAssertion"] | components["schemas"]["McpProtocolVersionAssertion"] | components["schemas"]["McpResponseTimeAssertion"] | components["schemas"]["McpResponseTimeWarnAssertion"] | components["schemas"]["McpToolAvailableAssertion"] | components["schemas"]["McpToolCountChangedAssertion"] | components["schemas"]["RedirectCountAssertion"] | components["schemas"]["RedirectTargetAssertion"] | components["schemas"]["RegexBodyAssertion"] | components["schemas"]["ResponseSizeAssertion"] | components["schemas"]["ResponseTimeAssertion"] | components["schemas"]["ResponseTimeWarnAssertion"] | components["schemas"]["SslExpiryAssertion"] | components["schemas"]["StatusCodeAssertion"] | components["schemas"]["TcpConnectsAssertion"] | components["schemas"]["TcpResponseTimeAssertion"] | components["schemas"]["TcpResponseTimeWarnAssertion"]; - /** @enum {string} */ - severity: "fail" | "warn"; - }; - /** @description New authentication configuration (full replacement) */ - MonitorAuthConfig: { - type: string; - }; - MonitorAuthDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - monitorId: string; - /** @enum {string} */ - authType: "bearer" | "basic" | "header" | "api_key"; - config: components["schemas"]["ApiKeyAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["BearerAuthConfig"] | components["schemas"]["HeaderAuthConfig"]; - }; - /** @description Protocol-specific monitor configuration */ - MonitorConfig: Record; - /** @description Full monitor representation */ - MonitorDto: { - /** - * Format: uuid - * @description Unique monitor identifier - */ - id: string; - /** - * Format: int32 - * @description Organization this monitor belongs to - */ - organizationId?: number; - /** @description Human-readable name for this monitor */ - name: string; - /** @enum {string} */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; - /** - * Format: int32 - * @description Check frequency in seconds (30–86400) - */ - frequencySeconds?: number; - /** @description Whether the monitor is active */ - enabled?: boolean; - /** @description Probe regions where checks are executed */ - regions: string[]; - /** - * @description Management source: DASHBOARD or CLI - * @enum {string} - */ - managedBy: "DASHBOARD" | "CLI" | "TERRAFORM"; - /** - * Format: date-time - * @description Timestamp when the monitor was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the monitor was last updated - */ - updatedAt: string; - /** @description Assertions evaluated against each check result; null on list responses */ - assertions?: components["schemas"]["MonitorAssertionDto"][] | null; - /** @description Tags applied to this monitor */ - tags?: components["schemas"]["TagDto"][] | null; - /** @description Heartbeat ping URL; populated for HEARTBEAT monitors only */ - pingUrl?: string | null; - environment?: components["schemas"]["Summary"] | null; - auth?: Omit | null; - incidentPolicy?: components["schemas"]["IncidentPolicyDto"] | null; - /** @description Alert channel IDs linked to this monitor; populated on single-monitor responses */ - alertChannelIds?: string[] | null; - }; - /** @description Monitors that reference this secret; null on create/update responses */ - MonitorReference: { - /** - * Format: uuid - * @description Monitor identifier - */ - id: string; - /** @description Monitor name */ - name: string; - }; - /** @description Dashboard summary counters for monitors */ - MonitorsSummaryDto: { - /** - * Format: int64 - * @description Total number of monitors in the organization - */ - total: number; - /** - * Format: int64 - * @description Number of monitors currently passing - */ - up: number; - /** - * Format: int64 - * @description Number of monitors currently failing (DOWN severity) - */ - down: number; - /** - * Format: int64 - * @description Number of monitors with degraded status - */ - degraded: number; - /** - * Format: int64 - * @description Number of disabled monitors - */ - paused: number; - /** - * Format: double - * @description Average uptime percentage across all monitors over last 24h - */ - avgUptime24h?: number | null; - /** - * Format: double - * @description Average uptime percentage across all monitors over last 30 days - */ - avgUptime30d?: number | null; - }; - MonitorTestRequest: { - /** - * @description Monitor protocol type to test - * @enum {string} - */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; - /** @description Optional assertions to evaluate against the test result */ - assertions?: components["schemas"]["CreateAssertionRequest"][] | null; - }; - MonitorTestResultDto: { - passed?: boolean; - error?: string | null; - /** Format: int32 */ - statusCode?: number | null; - /** Format: int64 */ - responseTimeMs?: number | null; - responseHeaders?: { - [key: string]: (string | null)[] | null; - } | null; - bodyPreview?: string | null; - /** Format: int64 */ - responseSizeBytes?: number | null; - /** Format: int32 */ - redirectCount?: number | null; - finalUrl?: string | null; - assertionResults: components["schemas"]["AssertionTestResultDto"][]; - warnings?: string[] | null; - }; - /** @description A point-in-time version snapshot of a monitor configuration */ - MonitorVersionDto: { - /** - * Format: uuid - * @description Unique version record identifier - */ - id: string; - /** - * Format: uuid - * @description Monitor this version belongs to - */ - monitorId: string; - /** - * Format: int32 - * @description Monotonically increasing version number - */ - version?: number; - snapshot: components["schemas"]["MonitorDto"]; - /** - * Format: int32 - * @description User ID who made the change; null for automated changes - */ - changedById?: number | null; - /** - * @description Change source (DASHBOARD, CLI, API) - * @enum {string} - */ - changedVia: "API" | "DASHBOARD" | "CLI" | "TERRAFORM"; - /** @description Human-readable description of what changed */ - changeSummary?: string | null; - /** - * Format: date-time - * @description Timestamp when this version was recorded - */ - createdAt: string; - }; - /** @description Inline tag creation — creates the tag if it does not already exist */ - NewTagRequest: { - /** @description Tag name */ - name: string; - /** @description Hex color code (defaults to #6B7280 if omitted) */ - color?: string | null; - }; - /** @description Dispatch state for a single (incident, notification policy) pair, with delivery history */ - NotificationDispatchDto: { - /** - * Format: uuid - * @description Unique dispatch record identifier - */ - id: string; - /** - * Format: uuid - * @description Incident this dispatch is for - */ - incidentId: string; - /** - * Format: uuid - * @description Notification policy that matched this incident - */ - policyId: string; - /** @description Human-readable name of the matched policy (null if policy has been deleted) */ - policyName?: string | null; - /** - * @description Current dispatch state - * @enum {string} - */ - status: "PENDING" | "DISPATCHING" | "DELIVERED" | "ESCALATING" | "ACKNOWLEDGED" | "COMPLETED"; - /** - * @description Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states. - * @enum {string|null} - */ - completionReason?: "EXHAUSTED" | "RESOLVED" | "NO_STEPS" | null; - /** - * Format: int32 - * @description 1-based index of the currently active escalation step - */ - currentStep?: number; - /** - * Format: int32 - * @description Total number of escalation steps in the policy (null if policy has been deleted) - */ - totalSteps?: number | null; - /** - * Format: date-time - * @description Timestamp when this dispatch was acknowledged (null if not acknowledged) - */ - acknowledgedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the next escalation step will fire (null if not scheduled) - */ - nextEscalationAt?: string | null; - /** - * Format: date-time - * @description Timestamp of the most recent notification delivery - */ - lastNotifiedAt?: string | null; - /** @description Delivery records for all channels associated with this dispatch */ - deliveries: components["schemas"]["AlertDeliveryDto"][]; - /** - * Format: date-time - * @description Timestamp when the dispatch was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the dispatch was last updated - */ - updatedAt: string; - }; - /** @description In-app notification for the current user */ - NotificationDto: { - /** - * Format: int64 - * @description Unique notification identifier - */ - id?: number; - /** @description Notification category (e.g. incident, monitor, team) */ - type: string; - /** @description Short notification title */ - title: string; - /** @description Full notification body; null for title-only notifications */ - body?: string | null; - /** @description Type of the resource this notification is about */ - resourceType?: string | null; - /** @description ID of the resource this notification is about */ - resourceId?: string | null; - /** @description Whether the notification has been read */ - read?: boolean; - /** - * Format: date-time - * @description Timestamp when the notification was created - */ - createdAt: string; - }; - /** @description Org-level notification policy with match rules and escalation chain */ - NotificationPolicyDto: { - /** - * Format: uuid - * @description Unique notification policy identifier - */ - id: string; - /** - * Format: int32 - * @description Organization this policy belongs to - */ - organizationId?: number; - /** @description Human-readable name for this policy */ - name: string; - /** @description Match rules (all must pass; empty = catch-all) */ - matchRules: components["schemas"]["MatchRule"][]; - escalation: components["schemas"]["EscalationChain"]; - /** @description Whether this policy is active */ - enabled?: boolean; - /** - * Format: int32 - * @description Evaluation order; higher value = evaluated first - */ - priority?: number; - /** - * Format: date-time - * @description Timestamp when the policy was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the policy was last updated - */ - updatedAt: string; - }; - OpsGenieChannelConfig: Omit & { - /** @description OpsGenie API key for alert creation */ - apiKey: string; - /** @description OpsGenie API region: us or eu */ - region?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "opsgenie"; - }; - /** @description Organization account details */ - OrganizationDto: { - /** - * Format: int32 - * @description Unique organization identifier - */ - id?: number; - /** @description Organization name */ - name: string; - /** @description Billing and contact email */ - email: string | null; - /** @description Team size range (e.g. 1-10, 11-50) */ - size?: string | null; - /** @description Industry vertical (e.g. SaaS, Fintech) */ - industry?: string | null; - /** @description Organization website URL */ - websiteUrl?: string | null; - }; - /** @description Organization the key belongs to */ - OrgInfo: { - /** - * Format: int32 - * @description Organization ID - */ - id?: number; - /** @description Organization name */ - name: string; - }; - Pageable: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - sort: string[]; - }; - PagerDutyChannelConfig: Omit & { - /** @description PagerDuty Events API v2 routing (integration) key */ - routingKey: string; - /** @description Override PagerDuty severity mapping */ - severityOverride?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "pagerduty"; - }; - /** @description A top-level page section (either a group or an ungrouped component) */ - PageSection: { - /** - * Format: uuid - * @description Group ID when this section is a group - */ - groupId?: string | null; - /** - * Format: uuid - * @description Component ID when this section is an ungrouped component - */ - componentId?: string | null; - /** - * Format: int32 - * @description Position on the page (0-based) - */ - pageOrder: number; - }; - /** @description Billing plan and entitlement state */ - PlanInfo: { - /** - * @description Resolved plan tier - * @enum {string} - */ - tier: "FREE" | "STARTER" | "PRO" | "TEAM" | "BUSINESS" | "ENTERPRISE"; - /** @description Subscription status (null if no subscription) */ - subscriptionStatus?: string | null; - /** @description Whether the org is on a trial */ - trialActive?: boolean; - /** - * Format: date-time - * @description Trial expiry (null if not trialing) - */ - trialExpiresAt?: string | null; - /** @description Entitlement limits keyed by entitlement name */ - entitlements: { - [key: string]: components["schemas"]["EntitlementDto"]; - }; - /** @description Current usage counters keyed by entitlement name */ - usage: { - [key: string]: number; - }; - }; - /** @description Aggregated poll metrics for a time bucket */ - PollChartBucketDto: { - /** - * Format: date-time - * @description Start of the time bucket (ISO 8601) - */ - bucket: string; - /** - * Format: double - * @description Uptime percentage for this bucket; null when no data - * @example 100 - */ - uptimePercent?: number | null; - /** - * Format: double - * @description Average response time in milliseconds for this bucket - * @example 245.3 - */ - avgResponseTimeMs?: number | null; - /** - * Format: int64 - * @description Total polls in this bucket - * @example 60 - */ - totalPolls?: number; - }; - PublishStatusPageIncidentRequest: { - /** @description Customer-facing title; null keeps draft value */ - title?: string | null; - /** - * @description Impact level; null keeps draft value - * @enum {string|null} - */ - impact?: "NONE" | "MINOR" | "MAJOR" | "CRITICAL" | null; - /** - * @description Incident status; null keeps draft value (must be an active status) - * @enum {string|null} - */ - status?: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED" | null; - /** @description Initial update body; null keeps draft value */ - body?: string | null; - /** @description Affected components; null keeps draft value */ - affectedComponents?: components["schemas"]["AffectedComponent"][] | null; - /** @description Whether to notify subscribers (default: true) */ - notifySubscribers?: boolean | null; - }; - /** @description Rate-limit quota for the current sliding window */ - RateLimitInfo: { - /** - * Format: int64 - * @description Maximum requests allowed per window - */ - requestsPerMinute: number; - /** - * Format: int64 - * @description Requests remaining in the current window - */ - remaining: number; - /** - * Format: int64 - * @description Sliding window size in milliseconds - */ - windowMs: number; - }; - /** @description Auto-recovery settings */ - RecoveryPolicy: { - /** - * Format: int32 - * @description Consecutive passing checks required to auto-resolve the incident - */ - consecutiveSuccesses: number; - /** - * Format: int32 - * @description Minimum regions that must be passing before recovery can complete - */ - minRegionsPassing: number; - /** - * Format: int32 - * @description Minutes after resolve before a new incident may open on the same monitor - */ - cooldownMinutes: number; - }; - RedirectCountAssertion: Omit & { - /** - * Format: int32 - * @description Maximum number of HTTP redirects allowed before the check fails - */ - maxCount: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "redirect_count"; - }; - RedirectTargetAssertion: Omit & { - /** @description Expected final URL after following redirects */ - expected: string; - /** - * @description Comparison operator (equals, contains, less_than, greater_than, etc.) - * @enum {string} - */ - operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "redirect_target"; - }; - RegexBodyAssertion: Omit & { - /** @description Regular expression the response body must match */ - pattern: string; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "regex_body"; - }; - /** @description Latest check result for a single region */ - RegionStatusDto: { - /** - * @description Region identifier - * @example us-east - */ - region: string; - /** - * @description Whether the last check in this region passed - * @example true - */ - passed?: boolean; - /** - * Format: int32 - * @description Response time in milliseconds for the last check - * @example 95 - */ - responseTimeMs?: number | null; - /** - * Format: date-time - * @description Timestamp of the last check in this region (ISO 8601) - */ - timestamp: string; - /** @description Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing */ - severityHint?: string | null; - }; - /** @description Request body for removing tags from a monitor */ - RemoveMonitorTagsRequest: { - /** @description IDs of the tags to detach from the monitor */ - tagIds: string[]; - }; - /** @description Batch component reorder request */ - ReorderComponentsRequest: { - /** @description Ordered list of component IDs with their new positions */ - positions: components["schemas"]["ComponentPosition"][]; - }; - /** @description Reorder page-level layout: groups and ungrouped components share one ordering */ - ReorderPageLayoutRequest: { - /** @description Top-level sections in their new order */ - sections: components["schemas"]["PageSection"][]; - /** @description Within-group component ordering; only needed for groups whose internal order changed */ - groupOrders?: components["schemas"]["GroupComponentOrder"][] | null; - }; - ResolveIncidentRequest: { - /** @description Optional resolution message or post-mortem notes */ - body: string; - }; - /** @description Resource group with health summary and optional member details */ - ResourceGroupDto: { - /** - * Format: uuid - * @description Unique resource group identifier - */ - id: string; - /** - * Format: int32 - * @description Organization this group belongs to - */ - organizationId?: number; - /** @description Human-readable group name */ - name: string; - /** @description URL-safe group identifier */ - slug: string; - /** @description Optional group description */ - description?: string | null; - /** - * Format: uuid - * @description Notification policy applied to this group - */ - alertPolicyId?: string | null; - /** - * Format: int32 - * @description Default check frequency in seconds for member monitors - */ - defaultFrequency?: number | null; - /** @description Default regions for member monitors */ - defaultRegions?: string[] | null; - defaultRetryStrategy?: components["schemas"]["RetryStrategy"] | null; - /** @description Default alert channel IDs for member monitors */ - defaultAlertChannels?: string[] | null; - /** - * Format: uuid - * @description Default environment ID for member monitors - */ - defaultEnvironmentId?: string | null; - /** - * @description Health threshold type: COUNT or PERCENTAGE - * @enum {string|null} - */ - healthThresholdType?: "COUNT" | "PERCENTAGE" | null; - /** @description Health threshold value */ - healthThresholdValue?: number | null; - /** @description When true, member-level incidents skip notification dispatch; only group alerts fire */ - suppressMemberAlerts?: boolean; - /** - * Format: int32 - * @description Seconds to wait after health threshold breach before creating group incident - */ - confirmationDelaySeconds?: number | null; - /** - * Format: int32 - * @description Cooldown minutes after group incident resolves before a new one can open - */ - recoveryCooldownMinutes?: number | null; - health: components["schemas"]["ResourceGroupHealthDto"]; - /** @description Member list with individual statuses; populated on detail GET only */ - members?: components["schemas"]["ResourceGroupMemberDto"][] | null; - /** - * Format: date-time - * @description Timestamp when the group was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the group was last updated - */ - updatedAt: string; - }; - /** @description Aggregated health summary for a resource group */ - ResourceGroupHealthDto: { - /** - * @description Worst-of health status across all members - * @enum {string} - */ - status: "operational" | "maintenance" | "degraded" | "down"; - /** - * Format: int32 - * @description Total number of members in the group - */ - totalMembers?: number; - /** - * Format: int32 - * @description Number of members currently in operational status - */ - operationalCount?: number; - /** - * Format: int32 - * @description Number of members with an active incident or non-operational status - */ - activeIncidents?: number; - /** - * @description Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured. - * @enum {string|null} - */ - thresholdStatus?: "healthy" | "degraded" | "down" | null; - /** - * Format: int32 - * @description Number of failing members at time of last evaluation - */ - failingCount?: number | null; - }; - /** @description A single member of a resource group with its computed health status */ - ResourceGroupMemberDto: { - /** - * Format: uuid - * @description Unique group member record identifier - */ - id: string; - /** - * Format: uuid - * @description Resource group this member belongs to - */ - groupId: string; - /** @description Type of member: 'monitor' or 'service' */ - memberType: string; - /** - * Format: uuid - * @description Monitor ID; set when memberType is 'monitor' - */ - monitorId?: string | null; - /** - * Format: uuid - * @description Service ID; set when memberType is 'service' - */ - serviceId?: string | null; - /** @description Display name of the referenced monitor or service */ - name?: string | null; - /** @description Slug identifier for the service (services only); used for icons and uptime API calls */ - slug?: string | null; - /** - * Format: uuid - * @description Subscription ID for the service (services only); used to link to the dependency detail page - */ - subscriptionId?: string | null; - /** - * @description Computed health status for this member - * @enum {string} - */ - status: "operational" | "maintenance" | "degraded" | "down"; - /** @description Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured */ - effectiveFrequency?: string | null; - /** - * Format: date-time - * @description Timestamp when the member was added to the group - */ - createdAt: string; - /** - * Format: double - * @description 24h uptime percentage; populated when includeMetrics=true - */ - uptime24h?: number | null; - /** @description Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true */ - chartData?: number[] | null; - /** - * Format: double - * @description Average latency in ms (monitors only); populated when includeMetrics=true - */ - avgLatencyMs?: number | null; - /** - * Format: double - * @description P95 latency in ms (monitors only); populated when includeMetrics=true - */ - p95LatencyMs?: number | null; - /** - * Format: date-time - * @description Timestamp of the most recent health check; populated when includeMetrics=true - */ - lastCheckedAt?: string | null; - /** @description Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only */ - monitorType?: string | null; - /** @description Environment name; monitors only */ - environmentName?: string | null; - }; - ResponseSizeAssertion: Omit & { - /** - * Format: int32 - * @description Maximum response body size in bytes before the check fails - */ - maxBytes: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_size"; - }; - ResponseTimeAssertion: Omit & { - /** - * Format: int32 - * @description Maximum allowed response time in milliseconds before the check fails - */ - thresholdMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_time"; - }; - ResponseTimeWarnAssertion: Omit & { - /** - * Format: int32 - * @description HTTP response time in milliseconds that triggers a warning only - */ - warnMs: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "response_time_warn"; - }; - /** @description Dashboard summary: current status, per-region latest results, and chart data */ - ResultSummaryDto: { - /** - * @description Derived current status across all regions - * @enum {string} - */ - currentStatus: "up" | "degraded" | "down" | "unknown"; - /** @description Latest check result per region */ - latestPerRegion: components["schemas"]["RegionStatusDto"][]; - /** @description Time-bucketed chart data for the requested window */ - chartData: components["schemas"]["ChartBucketDto"][]; - /** - * Format: double - * @description Uptime percentage over the last 24 hours; null when no data - * @example 99.95 - */ - uptime24h?: number | null; - /** - * Format: double - * @description Uptime percentage for the selected chart window; null when no data - * @example 99.8 - */ - uptimeWindow?: number | null; - }; - /** @description Default retry strategy for member monitors; null clears */ - RetryStrategy: { - /** @description Retry strategy kind, e.g. fixed interval between attempts */ - type: string; - /** - * Format: int32 - * @description Maximum number of retries after a failed check - */ - maxRetries?: number; - /** - * Format: int32 - * @description Delay between retry attempts in seconds - */ - interval?: number; - }; - /** @description A scheduled maintenance window from a vendor status page */ - ScheduledMaintenanceDto: { - /** - * Format: uuid - * @description Unique maintenance record identifier - */ - id: string; - /** @description Vendor-assigned maintenance identifier */ - externalId: string; - /** @description Maintenance title as reported by the vendor */ - title: string; - /** @description Current maintenance status (scheduled, in_progress, completed) */ - status: string; - /** @description Reported impact level */ - impact?: string | null; - /** @description Vendor-provided short URL to the maintenance page */ - shortlink?: string | null; - /** - * Format: date-time - * @description Timestamp when the maintenance is scheduled to begin - */ - scheduledFor?: string | null; - /** - * Format: date-time - * @description Timestamp when the maintenance is scheduled to end - */ - scheduledUntil?: string | null; - /** - * Format: date-time - * @description Timestamp when the maintenance actually started - */ - startedAt?: string | null; - /** - * Format: date-time - * @description Timestamp when the maintenance was completed - */ - completedAt?: string | null; - /** @description Components affected by this maintenance */ - affectedComponents: components["schemas"]["MaintenanceComponentRef"][]; - /** @description Status updates posted during the maintenance lifecycle */ - updates: components["schemas"]["MaintenanceUpdateDto"][]; - }; - /** @description Secret with change-detection hash; plaintext value is never returned */ - SecretDto: { - /** - * Format: uuid - * @description Unique secret identifier - */ - id: string; - /** @description Secret key name, unique within the workspace */ - key: string; - /** - * Format: int32 - * @description DEK version at the time of last encryption - */ - dekVersion?: number; - /** @description SHA-256 hex digest of the current plaintext; use for change detection */ - valueHash: string; - /** - * Format: date-time - * @description Timestamp when the secret was created - */ - createdAt: string; - /** - * Format: date-time - * @description Timestamp when the secret was last updated - */ - updatedAt: string; - /** @description Monitors that reference this secret; null on create/update responses */ - usedByMonitors?: components["schemas"]["MonitorReference"][] | null; - }; - /** @description Admin-editable SEO metadata for pSEO pages */ - SeoMetadataDto: { - /** @description Short description for meta tags (max 160 chars) */ - shortDescription?: string | null; - /** @description Full description for the service page */ - description?: string | null; - /** @description Long-form about text for the About section on pSEO pages */ - about?: string | null; - }; - /** @description Related services */ - ServiceCatalogDto: { - /** Format: uuid */ - id: string; - slug: string; - name: string; - category?: string | null; - officialStatusUrl?: string | null; - developerContext?: string | null; - logoUrl?: string | null; - adapterType: string; - /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; - published?: boolean; - overallStatus?: string | null; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - /** Format: int64 */ - componentCount?: number; - /** Format: int64 */ - activeIncidentCount?: number; - dataCompleteness: string; - /** - * Format: double - * @description Aggregated 30-day uptime percentage across all components - */ - uptime30d?: number | null; - }; - /** @description A first-class service component with lifecycle and uptime data */ - ServiceComponentDto: { - /** Format: uuid */ - id: string; - externalId: string; - name: string; - status: string; - description?: string | null; - /** Format: uuid */ - groupId?: string | null; - /** Format: int32 */ - position?: number | null; - showcase?: boolean; - onlyShowIfDegraded?: boolean; - /** Format: date-time */ - startDate?: string | null; - /** Format: date-time */ - vendorCreatedAt?: string | null; - lifecycleStatus: string; - /** - * @description Data classification: full, status_only, or metric_only - * @example full - */ - dataType: string; - /** @description Whether uptime data is available for this component */ - hasUptime?: boolean; - /** @description Geographic region for regional components (AWS, GCP, Azure) */ - region?: string | null; - /** @description Display name of the parent group */ - groupName?: string | null; - /** @description Group-only: render an aggregated uptime bar above this group's children */ - displayAggregatedUptime?: boolean; - /** - * Format: int32 - * @description Group-only count of visible leaf children; null for leaves - */ - childCount?: number | null; - uptime?: components["schemas"]["ComponentUptimeSummaryDto"] | null; - /** Format: date-time */ - statusChangedAt?: string | null; - /** Format: date-time */ - firstSeenAt: string; - /** Format: date-time */ - lastSeenAt: string; - isGroup?: boolean; - }; - /** @description One-day rollup for a public service status page: aggregated uptime, per-component impact, and incidents that overlapped the day. Powers the click/hover-to-expand panel under each uptime bar. */ - ServiceDayDetailDto: { - /** - * Format: date - * @description UTC calendar day this rollup covers - */ - date: string; - /** - * Format: double - * @description Average uptime % across leaf components with uptime data; null if no data - */ - overallUptimePercentage?: number | null; - /** - * Format: int64 - * @description Sum of partial outage seconds across all leaf components - */ - totalPartialOutageSeconds?: number; - /** - * Format: int64 - * @description Sum of major outage seconds across all leaf components - */ - totalMajorOutageSeconds?: number; - /** @description Per-component impact rows for the day (only components with uptime data) */ - components: components["schemas"]["ComponentImpact"][]; - /** @description Incidents that were active at any point during this day (started before day end, resolved after day start) */ - incidents: components["schemas"]["DayIncident"][]; - }; - ServiceDetailDto: { - /** Format: uuid */ - id: string; - slug: string; - name: string; - category?: string | null; - officialStatusUrl?: string | null; - developerContext?: string | null; - logoUrl?: string | null; - adapterType: string; - /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - currentStatus?: components["schemas"]["ServiceStatusDto"] | null; - recentIncidents: components["schemas"]["ServiceIncidentDto"][]; - components: components["schemas"]["ServiceComponentDto"][]; - uptime?: components["schemas"]["ComponentUptimeSummaryDto"] | null; - activeMaintenances: components["schemas"]["ScheduledMaintenanceDto"][]; - dataCompleteness: string; - seoMetadata?: components["schemas"]["SeoMetadataDto"] | null; - relatedServices?: components["schemas"]["ServiceCatalogDto"][] | null; - }; - ServiceIncidentDetailDto: { - /** Format: uuid */ - id: string; - title: string; - status: string; - impact?: string | null; - /** Format: date-time */ - startedAt?: string | null; - /** Format: date-time */ - resolvedAt?: string | null; - /** Format: date-time */ - detectedAt?: string | null; - shortlink?: string | null; - affectedComponents?: string[] | null; - updates: components["schemas"]["ServiceIncidentUpdateDto"][]; - }; - ServiceIncidentDto: { - /** Format: uuid */ - id: string; - /** Format: uuid */ - serviceId: string; - serviceSlug?: string | null; - serviceName?: string | null; - externalId?: string | null; - title: string; - status: string; - impact?: string | null; - /** Format: date-time */ - startedAt?: string | null; - /** Format: date-time */ - resolvedAt?: string | null; - /** Format: date-time */ - updatedAt?: string | null; - shortlink?: string | null; - /** Format: date-time */ - detectedAt?: string | null; - /** Format: date-time */ - vendorCreatedAt?: string | null; - }; - ServiceIncidentUpdateDto: { - status: string; - body?: string | null; - /** Format: date-time */ - displayAt?: string | null; - }; - ServiceLiveStatusDto: { - /** @description Current overall status of the service, e.g. operational, degraded_performance */ - overallStatus?: string | null; - /** @description Current status of each active component */ - componentStatuses: components["schemas"]["ComponentStatusDto"][]; - /** - * Format: int32 - * @description Number of currently unresolved incidents - */ - activeIncidentCount?: number; - /** @description ISO 8601 timestamp of the last status poll */ - lastPolledAt?: string | null; - }; - /** @description A single poll result from the status poller */ - ServicePollResultDto: { - /** - * Format: uuid - * @description Service ID - */ - serviceId: string; - /** - * Format: date-time - * @description Timestamp when the poll was executed (ISO 8601) - */ - timestamp: string; - /** - * @description Overall status of the service at time of poll - * @example operational - */ - overallStatus?: string | null; - /** - * Format: int32 - * @description Response time of the poll in milliseconds - * @example 245 - */ - responseTimeMs?: number | null; - /** - * Format: int32 - * @description HTTP status code from the upstream status page - * @example 200 - */ - httpStatusCode?: number | null; - /** - * @description Whether the poll succeeded - * @example true - */ - passed?: boolean; - /** @description Reason for failure when passed=false */ - failureReason?: string | null; - /** - * Format: int32 - * @description Number of components reported by the service - * @example 12 - */ - componentCount?: number; - /** - * Format: int32 - * @description Number of degraded or non-operational components - * @example 1 - */ - degradedCount?: number; - }; - /** @description Aggregated poll metrics and chart data for a service */ - ServicePollSummaryDto: { - /** - * Format: double - * @description Uptime percentage over the requested window; null when no data - * @example 99.95 - */ - uptimePercentage?: number | null; - /** - * Format: int64 - * @description Total number of polls executed - * @example 4320 - */ - totalPolls?: number; - /** - * Format: int64 - * @description Number of polls that succeeded - * @example 4318 - */ - passedPolls?: number; - /** - * Format: double - * @description Average response time in milliseconds; null when no data - * @example 312.5 - */ - avgResponseTimeMs?: number | null; - /** - * Format: double - * @description 95th-percentile response time in milliseconds; null when no data - * @example 580 - */ - p95ResponseTimeMs?: number | null; - /** - * @description Time window used for the summary - * @example 30d - */ - window: string; - /** @description Time-bucketed chart data for response time and uptime */ - chartData: components["schemas"]["PollChartBucketDto"][]; - }; - ServiceStatusDto: { - overallStatus: string; - /** Format: date-time */ - lastPolledAt?: string | null; - }; - /** @description Optional body for subscribing to a specific component of a service */ - ServiceSubscribeRequest: { - /** - * Format: uuid - * @description ID of the component to subscribe to. Omit or null for whole-service subscription. - */ - componentId?: string | null; - /** @description Alert sensitivity level. Defaults to INCIDENTS_ONLY when not provided. */ - alertSensitivity?: string | null; - }; - /** @description An org-level service subscription with current status information */ - ServiceSubscriptionDto: { - /** - * Format: uuid - * @description Unique subscription identifier - */ - subscriptionId: string; - /** - * Format: uuid - * @description Service identifier - */ - serviceId: string; - slug: string; - name: string; - category?: string | null; - officialStatusUrl?: string | null; - adapterType: string; - /** Format: int32 */ - pollingIntervalSeconds?: number; - enabled?: boolean; - /** @description Logo URL from the service catalog */ - logoUrl?: string | null; - /** @description Current overall status; null when the service has never been polled */ - overallStatus?: string | null; - /** - * Format: uuid - * @description Subscribed component id; null for whole-service subscription - */ - componentId?: string | null; - component?: components["schemas"]["ServiceComponentDto"] | null; - /** - * @description Alert sensitivity: ALL (synthetic + real incidents), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (real + DOWN severity) - * @enum {string} - */ - alertSensitivity: "ALL" | "INCIDENTS_ONLY" | "MAJOR_ONLY"; - /** - * Format: date-time - * @description When the organization subscribed to this service - */ - subscribedAt: string; - }; - /** @description Uptime response with per-bucket breakdown and overall percentage for the period */ - ServiceUptimeResponse: { - /** - * Format: double - * @description Overall uptime percentage across the entire period; null when no polling data exists - * @example 99.95 - */ - overallUptimePct?: number | null; - /** - * @description Requested period - * @example 7d - */ - period: string; - /** - * @description Requested granularity - * @example hourly - */ - granularity: string; - /** @description Per-bucket breakdown ordered by time ascending */ - buckets: components["schemas"]["UptimeBucketDto"][]; - /** - * @description Data source: vendor_reported, incident_derived, or poll_derived - * @example vendor_reported - */ - source?: string | null; - }; - /** @description Replace the alert channels linked to a monitor */ - SetAlertChannelsRequest: { - /** @description IDs of alert channels to link (replaces current list) */ - channelIds: string[]; - }; - SetMonitorAuthRequest: { - config: components["schemas"]["ApiKeyAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["BearerAuthConfig"] | components["schemas"]["HeaderAuthConfig"]; - }; - SingleValueResponseAlertChannelDto: { - data: components["schemas"]["AlertChannelDto"]; - }; - SingleValueResponseAlertDeliveryDto: { - data: components["schemas"]["AlertDeliveryDto"]; - }; - SingleValueResponseApiKeyCreateResponse: { - data: components["schemas"]["ApiKeyCreateResponse"]; - }; - SingleValueResponseApiKeyDto: { - data: components["schemas"]["ApiKeyDto"]; - }; - SingleValueResponseAuthMeResponse: { - data: components["schemas"]["AuthMeResponse"]; - }; - SingleValueResponseBulkMonitorActionResult: { - data: components["schemas"]["BulkMonitorActionResult"]; - }; - SingleValueResponseDashboardOverviewDto: { - data: components["schemas"]["DashboardOverviewDto"]; - }; - SingleValueResponseDekRotationResultDto: { - data: components["schemas"]["DekRotationResultDto"]; - }; - SingleValueResponseDeployLockDto: { - data: components["schemas"]["DeployLockDto"]; - }; - SingleValueResponseEnvironmentDto: { - data: components["schemas"]["EnvironmentDto"]; - }; - SingleValueResponseGlobalStatusSummaryDto: { - data: components["schemas"]["GlobalStatusSummaryDto"]; - }; - SingleValueResponseIncidentDetailDto: { - data: components["schemas"]["IncidentDetailDto"]; - }; - SingleValueResponseIncidentPolicyDto: { - data: components["schemas"]["IncidentPolicyDto"]; - }; - SingleValueResponseInviteDto: { - data: components["schemas"]["InviteDto"]; - }; - SingleValueResponseListUUID: { - data: string[]; - }; - SingleValueResponseLong: { - /** Format: int64 */ - data: number; - }; - SingleValueResponseMaintenanceWindowDto: { - data: components["schemas"]["MaintenanceWindowDto"]; - }; - SingleValueResponseMapStringListComponentUptimeDayDto: { - data: { - [key: string]: components["schemas"]["ComponentUptimeDayDto"][]; - }; - }; - SingleValueResponseMonitorAssertionDto: { - data: components["schemas"]["MonitorAssertionDto"]; - }; - SingleValueResponseMonitorAuthDto: { - data: components["schemas"]["MonitorAuthDto"]; - }; - SingleValueResponseMonitorDto: { - data: components["schemas"]["MonitorDto"]; - }; - SingleValueResponseMonitorTestResultDto: { - data: components["schemas"]["MonitorTestResultDto"]; - }; - SingleValueResponseMonitorVersionDto: { - data: components["schemas"]["MonitorVersionDto"]; - }; - SingleValueResponseNotificationDispatchDto: { - data: components["schemas"]["NotificationDispatchDto"]; - }; - SingleValueResponseNotificationPolicyDto: { - data: components["schemas"]["NotificationPolicyDto"]; - }; - SingleValueResponseOrganizationDto: { - data: components["schemas"]["OrganizationDto"]; - }; - SingleValueResponseResourceGroupDto: { - data: components["schemas"]["ResourceGroupDto"]; - }; - SingleValueResponseResourceGroupHealthDto: { - data: components["schemas"]["ResourceGroupHealthDto"]; - }; - SingleValueResponseResourceGroupMemberDto: { - data: components["schemas"]["ResourceGroupMemberDto"]; - }; - SingleValueResponseResultSummaryDto: { - data: components["schemas"]["ResultSummaryDto"]; - }; - SingleValueResponseSecretDto: { - data: components["schemas"]["SecretDto"]; - }; - SingleValueResponseServiceDayDetailDto: { - data: components["schemas"]["ServiceDayDetailDto"]; - }; - SingleValueResponseServiceDetailDto: { - data: components["schemas"]["ServiceDetailDto"]; - }; - SingleValueResponseServiceIncidentDetailDto: { - data: components["schemas"]["ServiceIncidentDetailDto"]; - }; - SingleValueResponseServiceLiveStatusDto: { - data: components["schemas"]["ServiceLiveStatusDto"]; - }; - SingleValueResponseServicePollSummaryDto: { - data: components["schemas"]["ServicePollSummaryDto"]; - }; - SingleValueResponseServiceSubscriptionDto: { - data: components["schemas"]["ServiceSubscriptionDto"]; - }; - SingleValueResponseServiceUptimeResponse: { - data: components["schemas"]["ServiceUptimeResponse"]; - }; - SingleValueResponseStatusPageComponentDto: { - data: components["schemas"]["StatusPageComponentDto"]; - }; - SingleValueResponseStatusPageComponentGroupDto: { - data: components["schemas"]["StatusPageComponentGroupDto"]; - }; - SingleValueResponseStatusPageCustomDomainDto: { - data: components["schemas"]["StatusPageCustomDomainDto"]; - }; - SingleValueResponseStatusPageDto: { - data: components["schemas"]["StatusPageDto"]; - }; - SingleValueResponseStatusPageIncidentDto: { - data: components["schemas"]["StatusPageIncidentDto"]; - }; - SingleValueResponseStatusPageSubscriberDto: { - data: components["schemas"]["StatusPageSubscriberDto"]; - }; - SingleValueResponseString: { - data: string; - }; - SingleValueResponseTagDto: { - data: components["schemas"]["TagDto"]; - }; - SingleValueResponseTestChannelResult: { - data: components["schemas"]["TestChannelResult"]; - }; - SingleValueResponseTestMatchResult: { - data: components["schemas"]["TestMatchResult"]; - }; - SingleValueResponseUptimeDto: { - data: components["schemas"]["UptimeDto"]; - }; - SingleValueResponseWebhookEndpointDto: { - data: components["schemas"]["WebhookEndpointDto"]; - }; - SingleValueResponseWebhookSigningSecretDto: { - data: components["schemas"]["WebhookSigningSecretDto"]; - }; - SingleValueResponseWebhookTestResult: { - data: components["schemas"]["WebhookTestResult"]; - }; - SingleValueResponseWorkspaceDto: { - data: components["schemas"]["WorkspaceDto"]; - }; - SlackChannelConfig: Omit & { - /** @description Slack incoming webhook URL */ - webhookUrl: string; - /** @description Optional mention text included in notifications, e.g. @channel */ - mentionText?: string | null; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - channelType: "slack"; - }; - SslExpiryAssertion: Omit & { - /** - * Format: int32 - * @description Minimum days before TLS certificate expiry; fails or warns below this threshold - */ - minDaysRemaining: number; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "ssl_expiry"; - }; - StatusCodeAssertion: Omit & { - /** @description Expected status code, range pattern, or wildcard such as 2xx */ - expected: string; - /** - * @description Comparison operator (equals, contains, less_than, greater_than, etc.) - * @enum {string} - */ - operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; - } & { - /** - * @description discriminator enum property added by openapi-typescript - * @enum {string} - */ - type: "status_code"; - }; - /** @description Updated branding configuration; null preserves current */ - StatusPageBranding: { - /** @description URL for the logo image displayed in the header */ - logoUrl?: string | null; - /** @description URL for the browser tab favicon */ - faviconUrl?: string | null; - /** @description Primary brand color as hex, e.g. #4F46E5; drives accent/links/buttons */ - brandColor?: string | null; - /** @description Page body background color as hex, e.g. #FAFAFA */ - pageBackground?: string | null; - /** @description Card/surface background color as hex, e.g. #FFFFFF */ - cardBackground?: string | null; - /** @description Primary text color as hex, e.g. #09090B */ - textColor?: string | null; - /** @description Card border color as hex, e.g. #E4E4E7 */ - borderColor?: string | null; - /** @description Header layout style (reserved for future use) */ - headerStyle?: string | null; - /** @description Color theme: light or dark (default: light) */ - theme?: string | null; - /** @description URL where visitors can report a problem */ - reportUrl?: string | null; - /** - * @description Whether to hide the 'Powered by DevHelm' footer badge (default: false) - * @default false - */ - hidePoweredBy: boolean; - /** @description Custom CSS injected via