From ab3c0ed3356d68be0121a3b7162890121b59f208 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 7 Aug 2026 14:06:28 +0000 Subject: [PATCH] chore: update generated API types from latest spec --- docs/openapi/monitoring-api.json | 5328 ++++++++++++++++++++++-------- src/devhelm/_generated.py | 1538 ++++++++- 2 files changed, 5315 insertions(+), 1551 deletions(-) diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index a9b7d44..d05a0f8 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -196,7 +196,9 @@ "zapier", "datadog", "jira", - "gitlab" + "gitlab", + "sms", + "phone_call" ] } }, @@ -891,13 +893,13 @@ } } }, - "/api/v1/alert-channels/{id}/test": { - "post": { + "/api/v1/alert-channels/{id}/enabled": { + "patch": { "tags": [ "Alert Channels" ], - "summary": "Test a saved alert channel's connectivity", - "operationId": "test_2", + "summary": "Enable or disable an alert channel without re-uploading config", + "operationId": "setEnabled", "parameters": [ { "name": "id", @@ -909,112 +911,11 @@ } } ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed 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/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" + "$ref": "#/components/schemas/SetEnabledRequest" } } }, @@ -1026,7 +927,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" } } } @@ -1114,14 +1015,13 @@ } } }, - "/api/v1/alert-deliveries/{id}/attempts": { - "get": { + "/api/v1/alert-channels/{id}/test": { + "post": { "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": "Test a saved alert channel's connectivity", + "operationId": "test_2", "parameters": [ { "name": "id", @@ -1139,7 +1039,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1227,32 +1127,30 @@ } } }, - "/api/v1/alert-deliveries/{id}/retry": { + "/api/v1/alert-channels/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", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Test alert channel connectivity using raw config (no saved channel required)", + "operationId": "testConfig", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestAlertChannelRequest" + } } - } - ], + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseTestChannelResult" } } } @@ -1340,20 +1238,32 @@ } } }, - "/api/v1/api-keys": { + "/api/v1/alert-deliveries/{id}/attempts": { "get": { "tags": [ - "API Keys" + "Alert Deliveries" + ], + "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": "string", + "format": "uuid" + } + } ], - "summary": "List API keys", - "operationId": "list_13", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultApiKeyDto" + "$ref": "#/components/schemas/TableValueResultDeliveryAttemptDto" } } } @@ -1439,30 +1349,34 @@ } } } - }, + } + }, + "/api/v1/alert-deliveries/{id}/retry": { "post": { "tags": [ - "API Keys" + "Alert Deliveries" ], - "summary": "Create API key", - "operationId": "create_14", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateApiKeyRequest" - } + "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": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" + "$ref": "#/components/schemas/SingleValueResponseAlertDeliveryDto" } } } @@ -1550,27 +1464,23 @@ } } }, - "/api/v1/api-keys/{id}": { - "delete": { + "/api/v1/api-keys": { + "get": { "tags": [ "API Keys" ], - "summary": "Delete API key", - "operationId": "delete_11", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "summary": "List API keys", + "operationId": "list_13", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultApiKeyDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -1654,40 +1564,29 @@ } } }, - "patch": { + "post": { "tags": [ "API Keys" ], - "summary": "Update API key", - "operationId": "update_15", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "summary": "Create API key", + "operationId": "create_14", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateApiKeyRequest" + "$ref": "#/components/schemas/CreateApiKeyRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -1775,13 +1674,13 @@ } } }, - "/api/v1/api-keys/{id}/regenerate": { - "post": { + "/api/v1/api-keys/{id}": { + "delete": { "tags": [ "API Keys" ], - "summary": "Regenerate API key", - "operationId": "regenerate", + "summary": "Delete API key", + "operationId": "delete_11", "parameters": [ { "name": "id", @@ -1794,15 +1693,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -1885,15 +1777,13 @@ } } } - } - }, - "/api/v1/api-keys/{id}/revoke": { - "post": { + }, + "patch": { "tags": [ "API Keys" ], - "summary": "Revoke API key", - "operationId": "revoke_1", + "summary": "Update API key", + "operationId": "update_16", "parameters": [ { "name": "id", @@ -1905,6 +1795,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateApiKeyRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -1999,76 +1899,22 @@ } } }, - "/api/v1/audit-log": { - "get": { + "/api/v1/api-keys/{id}/regenerate": { + "post": { "tags": [ - "Audit Log" + "API Keys" ], - "summary": "List audit events for the current organization", - "operationId": "list_19", + "summary": "Regenerate API key", + "operationId": "regenerate", "parameters": [ { - "name": "action", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "actorId", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "integer", "format": "int32" } - }, - { - "name": "resourceType", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } } ], "responses": { @@ -2077,7 +1923,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultAuditEventDto" + "$ref": "#/components/schemas/SingleValueResponseApiKeyCreateResponse" } } } @@ -2165,21 +2011,31 @@ } } }, - "/api/v1/auth/me": { - "get": { + "/api/v1/api-keys/{id}/revoke": { + "post": { "tags": [ - "API Auth" + "API Keys" + ], + "summary": "Revoke API key", + "operationId": "revoke_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } ], - "summary": "Get current API key identity", - "description": "Returns the authenticated API key's metadata, organization, billing plan, entitlements with usage, and current rate-limit quota. Only available for API key authentication (Bearer dh_live_...).", - "operationId": "me_1", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2267,22 +2123,75 @@ } } }, - "/api/v1/categories": { + "/api/v1/audit-log": { "get": { "tags": [ - "Status Data" + "Audit Log" ], - "summary": "List categories with service counts", - "operationId": "listCategories", + "summary": "List audit events for the current organization", + "operationId": "list_20", "parameters": [ { - "name": "publishedOnly", + "name": "action", "in": "query", - "description": "Count only published services (curated public pSEO set); default false", "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string" + } + }, + { + "name": "actorId", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "resourceType", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -2292,7 +2201,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultCategoryDto" + "$ref": "#/components/schemas/TableValueResultAuditEventDto" } } } @@ -2380,21 +2289,21 @@ } } }, - "/api/v1/dashboard/overview": { + "/api/v1/auth/me": { "get": { "tags": [ - "Dashboard" + "API Auth" ], - "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", + "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/SingleValueResponseDashboardOverviewDto" + "$ref": "#/components/schemas/SingleValueResponseAuthMeResponse" } } } @@ -2482,21 +2391,32 @@ } } }, - "/api/v1/deploy/lock": { + "/api/v1/categories": { "get": { "tags": [ - "Deploy Lock" + "Status Data" + ], + "summary": "List categories with service counts", + "operationId": "listCategories", + "parameters": [ + { + "name": "publishedOnly", + "in": "query", + "description": "Count only published services (curated public pSEO set); default false", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } ], - "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" + "$ref": "#/components/schemas/TableValueResultCategoryDto" } } } @@ -2582,31 +2502,235 @@ } } } - }, - "post": { + } + }, + "/api/v1/dashboard/overview": { + "get": { "tags": [ - "Deploy Lock" + "Dashboard" ], - "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 - }, + "summary": "Dashboard overview", + "description": "Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.", + "operationId": "overview", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDeployLockDto" + "$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" } } } @@ -4545,7 +4669,7 @@ "Incidents" ], "summary": "Get incident details including update timeline", - "operationId": "get_11", + "operationId": "get_9", "parameters": [ { "name": "id", @@ -4649,15 +4773,13 @@ } } } - } - }, - "/api/v1/incidents/{id}/resolve": { - "post": { + }, + "patch": { "tags": [ "Incidents" ], - "summary": "Resolve an incident", - "operationId": "resolve", + "summary": "Update incident title and/or severity", + "operationId": "update_15", "parameters": [ { "name": "id", @@ -4673,10 +4795,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" + "$ref": "#/components/schemas/UpdateIncidentRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -4772,13 +4895,13 @@ } } }, - "/api/v1/incidents/{id}/updates": { + "/api/v1/incidents/{id}/resolve": { "post": { "tags": [ "Incidents" ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", + "summary": "Resolve an incident", + "operationId": "resolve", "parameters": [ { "name": "id", @@ -4794,15 +4917,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" + "$ref": "#/components/schemas/ResolveIncidentRequest" } } - }, - "required": true + } }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { @@ -4894,21 +5016,41 @@ } } }, - "/api/v1/integrations": { - "get": { + "/api/v1/incidents/{id}/updates": { + "post": { "tags": [ - "Integrations" + "Incidents" ], - "summary": "List all supported integration types", - "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", - "operationId": "list_18", + "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": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -4996,20 +5138,21 @@ } } }, - "/api/v1/invites": { + "/api/v1/integrations": { "get": { "tags": [ - "Invites" + "Integrations" ], - "summary": "List invites", - "operationId": "list_10", + "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_19", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInviteDto" + "$ref": "#/components/schemas/TableValueResultIntegrationDto" } } } @@ -5095,30 +5238,23 @@ } } } - }, - "post": { + } + }, + "/api/v1/integrations/voice-languages": { + "get": { "tags": [ - "Invites" + "Integrations" ], - "summary": "Create invite", - "operationId": "create_11", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" - } - } - }, - "required": true - }, + "summary": "List supported voice languages for phone call alerts", + "description": "Returns BCP-47 locale codes and human-readable labels for all TTS languages supported by the phone call alert channel.", + "operationId": "listVoiceLanguages", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" } } } @@ -5206,31 +5342,20 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { - "post": { + "/api/v1/invites": { + "get": { "tags": [ "Invites" ], - "summary": "Resend invite", - "operationId": "resend_1", - "parameters": [ - { - "name": "inviteId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } - } - ], + "summary": "List invites", + "operationId": "list_10", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/TableValueResultInviteDto" } } } @@ -5316,149 +5441,30 @@ } } } - } - }, - "/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" - } + "summary": "Create invite", + "operationId": "create_11", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateInviteRequest" } } - } - } - } - }, - "/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" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -5544,31 +5550,33 @@ } } } - }, + } + }, + "/api/v1/invites/{inviteId}/resend": { "post": { "tags": [ - "Maintenance Windows" + "Invites" ], - "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": "Resend invite", + "operationId": "resend_1", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -5656,34 +5664,27 @@ } } }, - "/api/v1/maintenance-windows/{id}": { - "get": { + "/api/v1/invites/{inviteId}/revoke": { + "post": { "tags": [ - "Maintenance Windows" + "Invites" ], - "summary": "Get a single maintenance window by ID", - "operationId": "getById_2", + "summary": "Revoke invite", + "operationId": "revoke", "parameters": [ { - "name": "id", + "name": "inviteId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -5766,41 +5767,44 @@ } } } - }, - "put": { + } + }, + "/api/v1/maintenance-windows": { + "get": { "tags": [ "Maintenance Windows" ], - "summary": "Update a maintenance window", - "operationId": "update_12", + "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": "id", - "in": "path", - "required": true, + "name": "monitorId", + "in": "query", + "description": "Filter by monitor UUID", + "required": false, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" } } } @@ -5887,26 +5891,33 @@ } } }, - "delete": { + "post": { "tags": [ "Maintenance Windows" ], - "summary": "Delete a maintenance window", - "operationId": "delete_8", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "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": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -5991,20 +6002,21 @@ } } }, - "/api/v1/members": { + "/api/v1/maintenance-windows/{id}": { "get": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "List organization members", - "operationId": "list_17", + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], @@ -6014,7 +6026,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMemberDto" + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" } } } @@ -6100,29 +6112,44 @@ } } } - } - }, - "/api/v1/members/{userId}": { - "delete": { + }, + "put": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "Remove member from organization", - "operationId": "remove_2", + "summary": "Update a maintenance window", + "operationId": "update_12", "parameters": [ { - "name": "userId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -6205,36 +6232,24 @@ } } } - } - }, - "/api/v1/members/{userId}/role": { - "put": { + }, + "delete": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "Change member role", - "operationId": "changeRole", + "summary": "Delete a maintenance window", + "operationId": "delete_8", "parameters": [ { - "name": "userId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeRoleRequest" - } - } - }, - "required": true - }, "responses": { "204": { "description": "No Content" @@ -6322,38 +6337,34 @@ } } }, - "/api/v1/members/{userId}/status": { - "put": { + "/api/v1/members": { + "get": { "tags": [ "Members" ], - "summary": "Change member status", - "operationId": "changeStatus", + "summary": "List organization members", + "operationId": "list_18", "parameters": [ { - "name": "userId", - "in": "path", + "name": "pageable", + "in": "query", "required": true, "schema": { - "type": "integer", - "format": "int32" + "$ref": "#/components/schemas/Pageable" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMemberDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -6437,122 +6448,459 @@ } } }, - "/api/v1/monitors": { - "get": { + "/api/v1/members/{userId}": { + "delete": { "tags": [ - "Monitors" + "Members" ], - "summary": "List monitors for the authenticated org", - "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", - "operationId": "list_8", + "summary": "Remove member from organization", + "operationId": "remove_2", "parameters": [ { - "name": "enabled", - "in": "query", - "description": "Filter by enabled state (true/false)", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "status", - "in": "query", - "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "Filter by monitor type", - "required": false, - "schema": { - "type": "string", - "enum": [ - "HTTP", - "DNS", - "MCP_SERVER", - "TCP", - "ICMP", - "HEARTBEAT" - ] - } - }, - { - "name": "managedBy", - "in": "query", - "description": "Filter by managed-by source", - "required": false, - "schema": { - "type": "string", - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] - } - }, - { - "name": "tags", - "in": "query", - "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "tag", - "in": "query", - "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", - "in": "query", - "description": "Filter by environment ID", - "required": false, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "pageable", - "in": "query", + "name": "userId", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" - } - } - } + "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", + "description": "Supports filtering by `enabled`, `status` (alias active|paused for enabled), `type`, `managedBy`, `tag` / `tags`, `search`, and `environmentId`. Unrecognised query parameters are silently ignored (Spring's default binding behaviour) — pin to the documented set above.", + "operationId": "list_8", + "parameters": [ + { + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "managedBy", + "in": "query", + "description": "Filter by managed-by source", + "required": false, + "schema": { + "type": "string", + "enum": [ + "DASHBOARD", + "CLI", + "TERRAFORM", + "MCP", + "API" + ] + } + }, + { + "name": "tags", + "in": "query", + "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "tag", + "in": "query", + "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive name search", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "in": "query", + "description": "Filter by environment ID", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "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", @@ -6976,13 +7324,231 @@ } } } - }, - "delete": { + }, + "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": [ - "Monitors" + "Check Results" ], - "summary": "Soft-delete a monitor", - "operationId": "delete_7", + "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", @@ -6992,18 +7558,84 @@ "type": "string", "format": "uuid" } + }, + { + "name": "from", + "in": "query", + "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1–200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "Paginated check results", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageCheckResultDto" + } + } + } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid query parameters", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } @@ -7019,21 +7651,21 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Monitor does not belong to the caller's org", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/CursorPageCheckResultDto" } } } @@ -7081,13 +7713,14 @@ } } }, - "/api/v1/monitors/{id}/pause": { - "post": { + "/api/v1/monitors/{id}/results/summary": { + "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Pause a monitor (set enabled=false)", - "operationId": "pause", + "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", @@ -7097,25 +7730,40 @@ "type": "string", "format": "uuid" } + }, + { + "name": "chartWindow", + "in": "query", + "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } } ], "responses": { "200": { - "description": "OK", + "description": "Results summary", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/ResultSummaryDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -7131,21 +7779,21 @@ } }, "403": { - "description": "Forbidden — the actor lacks permission for this resource", + "description": "Monitor does not belong to the caller's org", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -7193,14 +7841,13 @@ } } }, - "/api/v1/monitors/{id}/results": { - "get": { + "/api/v1/monitors/{id}/resume": { + "post": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "List raw check results", - "description": "Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.", - "operationId": "getResults", + "summary": "Resume a monitor (set enabled=true)", + "operationId": "resume", "parameters": [ { "name": "id", @@ -7210,84 +7857,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "from", - "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response for pagination", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Maximum results per page (1–200)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 - }, - { - "name": "region", - "in": "query", - "description": "Filter by region (e.g. us-east)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "passed", - "in": "query", - "description": "Filter by pass/fail status", - "required": false, - "schema": { - "type": "boolean" - } } ], "responses": { "200": { - "description": "Paginated check results", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid query parameters", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/CursorPageCheckResultDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -7303,21 +7891,21 @@ } }, "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" } } } @@ -7365,14 +7953,14 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { - "get": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", + "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", @@ -7382,40 +7970,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "chartWindow", - "in": "query", - "description": "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } } ], "responses": { "200": { - "description": "Results summary", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/ResultSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } }, "400": { - "description": "Invalid chartWindow parameter", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -7431,21 +8004,21 @@ } }, "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" } } } @@ -7493,13 +8066,14 @@ } } }, - "/api/v1/monitors/{id}/resume": { - "post": { + "/api/v1/monitors/{id}/status-pages": { + "get": { "tags": [ "Monitors" ], - "summary": "Resume a monitor (set enabled=true)", - "operationId": "resume", + "summary": "List status pages that contain this monitor as a component", + "description": "Returns all status pages where this monitor appears as a component, enabling the detail page to show 'Appears On' cross-links.", + "operationId": "listStatusPagesForMonitor", "parameters": [ { "name": "id", @@ -7517,7 +8091,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -7605,14 +8179,13 @@ } } }, - "/api/v1/monitors/{id}/rotate-token": { - "post": { + "/api/v1/monitors/{id}/tags": { + "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", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { "name": "id", @@ -7630,7 +8203,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -7716,15 +8289,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/tags": { - "get": { + }, + "post": { "tags": [ "Monitors" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { "name": "id", @@ -7736,6 +8307,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddMonitorTagsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -7829,12 +8410,12 @@ } } }, - "post": { + "delete": { "tags": [ "Monitors" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { "name": "id", @@ -7850,22 +8431,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -7948,13 +8522,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/test": { + "post": { "tags": [ "Monitors" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "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. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", + "operationId": "testExisting", "parameters": [ { "name": "id", @@ -7966,20 +8543,17 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -8063,14 +8637,14 @@ } } }, - "/api/v1/monitors/{id}/test": { + "/api/v1/monitors/{id}/test-notifications": { "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", + "summary": "Send test notifications through the monitor's alert channels", + "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", + "operationId": "testNotifications", "parameters": [ { "name": "id", @@ -8082,13 +8656,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -9733,7 +10317,7 @@ "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.", + "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. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", "operationId": "testAdHoc", "requestBody": { "content": { @@ -10963,7 +11547,7 @@ "Notifications" ], "summary": "List notifications for the current user", - "operationId": "list_16", + "operationId": "list_17", "parameters": [ { "name": "unreadOnly", @@ -12942,7 +13526,7 @@ "Service Subscriptions" ], "summary": "List all service subscriptions for the organization", - "operationId": "list_15", + "operationId": "list_16", "responses": { "200": { "description": "OK", @@ -13043,7 +13627,7 @@ "Service Subscriptions" ], "summary": "Get a subscription by its ID", - "operationId": "get_10", + "operationId": "get_11", "parameters": [ { "name": "id", @@ -13532,6 +14116,15 @@ "type": "boolean" } }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, { "name": "search", "in": "query", @@ -13803,7 +14396,7 @@ "Status Data" ], "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service.", + "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", "operationId": "getComponents", "parameters": [ { @@ -13823,6 +14416,35 @@ "type": "string", "format": "uuid" } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "in": "query", + "description": "Page size (default 25, max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { @@ -14075,14 +14697,161 @@ } } }, - "/api/v1/services/{slugOrId}/components/uptime": { + "/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": "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", + "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", @@ -14093,24 +14862,130 @@ } }, { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, + "name": "date", + "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", + "required": true, "schema": { "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] + "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": "Explicit window start (ISO date); overrides ``period``", + "description": "Earliest start date (ISO 8601 date)", "required": false, "schema": { "type": "string", @@ -14118,13 +14993,24 @@ } }, { - "name": "to", + "name": "status", "in": "query", - "description": "Explicit window end (ISO date); defaults to today", + "description": "Filter: active (unresolved), resolved, or omit for all", "required": false, "schema": { "type": "string", - "format": "date" + "enum": [ + "active", + "resolved" + ] + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } } ], @@ -14134,7 +15020,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -14222,14 +15108,13 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { "get": { "tags": [ "Status Data" ], - "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", - "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", - "operationId": "getServiceDayDetail", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { "name": "slugOrId", @@ -14240,13 +15125,12 @@ } }, { - "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" } } ], @@ -14256,7 +15140,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -14344,13 +15228,14 @@ } } }, - "/api/v1/services/{slugOrId}/incidents": { + "/api/v1/services/{slugOrId}/live-status": { "get": { "tags": [ "Status Data" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "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", @@ -14359,37 +15244,6 @@ "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": { @@ -14398,7 +15252,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } @@ -14486,13 +15340,13 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "/api/v1/services/{slugOrId}/maintenances": { "get": { "tags": [ "Status Data" ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { "name": "slugOrId", @@ -14503,12 +15357,15 @@ } }, { - "name": "incidentId", - "in": "path", - "required": true, + "name": "status", + "in": "query", + "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "array", + "items": { + "type": "string" + } } } ], @@ -14518,7 +15375,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -14606,14 +15463,13 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/services/{slugOrId}/poll-results": { "get": { "tags": [ "Status Data" ], - "summary": "Lightweight live-status snapshot for polling", - "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", - "operationId": "getServiceLiveStatus", + "summary": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { "name": "slugOrId", @@ -14622,6 +15478,26 @@ "schema": { "type": "string" } + }, + { + "name": "cursor", + "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } } ], "responses": { @@ -14630,7 +15506,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/CursorPageServicePollResultDto" } } } @@ -14718,13 +15594,13 @@ } } }, - "/api/v1/services/{slugOrId}/maintenances": { + "/api/v1/services/{slugOrId}/poll-summary": { "get": { "tags": [ "Status Data" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { "name": "slugOrId", @@ -14735,15 +15611,17 @@ } }, { - "name": "status", + "name": "window", "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", + "description": "Time window", "required": false, "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "enum": [ + "24h", + "7d", + "30d" + ] } } ], @@ -14753,7 +15631,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } @@ -14841,13 +15719,14 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { + "/api/v1/services/{slugOrId}/status-events": { "get": { "tags": [ "Status Data" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { "name": "slugOrId", @@ -14858,148 +15737,66 @@ } }, { - "name": "cursor", + "name": "types", "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", + "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", "required": false, "schema": { "type": "string" } }, { - "name": "limit", + "name": "period", "in": "query", - "description": "Page size (1–100, default 50)", + "description": "Preset window", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed 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" - } - } + "type": "string", + "enum": [ + "7d", + "30d", + "90d" + ] } }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "from", + "in": "query", + "description": "Explicit lower bound (ISO 8601); overrides period", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } + { + "name": "to", + "in": "query", + "description": "Explicit upper bound (ISO 8601); default now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/services/{slugOrId}/poll-summary": { - "get": { - "tags": [ - "Status Data" - ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", - "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, "schema": { "type": "string" } }, { - "name": "window", + "name": "limit", "in": "query", - "description": "Time window", + "description": "Page size (1–100, default 50)", "required": false, "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] + "type": "integer", + "format": "int32", + "default": 50 } } ], @@ -15009,7 +15806,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/CursorPageStatusEventDto" } } } @@ -21848,6 +22645,36 @@ "type": "string", "description": "Jira project key", "nullable": true + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format (SMS / phone-call channels)", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of the org verified_phone_number row bound to this channel", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated mirror of phoneNumber as a length-1 list for older clients" + } + }, + "voiceLanguage": { + "type": "string", + "description": "BCP-47 voice language for phone-call TTS (e.g. en-US, de-DE)", + "nullable": true + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for SMS/voice (BCP-47, e.g. en-US, de-DE)", + "nullable": true } }, "description": "Non-sensitive alert channel configuration metadata" @@ -21856,6 +22683,7 @@ "required": [ "channelType", "createdAt", + "enabled", "id", "name", "updatedAt" @@ -21894,7 +22722,9 @@ "zapier", "datadog", "jira", - "gitlab" + "gitlab", + "sms", + "phone_call" ] }, "displayConfig": { @@ -21905,6 +22735,10 @@ } ] }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled and will receive alerts" + }, "createdAt": { "type": "string", "description": "Timestamp when the channel was created", @@ -21998,7 +22832,11 @@ "DELIVERED", "RETRY_PENDING", "FAILED", - "CANCELLED" + "CANCELLED", + "SKIPPED_NO_CREDIT", + "SKIPPED_UNVERIFIED", + "SKIPPED_OPTED_OUT", + "SKIPPED_RATE_LIMITED" ] }, "eventType": { @@ -22845,7 +23683,8 @@ "tcp": "#/components/schemas/Tcp", "icmp": "#/components/schemas/Icmp", "dns": "#/components/schemas/Dns", - "mcp_server": "#/components/schemas/McpServer" + "mcp_server": "#/components/schemas/McpServer", + "code": "#/components/schemas/Code" } }, "oneOf": [ @@ -22863,9 +23702,95 @@ }, { "$ref": "#/components/schemas/McpServer" + }, + { + "$ref": "#/components/schemas/Code" } ] }, + "Code": { + "type": "object", + "description": "Code check (browser / multi-step API) specific details", + "properties": { + "check_type": { + "type": "string", + "enum": [ + "code" + ] + }, + "exitCode": { + "type": "integer", + "description": "Container exit code (0 = pass)", + "format": "int32" + }, + "stdoutSnippet": { + "type": "string", + "description": "Truncated stdout from the container", + "nullable": true + }, + "stderrSnippet": { + "type": "string", + "description": "Truncated stderr from the container", + "nullable": true + }, + "steps": { + "type": "array", + "description": "Named steps extracted from Playwright test output", + "nullable": true, + "items": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CodeCheckStep" + } + ] + } + }, + "failureKind": { + "type": "string", + "description": "Failure classification: timeout, assertion, or error", + "nullable": true + }, + "timedOut": { + "type": "boolean", + "description": "Whether the run hit a step/total/run-budget timeout", + "nullable": true + } + }, + "required": [ + "check_type", + "exitCode" + ] + }, + "CodeCheckStep": { + "required": [ + "name", + "status" + ], + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Step name from test.step() or test() call" + }, + "status": { + "type": "string", + "description": "Step outcome: passed, failed, skipped, or timedOut" + }, + "durationMs": { + "type": "integer", + "description": "Step duration in milliseconds", + "format": "int32", + "nullable": true + }, + "error": { + "type": "string", + "description": "Error message if the step failed", + "nullable": true + } + }, + "description": "A single named step within a code check execution" + }, "ComponentImpact": { "required": [ "componentId", @@ -22934,6 +23859,35 @@ }, "description": "A single component position" }, + "ComponentSample": { + "required": [ + "componentId", + "newStatus" + ], + "type": "object", + "properties": { + "componentId": { + "type": "string", + "description": "Component ID", + "format": "uuid" + }, + "componentName": { + "type": "string", + "description": "Component display name", + "nullable": true + }, + "oldStatus": { + "type": "string", + "description": "Previous status before the flip", + "nullable": true + }, + "newStatus": { + "type": "string", + "description": "New status after the flip" + } + }, + "description": "One component sample inside a transition rollup" + }, "ComponentsSummaryDto": { "required": [ "groupComponentCounts", @@ -22986,6 +23940,33 @@ }, "description": "Current status of each active component" }, + "ComponentTransitionEventDto": { + "required": [ + "componentSample", + "newStatus", + "componentCount" + ], + "type": "object", + "properties": { + "newStatus": { + "type": "string", + "description": "New status that defines this rollup bucket" + }, + "componentCount": { + "type": "integer", + "description": "Total components in the 5-minute rollup bucket", + "format": "int32" + }, + "componentSample": { + "type": "array", + "description": "Up to 5 sample components from the bucket", + "items": { + "$ref": "#/components/schemas/ComponentSample" + } + } + }, + "description": "Rolled-up component status transitions for a status-events rail row" + }, "ComponentUptimeDayDto": { "required": [ "date", @@ -23143,6 +24124,9 @@ { "$ref": "#/components/schemas/PagerDutyChannelConfig" }, + { + "$ref": "#/components/schemas/PhoneCallChannelConfig" + }, { "$ref": "#/components/schemas/PushbulletChannelConfig" }, @@ -23155,6 +24139,9 @@ { "$ref": "#/components/schemas/SlackChannelConfig" }, + { + "$ref": "#/components/schemas/SmsChannelConfig" + }, { "$ref": "#/components/schemas/SplunkOnCallChannelConfig" }, @@ -23491,6 +24478,18 @@ "type": "string", "description": "Detailed description or context for the incident", "nullable": true + }, + "serviceId": { + "type": "string", + "description": "Vendor service to link; optional for Dependencies create CTA", + "format": "uuid", + "nullable": true + }, + "serviceIncidentId": { + "type": "string", + "description": "Vendor incident to link; idempotent if an active org incident already links it", + "format": "uuid", + "nullable": true } } }, @@ -23517,7 +24516,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -23537,6 +24538,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -24175,6 +25179,72 @@ }, "description": "Create a new workspace within the organization" }, + "CreditPolicy": { + "type": "object", + "properties": { + "summary": { + "type": "string", + "description": "Brief summary of credit policy", + "nullable": true + }, + "maxCreditPercent": { + "type": "integer", + "description": "Max credit as percent of monthly fee", + "format": "int32", + "nullable": true + }, + "claimWindowDays": { + "type": "integer", + "description": "Days to submit a credit claim after eligibility", + "format": "int32", + "nullable": true + }, + "creditApplicationDays": { + "type": "integer", + "description": "Days for credit to be applied after approval", + "format": "int32", + "nullable": true + }, + "tiers": { + "type": "array", + "description": "Credit tiers by uptime threshold", + "nullable": true, + "items": { + "$ref": "#/components/schemas/CreditTier" + } + } + }, + "description": "Service credit policy for SLA violations" + }, + "CreditTier": { + "required": [ + "uptimeRange" + ], + "type": "object", + "properties": { + "uptimeRange": { + "type": "string", + "description": "Uptime range, e.g. '99.1% – 99.98%'" + }, + "creditPercent": { + "type": "integer", + "description": "Credit percent of monthly fee", + "format": "int32", + "nullable": true + }, + "formula": { + "type": "string", + "description": "Credit formula when percent is not a fixed number", + "nullable": true + }, + "notes": { + "type": "string", + "description": "Additional notes on this credit tier", + "nullable": true + } + }, + "description": "Credit tiers by uptime threshold" + }, "CursorPageCheckResultDto": { "required": [ "data", @@ -24253,6 +25323,32 @@ }, "description": "Cursor-paginated response for time-series and append-only data" }, + "CursorPageStatusEventDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/StatusEventDto" + } + }, + "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" + }, "DashboardOverviewDto": { "required": [ "incidents", @@ -25842,7 +26938,8 @@ "updatedAt", "organizationId", "reopenCount", - "statusPageVisible" + "statusPageVisible", + "suppressDispatch" ], "type": "object", "properties": { @@ -25925,6 +27022,10 @@ "type": "boolean", "description": "Whether this incident is visible on the status page" }, + "suppressDispatch": { + "type": "boolean", + "description": "When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted" + }, "serviceIncidentId": { "type": "string", "description": "Linked vendor service incident ID; null for monitor incidents", @@ -25966,6 +27067,11 @@ "AUTO_RESOLVED" ] }, + "resolutionNote": { + "type": "string", + "description": "Body from the most recent resolve update; null when not currently resolved, auto-resolved without a note, or no resolve update body was provided", + "nullable": true + }, "startedAt": { "type": "string", "description": "Timestamp when the incident was detected or created", @@ -26052,10 +27158,99 @@ "type": "string", "description": "Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null.", "nullable": true + }, + "displayKey": { + "type": "string", + "description": "Org-scoped human-readable incident code, e.g. \"ABC-42\". Null on incidents created by pre-INC-keys API pods before the sweep; treat missing as unknown and fall back to the id", + "nullable": true } }, "description": "Incident triggered by a monitor check failure or manual creation" }, + "IncidentEventDto": { + "required": [ + "incidentId", + "title" + ], + "type": "object", + "properties": { + "incidentId": { + "type": "string", + "description": "Vendor catalog incident ID", + "format": "uuid" + }, + "externalId": { + "type": "string", + "description": "Vendor-supplied external incident ID", + "nullable": true + }, + "title": { + "type": "string", + "description": "Incident title from the vendor status page" + }, + "impact": { + "type": "string", + "description": "Vendor impact level (major, minor, none)", + "nullable": true + }, + "status": { + "type": "string", + "description": "Vendor lifecycle status (only set on incident.update rows)", + "nullable": true + }, + "body": { + "type": "string", + "description": "Update body text (only set on incident.update rows)", + "nullable": true + }, + "shortlink": { + "type": "string", + "description": "Short public URL for the vendor incident", + "nullable": true + }, + "startedAt": { + "type": "string", + "description": "When the vendor incident started", + "format": "date-time", + "nullable": true + }, + "resolvedAt": { + "type": "string", + "description": "When the vendor incident resolved", + "format": "date-time", + "nullable": true + }, + "detectedAt": { + "type": "string", + "description": "When DevHelm first detected the incident", + "format": "date-time", + "nullable": true + }, + "vendorCreatedAt": { + "type": "string", + "description": "Vendor-reported creation timestamp", + "format": "date-time", + "nullable": true + }, + "durationSeconds": { + "type": "integer", + "description": "Total duration in seconds (set on incident.resolved)", + "format": "int64", + "nullable": true + }, + "affectedComponentIds": { + "type": "array", + "description": "Affected component IDs from the vendor incident join", + "nullable": true, + "items": { + "type": "string", + "description": "Affected component IDs from the vendor incident join", + "format": "uuid" + } + } + }, + "description": "Vendor incident fields for a status-events rail row" + }, "IncidentFilterParams": { "type": "object", "properties": { @@ -26592,6 +27787,7 @@ }, "InviteDto": { "required": [ + "createdAt", "email", "expiresAt", "roleOffered", @@ -26617,6 +27813,11 @@ "MEMBER" ] }, + "createdAt": { + "type": "string", + "description": "Timestamp when the invite was created", + "format": "date-time" + }, "expiresAt": { "type": "string", "description": "Timestamp when the invite expires", @@ -26869,6 +28070,79 @@ }, "description": "A component affected by a scheduled maintenance window" }, + "MaintenanceEventDto": { + "required": [ + "externalId", + "maintenanceId", + "status", + "title" + ], + "type": "object", + "properties": { + "maintenanceId": { + "type": "string", + "description": "Vendor catalog maintenance ID", + "format": "uuid" + }, + "externalId": { + "type": "string", + "description": "Vendor-supplied external maintenance ID" + }, + "title": { + "type": "string", + "description": "Maintenance title from the vendor status page" + }, + "status": { + "type": "string", + "description": "Lifecycle status: scheduled, in_progress, verifying, completed" + }, + "impact": { + "type": "string", + "description": "Vendor impact level", + "nullable": true + }, + "shortlink": { + "type": "string", + "description": "Short public URL for the vendor maintenance", + "nullable": true + }, + "scheduledFor": { + "type": "string", + "description": "Scheduled start; null for undated maintenance", + "format": "date-time", + "nullable": true + }, + "scheduledUntil": { + "type": "string", + "description": "Scheduled end", + "format": "date-time", + "nullable": true + }, + "startedAt": { + "type": "string", + "description": "When maintenance actually started", + "format": "date-time", + "nullable": true + }, + "completedAt": { + "type": "string", + "description": "When maintenance completed", + "format": "date-time", + "nullable": true + }, + "affectedComponentIds": { + "type": "array", + "description": "Affected component IDs", + "nullable": true, + "items": { + "type": "string", + "description": "Affected component IDs", + "format": "uuid" + } + } + }, + "description": "Vendor maintenance fields for a status-events rail row" + }, "MaintenanceUpdateDto": { "required": [ "id", @@ -27686,7 +28960,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27706,6 +28982,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -27904,7 +29183,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27924,6 +29205,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -28087,6 +29371,32 @@ }, "description": "Inline tag creation — creates the tag if it does not already exist" }, + "NoSlaContext": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "Reason no SLA is published", + "nullable": true + }, + "historicalClaim": { + "type": "string", + "description": "Non-binding historical uptime claim", + "nullable": true + }, + "supportSla": { + "type": "string", + "description": "Support response time SLA if different from uptime SLA", + "nullable": true + }, + "enterpriseNote": { + "type": "string", + "description": "Note about enterprise/custom SLA availability", + "nullable": true + } + }, + "description": "Context for vendors with no public SLA" + }, "NotificationDispatchDto": { "required": [ "createdAt", @@ -28159,6 +29469,16 @@ "format": "date-time", "nullable": true }, + "acknowledgedBy": { + "type": "string", + "description": "Actor who acknowledged this dispatch (user email, api-key:, voice:, etc.); null if not acknowledged", + "nullable": true + }, + "acknowledgedVia": { + "type": "string", + "description": "Channel used to acknowledge (DASHBOARD, API, PHONE_CALL, INTERNAL, etc.); null if not acknowledged", + "nullable": true + }, "nextEscalationAt": { "type": "string", "description": "Timestamp when the next escalation step will fire (null if not scheduled)", @@ -28302,6 +29622,46 @@ }, "description": "Org-level notification policy with match rules and escalation chain" }, + "OfficialSla": { + "type": "object", + "properties": { + "percentage": { + "type": "string", + "description": "Advertised uptime percentage, e.g. '99.99%'", + "nullable": true + }, + "scope": { + "type": "string", + "description": "Scope of the SLA, e.g. 'Monthly uptime per region'", + "nullable": true + }, + "measurement": { + "type": "string", + "description": "How the vendor measures uptime for SLA purposes", + "nullable": true + }, + "exclusions": { + "type": "string", + "description": "Summary of exclusions from SLA calculation", + "nullable": true + }, + "appliesToPlans": { + "type": "array", + "description": "Plan names this SLA applies to, e.g. ['Enterprise']", + "nullable": true, + "items": { + "type": "string", + "description": "Plan names this SLA applies to, e.g. ['Enterprise']" + } + }, + "notCovered": { + "type": "string", + "description": "Services/components NOT covered by the SLA", + "nullable": true + } + }, + "description": "The vendor's officially advertised SLA commitment" + }, "OpsGenieChannelConfig": { "required": [ "channelType", @@ -28367,6 +29727,57 @@ }, "description": "Organization account details" }, + "OrgIncidentAnnotationDto": { + "required": [ + "incidentId", + "severity", + "status", + "alerted" + ], + "type": "object", + "properties": { + "incidentId": { + "type": "string", + "description": "Internal org incident ID", + "format": "uuid" + }, + "displayKey": { + "type": "string", + "description": "Human display key (e.g. DEV-42); null until platform INC codes ship", + "nullable": true + }, + "status": { + "type": "string", + "description": "Internal incident lifecycle status", + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] + }, + "severity": { + "type": "string", + "description": "Internal incident severity", + "enum": [ + "DOWN", + "DEGRADED", + "MAINTENANCE" + ] + }, + "alerted": { + "type": "boolean", + "description": "Whether alert channels were eligible to fire (false for AWARENESS silent tracking)" + }, + "startedAt": { + "type": "string", + "description": "When the internal incident started", + "format": "date-time", + "nullable": true + } + }, + "description": "Linked internal incident annotation on a vendor status-event row" + }, "OrgInfo": { "required": [ "name", @@ -28463,6 +29874,51 @@ "pageOrder" ] }, + "PhoneCallChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "phone_call" + ] + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format, e.g. +14155550123", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of an org verified_phone_number row; alternative to phoneNumber", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true + } + }, + "voiceLanguage": { + "type": "string", + "description": "TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", + "nullable": true + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "PlanInfo": { "required": [ "entitlements", @@ -28595,6 +30051,29 @@ }, "description": "Aggregated poll metrics for a time bucket" }, + "PricingTier": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tier name, e.g. 'Free', 'Pro', 'Enterprise'" + }, + "slaPercentage": { + "type": "string", + "description": "SLA percentage for this tier, e.g. '99.9%'", + "nullable": true + }, + "priceFrom": { + "type": "string", + "description": "Starting price, e.g. '$0', '$25/mo', 'Custom'", + "nullable": true + } + }, + "description": "Pricing tiers with associated SLA levels" + }, "PublishStatusPageIncidentRequest": { "type": "object", "properties": { @@ -29601,6 +31080,28 @@ }, "description": "A scheduled maintenance window from a vendor status page" }, + "ScriptMonitorConfig": { + "required": [ + "script" + ], + "type": "object", + "properties": { + "script": { + "maxLength": 65536, + "minLength": 1, + "type": "string", + "description": "Playwright test script source code" + }, + "timeoutSeconds": { + "maximum": 120, + "minimum": 5, + "type": "integer", + "description": "Maximum execution time in seconds (5–120)", + "format": "int32", + "nullable": true + } + } + }, "SecretDto": { "required": [ "createdAt", @@ -29672,6 +31173,34 @@ }, "description": "Admin-editable SEO metadata for pSEO pages" }, + "ServiceBreakdown": { + "required": [ + "service" + ], + "type": "object", + "properties": { + "service": { + "type": "string", + "description": "Sub-service name, e.g. 'EC2', 'S3'" + }, + "slaPercentage": { + "type": "string", + "description": "SLA percentage for this sub-service", + "nullable": true + }, + "scope": { + "type": "string", + "description": "Scope qualifier, e.g. 'Region (Multi-AZ)'", + "nullable": true + }, + "notes": { + "type": "string", + "description": "Additional notes on measurement or conditions", + "nullable": true + } + }, + "description": "Per-service breakdown for vendors with per_service SLA type" + }, "ServiceCatalogDto": { "required": [ "adapterType", @@ -29685,6 +31214,7 @@ "pollingIntervalSeconds", "enabled", "published", + "slaPublished", "componentCount", "activeIncidentCount" ], @@ -29739,6 +31269,10 @@ "published": { "type": "boolean" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "overallStatus": { "type": "string", "nullable": true @@ -29959,7 +31493,8 @@ "slug", "updatedAt", "pollingIntervalSeconds", - "enabled" + "enabled", + "slaPublished" ], "type": "object", "properties": { @@ -30062,6 +31597,10 @@ "dataCompleteness": { "type": "string" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "seoMetadata": { "nullable": true, "allOf": [ @@ -30070,6 +31609,14 @@ } ] }, + "slaData": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SlaDataDto" + } + ] + }, "relatedServices": { "type": "array", "nullable": true, @@ -30128,6 +31675,13 @@ "type": "string" } }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, "updates": { "type": "array", "items": { @@ -30203,6 +31757,13 @@ "type": "string", "format": "date-time", "nullable": true + }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } } } }, @@ -30566,6 +32127,19 @@ }, "description": "Replace the alert channels linked to a monitor" }, + "SetEnabledRequest": { + "required": [ + "enabled" + ], + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the resource should be enabled" + } + }, + "description": "Request body for toggling a resource's enabled state" + }, "SetMonitorAuthRequest": { "required": [ "config" @@ -31236,6 +32810,146 @@ } } }, + "SlaDataDto": { + "type": "object", + "properties": { + "slaType": { + "type": "string", + "description": "SLA pattern: plan_gated, per_service, no_public_sla, or universal", + "nullable": true + }, + "officialSla": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/OfficialSla" + } + ] + }, + "serviceBreakdown": { + "type": "array", + "description": "Per-service breakdown for vendors with per_service SLA type", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ServiceBreakdown" + } + }, + "pricingTiers": { + "type": "array", + "description": "Pricing tiers with associated SLA levels", + "nullable": true, + "items": { + "$ref": "#/components/schemas/PricingTier" + } + }, + "creditPolicy": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CreditPolicy" + } + ] + }, + "noSlaContext": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NoSlaContext" + } + ] + }, + "sourceUrls": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SourceUrls" + } + ] + }, + "lastResearched": { + "type": "string", + "description": "ISO date when this data was last manually researched", + "nullable": true + }, + "researchNotes": { + "type": "string", + "description": "Freeform operator notes about the research", + "nullable": true + } + }, + "description": "Researched vendor SLA/pricing data for pSEO SLA report pages" + }, + "SmsChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "sms" + ] + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format, e.g. +14155550123", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of an org verified_phone_number row; alternative to phoneNumber", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + "nullable": true + } + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "SourceUrls": { + "type": "object", + "properties": { + "slaPage": { + "type": "string", + "description": "URL to vendor's SLA page", + "nullable": true + }, + "pricingPage": { + "type": "string", + "description": "URL to vendor's pricing page", + "nullable": true + }, + "tosPage": { + "type": "string", + "description": "URL to vendor's Terms of Service", + "nullable": true + }, + "statusPage": { + "type": "string", + "description": "URL to vendor's status page", + "nullable": true + }, + "allSlasPage": { + "type": "string", + "description": "URL to vendor's all-services SLA listing", + "nullable": true + } + }, + "description": "Source URLs for SLA, pricing, and ToS pages" + }, "SplunkOnCallChannelConfig": { "required": [ "channelType", @@ -31332,6 +33046,72 @@ } } }, + "StatusEventDto": { + "required": [ + "at", + "id", + "type" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Stable row ID (incident/update/maintenance UUID or transition bucket key)", + "format": "uuid" + }, + "type": { + "type": "string", + "description": "Status event row type on the Dependencies Detail rail", + "enum": [ + "incident.opened", + "incident.update", + "incident.resolved", + "maintenance.scheduled", + "maintenance.started", + "maintenance.completed", + "component.transition" + ] + }, + "at": { + "type": "string", + "description": "Canonical timestamp used for reverse-chronological ordering", + "format": "date-time" + }, + "incident": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentEventDto" + } + ] + }, + "maintenance": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/MaintenanceEventDto" + } + ] + }, + "component": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/ComponentTransitionEventDto" + } + ] + }, + "orgAnnotation": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/OrgIncidentAnnotationDto" + } + ] + } + }, + "description": "Curated vendor status-event row for the Dependencies Detail rail" + }, "StatusPageBranding": { "type": "object", "properties": { @@ -32144,167 +33924,231 @@ } } }, - "TableValueResultCategoryDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CategoryDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultComponentUptimeDayDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ComponentUptimeDayDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultDeliveryAttemptDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/DeliveryAttemptDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultEnvironmentDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/EnvironmentDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultIncidentDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/IncidentDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, - "TableValueResultIncidentStateTransitionDto": { + "TableValueResultCategoryDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CategoryDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultComponentUptimeDayDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ComponentUptimeDayDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultDeliveryAttemptDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeliveryAttemptDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultEnvironmentDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IncidentDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIncidentStateTransitionDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IncidentStateTransitionDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultIntegrationDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultInviteDto": { "required": [ "data", "hasNext", @@ -32315,7 +34159,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IncidentStateTransitionDto" + "$ref": "#/components/schemas/InviteDto" } }, "hasNext": { @@ -32336,7 +34180,7 @@ } } }, - "TableValueResultIntegrationDto": { + "TableValueResultMaintenanceWindowDto": { "required": [ "data", "hasNext", @@ -32347,7 +34191,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/IntegrationDto" + "$ref": "#/components/schemas/MaintenanceWindowDto" } }, "hasNext": { @@ -32368,7 +34212,7 @@ } } }, - "TableValueResultInviteDto": { + "TableValueResultMemberDto": { "required": [ "data", "hasNext", @@ -32379,7 +34223,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/InviteDto" + "$ref": "#/components/schemas/MemberDto" } }, "hasNext": { @@ -32400,7 +34244,7 @@ } } }, - "TableValueResultMaintenanceWindowDto": { + "TableValueResultMonitorDto": { "required": [ "data", "hasNext", @@ -32411,7 +34255,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MaintenanceWindowDto" + "$ref": "#/components/schemas/MonitorDto" } }, "hasNext": { @@ -32432,7 +34276,7 @@ } } }, - "TableValueResultMemberDto": { + "TableValueResultMonitorVersionDto": { "required": [ "data", "hasNext", @@ -32443,7 +34287,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MemberDto" + "$ref": "#/components/schemas/MonitorVersionDto" } }, "hasNext": { @@ -32464,7 +34308,7 @@ } } }, - "TableValueResultMonitorDto": { + "TableValueResultNotificationDispatchDto": { "required": [ "data", "hasNext", @@ -32475,7 +34319,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MonitorDto" + "$ref": "#/components/schemas/NotificationDispatchDto" } }, "hasNext": { @@ -32496,7 +34340,7 @@ } } }, - "TableValueResultMonitorVersionDto": { + "TableValueResultNotificationDto": { "required": [ "data", "hasNext", @@ -32507,7 +34351,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/MonitorVersionDto" + "$ref": "#/components/schemas/NotificationDto" } }, "hasNext": { @@ -32528,7 +34372,7 @@ } } }, - "TableValueResultNotificationDispatchDto": { + "TableValueResultNotificationPolicyDto": { "required": [ "data", "hasNext", @@ -32539,7 +34383,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationDispatchDto" + "$ref": "#/components/schemas/NotificationPolicyDto" } }, "hasNext": { @@ -32560,7 +34404,7 @@ } } }, - "TableValueResultNotificationDto": { + "TableValueResultResourceGroupDto": { "required": [ "data", "hasNext", @@ -32571,7 +34415,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationDto" + "$ref": "#/components/schemas/ResourceGroupDto" } }, "hasNext": { @@ -32592,7 +34436,7 @@ } } }, - "TableValueResultNotificationPolicyDto": { + "TableValueResultRuleEvaluationDto": { "required": [ "data", "hasNext", @@ -32603,7 +34447,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/NotificationPolicyDto" + "$ref": "#/components/schemas/RuleEvaluationDto" } }, "hasNext": { @@ -32624,7 +34468,7 @@ } } }, - "TableValueResultResourceGroupDto": { + "TableValueResultScheduledMaintenanceDto": { "required": [ "data", "hasNext", @@ -32635,7 +34479,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ResourceGroupDto" + "$ref": "#/components/schemas/ScheduledMaintenanceDto" } }, "hasNext": { @@ -32656,7 +34500,7 @@ } } }, - "TableValueResultRuleEvaluationDto": { + "TableValueResultSecretDto": { "required": [ "data", "hasNext", @@ -32667,7 +34511,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/RuleEvaluationDto" + "$ref": "#/components/schemas/SecretDto" } }, "hasNext": { @@ -32688,7 +34532,7 @@ } } }, - "TableValueResultScheduledMaintenanceDto": { + "TableValueResultServiceComponentDto": { "required": [ "data", "hasNext", @@ -32699,7 +34543,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ScheduledMaintenanceDto" + "$ref": "#/components/schemas/ServiceComponentDto" } }, "hasNext": { @@ -32720,7 +34564,7 @@ } } }, - "TableValueResultSecretDto": { + "TableValueResultServiceIncidentDto": { "required": [ "data", "hasNext", @@ -32731,7 +34575,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/SecretDto" + "$ref": "#/components/schemas/ServiceIncidentDto" } }, "hasNext": { @@ -32752,7 +34596,7 @@ } } }, - "TableValueResultServiceComponentDto": { + "TableValueResultServiceSubscriptionDto": { "required": [ "data", "hasNext", @@ -32763,7 +34607,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ServiceComponentDto" + "$ref": "#/components/schemas/ServiceSubscriptionDto" } }, "hasNext": { @@ -32784,7 +34628,7 @@ } } }, - "TableValueResultServiceIncidentDto": { + "TableValueResultStatusPageComponentDto": { "required": [ "data", "hasNext", @@ -32795,7 +34639,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ServiceIncidentDto" + "$ref": "#/components/schemas/StatusPageComponentDto" } }, "hasNext": { @@ -32816,7 +34660,7 @@ } } }, - "TableValueResultServiceSubscriptionDto": { + "TableValueResultStatusPageComponentGroupDto": { "required": [ "data", "hasNext", @@ -32827,7 +34671,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/ServiceSubscriptionDto" + "$ref": "#/components/schemas/StatusPageComponentGroupDto" } }, "hasNext": { @@ -32848,7 +34692,7 @@ } } }, - "TableValueResultStatusPageComponentDto": { + "TableValueResultStatusPageCustomDomainDto": { "required": [ "data", "hasNext", @@ -32859,7 +34703,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageComponentDto" + "$ref": "#/components/schemas/StatusPageCustomDomainDto" } }, "hasNext": { @@ -32880,7 +34724,7 @@ } } }, - "TableValueResultStatusPageComponentGroupDto": { + "TableValueResultStatusPageDto": { "required": [ "data", "hasNext", @@ -32891,7 +34735,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageComponentGroupDto" + "$ref": "#/components/schemas/StatusPageDto" } }, "hasNext": { @@ -32912,7 +34756,7 @@ } } }, - "TableValueResultStatusPageCustomDomainDto": { + "TableValueResultStatusPageIncidentDto": { "required": [ "data", "hasNext", @@ -32923,7 +34767,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageCustomDomainDto" + "$ref": "#/components/schemas/StatusPageIncidentDto" } }, "hasNext": { @@ -32944,7 +34788,7 @@ } } }, - "TableValueResultStatusPageDto": { + "TableValueResultStatusPageSubscriberDto": { "required": [ "data", "hasNext", @@ -32955,7 +34799,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageDto" + "$ref": "#/components/schemas/StatusPageSubscriberDto" } }, "hasNext": { @@ -32976,7 +34820,7 @@ } } }, - "TableValueResultStatusPageIncidentDto": { + "TableValueResultTagDto": { "required": [ "data", "hasNext", @@ -32987,7 +34831,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageIncidentDto" + "$ref": "#/components/schemas/TagDto" } }, "hasNext": { @@ -33008,7 +34852,7 @@ } } }, - "TableValueResultStatusPageSubscriberDto": { + "TableValueResultTestChannelResult": { "required": [ "data", "hasNext", @@ -33019,7 +34863,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageSubscriberDto" + "$ref": "#/components/schemas/TestChannelResult" } }, "hasNext": { @@ -33040,7 +34884,7 @@ } } }, - "TableValueResultTagDto": { + "TableValueResultVoiceLanguageDto": { "required": [ "data", "hasNext", @@ -33051,7 +34895,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/TagDto" + "$ref": "#/components/schemas/VoiceLanguageDto" } }, "hasNext": { @@ -33413,6 +35257,9 @@ { "$ref": "#/components/schemas/PagerDutyChannelConfig" }, + { + "$ref": "#/components/schemas/PhoneCallChannelConfig" + }, { "$ref": "#/components/schemas/PushbulletChannelConfig" }, @@ -33425,6 +35272,9 @@ { "$ref": "#/components/schemas/SlackChannelConfig" }, + { + "$ref": "#/components/schemas/SmsChannelConfig" + }, { "$ref": "#/components/schemas/SplunkOnCallChannelConfig" }, @@ -33491,6 +35341,29 @@ }, "description": "Result of a dry-run match evaluation against a notification policy" }, + "TestMonitorNotificationsRequest": { + "type": "object", + "properties": { + "channelIds": { + "type": "array", + "description": "Channel IDs to test; null or empty tests all channels attached to the monitor", + "nullable": true, + "items": { + "type": "string", + "description": "Channel IDs to test; null or empty tests all channels attached to the monitor", + "format": "uuid" + } + }, + "includeResolved": { + "type": "boolean", + "description": "Whether to include a resolved notification in the test (default: false)" + } + }, + "description": "Request to send test notifications through a monitor's alert channels", + "required": [ + "includeResolved" + ] + }, "TestNotificationPolicyRequest": { "type": "object", "properties": { @@ -33564,7 +35437,7 @@ "properties": { "dns_ms": { "type": "integer", - "description": "DNS resolution time in milliseconds", + "description": "Legacy DNS phase; null for new checks (no longer measured)", "format": "int32", "nullable": true, "example": 12 @@ -33753,64 +35626,70 @@ "config": { "oneOf": [ { - "$ref": "#/components/schemas/DatadogChannelConfig" + "$ref": "#/components/schemas/UpdateDatadogChannelConfig" }, { - "$ref": "#/components/schemas/DiscordChannelConfig" + "$ref": "#/components/schemas/UpdateDiscordChannelConfig" }, { - "$ref": "#/components/schemas/EmailChannelConfig" + "$ref": "#/components/schemas/UpdateEmailChannelConfig" }, { - "$ref": "#/components/schemas/GitLabChannelConfig" + "$ref": "#/components/schemas/UpdateGitLabChannelConfig" }, { - "$ref": "#/components/schemas/GoogleChatChannelConfig" + "$ref": "#/components/schemas/UpdateGoogleChatChannelConfig" }, { - "$ref": "#/components/schemas/IncidentIoChannelConfig" + "$ref": "#/components/schemas/UpdateIncidentIoChannelConfig" }, { - "$ref": "#/components/schemas/JiraChannelConfig" + "$ref": "#/components/schemas/UpdateJiraChannelConfig" }, { - "$ref": "#/components/schemas/LinearChannelConfig" + "$ref": "#/components/schemas/UpdateLinearChannelConfig" }, { - "$ref": "#/components/schemas/MattermostChannelConfig" + "$ref": "#/components/schemas/UpdateMattermostChannelConfig" }, { - "$ref": "#/components/schemas/OpsGenieChannelConfig" + "$ref": "#/components/schemas/UpdateOpsGenieChannelConfig" }, { - "$ref": "#/components/schemas/PagerDutyChannelConfig" + "$ref": "#/components/schemas/UpdatePagerDutyChannelConfig" }, { - "$ref": "#/components/schemas/PushbulletChannelConfig" + "$ref": "#/components/schemas/UpdatePhoneCallChannelConfig" }, { - "$ref": "#/components/schemas/PushoverChannelConfig" + "$ref": "#/components/schemas/UpdatePushbulletChannelConfig" }, { - "$ref": "#/components/schemas/RootlyChannelConfig" + "$ref": "#/components/schemas/UpdatePushoverChannelConfig" }, { - "$ref": "#/components/schemas/SlackChannelConfig" + "$ref": "#/components/schemas/UpdateRootlyChannelConfig" }, { - "$ref": "#/components/schemas/SplunkOnCallChannelConfig" + "$ref": "#/components/schemas/UpdateSlackChannelConfig" }, { - "$ref": "#/components/schemas/TeamsChannelConfig" + "$ref": "#/components/schemas/UpdateSmsChannelConfig" }, { - "$ref": "#/components/schemas/TelegramChannelConfig" + "$ref": "#/components/schemas/UpdateSplunkOnCallChannelConfig" }, { - "$ref": "#/components/schemas/WebhookChannelConfig" + "$ref": "#/components/schemas/UpdateTeamsChannelConfig" }, { - "$ref": "#/components/schemas/ZapierChannelConfig" + "$ref": "#/components/schemas/UpdateTelegramChannelConfig" + }, + { + "$ref": "#/components/schemas/UpdateWebhookChannelConfig" + }, + { + "$ref": "#/components/schemas/UpdateZapierChannelConfig" } ] }, @@ -33825,6 +35704,11 @@ "MCP", "API" ] + }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled (default: true); null preserves current value", + "nullable": true } } }, @@ -34004,6 +35888,84 @@ } } }, + "UpdateDatadogChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "datadog" + ] + }, + "apiKey": { + "type": "string", + "description": "Datadog API key", + "nullable": true + }, + "site": { + "type": "string", + "description": "Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)", + "nullable": true + }, + "tags": { + "type": "string", + "description": "Comma-separated tags to attach to events", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateDiscordChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "discord" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Discord webhook URL", + "nullable": true + }, + "mentionRoleId": { + "type": "string", + "description": "Optional Discord role ID to mention in notifications", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateEmailChannelConfig": { + "required": [ + "channelType", + "recipients" + ], + "type": "object", + "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" + } + } + } + }, "UpdateEnvironmentRequest": { "type": "object", "properties": { @@ -34031,6 +35993,79 @@ } } }, + "UpdateGitLabChannelConfig": { + "required": [ + "channelType", + "endpointUrl" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "endpointUrl": { + "minLength": 1, + "type": "string", + "description": "GitLab alert integration endpoint URL" + }, + "authorizationKey": { + "type": "string", + "description": "Authorization key from GitLab alert integration settings", + "nullable": true + } + } + }, + "UpdateGoogleChatChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "google_chat" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Google Chat space webhook URL", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateIncidentIoChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "incident_io" + ] + }, + "apiKey": { + "type": "string", + "description": "incident.io API key with 'Create incidents' permission", + "nullable": true + }, + "severityId": { + "type": "string", + "description": "Severity ID for created incidents (from List Severities API)", + "nullable": true + }, + "visibility": { + "type": "string", + "description": "Incident visibility: public or private (default: public)", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateIncidentPolicyRequest": { "required": [ "confirmation", @@ -34056,6 +36091,100 @@ }, "description": "Request body for updating an incident policy" }, + "UpdateIncidentRequest": { + "type": "object", + "properties": { + "title": { + "maxLength": 2147483647, + "minLength": 1, + "type": "string", + "description": "New title; null preserves current (min 1 char if present)", + "nullable": true + }, + "severity": { + "type": "string", + "description": "New severity: DOWN, DEGRADED, or MAINTENANCE; null preserves current", + "nullable": true, + "enum": [ + "DOWN", + "DEGRADED", + "MAINTENANCE" + ] + } + } + }, + "UpdateJiraChannelConfig": { + "required": [ + "channelType", + "domain", + "email", + "projectKey" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "jira" + ] + }, + "domain": { + "minLength": 1, + "type": "string", + "description": "Atlassian instance domain (e.g. yourteam.atlassian.net)" + }, + "email": { + "minLength": 1, + "type": "string", + "description": "Atlassian account email for API authentication" + }, + "apiToken": { + "type": "string", + "description": "Atlassian API token", + "nullable": true + }, + "projectKey": { + "minLength": 1, + "type": "string", + "description": "Jira project key where issues are created (e.g. OPS)" + }, + "issueType": { + "type": "string", + "description": "Issue type name (e.g. Bug, Task, Incident)", + "nullable": true + } + } + }, + "UpdateLinearChannelConfig": { + "required": [ + "channelType", + "teamId" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "linear" + ] + }, + "apiKey": { + "type": "string", + "description": "Linear API key", + "nullable": true + }, + "teamId": { + "minLength": 1, + "type": "string", + "description": "Team ID to create issues in" + }, + "labelId": { + "type": "string", + "description": "Label ID to attach to created issues", + "nullable": true + } + } + }, "UpdateMaintenanceWindowRequest": { "required": [ "endsAt", @@ -34100,6 +36229,35 @@ } } }, + "UpdateMattermostChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "mattermost" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Mattermost incoming webhook URL", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Override channel (if webhook allows)", + "nullable": true + }, + "iconUrl": { + "type": "string", + "description": "Custom bot icon URL", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateMonitorAuthRequest": { "required": [ "config" @@ -34152,6 +36310,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -34291,6 +36452,30 @@ }, "description": "Request body for updating a notification policy (null fields are preserved)" }, + "UpdateOpsGenieChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "opsgenie" + ] + }, + "apiKey": { + "type": "string", + "description": "OpsGenie API key for alert creation", + "nullable": true + }, + "region": { + "type": "string", + "description": "OpsGenie API region: us or eu", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateOrgDetailsRequest": { "required": [ "email", @@ -34333,6 +36518,133 @@ } } }, + "UpdatePagerDutyChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pagerduty" + ] + }, + "routingKey": { + "type": "string", + "description": "PagerDuty Events API v2 routing (integration) key", + "nullable": true + }, + "severityOverride": { + "type": "string", + "description": "Override PagerDuty severity mapping", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdatePhoneCallChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "phone_call" + ] + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format; null preserves current", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of an org verified_phone_number row; null preserves current when phoneNumber also null", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated: use phoneNumber", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated: use phoneNumber", + "nullable": true + } + }, + "voiceLanguage": { + "type": "string", + "description": "TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", + "nullable": true + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdatePushbulletChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pushbullet" + ] + }, + "accessToken": { + "type": "string", + "description": "Pushbullet access token", + "nullable": true + }, + "deviceIden": { + "type": "string", + "description": "Target device identifier (broadcasts to all if empty)", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdatePushoverChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pushover" + ] + }, + "userKey": { + "type": "string", + "description": "Pushover user or group key", + "nullable": true + }, + "appToken": { + "type": "string", + "description": "Pushover application API token", + "nullable": true + }, + "priority": { + "type": "string", + "description": "Notification priority override (-2 to 2)", + "nullable": true + }, + "sound": { + "type": "string", + "description": "Notification sound override", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateResourceGroupRequest": { "required": [ "name" @@ -34451,6 +36763,30 @@ }, "description": "Request body for updating a resource group" }, + "UpdateRootlyChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "rootly" + ] + }, + "apiKey": { + "type": "string", + "description": "Rootly API token with incident creation permission", + "nullable": true + }, + "severity": { + "type": "string", + "description": "Severity slug override (e.g. sev0, sev1)", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateSecretRequest": { "required": [ "value" @@ -34465,6 +36801,95 @@ } } }, + "UpdateSlackChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "slack" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Slack incoming webhook URL", + "nullable": true + }, + "mentionText": { + "type": "string", + "description": "Optional mention text included in notifications, e.g. @channel", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateSmsChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "sms" + ] + }, + "phoneNumber": { + "type": "string", + "description": "Recipient phone number in E.164 format; null preserves current", + "nullable": true + }, + "verifiedPhoneNumberId": { + "type": "integer", + "description": "Id of an org verified_phone_number row; null preserves current when phoneNumber also null", + "format": "int64", + "nullable": true + }, + "phoneNumbers": { + "type": "array", + "description": "Deprecated: use phoneNumber", + "nullable": true, + "items": { + "type": "string", + "description": "Deprecated: use phoneNumber", + "nullable": true + } + }, + "preferredLanguage": { + "type": "string", + "description": "Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateSplunkOnCallChannelConfig": { + "required": [ + "channelType", + "routingKey" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "splunk_oncall" + ] + }, + "apiKey": { + "type": "string", + "description": "Splunk On-Call REST API key", + "nullable": true + }, + "routingKey": { + "minLength": 1, + "type": "string", + "description": "Routing key for alert routing" + } + } + }, "UpdateStatusPageComponentGroupRequest": { "type": "object", "properties": { @@ -34685,6 +37110,84 @@ }, "description": "Request body for updating a tag; null fields are left unchanged" }, + "UpdateTeamsChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "teams" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Microsoft Teams incoming webhook URL", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateTelegramChannelConfig": { + "required": [ + "channelType", + "chatId" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "telegram" + ] + }, + "botToken": { + "type": "string", + "description": "Telegram bot token from @BotFather", + "nullable": true + }, + "chatId": { + "minLength": 1, + "type": "string", + "description": "Chat, group, or channel ID to send alerts to" + } + } + }, + "UpdateWebhookChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "url": { + "type": "string", + "description": "Webhook endpoint URL that receives alert payloads", + "nullable": true + }, + "signingSecret": { + "type": "string", + "description": "HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", + "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 + } + }, + "required": [ + "channelType" + ] + }, "UpdateWebhookEndpointRequest": { "type": "object", "properties": { @@ -34745,6 +37248,25 @@ }, "description": "Update workspace details" }, + "UpdateZapierChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "zapier" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Zapier/n8n/Make catch webhook URL", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UptimeBucketDto": { "required": [ "timestamp", @@ -34809,14 +37331,48 @@ "format": "double", "nullable": true, "example": 312 + }, + "p50LatencyMs": { + "type": "number", + "description": "50th-percentile (median) latency in milliseconds; null when no data", + "format": "double", + "nullable": true, + "example": 128 + }, + "incidentCount": { + "type": "integer", + "description": "Number of incidents that started within the requested window", + "format": "int64", + "example": 2 } }, "description": "Uptime statistics aggregated from continuous aggregates", "required": [ "totalChecks", - "passedChecks" + "passedChecks", + "incidentCount" ] }, + "VoiceLanguageDto": { + "required": [ + "code", + "label" + ], + "type": "object", + "properties": { + "code": { + "minLength": 1, + "type": "string", + "description": "BCP-47 locale code, e.g. en-US" + }, + "label": { + "minLength": 1, + "type": "string", + "description": "Human-readable label, e.g. English (US)" + } + }, + "description": "Supported TTS voice language for phone call alerts" + }, "WebhookChannelConfig": { "required": [ "channelType", @@ -34837,7 +37393,7 @@ }, "signingSecret": { "type": "string", - "description": "Optional HMAC signing secret for payload verification", + "description": "HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", "nullable": true }, "customHeaders": { diff --git a/src/devhelm/_generated.py b/src/devhelm/_generated.py index 0b19ffa..daae688 100644 --- a/src/devhelm/_generated.py +++ b/src/devhelm/_generated.py @@ -173,6 +173,41 @@ class AlertChannelDisplayConfig(BaseModel): project_key: Annotated[ str | None, Field(alias="projectKey", description="Jira project key") ] = None + phone_number: Annotated[ + str | None, + Field( + alias="phoneNumber", + description="Recipient phone number in E.164 format (SMS / phone-call channels)", + ), + ] = None + verified_phone_number_id: Annotated[ + int | None, + Field( + alias="verifiedPhoneNumberId", + description="Id of the org verified_phone_number row bound to this channel", + ), + ] = None + phone_numbers: Annotated[ + list[str] | None, + Field( + alias="phoneNumbers", + description="Deprecated mirror of phoneNumber as a length-1 list for older clients", + ), + ] = None + voice_language: Annotated[ + str | None, + Field( + alias="voiceLanguage", + description="BCP-47 voice language for phone-call TTS (e.g. en-US, de-DE)", + ), + ] = None + preferred_language: Annotated[ + str | None, + Field( + alias="preferredLanguage", + description="Preferred language for SMS/voice (BCP-47, e.g. en-US, de-DE)", + ), + ] = None class AlertChannelDto(BaseModel): @@ -189,6 +224,10 @@ class AlertChannelDto(BaseModel): display_config: Annotated[ AlertChannelDisplayConfig | None, Field(alias="displayConfig") ] = None + enabled: Annotated[ + bool, + Field(description="Whether this channel is enabled and will receive alerts"), + ] created_at: Annotated[ AwareDatetime, Field(alias="createdAt", description="Timestamp when the channel was created"), @@ -549,6 +588,21 @@ class ChartBucketDto(BaseModel): ] = None +class CodeCheckStep(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[str, Field(description="Step name from test.step() or test() call")] + status: Annotated[ + str, Field(description="Step outcome: passed, failed, skipped, or timedOut") + ] + duration_ms: Annotated[ + int | None, + Field(alias="durationMs", description="Step duration in milliseconds"), + ] = None + error: Annotated[ + str | None, Field(description="Error message if the step failed") + ] = None + + class ComponentImpact(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) component_id: Annotated[ @@ -601,6 +655,23 @@ class ComponentPosition(BaseModel): ] = None +class ComponentSample(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + component_id: Annotated[ + UUID, Field(alias="componentId", description="Component ID") + ] + component_name: Annotated[ + str | None, Field(alias="componentName", description="Component display name") + ] = None + old_status: Annotated[ + str | None, + Field(alias="oldStatus", description="Previous status before the flip"), + ] = None + new_status: Annotated[ + str, Field(alias="newStatus", description="New status after the flip") + ] + + class ComponentsSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) total_count: Annotated[ @@ -638,6 +709,30 @@ class ComponentStatusDto(BaseModel): ] +class ComponentTransitionEventDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + new_status: Annotated[ + str, + Field( + alias="newStatus", description="New status that defines this rollup bucket" + ), + ] + component_count: Annotated[ + int, + Field( + alias="componentCount", + description="Total components in the 5-minute rollup bucket", + ), + ] + component_sample: Annotated[ + list[ComponentSample], + Field( + alias="componentSample", + description="Up to 5 sample components from the bucket", + ), + ] + + class ComponentUptimeSummaryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) day: Annotated[ @@ -834,6 +929,20 @@ class CreateManualIncidentRequest(BaseModel): str | None, Field(description="Detailed description or context for the incident"), ] = None + service_id: Annotated[ + UUID | None, + Field( + alias="serviceId", + description="Vendor service to link; optional for Dependencies create CTA", + ), + ] = None + service_incident_id: Annotated[ + UUID | None, + Field( + alias="serviceIncidentId", + description="Vendor incident to link; idempotent if an active org incident already links it", + ), + ] = None class Type(StrEnum): @@ -843,6 +952,8 @@ class Type(StrEnum): tcp = "TCP" icmp = "ICMP" heartbeat = "HEARTBEAT" + browser = "BROWSER" + multi_step_api = "MULTI_STEP_API" class HealthThresholdType(StrEnum): @@ -1121,6 +1232,25 @@ class CreateWorkspaceRequest(BaseModel): name: Annotated[str, Field(description="Workspace name", min_length=1)] +class CreditTier(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + uptime_range: Annotated[ + str, + Field(alias="uptimeRange", description="Uptime range, e.g. '99.1% – 99.98%'"), + ] + credit_percent: Annotated[ + int | None, + Field(alias="creditPercent", description="Credit percent of monthly fee"), + ] = None + formula: Annotated[ + str | None, + Field(description="Credit formula when percent is not a fixed number"), + ] = None + notes: Annotated[ + str | None, Field(description="Additional notes on this credit tier") + ] = None + + class DatadogChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["datadog"], Field(alias="channelType")] = "datadog" @@ -2116,6 +2246,13 @@ class IncidentDto(BaseModel): description="Whether this incident is visible on the status page", ), ] + suppress_dispatch: Annotated[ + bool, + Field( + alias="suppressDispatch", + description="When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted", + ), + ] service_incident_id: Annotated[ UUID | None, Field( @@ -2154,6 +2291,13 @@ class IncidentDto(BaseModel): description="How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.)", ), ] = None + resolution_note: Annotated[ + str | None, + Field( + alias="resolutionNote", + description="Body from the most recent resolve update; null when not currently resolved, auto-resolved without a note, or no resolve update body was provided", + ), + ] = None started_at: Annotated[ AwareDatetime | None, Field( @@ -2265,6 +2409,75 @@ class IncidentDto(BaseModel): description="Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null.", ), ] = None + display_key: Annotated[ + str | None, + Field( + alias="displayKey", + description='Org-scoped human-readable incident code, e.g. "ABC-42". Null on incidents created by pre-INC-keys API pods before the sweep; treat missing as unknown and fall back to the id', + ), + ] = None + + +class IncidentEventDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + incident_id: Annotated[ + UUID, Field(alias="incidentId", description="Vendor catalog incident ID") + ] + external_id: Annotated[ + str | None, + Field(alias="externalId", description="Vendor-supplied external incident ID"), + ] = None + title: Annotated[ + str, Field(description="Incident title from the vendor status page") + ] + impact: Annotated[ + str | None, Field(description="Vendor impact level (major, minor, none)") + ] = None + status: Annotated[ + str | None, + Field(description="Vendor lifecycle status (only set on incident.update rows)"), + ] = None + body: Annotated[ + str | None, + Field(description="Update body text (only set on incident.update rows)"), + ] = None + shortlink: Annotated[ + str | None, Field(description="Short public URL for the vendor incident") + ] = None + started_at: Annotated[ + AwareDatetime | None, + Field(alias="startedAt", description="When the vendor incident started"), + ] = None + resolved_at: Annotated[ + AwareDatetime | None, + Field(alias="resolvedAt", description="When the vendor incident resolved"), + ] = None + detected_at: Annotated[ + AwareDatetime | None, + Field( + alias="detectedAt", description="When DevHelm first detected the incident" + ), + ] = None + vendor_created_at: Annotated[ + AwareDatetime | None, + Field( + alias="vendorCreatedAt", description="Vendor-reported creation timestamp" + ), + ] = None + duration_seconds: Annotated[ + int | None, + Field( + alias="durationSeconds", + description="Total duration in seconds (set on incident.resolved)", + ), + ] = None + affected_component_ids: Annotated[ + list[UUID] | None, + Field( + alias="affectedComponentIds", + description="Affected component IDs from the vendor incident join", + ), + ] = None class Status5(StrEnum): @@ -2453,6 +2666,10 @@ class InviteDto(BaseModel): description="Role that will be assigned to the invitee on acceptance", ), ] + created_at: Annotated[ + AwareDatetime, + Field(alias="createdAt", description="Timestamp when the invite was created"), + ] expires_at: Annotated[ AwareDatetime, Field(alias="expiresAt", description="Timestamp when the invite expires"), @@ -2584,6 +2801,54 @@ class MaintenanceComponentRef(BaseModel): ] +class MaintenanceEventDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + maintenance_id: Annotated[ + UUID, Field(alias="maintenanceId", description="Vendor catalog maintenance ID") + ] + external_id: Annotated[ + str, + Field( + alias="externalId", description="Vendor-supplied external maintenance ID" + ), + ] + title: Annotated[ + str, Field(description="Maintenance title from the vendor status page") + ] + status: Annotated[ + str, + Field( + description="Lifecycle status: scheduled, in_progress, verifying, completed" + ), + ] + impact: Annotated[str | None, Field(description="Vendor impact level")] = None + shortlink: Annotated[ + str | None, Field(description="Short public URL for the vendor maintenance") + ] = None + scheduled_for: Annotated[ + AwareDatetime | None, + Field( + alias="scheduledFor", + description="Scheduled start; null for undated maintenance", + ), + ] = None + scheduled_until: Annotated[ + AwareDatetime | None, Field(alias="scheduledUntil", description="Scheduled end") + ] = None + started_at: Annotated[ + AwareDatetime | None, + Field(alias="startedAt", description="When maintenance actually started"), + ] = None + completed_at: Annotated[ + AwareDatetime | None, + Field(alias="completedAt", description="When maintenance completed"), + ] = None + affected_component_ids: Annotated[ + list[UUID] | None, + Field(alias="affectedComponentIds", description="Affected component IDs"), + ] = None + + class MaintenanceUpdateDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique update identifier")] @@ -2946,6 +3211,8 @@ class Type3(StrEnum): tcp = "TCP" icmp = "ICMP" heartbeat = "HEARTBEAT" + browser = "BROWSER" + multi_step_api = "MULTI_STEP_API" class MonitorTestResultDto(BaseModel): @@ -2979,6 +3246,33 @@ class NewTagRequest(BaseModel): ] = None +class NoSlaContext(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[str | None, Field(description="Reason no SLA is published")] = ( + None + ) + historical_claim: Annotated[ + str | None, + Field( + alias="historicalClaim", description="Non-binding historical uptime claim" + ), + ] = None + support_sla: Annotated[ + str | None, + Field( + alias="supportSla", + description="Support response time SLA if different from uptime SLA", + ), + ] = None + enterprise_note: Annotated[ + str | None, + Field( + alias="enterpriseNote", + description="Note about enterprise/custom SLA availability", + ), + ] = None + + class NotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique dispatch record identifier")] @@ -3028,6 +3322,20 @@ class NotificationDispatchDto(BaseModel): description="Timestamp when this dispatch was acknowledged (null if not acknowledged)", ), ] = None + acknowledged_by: Annotated[ + str | None, + Field( + alias="acknowledgedBy", + description="Actor who acknowledged this dispatch (user email, api-key:, voice:, etc.); null if not acknowledged", + ), + ] = None + acknowledged_via: Annotated[ + str | None, + Field( + alias="acknowledgedVia", + description="Channel used to acknowledge (DASHBOARD, API, PHONE_CALL, INTERNAL, etc.); null if not acknowledged", + ), + ] = None next_escalation_at: Annotated[ AwareDatetime | None, Field( @@ -3095,6 +3403,36 @@ class NotificationDto(BaseModel): ] +class OfficialSla(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + percentage: Annotated[ + str | None, Field(description="Advertised uptime percentage, e.g. '99.99%'") + ] = None + scope: Annotated[ + str | None, + Field(description="Scope of the SLA, e.g. 'Monthly uptime per region'"), + ] = None + measurement: Annotated[ + str | None, Field(description="How the vendor measures uptime for SLA purposes") + ] = None + exclusions: Annotated[ + str | None, Field(description="Summary of exclusions from SLA calculation") + ] = None + applies_to_plans: Annotated[ + list[str] | None, + Field( + alias="appliesToPlans", + description="Plan names this SLA applies to, e.g. ['Enterprise']", + ), + ] = None + not_covered: Annotated[ + str | None, + Field( + alias="notCovered", description="Services/components NOT covered by the SLA" + ), + ] = None + + class OpsGenieChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( @@ -3129,6 +3467,32 @@ class OrganizationDto(BaseModel): ] = None +class OrgIncidentAnnotationDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + incident_id: Annotated[ + UUID, Field(alias="incidentId", description="Internal org incident ID") + ] + display_key: Annotated[ + str | None, + Field( + alias="displayKey", + description="Human display key (e.g. DEV-42); null until platform INC codes ship", + ), + ] = None + status: Annotated[str, Field(description="Internal incident lifecycle status")] + severity: Annotated[str, Field(description="Internal incident severity")] + alerted: Annotated[ + bool, + Field( + description="Whether alert channels were eligible to fire (false for AWARENESS silent tracking)" + ), + ] + started_at: Annotated[ + AwareDatetime | None, + Field(alias="startedAt", description="When the internal incident started"), + ] = None + + class OrgInfo(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) id: Annotated[int, Field(description="Organization ID")] @@ -3181,6 +3545,48 @@ class PageSection(BaseModel): ] +class PhoneCallChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["phone_call"], Field(alias="channelType")] = ( + "phone_call" + ) + phone_number: Annotated[ + str | None, + Field( + alias="phoneNumber", + description="Recipient phone number in E.164 format, e.g. +14155550123", + ), + ] = None + verified_phone_number_id: Annotated[ + int | None, + Field( + alias="verifiedPhoneNumberId", + description="Id of an org verified_phone_number row; alternative to phoneNumber", + ), + ] = None + phone_numbers: Annotated[ + list[str] | None, + Field( + alias="phoneNumbers", + description="Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + ), + ] = None + voice_language: Annotated[ + str | None, + Field( + alias="voiceLanguage", + description="TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", + ), + ] = None + preferred_language: Annotated[ + str | None, + Field( + alias="preferredLanguage", + description="Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", + ), + ] = None + + class Tier(StrEnum): free = "FREE" starter = "STARTER" @@ -3286,6 +3692,27 @@ class PollChartBucketDto(BaseModel): ] +class PricingTier(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str, Field(description="Tier name, e.g. 'Free', 'Pro', 'Enterprise'") + ] + sla_percentage: Annotated[ + str | None, + Field( + alias="slaPercentage", + description="SLA percentage for this tier, e.g. '99.9%'", + ), + ] = None + price_from: Annotated[ + str | None, + Field( + alias="priceFrom", + description="Starting price, e.g. '$0', '$25/mo', 'Custom'", + ), + ] = None + + class Status6(StrEnum): investigating = "INVESTIGATING" identified = "IDENTIFIED" @@ -3930,6 +4357,27 @@ class ScheduledMaintenanceDto(BaseModel): ] +class ScriptMonitorConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + script: Annotated[ + str, + Field( + description="Playwright test script source code", + max_length=65536, + min_length=1, + ), + ] + timeout_seconds: Annotated[ + int | None, + Field( + alias="timeoutSeconds", + description="Maximum execution time in seconds (5–120)", + ge=5, + le=120, + ), + ] = None + + class SecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique secret identifier")] @@ -3986,6 +4434,21 @@ class SeoMetadataDto(BaseModel): ] = None +class ServiceBreakdown(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + service: Annotated[str, Field(description="Sub-service name, e.g. 'EC2', 'S3'")] + sla_percentage: Annotated[ + str | None, + Field(alias="slaPercentage", description="SLA percentage for this sub-service"), + ] = None + scope: Annotated[ + str | None, Field(description="Scope qualifier, e.g. 'Region (Multi-AZ)'") + ] = None + notes: Annotated[ + str | None, Field(description="Additional notes on measurement or conditions") + ] = None + + class ServiceCatalogDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -4006,6 +4469,13 @@ class ServiceCatalogDto(BaseModel): ] enabled: bool published: bool + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] overall_status: Annotated[str | None, Field(alias="overallStatus")] = None created_at: Annotated[AwareDatetime, Field(alias="createdAt")] updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] @@ -4147,6 +4617,7 @@ class ServiceIncidentDto(BaseModel): vendor_created_at: Annotated[ AwareDatetime | None, Field(alias="vendorCreatedAt") ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None class ServiceIncidentUpdateDto(BaseModel): @@ -4388,6 +4859,13 @@ class SetAlertChannelsRequest(BaseModel): ] +class SetEnabledRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + enabled: Annotated[ + bool, Field(description="Whether the resource should be enabled") + ] + + class SetMonitorAuthRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig @@ -4536,6 +5014,63 @@ class SlackChannelConfig(BaseModel): ] = None +class SmsChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["sms"], Field(alias="channelType")] = "sms" + phone_number: Annotated[ + str | None, + Field( + alias="phoneNumber", + description="Recipient phone number in E.164 format, e.g. +14155550123", + ), + ] = None + verified_phone_number_id: Annotated[ + int | None, + Field( + alias="verifiedPhoneNumberId", + description="Id of an org verified_phone_number row; alternative to phoneNumber", + ), + ] = None + phone_numbers: Annotated[ + list[str] | None, + Field( + alias="phoneNumbers", + description="Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set", + ), + ] = None + preferred_language: Annotated[ + str | None, + Field( + alias="preferredLanguage", + description="Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US", + ), + ] = None + + +class SourceUrls(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + sla_page: Annotated[ + str | None, Field(alias="slaPage", description="URL to vendor's SLA page") + ] = None + pricing_page: Annotated[ + str | None, + Field(alias="pricingPage", description="URL to vendor's pricing page"), + ] = None + tos_page: Annotated[ + str | None, + Field(alias="tosPage", description="URL to vendor's Terms of Service"), + ] = None + status_page: Annotated[ + str | None, Field(alias="statusPage", description="URL to vendor's status page") + ] = None + all_slas_page: Annotated[ + str | None, + Field( + alias="allSlasPage", description="URL to vendor's all-services SLA listing" + ), + ] = None + + class SplunkOnCallChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["splunk_oncall"], Field(alias="channelType")] = ( @@ -4600,6 +5135,31 @@ class StatusCodeAssertion(BaseModel): ] +class StatusEventDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: Annotated[ + UUID, + Field( + description="Stable row ID (incident/update/maintenance UUID or transition bucket key)" + ), + ] + type: Annotated[ + str, Field(description="Status event row type on the Dependencies Detail rail") + ] + at: Annotated[ + AwareDatetime, + Field( + description="Canonical timestamp used for reverse-chronological ordering" + ), + ] + incident: IncidentEventDto | None = None + maintenance: MaintenanceEventDto | None = None + component: ComponentTransitionEventDto | None = None + org_annotation: Annotated[ + OrgIncidentAnnotationDto | None, Field(alias="orgAnnotation") + ] = None + + class StatusPageBranding(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) logo_url: Annotated[ @@ -5188,6 +5748,24 @@ class TestMatchResult(BaseModel): ] +class TestMonitorNotificationsRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_ids: Annotated[ + list[UUID] | None, + Field( + alias="channelIds", + description="Channel IDs to test; null or empty tests all channels attached to the monitor", + ), + ] = None + include_resolved: Annotated[ + bool, + Field( + alias="includeResolved", + description="Whether to include a resolved notification in the test (default: false)", + ), + ] + + class TestNotificationPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) severity: Annotated[ @@ -5261,7 +5839,10 @@ class TimingPhasesDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) dns_ms: Annotated[ int | None, - Field(description="DNS resolution time in milliseconds", examples=[12]), + Field( + description="Legacy DNS phase; null for new checks (no longer measured)", + examples=[12], + ), ] = None tcp_ms: Annotated[ int | None, Field(description="TCP connect time in milliseconds", examples=[18]) @@ -5489,6 +6070,47 @@ class UpdateAssertionRequest(BaseModel): ] = None +class UpdateDatadogChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["datadog"], Field(alias="channelType")] = "datadog" + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Datadog API key") + ] = None + site: Annotated[ + str | None, + Field( + description="Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)" + ), + ] = None + tags: Annotated[ + str | None, Field(description="Comma-separated tags to attach to events") + ] = None + + +class UpdateDiscordChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["discord"], Field(alias="channelType")] = "discord" + webhook_url: Annotated[ + str | None, Field(alias="webhookUrl", description="Discord webhook URL") + ] = None + mention_role_id: Annotated[ + str | None, + Field( + alias="mentionRoleId", + description="Optional Discord role ID to mention in notifications", + ), + ] = None + + +class UpdateEmailChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["email"], Field(alias="channelType")] = "email" + recipients: Annotated[ + list[EmailStr], + Field(description="Email addresses to send notifications to", min_length=1), + ] + + class UpdateEnvironmentRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -5512,121 +6134,379 @@ class UpdateEnvironmentRequest(BaseModel): ] = None -class UpdateIncidentPolicyRequest(BaseModel): +class UpdateGitLabChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - trigger_rules: Annotated[ - list[TriggerRule], + channel_type: Annotated[Literal["gitlab"], Field(alias="channelType")] = "gitlab" + endpoint_url: Annotated[ + str, Field( - alias="triggerRules", - description="Array of trigger rules; at least one required", + alias="endpointUrl", + description="GitLab alert integration endpoint URL", min_length=1, ), ] - confirmation: ConfirmationPolicy - recovery: RecoveryPolicy - - -class UpdateMaintenanceWindowRequest(BaseModel): - model_config = ConfigDict(extra="forbid", populate_by_name=True) - monitor_id: Annotated[ - UUID | None, - Field( - alias="monitorId", - description="Monitor this window applies to; null switches the window to org-wide", - ), - ] = None - starts_at: Annotated[ - AwareDatetime, - Field(alias="startsAt", description="Updated start time (ISO 8601)"), - ] - ends_at: Annotated[ - AwareDatetime, Field(alias="endsAt", description="Updated end time (ISO 8601)") - ] - repeat_rule: Annotated[ - str | None, - Field( - alias="repeatRule", - description="Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it", - max_length=100, - min_length=0, - ), - ] = None - reason: Annotated[ + authorization_key: Annotated[ str | None, Field( - description="Updated reason (max 500 chars); null clears the existing reason", - max_length=500, - min_length=0, - ), - ] = None - suppress_alerts: Annotated[ - bool | None, - Field( - alias="suppressAlerts", - description="Whether to suppress alerts during this window; null defaults to true", + alias="authorizationKey", + description="Authorization key from GitLab alert integration settings", ), ] = None -class UpdateMonitorAuthRequest(BaseModel): +class UpdateGoogleChatChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig + channel_type: Annotated[Literal["google_chat"], Field(alias="channelType")] = ( + "google_chat" + ) + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Google Chat space webhook URL"), + ] = None -class UpdateOrgDetailsRequest(BaseModel): +class UpdateIncidentIoChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - name: Annotated[ - str, - Field( - description="New organization name (max 200 chars)", - max_length=200, - min_length=0, - ), - ] - email: Annotated[ - EmailStr, - Field(description="New billing and contact email address", min_length=1), - ] - size: Annotated[ + channel_type: Annotated[Literal["incident_io"], Field(alias="channelType")] = ( + "incident_io" + ) + api_key: Annotated[ str | None, Field( - description="Team size range (e.g. 1-10, 11-50)", - max_length=50, - min_length=0, + alias="apiKey", + description="incident.io API key with 'Create incidents' permission", ), ] = None - industry: Annotated[ + severity_id: Annotated[ str | None, Field( - description="Industry vertical (e.g. SaaS, Fintech)", - max_length=100, - min_length=0, + alias="severityId", + description="Severity ID for created incidents (from List Severities API)", ), ] = None - website_url: Annotated[ + visibility: Annotated[ str | None, - Field( - alias="websiteUrl", - description="Organization website URL (max 255 chars)", - max_length=255, - min_length=0, - ), + Field(description="Incident visibility: public or private (default: public)"), ] = None -class UpdateResourceGroupRequest(BaseModel): +class UpdateIncidentPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - name: Annotated[ - str, + trigger_rules: Annotated[ + list[TriggerRule], Field( - description="Human-readable name for this group", - max_length=255, - min_length=0, + alias="triggerRules", + description="Array of trigger rules; at least one required", + min_length=1, ), ] - description: Annotated[ - str | None, - Field(description="Optional description; null clears the existing value"), + confirmation: ConfirmationPolicy + recovery: RecoveryPolicy + + +class Severity5(StrEnum): + down = "DOWN" + degraded = "DEGRADED" + maintenance = "MAINTENANCE" + + +class UpdateIncidentRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + title: Annotated[ + str | None, + Field( + description="New title; null preserves current (min 1 char if present)", + max_length=2147483647, + min_length=1, + ), + ] = None + severity: Annotated[ + Severity5 | None, + Field( + description="New severity: DOWN, DEGRADED, or MAINTENANCE; null preserves current" + ), + ] = None + + +class UpdateJiraChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["jira"], Field(alias="channelType")] = "jira" + domain: Annotated[ + str, + Field( + description="Atlassian instance domain (e.g. yourteam.atlassian.net)", + min_length=1, + ), + ] + email: Annotated[ + str, + Field( + description="Atlassian account email for API authentication", min_length=1 + ), + ] + api_token: Annotated[ + str | None, Field(alias="apiToken", description="Atlassian API token") + ] = None + project_key: Annotated[ + str, + Field( + alias="projectKey", + description="Jira project key where issues are created (e.g. OPS)", + min_length=1, + ), + ] + issue_type: Annotated[ + str | None, + Field( + alias="issueType", description="Issue type name (e.g. Bug, Task, Incident)" + ), + ] = None + + +class UpdateLinearChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["linear"], Field(alias="channelType")] = "linear" + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Linear API key") + ] = None + team_id: Annotated[ + str, + Field(alias="teamId", description="Team ID to create issues in", min_length=1), + ] + label_id: Annotated[ + str | None, + Field(alias="labelId", description="Label ID to attach to created issues"), + ] = None + + +class UpdateMaintenanceWindowRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + monitor_id: Annotated[ + UUID | None, + Field( + alias="monitorId", + description="Monitor this window applies to; null switches the window to org-wide", + ), + ] = None + starts_at: Annotated[ + AwareDatetime, + Field(alias="startsAt", description="Updated start time (ISO 8601)"), + ] + ends_at: Annotated[ + AwareDatetime, Field(alias="endsAt", description="Updated end time (ISO 8601)") + ] + repeat_rule: Annotated[ + str | None, + Field( + alias="repeatRule", + description="Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it", + max_length=100, + min_length=0, + ), + ] = None + reason: Annotated[ + str | None, + Field( + description="Updated reason (max 500 chars); null clears the existing reason", + max_length=500, + min_length=0, + ), + ] = None + suppress_alerts: Annotated[ + bool | None, + Field( + alias="suppressAlerts", + description="Whether to suppress alerts during this window; null defaults to true", + ), + ] = None + + +class UpdateMattermostChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["mattermost"], Field(alias="channelType")] = ( + "mattermost" + ) + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Mattermost incoming webhook URL"), + ] = None + channel: Annotated[ + str | None, Field(description="Override channel (if webhook allows)") + ] = None + icon_url: Annotated[ + str | None, Field(alias="iconUrl", description="Custom bot icon URL") + ] = None + + +class UpdateMonitorAuthRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig + + +class UpdateOpsGenieChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( + "opsgenie" + ) + api_key: Annotated[ + str | None, + Field(alias="apiKey", description="OpsGenie API key for alert creation"), + ] = None + region: Annotated[ + str | None, Field(description="OpsGenie API region: us or eu") + ] = None + + +class UpdateOrgDetailsRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str, + Field( + description="New organization name (max 200 chars)", + max_length=200, + min_length=0, + ), + ] + email: Annotated[ + EmailStr, + Field(description="New billing and contact email address", min_length=1), + ] + size: Annotated[ + str | None, + Field( + description="Team size range (e.g. 1-10, 11-50)", + max_length=50, + min_length=0, + ), + ] = None + industry: Annotated[ + str | None, + Field( + description="Industry vertical (e.g. SaaS, Fintech)", + max_length=100, + min_length=0, + ), + ] = None + website_url: Annotated[ + str | None, + Field( + alias="websiteUrl", + description="Organization website URL (max 255 chars)", + max_length=255, + min_length=0, + ), + ] = None + + +class UpdatePagerDutyChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pagerduty"], Field(alias="channelType")] = ( + "pagerduty" + ) + routing_key: Annotated[ + str | None, + Field( + alias="routingKey", + description="PagerDuty Events API v2 routing (integration) key", + ), + ] = None + severity_override: Annotated[ + str | None, + Field( + alias="severityOverride", description="Override PagerDuty severity mapping" + ), + ] = None + + +class UpdatePhoneCallChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["phone_call"], Field(alias="channelType")] = ( + "phone_call" + ) + phone_number: Annotated[ + str | None, + Field( + alias="phoneNumber", + description="Recipient phone number in E.164 format; null preserves current", + ), + ] = None + verified_phone_number_id: Annotated[ + int | None, + Field( + alias="verifiedPhoneNumberId", + description="Id of an org verified_phone_number row; null preserves current when phoneNumber also null", + ), + ] = None + phone_numbers: Annotated[ + list[str] | None, + Field(alias="phoneNumbers", description="Deprecated: use phoneNumber"), + ] = None + voice_language: Annotated[ + str | None, + Field( + alias="voiceLanguage", + description="TTS voice language/locale (default: en-US). See VoiceLanguage for supported values", + ), + ] = None + preferred_language: Annotated[ + str | None, + Field( + alias="preferredLanguage", + description="Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage", + ), + ] = None + + +class UpdatePushbulletChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pushbullet"], Field(alias="channelType")] = ( + "pushbullet" + ) + access_token: Annotated[ + str | None, Field(alias="accessToken", description="Pushbullet access token") + ] = None + device_iden: Annotated[ + str | None, + Field( + alias="deviceIden", + description="Target device identifier (broadcasts to all if empty)", + ), + ] = None + + +class UpdatePushoverChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pushover"], Field(alias="channelType")] = ( + "pushover" + ) + user_key: Annotated[ + str | None, Field(alias="userKey", description="Pushover user or group key") + ] = None + app_token: Annotated[ + str | None, + Field(alias="appToken", description="Pushover application API token"), + ] = None + priority: Annotated[ + str | None, Field(description="Notification priority override (-2 to 2)") + ] = None + sound: Annotated[str | None, Field(description="Notification sound override")] = ( + None + ) + + +class UpdateResourceGroupRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str, + Field( + description="Human-readable name for this group", + max_length=255, + min_length=0, + ), + ] + description: Annotated[ + str | None, + Field(description="Optional description; null clears the existing value"), ] = None alert_policy_id: Annotated[ UUID | None, @@ -5718,6 +6598,21 @@ class UpdateResourceGroupRequest(BaseModel): ] = None +class UpdateRootlyChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["rootly"], Field(alias="channelType")] = "rootly" + api_key: Annotated[ + str | None, + Field( + alias="apiKey", + description="Rootly API token with incident creation permission", + ), + ] = None + severity: Annotated[ + str | None, Field(description="Severity slug override (e.g. sev0, sev1)") + ] = None + + class UpdateSecretRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) value: Annotated[ @@ -5730,6 +6625,69 @@ class UpdateSecretRequest(BaseModel): ] +class UpdateSlackChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["slack"], Field(alias="channelType")] = "slack" + webhook_url: Annotated[ + str | None, Field(alias="webhookUrl", description="Slack incoming webhook URL") + ] = None + mention_text: Annotated[ + str | None, + Field( + alias="mentionText", + description="Optional mention text included in notifications, e.g. @channel", + ), + ] = None + + +class UpdateSmsChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["sms"], Field(alias="channelType")] = "sms" + phone_number: Annotated[ + str | None, + Field( + alias="phoneNumber", + description="Recipient phone number in E.164 format; null preserves current", + ), + ] = None + verified_phone_number_id: Annotated[ + int | None, + Field( + alias="verifiedPhoneNumberId", + description="Id of an org verified_phone_number row; null preserves current when phoneNumber also null", + ), + ] = None + phone_numbers: Annotated[ + list[str] | None, + Field(alias="phoneNumbers", description="Deprecated: use phoneNumber"), + ] = None + preferred_language: Annotated[ + str | None, + Field( + alias="preferredLanguage", + description="Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US", + ), + ] = None + + +class UpdateSplunkOnCallChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["splunk_oncall"], Field(alias="channelType")] = ( + "splunk_oncall" + ) + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Splunk On-Call REST API key") + ] = None + routing_key: Annotated[ + str, + Field( + alias="routingKey", + description="Routing key for alert routing", + min_length=1, + ), + ] + + class UpdateStatusPageComponentGroupRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -5905,19 +6863,70 @@ class UpdateStatusPageRequest(BaseModel): alias="managedBy", description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.", ), - ] = None + ] = None + + +class UpdateTagRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str | None, Field(description="New tag name", max_length=100, min_length=0) + ] = None + color: Annotated[ + str | None, + Field( + description="New hex color code", + pattern="^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", + ), + ] = None + + +class UpdateTeamsChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["teams"], Field(alias="channelType")] = "teams" + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Microsoft Teams incoming webhook URL"), + ] = None + + +class UpdateTelegramChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["telegram"], Field(alias="channelType")] = ( + "telegram" + ) + bot_token: Annotated[ + str | None, + Field(alias="botToken", description="Telegram bot token from @BotFather"), + ] = None + chat_id: Annotated[ + str, + Field( + alias="chatId", + description="Chat, group, or channel ID to send alerts to", + min_length=1, + ), + ] -class UpdateTagRequest(BaseModel): +class UpdateWebhookChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - name: Annotated[ - str | None, Field(description="New tag name", max_length=100, min_length=0) + channel_type: Annotated[Literal["webhook"], Field(alias="channelType")] = "webhook" + url: Annotated[ + str | None, + Field(description="Webhook endpoint URL that receives alert payloads"), ] = None - color: Annotated[ + signing_secret: Annotated[ str | None, Field( - description="New hex color code", - pattern="^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$", + alias="signingSecret", + description="HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", + ), + ] = None + custom_headers: Annotated[ + dict[str, str] | None, + Field( + alias="customHeaders", + description="Additional HTTP headers to include in webhook requests", ), ] = None @@ -5960,6 +6969,15 @@ class UpdateWorkspaceRequest(BaseModel): ] +class UpdateZapierChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["zapier"], Field(alias="channelType")] = "zapier" + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Zapier/n8n/Make catch webhook URL"), + ] = None + + class UptimeBucketDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) timestamp: Annotated[ @@ -6029,6 +7047,32 @@ class UptimeDto(BaseModel): examples=[312], ), ] = None + p50_latency_ms: Annotated[ + float | None, + Field( + alias="p50LatencyMs", + description="50th-percentile (median) latency in milliseconds; null when no data", + examples=[128], + ), + ] = None + incident_count: Annotated[ + int, + Field( + alias="incidentCount", + description="Number of incidents that started within the requested window", + examples=[2], + ), + ] + + +class VoiceLanguageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + code: Annotated[ + str, Field(description="BCP-47 locale code, e.g. en-US", min_length=1) + ] + label: Annotated[ + str, Field(description="Human-readable label, e.g. English (US)", min_length=1) + ] class WebhookChannelConfig(BaseModel): @@ -6045,7 +7089,7 @@ class WebhookChannelConfig(BaseModel): str | None, Field( alias="signingSecret", - description="Optional HMAC signing secret for payload verification", + description="HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", ), ] = None custom_headers: Annotated[ @@ -6278,6 +7322,40 @@ class BulkMonitorActionResult(BaseModel): ] +class Code(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + check_type: Literal["code"] = "code" + exit_code: Annotated[ + int, Field(alias="exitCode", description="Container exit code (0 = pass)") + ] + stdout_snippet: Annotated[ + str | None, + Field(alias="stdoutSnippet", description="Truncated stdout from the container"), + ] = None + stderr_snippet: Annotated[ + str | None, + Field(alias="stderrSnippet", description="Truncated stderr from the container"), + ] = None + steps: Annotated[ + list[CodeCheckStep] | None, + Field(description="Named steps extracted from Playwright test output"), + ] = None + failure_kind: Annotated[ + str | None, + Field( + alias="failureKind", + description="Failure classification: timeout, assertion, or error", + ), + ] = None + timed_out: Annotated[ + bool | None, + Field( + alias="timedOut", + description="Whether the run hit a step/total/run-budget timeout", + ), + ] = None + + class ComponentUptimeDayDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) date: Annotated[ @@ -6342,10 +7420,12 @@ class CreateAlertChannelRequest(BaseModel): | MattermostChannelConfig | OpsGenieChannelConfig | PagerDutyChannelConfig + | PhoneCallChannelConfig | PushbulletChannelConfig | PushoverChannelConfig | RootlyChannelConfig | SlackChannelConfig + | SmsChannelConfig | SplunkOnCallChannelConfig | TeamsChannelConfig | TelegramChannelConfig @@ -6434,6 +7514,7 @@ class CreateMonitorRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) frequency_seconds: Annotated[ @@ -6640,6 +7721,36 @@ class CreateStatusPageRequest(BaseModel): ] = None +class CreditPolicy(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + summary: Annotated[ + str | None, Field(description="Brief summary of credit policy") + ] = None + max_credit_percent: Annotated[ + int | None, + Field( + alias="maxCreditPercent", description="Max credit as percent of monthly fee" + ), + ] = None + claim_window_days: Annotated[ + int | None, + Field( + alias="claimWindowDays", + description="Days to submit a credit claim after eligibility", + ), + ] = None + credit_application_days: Annotated[ + int | None, + Field( + alias="creditApplicationDays", + description="Days for credit to be applied after approval", + ), + ] = None + tiers: Annotated[ + list[CreditTier] | None, Field(description="Credit tiers by uptime threshold") + ] = None + + class CursorPageServiceCatalogDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[list[ServiceCatalogDto], Field(description="Items on this page")] @@ -6676,6 +7787,24 @@ class CursorPageServicePollResultDto(BaseModel): ] +class CursorPageStatusEventDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: Annotated[list[StatusEventDto], Field(description="Items on this page")] + next_cursor: Annotated[ + str | None, + Field( + alias="nextCursor", + description="Opaque cursor for the next page; null when there are no more results", + ), + ] = None + has_more: Annotated[ + bool, + Field( + alias="hasMore", description="Whether more results exist beyond this page" + ), + ] + + class DashboardOverviewDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) monitors: MonitorsSummaryDto @@ -7004,9 +8133,6 @@ class MonitorDto(BaseModel): """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" model_config = ConfigDict(extra="ignore", populate_by_name=True) - """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" - - model_config = ConfigDict(extra="forbid", populate_by_name=True) id: Annotated[UUID, Field(description="Unique monitor identifier")] organization_id: Annotated[ int, @@ -7024,6 +8150,7 @@ class MonitorDto(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) frequency_seconds: Annotated[ @@ -7100,6 +8227,7 @@ class MonitorTestRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) assertions: Annotated[ @@ -7287,48 +8415,6 @@ class ResourceGroupDto(BaseModel): ] -class ServiceDetailDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - slug: str - name: str - category: str | None = None - official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None - developer_context: Annotated[str | None, Field(alias="developerContext")] = None - logo_url: Annotated[str | None, Field(alias="logoUrl")] = None - adapter_type: Annotated[str, Field(alias="adapterType")] - polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] - lifecycle_status: Annotated[ - str, - Field( - alias="lifecycleStatus", - description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", - ), - ] - enabled: bool - created_at: Annotated[AwareDatetime, Field(alias="createdAt")] - updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] - current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( - None - ) - recent_incidents: Annotated[ - list[ServiceIncidentDto], Field(alias="recentIncidents") - ] - components: list[ServiceComponentDto] - components_summary: Annotated[ - ComponentsSummaryDto | None, Field(alias="componentsSummary") - ] = None - uptime: ComponentUptimeSummaryDto | None = None - active_maintenances: Annotated[ - list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") - ] - data_completeness: Annotated[str, Field(alias="dataCompleteness")] - seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None - related_services: Annotated[ - list[ServiceCatalogDto] | None, Field(alias="relatedServices") - ] = None - - class ServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7342,6 +8428,7 @@ class ServiceIncidentDetailDto(BaseModel): affected_components: Annotated[ list[str] | None, Field(alias="affectedComponents") ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None updates: list[ServiceIncidentUpdateDto] @@ -7432,11 +8519,6 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto -class SingleValueResponseServiceDetailDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: ServiceDetailDto - - class SingleValueResponseServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceIncidentDetailDto @@ -7512,6 +8594,48 @@ class SingleValueResponseWorkspaceDto(BaseModel): data: WorkspaceDto +class SlaDataDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + sla_type: Annotated[ + str | None, + Field( + alias="slaType", + description="SLA pattern: plan_gated, per_service, no_public_sla, or universal", + ), + ] = None + official_sla: Annotated[OfficialSla | None, Field(alias="officialSla")] = None + service_breakdown: Annotated[ + list[ServiceBreakdown] | None, + Field( + alias="serviceBreakdown", + description="Per-service breakdown for vendors with per_service SLA type", + ), + ] = None + pricing_tiers: Annotated[ + list[PricingTier] | None, + Field( + alias="pricingTiers", description="Pricing tiers with associated SLA levels" + ), + ] = None + credit_policy: Annotated[CreditPolicy | None, Field(alias="creditPolicy")] = None + no_sla_context: Annotated[NoSlaContext | None, Field(alias="noSlaContext")] = None + source_urls: Annotated[SourceUrls | None, Field(alias="sourceUrls")] = None + last_researched: Annotated[ + str | None, + Field( + alias="lastResearched", + description="ISO date when this data was last manually researched", + ), + ] = None + research_notes: Annotated[ + str | None, + Field( + alias="researchNotes", + description="Freeform operator notes about the research", + ), + ] = None + + class StatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7621,6 +8745,24 @@ class TableValueResultTagDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None +class TableValueResultTestChannelResult(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[TestChannelResult] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + +class TableValueResultVoiceLanguageDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[VoiceLanguageDto] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + class TableValueResultWebhookDeliveryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[WebhookDeliveryDto] @@ -7662,10 +8804,12 @@ class TestAlertChannelRequest(BaseModel): | MattermostChannelConfig | OpsGenieChannelConfig | PagerDutyChannelConfig + | PhoneCallChannelConfig | PushbulletChannelConfig | PushoverChannelConfig | RootlyChannelConfig | SlackChannelConfig + | SmsChannelConfig | SplunkOnCallChannelConfig | TeamsChannelConfig | TelegramChannelConfig @@ -7686,26 +8830,28 @@ class UpdateAlertChannelRequest(BaseModel): ), ] config: Annotated[ - DatadogChannelConfig - | DiscordChannelConfig - | EmailChannelConfig - | GitLabChannelConfig - | GoogleChatChannelConfig - | IncidentIoChannelConfig - | JiraChannelConfig - | LinearChannelConfig - | MattermostChannelConfig - | OpsGenieChannelConfig - | PagerDutyChannelConfig - | PushbulletChannelConfig - | PushoverChannelConfig - | RootlyChannelConfig - | SlackChannelConfig - | SplunkOnCallChannelConfig - | TeamsChannelConfig - | TelegramChannelConfig - | WebhookChannelConfig - | ZapierChannelConfig, + UpdateDatadogChannelConfig + | UpdateDiscordChannelConfig + | UpdateEmailChannelConfig + | UpdateGitLabChannelConfig + | UpdateGoogleChatChannelConfig + | UpdateIncidentIoChannelConfig + | UpdateJiraChannelConfig + | UpdateLinearChannelConfig + | UpdateMattermostChannelConfig + | UpdateOpsGenieChannelConfig + | UpdatePagerDutyChannelConfig + | UpdatePhoneCallChannelConfig + | UpdatePushbulletChannelConfig + | UpdatePushoverChannelConfig + | UpdateRootlyChannelConfig + | UpdateSlackChannelConfig + | UpdateSmsChannelConfig + | UpdateSplunkOnCallChannelConfig + | UpdateTeamsChannelConfig + | UpdateTelegramChannelConfig + | UpdateWebhookChannelConfig + | UpdateZapierChannelConfig, Field(discriminator="channel_type"), ] managed_by: Annotated[ @@ -7715,6 +8861,12 @@ class UpdateAlertChannelRequest(BaseModel): description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.", ), ] = None + enabled: Annotated[ + bool | None, + Field( + description="Whether this channel is enabled (default: true); null preserves current value" + ), + ] = None class UpdateMonitorRequest(BaseModel): @@ -7733,6 +8885,7 @@ class UpdateMonitorRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig | None ) = None @@ -7906,9 +9059,9 @@ class CheckTraceDto(BaseModel): ] = None -class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer]): +class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer | Code]): root: Annotated[ - Http | Tcp | Icmp | Dns | McpServer, + Http | Tcp | Icmp | Dns | McpServer | Code, Field( description="Check-type-specific details — polymorphic by check_type discriminator", discriminator="check_type", @@ -7945,6 +9098,56 @@ class CreateNotificationPolicyRequest(BaseModel): ] = 0 +class ServiceDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: UUID + slug: str + name: str + category: str | None = None + official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None + developer_context: Annotated[str | None, Field(alias="developerContext")] = None + logo_url: Annotated[str | None, Field(alias="logoUrl")] = None + adapter_type: Annotated[str, Field(alias="adapterType")] + polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] + lifecycle_status: Annotated[ + str, + Field( + alias="lifecycleStatus", + description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + ), + ] + enabled: bool + created_at: Annotated[AwareDatetime, Field(alias="createdAt")] + updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] + current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( + None + ) + recent_incidents: Annotated[ + list[ServiceIncidentDto], Field(alias="recentIncidents") + ] + components: list[ServiceComponentDto] + components_summary: Annotated[ + ComponentsSummaryDto | None, Field(alias="componentsSummary") + ] = None + uptime: ComponentUptimeSummaryDto | None = None + active_maintenances: Annotated[ + list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + ] + data_completeness: Annotated[str, Field(alias="dataCompleteness")] + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] + seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None + sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None + related_services: Annotated[ + list[ServiceCatalogDto] | None, Field(alias="relatedServices") + ] = None + + class SingleValueResponseBatchComponentUptimeDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: BatchComponentUptimeDto @@ -7955,6 +9158,11 @@ class SingleValueResponseCheckTraceDto(BaseModel): data: CheckTraceDto +class SingleValueResponseServiceDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: ServiceDetailDto + + class SingleValueResponseStatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: StatusPageIncidentDto