From 5ee8c46ecc618353a5bc751bbb6a4871e1454918 Mon Sep 17 00:00:00 2001 From: caballeto Date: Sun, 23 Aug 2026 12:19:35 +0200 Subject: [PATCH 1/2] feat: add status-page maintenance command family Absorb the split incidents/maintenance API and add `status-pages maintenance` commands. `--scheduled` on incident create now errors instead of silently creating an incident. Wire new authoring fields (NP description, channel enabled, sms/phone_call, DEPENDENCY components) instead of hiding them from parity tests. Co-authored-by: Cursor --- docs/openapi/monitoring-api.json | 13021 ++++++++++++---- scripts/generate-skill-references.mjs | 1 + .../status-page-components.fields.md | 16 +- .../status-page-incidents.fields.md | 9 +- .../status-page-maintenance.fields.md | 19 + .../status-page-subscribers.fields.md | 12 +- .../_generated/status-pages.fields.md | 1 + .../references/incidents.md | 43 +- .../references/status-pages.md | 10 +- .../_generated/alert-channels.fields.md | 2 + .../references/_generated/monitors.fields.md | 2 +- .../notification-policies.fields.md | 7 + .../_generated/resource-groups.fields.md | 6 +- .../references/_generated/incidents.fields.md | 13 + src/commands/status-pages/incidents/create.ts | 11 +- .../status-pages/maintenance/create.ts | 41 + .../status-pages/maintenance/delete.ts | 21 + .../status-pages/maintenance/dismiss.ts | 21 + src/commands/status-pages/maintenance/get.ts | 21 + src/commands/status-pages/maintenance/list.ts | 36 + .../status-pages/maintenance/post-update.ts | 32 + .../status-pages/maintenance/publish.ts | 21 + .../status-pages/maintenance/update.ts | 39 + src/lib/api-zod.generated.ts | 984 +- src/lib/api.generated.ts | 6723 ++++++-- src/lib/descriptions.generated.ts | 15 +- src/lib/resources.ts | 2 + src/lib/spec-facts.generated.ts | 6 +- src/lib/yaml/handlers.ts | 32 +- src/lib/yaml/schema.ts | 4 + src/lib/yaml/transform.ts | 4 + src/lib/yaml/validator.ts | 4 + src/lib/yaml/zod-schemas.ts | 15 + .../yaml/invalid/bad-channel-type.yml | 2 +- test/yaml/differ.test.ts | 2 +- test/yaml/negative-validation.test.ts | 2 +- test/yaml/spec-field-parity.test.ts | 16 +- test/yaml/zod-schemas.test.ts | 2 +- 38 files changed, 16882 insertions(+), 4336 deletions(-) create mode 100644 skills/devhelm-communicate/references/_generated/status-page-maintenance.fields.md create mode 100644 src/commands/status-pages/maintenance/create.ts create mode 100644 src/commands/status-pages/maintenance/delete.ts create mode 100644 src/commands/status-pages/maintenance/dismiss.ts create mode 100644 src/commands/status-pages/maintenance/get.ts create mode 100644 src/commands/status-pages/maintenance/list.ts create mode 100644 src/commands/status-pages/maintenance/post-update.ts create mode 100644 src/commands/status-pages/maintenance/publish.ts create mode 100644 src/commands/status-pages/maintenance/update.ts diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index a9b7d44..146f30f 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,254 @@ } } }, - "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" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed 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/api-keys/{id}": { + "delete": { + "tags": [ + "API Keys" + ], + "summary": "Delete API key", + "operationId": "delete_11", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "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" + } + } + } + } + } + }, + "patch": { + "tags": [ + "API Keys" + ], + "summary": "Update API key", + "operationId": "update_16", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateApiKeyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseApiKeyDto" } } } @@ -2005,7 +2129,7 @@ "Audit Log" ], "summary": "List audit events for the current organization", - "operationId": "list_19", + "operationId": "list_20", "parameters": [ { "name": "action", @@ -3556,7 +3680,7 @@ "Forensics" ], "summary": "Paged list of rule evaluations for a monitor", - "description": "Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations, and occurredAt window.", + "description": "Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations. Time window defaults to the last 7 days when from/to are omitted; windows wider than 30 days are clamped.", "operationId": "listMonitorRuleEvaluations", "parameters": [ { @@ -3718,7 +3842,8 @@ "tags": [ "Forensics" ], - "summary": "Paged list of state transitions for a monitor (optionally time-bounded)", + "summary": "Paged list of state transitions for a monitor", + "description": "Time window defaults to the last 30 days when from/to are omitted; windows wider than 90 days are clamped.", "operationId": "listMonitorTransitions", "parameters": [ { @@ -4545,7 +4670,8 @@ "Incidents" ], "summary": "Get incident details including update timeline", - "operationId": "get_11", + "description": "Shell payload: incident row, updates, and linked status-page incidents. Trigger enrichment (forensics / check_results) is GET /{id}/trigger so first paint is not blocked on hypertable reads.", + "operationId": "get_9", "parameters": [ { "name": "id", @@ -4649,15 +4775,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 +4797,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" + "$ref": "#/components/schemas/UpdateIncidentRequest" } } - } + }, + "required": true }, "responses": { "200": { @@ -4772,13 +4897,14 @@ } } }, - "/api/v1/incidents/{id}/updates": { + "/api/v1/incidents/{id}/acknowledge": { "post": { "tags": [ "Incidents" ], - "summary": "Add an update to an incident (optionally change status)", - "operationId": "addUpdate", + "summary": "Acknowledge all open notification dispatches for an incident", + "description": "Atomically acknowledges every DELIVERED or ESCALATING dispatch for the incident. Already-acknowledged and non-acknowledgeable dispatches are returned in skipped (not errors). MEMBER+.", + "operationId": "acknowledgeAll", "parameters": [ { "name": "id", @@ -4790,23 +4916,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddIncidentUpdateRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + "$ref": "#/components/schemas/SingleValueResponseAcknowledgeAllIncidentsResponse" } } } @@ -4894,21 +5010,50 @@ } } }, - "/api/v1/integrations": { + "/api/v1/incidents/{id}/events": { "get": { "tags": [ - "Integrations" + "Incidents" + ], + "summary": "List merged activity events for an incident", + "description": "Cursor-paginated unified activity stream merging incident updates, notification dispatches, alert deliveries, forensic state transitions, and linked status-page updates. Ordered by time descending.", + "operationId": "listEvents_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + } + } ], - "summary": "List all supported integration types", - "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", - "operationId": "list_18", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultIntegrationDto" + "$ref": "#/components/schemas/CursorPageIncidentActivityEventDto" } } } @@ -4996,20 +5141,52 @@ } } }, - "/api/v1/invites": { + "/api/v1/incidents/{id}/related": { "get": { "tags": [ - "Invites" + "Incidents" + ], + "summary": "List related incidents sharing the same origin", + "description": "Returns same-origin recurrence (monitor, service, or resource group) within the window, excluding the current incident. total is the full count for “Nth outage this month” copy.", + "operationId": "listRelated", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowDays", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 30 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 3 + } + } ], - "summary": "List invites", - "operationId": "list_10", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultInviteDto" + "$ref": "#/components/schemas/RelatedIncidentsResponse" } } } @@ -5095,30 +5272,42 @@ } } } - }, + } + }, + "/api/v1/incidents/{id}/resolve": { "post": { "tags": [ - "Invites" + "Incidents" + ], + "summary": "Resolve an incident", + "operationId": "resolve", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create invite", - "operationId": "create_11", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateInviteRequest" + "$ref": "#/components/schemas/ResolveIncidentRequest" } } - }, - "required": true + } }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" } } } @@ -5206,21 +5395,22 @@ } } }, - "/api/v1/invites/{inviteId}/resend": { - "post": { + "/api/v1/incidents/{id}/trigger": { + "get": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Resend invite", - "operationId": "resend_1", + "summary": "Get incident trigger enrichment", + "description": "Rule type, count/threshold, last error, and first-failed-check time derived from forensics and check_results. Not required to render the incident shell.", + "operationId": "getTrigger", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], @@ -5230,7 +5420,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseInviteDto" + "$ref": "#/components/schemas/SingleValueResponseIncidentTriggerDto" } } } @@ -5318,27 +5508,44 @@ } } }, - "/api/v1/invites/{inviteId}/revoke": { + "/api/v1/incidents/{id}/updates": { "post": { "tags": [ - "Invites" + "Incidents" ], - "summary": "Revoke invite", - "operationId": "revoke", + "summary": "Add an update to an incident (optionally change status)", + "operationId": "addUpdate", "parameters": [ { - "name": "inviteId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -5423,42 +5630,21 @@ } } }, - "/api/v1/maintenance-windows": { + "/api/v1/integrations": { "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" - } - } + "Integrations" ], + "summary": "List all supported integration types", + "description": "Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.", + "operationId": "list_19", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" + "$ref": "#/components/schemas/TableValueResultIntegrationDto" } } } @@ -5544,31 +5730,23 @@ } } } - }, - "post": { + } + }, + "/api/v1/integrations/voice-languages": { + "get": { "tags": [ - "Maintenance Windows" + "Integrations" ], - "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 - }, + "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/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/TableValueResultVoiceLanguageDto" } } } @@ -5656,31 +5834,20 @@ } } }, - "/api/v1/maintenance-windows/{id}": { + "/api/v1/invites": { "get": { "tags": [ - "Maintenance Windows" - ], - "summary": "Get a single maintenance window by ID", - "operationId": "getById_2", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Invites" ], + "summary": "List invites", + "operationId": "list_10", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/TableValueResultInviteDto" } } } @@ -5767,40 +5934,29 @@ } } }, - "put": { + "post": { "tags": [ - "Maintenance Windows" - ], - "summary": "Update a maintenance window", - "operationId": "update_12", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Invites" ], + "summary": "Create invite", + "operationId": "create_11", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMaintenanceWindowRequest" + "$ref": "#/components/schemas/CreateInviteRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "$ref": "#/components/schemas/SingleValueResponseInviteDto" } } } @@ -5886,21 +6042,135 @@ } } } - }, - "delete": { + } + }, + "/api/v1/invites/{inviteId}/resend": { + "post": { "tags": [ - "Maintenance Windows" + "Invites" ], - "summary": "Delete a maintenance window", - "operationId": "delete_8", + "summary": "Resend invite", + "operationId": "resend_1", "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/SingleValueResponseInviteDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/invites/{inviteId}/revoke": { + "post": { + "tags": [ + "Invites" + ], + "summary": "Revoke invite", + "operationId": "revoke", + "parameters": [ + { + "name": "inviteId", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" } } ], @@ -5991,20 +6261,32 @@ } } }, - "/api/v1/members": { + "/api/v1/maintenance-windows": { "get": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "List organization members", - "operationId": "list_17", + "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": "pageable", + "name": "monitorId", "in": "query", - "required": true, + "description": "Filter by monitor UUID", + "required": false, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "filter", + "in": "query", + "description": "Filter by status: 'active' or 'upcoming'", + "required": false, + "schema": { + "type": "string" } } ], @@ -6014,7 +6296,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMemberDto" + "$ref": "#/components/schemas/TableValueResultMaintenanceWindowDto" } } } @@ -6100,29 +6382,34 @@ } } } - } - }, - "/api/v1/members/{userId}": { - "delete": { + }, + "post": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "Remove member from organization", - "operationId": "remove_2", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" + "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", @@ -6207,38 +6494,35 @@ } } }, - "/api/v1/members/{userId}/role": { - "put": { + "/api/v1/maintenance-windows/{id}": { + "get": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "Change member role", - "operationId": "changeRole", + "summary": "Get a single maintenance window by ID", + "operationId": "getById_2", "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" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -6320,23 +6604,21 @@ } } } - } - }, - "/api/v1/members/{userId}/status": { + }, "put": { "tags": [ - "Members" + "Maintenance Windows" ], - "summary": "Change member status", - "operationId": "changeStatus", + "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" } } ], @@ -6344,15 +6626,22 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChangeStatusRequest" + "$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", @@ -6435,124 +6724,27 @@ } } } - } - }, - "/api/v1/monitors": { - "get": { + }, + "delete": { "tags": [ - "Monitors" + "Maintenance Windows" ], - "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": "Delete a maintenance window", + "operationId": "delete_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" - ] - } - }, - { - "name": "managedBy", - "in": "query", - "description": "Filter by managed-by source", - "required": false, - "schema": { - "type": "string", - "enum": [ - "DASHBOARD", - "CLI", - "TERRAFORM", - "MCP", - "API" - ] - } - }, - { - "name": "tags", - "in": "query", - "description": "Filter by tag names, comma-separated (e.g. prod,critical); OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "tag", - "in": "query", - "description": "Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive name search", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "environmentId", - "in": "query", - "description": "Filter by environment ID", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -6635,30 +6827,32 @@ } } } - }, - "post": { + } + }, + "/api/v1/members": { + "get": { "tags": [ - "Monitors" + "Members" ], - "summary": "Create a new monitor", - "operationId": "create_9", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMonitorRequest" - } + "summary": "List organization members", + "operationId": "list_18", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMemberDto" } } } @@ -6746,34 +6940,27 @@ } } }, - "/api/v1/monitors/{id}": { - "get": { + "/api/v1/members/{userId}": { + "delete": { "tags": [ - "Monitors" + "Members" ], - "summary": "Get a single monitor by id", - "operationId": "get_6", + "summary": "Remove member from organization", + "operationId": "remove_2", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -6856,21 +7043,23 @@ } } } - }, + } + }, + "/api/v1/members/{userId}/role": { "put": { "tags": [ - "Monitors" + "Members" ], - "summary": "Update a monitor", - "operationId": "update_11", + "summary": "Change member role", + "operationId": "changeRole", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], @@ -6878,22 +7067,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorRequest" + "$ref": "#/components/schemas/ChangeRoleRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -6976,24 +7158,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/members/{userId}/status": { + "put": { "tags": [ - "Monitors" + "Members" ], - "summary": "Soft-delete a monitor", - "operationId": "delete_7", + "summary": "Change member status", + "operationId": "changeStatus", "parameters": [ { - "name": "id", + "name": "userId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int32" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeStatusRequest" + } + } + }, + "required": true + }, "responses": { "204": { "description": "No Content" @@ -7081,22 +7275,112 @@ } } }, - "/api/v1/monitors/{id}/pause": { - "post": { + "/api/v1/monitors": { + "get": { "tags": [ "Monitors" ], - "summary": "Pause a monitor (set enabled=false)", - "operationId": "pause", + "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": "id", - "in": "path", - "required": true, + "name": "enabled", + "in": "query", + "description": "Filter by enabled state (true/false)", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "status", + "in": "query", + "description": "Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied.", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Filter by monitor type", + "required": false, + "schema": { + "type": "string", + "enum": [ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" + ] + } + }, + { + "name": "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": { @@ -7105,7 +7389,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" + "$ref": "#/components/schemas/TableValueResultMonitorDto" } } } @@ -7191,103 +7475,40 @@ } } } - } - }, - "/api/v1/monitors/{id}/results": { - "get": { + }, + "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", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "from", - "in": "query", - "description": "Start of time range (ISO 8601, inclusive); defaults to 24 hours ago", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "description": "End of time range (ISO 8601, inclusive); defaults to now", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response for pagination", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Maximum results per page (1–200)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - }, - "example": 50 - }, - { - "name": "region", - "in": "query", - "description": "Filter by region (e.g. us-east)", - "required": false, - "schema": { - "type": "string" + "summary": "Create a new monitor", + "operationId": "create_9", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMonitorRequest" + } } }, - { - "name": "passed", - "in": "query", - "description": "Filter by pass/fail status", - "required": false, - "schema": { - "type": "boolean" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "Paginated check results", + "201": { + "description": "Created", "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 +7524,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 +7586,13 @@ } } }, - "/api/v1/monitors/{id}/results/summary": { + "/api/v1/monitors/{id}": { "get": { "tags": [ - "Check Results" + "Monitors" ], - "summary": "Get results summary", - "description": "Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.", - "operationId": "getSummary", + "summary": "Get a single monitor by id", + "operationId": "get_6", "parameters": [ { "name": "id", @@ -7382,40 +7602,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 +7636,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" } } } @@ -7491,15 +7696,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/resume": { - "post": { + }, + "put": { "tags": [ "Monitors" ], - "summary": "Resume a monitor (set enabled=true)", - "operationId": "resume", + "summary": "Update a monitor", + "operationId": "update_11", "parameters": [ { "name": "id", @@ -7511,6 +7714,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", @@ -7603,16 +7816,13 @@ } } } - } - }, - "/api/v1/monitors/{id}/rotate-token": { - "post": { + }, + "delete": { "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": "Soft-delete a monitor", + "operationId": "delete_7", "parameters": [ { "name": "id", @@ -7625,15 +7835,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -7718,13 +7921,13 @@ } } }, - "/api/v1/monitors/{id}/tags": { - "get": { + "/api/v1/monitors/{id}/pause": { + "post": { "tags": [ "Monitors" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "summary": "Pause a monitor (set enabled=false)", + "operationId": "pause", "parameters": [ { "name": "id", @@ -7742,7 +7945,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -7828,13 +8031,16 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/results": { + "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "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", @@ -7844,35 +8050,84 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" - } + }, + { + "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" } }, - "required": true - }, + { + "name": "to", + "in": "query", + "description": "End of time range (ISO 8601, inclusive); defaults to now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response for pagination", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Maximum results per page (1–200)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 + }, + "example": 50 + }, + { + "name": "region", + "in": "query", + "description": "Filter by region (e.g. us-east)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "passed", + "in": "query", + "description": "Filter by pass/fail status", + "required": false, + "schema": { + "type": "boolean" + } + } + ], "responses": { "200": { - "description": "OK", + "description": "Paginated check results", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$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" } } } @@ -7888,21 +8143,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" } } } @@ -7948,13 +8203,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/results/summary": { + "get": { "tags": [ - "Monitors" + "Check Results" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "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", @@ -7964,28 +8222,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" + ] + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "responses": { + "200": { + "description": "Results summary", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ResultSummaryDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid chartWindow parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseResultSummaryDto" } } } @@ -8001,21 +8271,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" } } } @@ -8063,14 +8333,13 @@ } } }, - "/api/v1/monitors/{id}/test": { + "/api/v1/monitors/{id}/resume": { "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": "Resume a monitor (set enabled=true)", + "operationId": "resume", "parameters": [ { "name": "id", @@ -8088,7 +8357,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -8176,142 +8445,14 @@ } } }, - "/api/v1/monitors/{id}/uptime": { - "get": { - "tags": [ - "Check Results" - ], - "summary": "Get uptime statistics", - "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows.", - "operationId": "getUptime", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "window", - "in": "query", - "description": "Time window for uptime calculation", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d" - ] - } - } - ], - "responses": { - "200": { - "description": "Uptime statistics", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/UptimeDto" - } - } - } - }, - "400": { - "description": "Invalid window parameter", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Monitor does not belong to the caller's org", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" - } - } - } - }, - "404": { - "description": "Monitor not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseUptimeDto" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/monitors/{id}/versions": { - "get": { + "/api/v1/monitors/{id}/rotate-token": { + "post": { "tags": [ "Monitors" ], - "summary": "List version history for a monitor", - "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", - "operationId": "listVersions", + "summary": "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", @@ -8321,14 +8462,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { @@ -8337,7 +8470,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorDto" } } } @@ -8425,14 +8558,14 @@ } } }, - "/api/v1/monitors/{id}/versions/{version}": { + "/api/v1/monitors/{id}/status-pages": { "get": { "tags": [ "Monitors" ], - "summary": "Get a specific version snapshot for a monitor", - "description": "Returns the full monitor config snapshot captured at the given version number.", - "operationId": "getVersion", + "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", @@ -8442,15 +8575,6 @@ "type": "string", "format": "uuid" } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "format": "int32" - } } ], "responses": { @@ -8459,7 +8583,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -8547,16 +8671,16 @@ } } }, - "/api/v1/monitors/{monitorId}/alert-channels": { - "put": { + "/api/v1/monitors/{id}/tags": { + "get": { "tags": [ - "Monitor Alert Channels" + "Monitors" ], - "summary": "Replace the linked alert channel set for a monitor", - "operationId": "setChannels", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -8565,23 +8689,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetAlertChannelsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseListUUID" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -8667,18 +8781,16 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions": { + }, "post": { "tags": [ - "Monitor Assertions" + "Monitors" ], - "summary": "Add an assertion to a monitor", - "operationId": "add", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -8691,19 +8803,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateAssertionRequest" + "$ref": "#/components/schemas/AddMonitorTagsRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "$ref": "#/components/schemas/TableValueResultTagDto" } } } @@ -8789,27 +8901,16 @@ } } } - } - }, - "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { - "put": { + }, + "delete": { "tags": [ - "Monitor Assertions" + "Monitors" ], - "summary": "Update an assertion on a monitor", - "operationId": "update_10", + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", "parameters": [ { - "name": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -8822,22 +8923,15 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateAssertionRequest" + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -8920,25 +9014,19 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/test": { + "post": { "tags": [ - "Monitor Assertions" + "Monitors" ], - "summary": "Remove an assertion from a monitor", - "operationId": "remove_1", + "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": "monitorId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "assertionId", + "name": "id", "in": "path", "required": true, "schema": { @@ -8948,8 +9036,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -9034,16 +9129,17 @@ } } }, - "/api/v1/monitors/{monitorId}/auth": { - "put": { + "/api/v1/monitors/{id}/test-notifications": { + "post": { "tags": [ - "Monitor Auth" + "Monitors" ], - "summary": "Update authentication config for a monitor", - "operationId": "update_9", + "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": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { @@ -9056,7 +9152,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" } } }, @@ -9068,7 +9164,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -9154,51 +9250,59 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/uptime": { + "get": { "tags": [ - "Monitor Auth" + "Check Results" ], - "summary": "Set authentication config for a monitor", - "operationId": "set", + "summary": "Get uptime statistics", + "description": "Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows.", + "operationId": "getUptime", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "window", + "in": "query", + "description": "Time window for uptime calculation", + "required": false, + "schema": { + "type": "string", + "enum": [ + "24h", + "7d", + "30d", + "90d" + ] + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetMonitorAuthRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "Uptime statistics", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" + "$ref": "#/components/schemas/UptimeDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Invalid window parameter", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -9214,21 +9318,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/SingleValueResponseUptimeDto" } } } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseUptimeDto" } } } @@ -9274,27 +9378,45 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/{id}/versions": { + "get": { "tags": [ - "Monitor Auth" + "Monitors" ], - "summary": "Remove authentication config from a monitor", - "operationId": "remove", + "summary": "List version history for a monitor", + "description": "Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.", + "operationId": "listVersions", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultMonitorVersionDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -9379,33 +9501,41 @@ } } }, - "/api/v1/monitors/{monitorId}/policy": { + "/api/v1/monitors/{id}/versions/{version}": { "get": { "tags": [ - "Incident Policies" + "Monitors" ], - "summary": "Get incident policy for a monitor", - "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", - "operationId": "get_5", + "summary": "Get a specific version snapshot for a monitor", + "description": "Returns the full monitor config snapshot captured at the given version number.", + "operationId": "getVersion", "parameters": [ { - "name": "monitorId", + "name": "id", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { "200": { - "description": "Policy found", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorVersionDto" } } } @@ -9441,11 +9571,11 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -9491,19 +9621,19 @@ } } } - }, + } + }, + "/api/v1/monitors/{monitorId}/alert-channels": { "put": { "tags": [ - "Incident Policies" + "Monitor Alert Channels" ], - "summary": "Update incident policy for a monitor", - "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", - "operationId": "update_8", + "summary": "Replace the linked alert channel set for a monitor", + "operationId": "setChannels", "parameters": [ { "name": "monitorId", "in": "path", - "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -9515,7 +9645,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + "$ref": "#/components/schemas/SetAlertChannelsRequest" } } }, @@ -9523,21 +9653,21 @@ }, "responses": { "200": { - "description": "Policy updated", + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/IncidentPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseListUUID" } } } }, "400": { - "description": "Validation error in JSONB shape", + "description": "Bad request — the payload failed validation", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -9563,11 +9693,11 @@ } }, "404": { - "description": "Monitor or policy not found", + "description": "Not found — the requested resource does not exist", "content": { - "*/*": { + "application/json": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "$ref": "#/components/schemas/ErrorResponse" } } } @@ -9615,31 +9745,41 @@ } } }, - "/api/v1/monitors/bulk": { + "/api/v1/monitors/{monitorId}/assertions": { "post": { "tags": [ - "Monitors" + "Monitor Assertions" + ], + "summary": "Add an assertion to a monitor", + "operationId": "add", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Bulk action on monitors", - "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", - "operationId": "bulkAction", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/BulkMonitorActionRequest" + "$ref": "#/components/schemas/CreateAssertionRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -9727,19 +9867,38 @@ } } }, - "/api/v1/monitors/test": { - "post": { + "/api/v1/monitors/{monitorId}/assertions/{assertionId}": { + "put": { "tags": [ - "Monitors" + "Monitor Assertions" + ], + "summary": "Update an assertion on a monitor", + "operationId": "update_10", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Ad-hoc monitor test", - "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers.", - "operationId": "testAdHoc", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MonitorTestRequest" + "$ref": "#/components/schemas/UpdateAssertionRequest" } } }, @@ -9751,7 +9910,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAssertionDto" } } } @@ -9837,21 +9996,26 @@ } } } - } - }, - "/api/v1/notification-dispatches": { - "get": { + }, + "delete": { "tags": [ - "Notification Dispatches" + "Monitor Assertions" ], - "summary": "List all dispatches for an incident", - "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", - "operationId": "listByIncident", + "summary": "Remove an assertion from a monitor", + "operationId": "remove_1", "parameters": [ { - "name": "incident_id", - "in": "query", - "description": "UUID of the incident to inspect", + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "assertionId", + "in": "path", "required": true, "schema": { "type": "string", @@ -9860,15 +10024,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -9953,17 +10110,16 @@ } } }, - "/api/v1/notification-dispatches/{id}": { - "get": { + "/api/v1/monitors/{monitorId}/auth": { + "put": { "tags": [ - "Notification Dispatches" + "Monitor Auth" ], - "summary": "Get a single dispatch with full escalation and delivery history", - "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", - "operationId": "getById_3", + "summary": "Update authentication config for a monitor", + "operationId": "update_9", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -9972,13 +10128,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -10064,19 +10230,16 @@ } } } - } - }, - "/api/v1/notification-dispatches/{id}/acknowledge": { + }, "post": { "tags": [ - "Notification Dispatches" + "Monitor Auth" ], - "summary": "Acknowledge a notification dispatch", - "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", - "operationId": "acknowledge", + "summary": "Set authentication config for a monitor", + "operationId": "set", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", "required": true, "schema": { @@ -10085,13 +10248,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetMonitorAuthRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "$ref": "#/components/schemas/SingleValueResponseMonitorAuthDto" } } } @@ -10177,25 +10350,27 @@ } } } - } - }, - "/api/v1/notification-policies": { - "get": { + }, + "delete": { "tags": [ - "Notification Policies" + "Monitor Auth" ], - "summary": "List all notification policies for the authenticated org", - "operationId": "list_7", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" - } - } + "summary": "Remove authentication config from a monitor", + "operationId": "remove", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } + } + ], + "responses": { + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -10278,30 +10453,35 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{monitorId}/policy": { + "get": { "tags": [ - "Notification Policies" + "Incident Policies" ], - "summary": "Create a notification policy with match rules and escalation chain", - "operationId": "create_8", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateNotificationPolicyRequest" - } + "summary": "Get incident policy for a monitor", + "description": "Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.", + "operationId": "get_5", + "parameters": [ + { + "name": "monitorId", + "in": "path", + "description": "Monitor UUID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } - }, - "required": true - }, + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "Policy found", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } @@ -10337,11 +10517,11 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor or policy not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } @@ -10387,19 +10567,19 @@ } } } - } - }, - "/api/v1/notification-policies/{id}": { - "get": { + }, + "put": { "tags": [ - "Notification Policies" + "Incident Policies" ], - "summary": "Get a notification policy by ID", - "operationId": "getById_1", + "summary": "Update incident policy for a monitor", + "description": "Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.", + "operationId": "update_8", "parameters": [ { - "name": "id", + "name": "monitorId", "in": "path", + "description": "Monitor UUID", "required": true, "schema": { "type": "string", @@ -10407,23 +10587,33 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIncidentPolicyRequest" + } + } + }, + "required": true + }, "responses": { "200": { - "description": "OK", + "description": "Policy updated", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/IncidentPolicyDto" } } } }, "400": { - "description": "Bad request — the payload failed validation", + "description": "Validation error in JSONB shape", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } @@ -10449,11 +10639,11 @@ } }, "404": { - "description": "Not found — the requested resource does not exist", + "description": "Monitor or policy not found", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" } } } @@ -10499,29 +10689,21 @@ } } } - }, - "put": { + } + }, + "/api/v1/monitors/bulk": { + "post": { "tags": [ - "Notification Policies" - ], - "summary": "Update a notification policy", - "operationId": "update_7", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Monitors" ], + "summary": "Bulk action on monitors", + "description": "Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.", + "operationId": "bulkAction", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" + "$ref": "#/components/schemas/BulkMonitorActionRequest" } } }, @@ -10533,7 +10715,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "$ref": "#/components/schemas/SingleValueResponseBulkMonitorActionResult" } } } @@ -10619,27 +10801,36 @@ } } } - }, - "delete": { + } + }, + "/api/v1/monitors/test": { + "post": { "tags": [ - "Notification Policies" + "Monitors" ], - "summary": "Delete a notification policy", - "operationId": "delete_6", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Ad-hoc monitor test", + "description": "Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. MULTI_STEP_API and BROWSER are rejected with MONITOR_CODE_CHECK_TEST_UNAVAILABLE until fleet dry-run is available.", + "operationId": "testAdHoc", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MonitorTestRequest" + } } - } - ], + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -10724,17 +10915,19 @@ } } }, - "/api/v1/notification-policies/{id}/dispatches": { + "/api/v1/notification-dispatches": { "get": { "tags": [ - "Notification Policies" + "Notification Dispatches" ], - "summary": "List all dispatches (firing history) for a notification policy", - "operationId": "listDispatches", + "summary": "List all dispatches for an incident", + "description": "Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.", + "operationId": "listByIncident", "parameters": [ { - "name": "id", - "in": "path", + "name": "incident_id", + "in": "query", + "description": "UUID of the incident to inspect", "required": true, "schema": { "type": "string", @@ -10836,13 +11029,14 @@ } } }, - "/api/v1/notification-policies/{id}/test": { - "post": { + "/api/v1/notification-dispatches/{id}": { + "get": { "tags": [ - "Notification Policies" + "Notification Dispatches" ], - "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", - "operationId": "test_1", + "summary": "Get a single dispatch with full escalation and delivery history", + "description": "Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.", + "operationId": "getById_3", "parameters": [ { "name": "id", @@ -10854,22 +11048,13 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestNotificationPolicyRequest" - } - } - } - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -10957,41 +11142,22 @@ } } }, - "/api/v1/notifications": { - "get": { + "/api/v1/notification-dispatches/{id}/acknowledge": { + "post": { "tags": [ - "Notifications" + "Notification Dispatches" ], - "summary": "List notifications for the current user", - "operationId": "list_16", + "summary": "Acknowledge a notification dispatch", + "description": "Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).", + "operationId": "acknowledge", "parameters": [ { - "name": "unreadOnly", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 0 - } - }, - { - "name": "size", - "in": "query", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -11001,7 +11167,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultNotificationDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } @@ -11089,121 +11255,35 @@ } } }, - "/api/v1/notifications/{id}/read": { - "put": { + "/api/v1/notification-dispatches/{id}/unacknowledge": { + "post": { "tags": [ - "Notifications" + "Notification Dispatches" ], - "summary": "Mark a notification as read", - "operationId": "markRead", + "summary": "Unacknowledge a notification dispatch", + "description": "Reverses a mistaken acknowledgment without reopening the incident. Allowed only from ACKNOWLEDGED. Clears ack fields, stays on the current escalation step, restores nextEscalationAt, and resumes escalation (ESCALATING if more steps remain, else DELIVERED). MEMBER+.", + "operationId": "unacknowledge", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "integer", - "format": "int64" + "type": "string", + "format": "uuid" } } ], "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", + "200": { + "description": "OK", "content": { - "application/json": { + "*/*": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/SingleValueResponseNotificationDispatchDto" } } } - } - } - } - }, - "/api/v1/notifications/read-all": { - "put": { - "tags": [ - "Notifications" - ], - "summary": "Mark all notifications as read", - "operationId": "markAllRead", - "responses": { - "204": { - "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -11288,121 +11368,20 @@ } } }, - "/api/v1/notifications/unread-count": { - "get": { - "tags": [ - "Notifications" - ], - "summary": "Get unread notification count", - "operationId": "unreadCount", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseLong" - } - } - } - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/org": { + "/api/v1/notification-policies": { "get": { "tags": [ - "Organizations" + "Notification Policies" ], - "summary": "Get the current organization", - "operationId": "get_4", + "summary": "List all notification policies for the authenticated org", + "operationId": "list_7", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -11489,29 +11468,29 @@ } } }, - "put": { + "post": { "tags": [ - "Organizations" + "Notification Policies" ], - "summary": "Update the current organization", - "operationId": "update_6", + "summary": "Create a notification policy with match rules and escalation chain", + "operationId": "create_8", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateOrgDetailsRequest" + "$ref": "#/components/schemas/CreateNotificationPolicyRequest" } } }, "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -11599,20 +11578,31 @@ } } }, - "/api/v1/resource-groups": { + "/api/v1/notification-policies/{id}": { "get": { "tags": [ - "Resource Groups" + "Notification Policies" + ], + "summary": "Get a notification policy by ID", + "operationId": "getById_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "List all resource groups for the authenticated org with health summaries", - "operationId": "list_6", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -11699,29 +11689,40 @@ } } }, - "post": { + "put": { "tags": [ - "Resource Groups" + "Notification Policies" + ], + "summary": "Update a notification policy", + "operationId": "update_7", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } ], - "summary": "Create a new resource group", - "operationId": "create_7", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateResourceGroupRequest" + "$ref": "#/components/schemas/UpdateNotificationPolicyRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/SingleValueResponseNotificationPolicyDto" } } } @@ -11807,16 +11808,13 @@ } } } - } - }, - "/api/v1/resource-groups/{id}": { - "get": { + }, + "delete": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "Get a resource group by id with member statuses and inherited settings", - "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", - "operationId": "get_3", + "summary": "Delete a notification policy", + "operationId": "delete_6", "parameters": [ { "name": "id", @@ -11826,27 +11824,11 @@ "type": "string", "format": "uuid" } - }, - { - "name": "includeMetrics", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -11929,13 +11911,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/notification-policies/{id}/dispatches": { + "get": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", - "operationId": "update_5", + "summary": "List dispatches (firing history) for a notification policy", + "description": "Additive optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50, and may include nextCursor. Response remains TableValueResult — no CursorPage swap.", + "operationId": "listDispatches", "parameters": [ { "name": "id", @@ -11945,25 +11930,54 @@ "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateResourceGroupRequest" - } + }, + { + "name": "since", + "in": "query", + "description": "Inclusive lower bound (ISO-8601); defaults to now−30d when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" } }, - "required": true - }, + { + "name": "until", + "in": "query", + "description": "Exclusive upper bound (ISO-8601); defaults to now when windowing", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous nextCursor", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size 1–100 when windowing/paginating (default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + "$ref": "#/components/schemas/TableValueResultNotificationDispatchDto" } } } @@ -12049,13 +12063,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/notification-policies/{id}/test": { + "post": { "tags": [ - "Resource Groups" + "Notification Policies" ], - "summary": "Delete a resource group (cascades to member rows)", - "operationId": "delete_5", + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", "parameters": [ { "name": "id", @@ -12067,9 +12083,25 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestNotificationPolicyRequest" + } + } + } + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -12154,22 +12186,41 @@ } } }, - "/api/v1/resource-groups/{id}/health": { + "/api/v1/notifications": { "get": { "tags": [ - "Resource Groups" + "Notifications" ], - "summary": "Get the detailed health breakdown for a resource group", - "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", - "operationId": "getHealth", + "summary": "List notifications for the current user", + "operationId": "list_17", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "unreadOnly", + "in": "query", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], @@ -12179,7 +12230,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "$ref": "#/components/schemas/TableValueResultNotificationDto" } } } @@ -12267,44 +12318,27 @@ } } }, - "/api/v1/resource-groups/{id}/members": { - "post": { + "/api/v1/notifications/{id}/read": { + "put": { "tags": [ - "Resource Groups" + "Notifications" ], - "summary": "Add a monitor or service member to a resource group", - "operationId": "addMember_1", + "summary": "Mark a notification as read", + "operationId": "markRead", "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "integer", + "format": "int64" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddResourceGroupMemberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -12389,33 +12423,13 @@ } } }, - "/api/v1/resource-groups/{id}/members/{memberId}": { - "delete": { + "/api/v1/notifications/read-all": { + "put": { "tags": [ - "Resource Groups" - ], - "summary": "Remove a member from a resource group", - "operationId": "removeMember_1", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "memberId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Notifications" ], + "summary": "Mark all notifications as read", + "operationId": "markAllRead", "responses": { "204": { "description": "No Content" @@ -12503,20 +12517,20 @@ } } }, - "/api/v1/secrets": { + "/api/v1/notifications/unread-count": { "get": { "tags": [ - "Secrets" + "Notifications" ], - "summary": "List secrets", - "operationId": "list_5", + "summary": "Get unread notification count", + "operationId": "unreadCount", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultSecretDto" + "$ref": "#/components/schemas/SingleValueResponseLong" } } } @@ -12602,30 +12616,22 @@ } } } - }, - "post": { + } + }, + "/api/v1/org": { + "get": { "tags": [ - "Secrets" + "Organizations" ], - "summary": "Create secret", - "operationId": "create_6", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } - } - }, - "required": true - }, + "summary": "Get the current organization", + "operationId": "get_4", "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -12711,30 +12717,18 @@ } } } - } - }, - "/api/v1/secrets/{key}": { + }, "put": { "tags": [ - "Secrets" - ], - "summary": "Update secret", - "operationId": "update_4", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Organizations" ], + "summary": "Update the current organization", + "operationId": "update_6", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateSecretRequest" + "$ref": "#/components/schemas/UpdateOrgDetailsRequest" } } }, @@ -12746,7 +12740,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseSecretDto" + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" } } } @@ -12832,26 +12826,25 @@ } } } - }, - "delete": { + } + }, + "/api/v1/resource-groups": { + "get": { "tags": [ - "Secrets" - ], - "summary": "Delete secret", - "operationId": "delete_4", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } + "Resource Groups" ], + "summary": "List all resource groups for the authenticated org with health summaries", + "operationId": "list_6", "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultResourceGroupDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -12934,22 +12927,30 @@ } } } - } - }, - "/api/v1/service-subscriptions": { - "get": { + }, + "post": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "List all service subscriptions for the organization", - "operationId": "list_15", + "summary": "Create a new resource group", + "operationId": "create_7", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -13037,13 +13038,14 @@ } } }, - "/api/v1/service-subscriptions/{id}": { + "/api/v1/resource-groups/{id}": { "get": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "Get a subscription by its ID", - "operationId": "get_10", + "summary": "Get a resource group by id with member statuses and inherited settings", + "description": "Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.", + "operationId": "get_3", "parameters": [ { "name": "id", @@ -13053,6 +13055,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "includeMetrics", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -13061,7 +13072,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" } } } @@ -13148,13 +13159,12 @@ } } }, - "delete": { + "put": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "Remove a subscription by its ID", - "description": "Removes a specific subscription (whole-service or component-level). No-op if not found.", - "operationId": "unsubscribe_1", + "summary": "Update a resource group's name, description, alert policy, inherited settings, and health threshold", + "operationId": "update_5", "parameters": [ { "name": "id", @@ -13166,9 +13176,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateResourceGroupRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseResourceGroupDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -13251,16 +13278,13 @@ } } } - } - }, - "/api/v1/service-subscriptions/{id}/alert-sensitivity": { - "patch": { + }, + "delete": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "Update alert sensitivity for a subscription", - "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", - "operationId": "updateAlertSensitivity", + "summary": "Delete a resource group (cascades to member rows)", + "operationId": "delete_5", "parameters": [ { "name": "id", @@ -13272,26 +13296,9 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -13376,40 +13383,32 @@ } } }, - "/api/v1/service-subscriptions/{slug}": { - "post": { + "/api/v1/resource-groups/{id}/health": { + "get": { "tags": [ - "Service Subscriptions" + "Resource Groups" ], - "summary": "Subscribe to a service or a component of a service", - "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", - "operationId": "subscribe_1", + "summary": "Get the detailed health breakdown for a resource group", + "description": "Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.", + "operationId": "getHealth", "parameters": [ { - "name": "slug", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceSubscribeRequest" - } - } - } - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupHealthDto" } } } @@ -13497,77 +13496,22 @@ } } }, - "/api/v1/services": { + "/api/v1/resource-groups/{id}/matched-policies": { "get": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List all enabled services (cursor-paginated)", - "operationId": "listServices", + "summary": "List notification policies that match this resource group", + "description": "Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused)", + "operationId": "listMatchedPolicies", "parameters": [ { - "name": "category", - "in": "query", - "description": "Filter by category (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by current overall_status (exact match)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "published", - "in": "query", - "description": "Filter by published status for pSEO pages", - "required": false, - "schema": { - "type": "boolean" - } - }, - { - "name": "search", - "in": "query", - "description": "Case-insensitive substring match on service name or slug", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "Opaque cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 20)", - "required": false, + "name": "id", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], @@ -13577,7 +13521,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServiceCatalogDto" + "$ref": "#/components/schemas/TableValueResultNotificationPolicyDto" } } } @@ -13665,51 +13609,41 @@ } } }, - "/api/v1/services/{slugOrId}": { - "get": { + "/api/v1/resource-groups/{id}/members": { + "post": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", - "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", - "operationId": "getService", + "summary": "Add a monitor or service member to a resource group", + "operationId": "addMember_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "summary", - "in": "query", - "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", - "required": false, - "schema": { - "type": "boolean", - "default": false - } - }, - { - "name": "publishedOnly", - "in": "query", - "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", - "required": false, - "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddResourceGroupMemberRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" + "$ref": "#/components/schemas/SingleValueResponseResourceGroupMemberDto" } } } @@ -13797,28 +13731,27 @@ } } }, - "/api/v1/services/{slugOrId}/components": { - "get": { + "/api/v1/resource-groups/{id}/members/{memberId}": { + "delete": { "tags": [ - "Status Data" + "Resource Groups" ], - "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service.", - "operationId": "getComponents", + "summary": "Remove a member from a resource group", + "operationId": "removeMember_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "groupId", - "in": "query", - "description": "Restrict result to direct children of this group component id", - "required": false, + "name": "memberId", + "in": "path", + "required": true, "schema": { "type": "string", "format": "uuid" @@ -13826,15 +13759,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultServiceComponentDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -13919,75 +13845,20 @@ } } }, - "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { + "/api/v1/secrets": { "get": { "tags": [ - "Status Data" - ], - "summary": "Get daily uptime data for a component", - "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", - "operationId": "getComponentUptime", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "componentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "period", - "in": "query", - "description": "Preset time window (used when ``from`` is omitted)", - "required": false, - "schema": { - "type": "string", - "enum": [ - "7d", - "30d", - "90d", - "1y" - ] - } - }, - { - "name": "from", - "in": "query", - "description": "Explicit window start (ISO date); overrides ``period``", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - } + "Secrets" ], + "summary": "List secrets", + "operationId": "list_5", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/TableValueResultSecretDto" } } } @@ -14073,68 +13944,30 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/components/uptime": { - "get": { + }, + "post": { "tags": [ - "Status Data" + "Secrets" ], - "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" + "summary": "Create secret", + "operationId": "create_6", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSecretRequest" + } } }, - { - "name": "to", - "in": "query", - "description": "Explicit window end (ISO date); defaults to today", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -14222,41 +14055,40 @@ } } }, - "/api/v1/services/{slugOrId}/days/{date}": { - "get": { + "/api/v1/secrets/{key}": { + "put": { "tags": [ - "Status Data" + "Secrets" ], - "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", - "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", - "operationId": "getServiceDayDetail", + "summary": "Update secret", + "operationId": "update_4", "parameters": [ { - "name": "slugOrId", + "name": "key", "in": "path", "required": true, "schema": { "type": "string" } - }, - { - "name": "date", - "in": "path", - "description": "UTC calendar day in ISO format (YYYY-MM-DD)", - "required": true, - "schema": { - "type": "string", - "format": "date" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSecretRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "$ref": "#/components/schemas/SingleValueResponseSecretDto" } } } @@ -14342,66 +14174,26 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/incidents": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Secrets" ], - "summary": "List incident history for a service (paginated)", - "operationId": "listIncidents_1", + "summary": "Delete secret", + "operationId": "delete_4", "parameters": [ { - "name": "slugOrId", + "name": "key", "in": "path", "required": true, "schema": { "type": "string" } - }, - { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", - "required": false, - "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -14486,39 +14278,20 @@ } } }, - "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "/api/v1/service-subscriptions": { "get": { "tags": [ - "Status Data" - ], - "summary": "Get incident detail with full update timeline", - "operationId": "getIncident_1", - "parameters": [ - { - "name": "slugOrId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } + "Service Subscriptions" ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_16", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" } } } @@ -14606,21 +14379,21 @@ } } }, - "/api/v1/services/{slugOrId}/live-status": { + "/api/v1/service-subscriptions/{id}": { "get": { "tags": [ - "Status Data" + "Service Subscriptions" ], - "summary": "Lightweight live-status snapshot for polling", - "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", - "operationId": "getServiceLiveStatus", + "summary": "Get a subscription by its ID", + "operationId": "get_11", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -14630,7 +14403,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -14716,47 +14489,28 @@ } } } - } - }, - "/api/v1/services/{slugOrId}/maintenances": { - "get": { + }, + "delete": { "tags": [ - "Status Data" + "Service Subscriptions" ], - "summary": "List scheduled maintenances for a service", - "operationId": "getScheduledMaintenances", + "summary": "Remove a subscription by its ID", + "description": "Removes a specific subscription (whole-service or component-level). No-op if not found.", + "operationId": "unsubscribe_1", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "Filter by status (e.g. scheduled, in_progress, verifying, completed)", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string" - } + "type": "string", + "format": "uuid" } } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -14841,50 +14595,42 @@ } } }, - "/api/v1/services/{slugOrId}/poll-results": { - "get": { + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { "tags": [ - "Status Data" + "Service Subscriptions" ], - "summary": "List poll results for a service (cursor-paginated)", - "operationId": "listPollResults", + "summary": "Update alert sensitivity for a subscription", + "description": "Controls which external incidents trigger alerts and whether they page anyone: ALL (any status change, paged), INCIDENTS_ONLY (real vendor incidents, paged), MAJOR_ONLY (only DOWN-level incidents, paged), AWARENESS (real vendor incidents tracked silently — visible on the dashboard but no alert channels fire; default for new subscriptions).", + "operationId": "updateAlertSensitivity", "parameters": [ { - "name": "slugOrId", + "name": "id", "in": "path", "required": true, "schema": { - "type": "string" - } - }, - { - "name": "cursor", - "in": "query", - "description": "ISO 8601 timestamp cursor from a previous response", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Page size (1–100, default 50)", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/CursorPageServicePollResultDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -14972,44 +14718,40 @@ } } }, - "/api/v1/services/{slugOrId}/poll-summary": { - "get": { + "/api/v1/service-subscriptions/{slug}": { + "post": { "tags": [ - "Status Data" + "Service Subscriptions" ], - "summary": "Get aggregated poll metrics and chart data for a service", - "operationId": "getPollSummary", + "summary": "Subscribe to a service or a component of a service", + "description": "Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. When alertSensitivity is omitted, new subscriptions default to AWARENESS (silent tracking — the incident appears on the dashboard but no alert channels fire). PATCH /alert-sensitivity to opt in to paging. Free tier: max 10 subscriptions. Paid tier: unlimited.", + "operationId": "subscribe_1", "parameters": [ { - "name": "slugOrId", + "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } - }, - { - "name": "window", - "in": "query", - "description": "Time window", - "required": false, - "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d" - ] - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceSubscribeRequest" + } + } + } + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" } } } @@ -15097,53 +14839,86 @@ } } }, - "/api/v1/services/{slugOrId}/uptime": { + "/api/v1/services": { "get": { "tags": [ "Status Data" ], - "summary": "Get uptime statistics for a service", - "description": "Uptime data aggregated across active non-group components.", - "operationId": "getServiceUptime", + "summary": "List all enabled services (cursor-paginated)", + "operationId": "listServices", "parameters": [ { - "name": "slugOrId", - "in": "path", - "required": true, + "name": "category", + "in": "query", + "description": "Filter by category (exact match)", + "required": false, "schema": { "type": "string" } }, { - "name": "period", + "name": "status", "in": "query", - "description": "Time window", + "description": "Filter by current overall_status (exact match)", "required": false, "schema": { - "type": "string", - "enum": [ - "24h", - "7d", - "30d", - "90d", - "1y", - "2y", - "all" - ] + "type": "string" } }, { - "name": "granularity", + "name": "published", "in": "query", - "description": "Bucket granularity", + "description": "Filter by published status for pSEO pages", "required": false, "schema": { - "type": "string", - "enum": [ - "hourly", - "daily", - "monthly" - ] + "type": "boolean" + } + }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on service name or slug", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "description": "Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 20)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 } } ], @@ -15153,7 +14928,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "$ref": "#/components/schemas/CursorPageServiceCatalogDto" } } } @@ -15238,61 +15013,44 @@ } } } - }, - "security": [ - { - "BearerAuth": [] - } - ] + } } }, - "/api/v1/services/incidents": { + "/api/v1/services/{slugOrId}": { "get": { "tags": [ "Status Data" ], - "summary": "List vendor incidents across all services (paginated)", - "description": "Cross-service vendor incident feed ordered by start date descending.", - "operationId": "listCrossServiceIncidents", + "summary": "Get a single service by slug or UUID with current status, components, and recent incidents", + "description": "When ``summary=true``, the inline ``components`` list is trimmed to groups + showcase leaves + currently-impacted leaves + ungrouped leaves, and a ``componentsSummary`` block is added with the trimmed counts. Powers SSR for vendors with hundreds of components (Snowflake, Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false for full back-compat.", + "operationId": "getService", "parameters": [ { - "name": "from", - "in": "query", - "description": "Earliest start date (ISO 8601 date)", - "required": false, + "name": "slugOrId", + "in": "path", + "required": true, "schema": { - "type": "string", - "format": "date" + "type": "string" } }, { - "name": "status", + "name": "summary", "in": "query", - "description": "Filter: active (unresolved), resolved, or omit for all", + "description": "Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false", "required": false, "schema": { - "type": "string", - "enum": [ - "active", - "resolved" - ] + "type": "boolean", + "default": false } }, { - "name": "category", + "name": "publishedOnly", "in": "query", - "description": "Filter by service category", + "description": "Resolve only published services (curated public pSEO set); 404 otherwise. Default false", "required": false, "schema": { - "type": "string" - } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "boolean", + "default": false } } ], @@ -15302,7 +15060,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDetailDto" } } } @@ -15390,23 +15148,60 @@ } } }, - "/api/v1/services/summary": { + "/api/v1/services/{slugOrId}/components": { "get": { "tags": [ "Status Data" ], - "summary": "Global status summary across all services", - "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", - "operationId": "getGlobalStatusSummary", + "summary": "List active components for a service with current status and inline uptime", + "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", + "operationId": "getComponents", "parameters": [ { - "name": "publishedOnly", + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "groupId", "in": "query", - "description": "Aggregate only published services (curated public pSEO set); default false", + "description": "Restrict result to direct children of this group component id", "required": false, "schema": { - "type": "boolean", - "default": false + "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" } } ], @@ -15416,7 +15211,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "$ref": "#/components/schemas/TableValueResultServiceComponentDto" } } } @@ -15504,20 +15299,75 @@ } } }, - "/api/v1/status-pages": { + "/api/v1/services/{slugOrId}/components/{componentId}/uptime": { "get": { "tags": [ - "Status Pages" + "Status Data" + ], + "summary": "Get daily uptime data for a component", + "description": "Pass either ``period`` (preset window) or an explicit ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` defaults to today). When both are supplied, the explicit window wins.", + "operationId": "getComponentUptime", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset time window (used when ``from`` is omitted)", + "required": false, + "schema": { + "type": "string", + "enum": [ + "7d", + "30d", + "90d", + "1y" + ] + } + }, + { + "name": "from", + "in": "query", + "description": "Explicit window start (ISO date); overrides ``period``", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit window end (ISO date); defaults to today", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + } ], - "summary": "List status pages for the workspace", - "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -15603,30 +15453,68 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/components/uptime": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Create a status page", - "operationId": "create_5", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - } + "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" } }, - "required": true - }, + { + "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": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" } } } @@ -15714,21 +15602,31 @@ } } }, - "/api/v1/status-pages/{id}": { + "/api/v1/services/{slugOrId}/days/{date}": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get a status page", - "operationId": "get_2", + "summary": "One-day rollup for a service: aggregated uptime, per-component impacts, and overlapping incidents", + "description": "Powers the click/hover-to-expand panel under each uptime bar on the public status page. Single round-trip — components, sums, and overlapping incidents (with affected component names) are returned in one response.", + "operationId": "getServiceDayDetail", "parameters": [ { - "name": "id", + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "date", "in": "path", + "description": "UTC calendar day in ISO format (YYYY-MM-DD)", "required": true, "schema": { "type": "string", - "format": "uuid" + "format": "date" } } ], @@ -15738,7 +15636,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/SingleValueResponseServiceDayDetailDto" } } } @@ -15824,41 +15722,63 @@ } } } - }, - "put": { + } + }, + "/api/v1/services/{slugOrId}/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a status page", - "operationId": "update_3", + "summary": "List incident history for a service (paginated)", + "operationId": "listIncidents_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" - } + }, + { + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "resolved" + ] } }, - "required": true - }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -15944,121 +15864,26 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/incidents/{incidentId}": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Delete a status page", - "operationId": "delete_3", + "summary": "Get incident detail with full update timeline", + "operationId": "getIncident_1", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "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" - } - } + "type": "string" } }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/status-pages/{id}/components": { - "get": { - "tags": [ - "Status Pages" - ], - "summary": "List all components", - "operationId": "listComponents", - "parameters": [ { - "name": "id", + "name": "incidentId", "in": "path", "required": true, "schema": { @@ -16073,7 +15898,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" } } } @@ -16159,41 +15984,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/services/{slugOrId}/live-status": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Add a component to the status page", - "operationId": "createComponent", + "summary": "Lightweight live-status snapshot for polling", + "description": "Returns only the current overall status, component statuses, and active incident count. Designed for frequent polling with minimal payload.", + "operationId": "getServiceLiveStatus", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/SingleValueResponseServiceLiveStatusDto" } } } @@ -16281,50 +16098,42 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}": { - "put": { + "/api/v1/services/{slugOrId}/maintenances": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Update a component", - "operationId": "updateComponent", + "summary": "List scheduled maintenances for a service", + "operationId": "getScheduledMaintenances", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "componentId", - "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" + } } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "$ref": "#/components/schemas/TableValueResultScheduledMaintenanceDto" } } } @@ -16410,36 +16219,55 @@ } } } - }, - "delete": { + } + }, + "/api/v1/services/{slugOrId}/poll-results": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Remove a component from the status page", - "operationId": "deleteComponent", + "summary": "List poll results for a service (cursor-paginated)", + "operationId": "listPollResults", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "componentId", - "in": "path", - "required": true, + "name": "cursor", + "in": "query", + "description": "ISO 8601 timestamp cursor from a previous response", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageServicePollResultDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -16524,40 +16352,34 @@ } } }, - "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "/api/v1/services/{slugOrId}/poll-summary": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Get component uptime history (daily rollups)", - "operationId": "componentUptime_1", + "summary": "Get aggregated poll metrics and chart data for a service", + "operationId": "getPollSummary", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "componentId", + "name": "slugOrId", "in": "path", "required": true, "schema": { - "type": "string", - "format": "uuid" + "type": "string" } }, { - "name": "days", + "name": "window", "in": "query", + "description": "Time window", "required": false, "schema": { - "type": "integer", - "format": "int32", - "default": 90 + "type": "string", + "enum": [ + "24h", + "7d", + "30d" + ] } } ], @@ -16567,7 +16389,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" + "$ref": "#/components/schemas/SingleValueResponseServicePollSummaryDto" } } } @@ -16655,38 +16477,98 @@ } } }, - "/api/v1/status-pages/{id}/components/reorder": { - "put": { + "/api/v1/services/{slugOrId}/status-events": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Batch reorder components (and optionally move between groups)", - "operationId": "reorderComponents", + "summary": "List curated vendor status events for a service", + "description": "Reverse-chronological merge of vendor incidents, maintenances, and rolled-up component transitions for the Dependencies Detail rail. Optional JWT + x-phelm-org-id annotates incident.opened rows with the caller's linked internal incident.", + "operationId": "listStatusEvents", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "types", + "in": "query", + "description": "Comma-separated type buckets: incident, maintenance, component (default: all)", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Preset window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "7d", + "30d", + "90d" + ] + } + }, + { + "name": "from", + "in": "query", + "description": "Explicit lower bound (ISO 8601); overrides period", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "to", + "in": "query", + "description": "Explicit upper bound (ISO 8601); default now", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "cursor", + "in": "query", + "description": "Opaque cursor from a previous response", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Page size (1–100, default 50)", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 50 } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderComponentsRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/CursorPageStatusEventDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -16770,21 +16652,53 @@ } } }, - "/api/v1/status-pages/{id}/domains": { + "/api/v1/services/{slugOrId}/uptime": { "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "List custom domains", - "operationId": "listDomains", + "summary": "Get uptime statistics for a service", + "description": "Uptime data aggregated across active non-group components.", + "operationId": "getServiceUptime", "parameters": [ { - "name": "id", + "name": "slugOrId", "in": "path", "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Time window", + "required": false, "schema": { "type": "string", - "format": "uuid" + "enum": [ + "24h", + "7d", + "30d", + "90d", + "1y", + "2y", + "all" + ] + } + }, + { + "name": "granularity", + "in": "query", + "description": "Bucket granularity", + "required": false, + "schema": { + "type": "string", + "enum": [ + "hourly", + "daily", + "monthly" + ] } } ], @@ -16794,7 +16708,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseServiceUptimeResponse" } } } @@ -16879,42 +16793,71 @@ } } } - } - }, - "post": { + }, + "security": [ + { + "BearerAuth": [] + } + ] + } + }, + "/api/v1/services/incidents": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Add a custom domain", - "operationId": "addDomain", + "summary": "List vendor incidents across all services (paginated)", + "description": "Cross-service vendor incident feed ordered by start date descending.", + "operationId": "listCrossServiceIncidents", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "from", + "in": "query", + "description": "Earliest start date (ISO 8601 date)", + "required": false, "schema": { "type": "string", - "format": "uuid" + "format": "date" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddCustomDomainRequest" - } + }, + { + "name": "status", + "in": "query", + "description": "Filter: active (unresolved), resolved, or omit for all", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "resolved" + ] } }, - "required": true - }, + { + "name": "category", + "in": "query", + "description": "Filter by service category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/TableValueResultServiceIncidentDto" } } } @@ -17002,36 +16945,36 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}": { - "delete": { + "/api/v1/services/summary": { + "get": { "tags": [ - "Status Pages" + "Status Data" ], - "summary": "Remove a custom domain", - "operationId": "removeDomain", + "summary": "Global status summary across all services", + "description": "Returns aggregate counts of services by status and a list of services currently experiencing issues.", + "operationId": "getGlobalStatusSummary", "parameters": [ { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", - "required": true, + "name": "publishedOnly", + "in": "query", + "description": "Aggregate only published services (curated public pSEO set); default false", + "required": false, "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -17116,40 +17059,20 @@ } } }, - "/api/v1/status-pages/{id}/domains/{domainId}/primary": { - "post": { + "/api/v1/status-pages": { + "get": { "tags": [ "Status Pages" ], - "summary": "Mark a verified custom domain as the page's primary host", - "operationId": "setPrimaryDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "summary": "List status pages for the workspace", + "operationId": "list_4", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -17235,42 +17158,30 @@ } } } - } - }, - "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + }, "post": { "tags": [ "Status Pages" ], - "summary": "Trigger domain verification check", - "operationId": "verifyDomain", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" + "summary": "Create a status page", + "operationId": "create_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageRequest" + } } }, - { - "name": "domainId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -17358,13 +17269,13 @@ } } }, - "/api/v1/status-pages/{id}/groups": { + "/api/v1/status-pages/{id}": { "get": { "tags": [ "Status Pages" ], - "summary": "List component groups with nested components", - "operationId": "listGroups", + "summary": "Get a status page", + "operationId": "get_2", "parameters": [ { "name": "id", @@ -17382,7 +17293,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -17469,12 +17380,12 @@ } } }, - "post": { + "put": { "tags": [ "Status Pages" ], - "summary": "Create a component group", - "operationId": "createGroup", + "summary": "Update a status page", + "operationId": "update_3", "parameters": [ { "name": "id", @@ -17490,19 +17401,19 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + "$ref": "#/components/schemas/UpdateStatusPageRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageDto" } } } @@ -17588,15 +17499,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/groups/{groupId}": { - "put": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Update a component group", - "operationId": "updateGroup", + "summary": "Delete a status page", + "operationId": "delete_3", "parameters": [ { "name": "id", @@ -17606,37 +17515,11 @@ "type": "string", "format": "uuid" } - }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -17719,13 +17602,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/components": { + "get": { "tags": [ "Status Pages" ], - "summary": "Delete a component group (components become ungrouped)", - "operationId": "deleteGroup", + "summary": "List all components", + "operationId": "listComponents", "parameters": [ { "name": "id", @@ -17735,20 +17620,18 @@ "type": "string", "format": "uuid" } - }, - { - "name": "groupId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageComponentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -17831,15 +17714,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents": { - "get": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "List incidents for this status page (filterable by status, paginated)", - "operationId": "listIncidents", + "summary": "Add a component to the status page", + "operationId": "createComponent", "parameters": [ { "name": "id", @@ -17849,40 +17730,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageComponentRequest" } } }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } - } - ], + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -17968,13 +17834,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}": { + "put": { "tags": [ "Status Pages" ], - "summary": "Create a status page incident (manual)", - "operationId": "createIncident", + "summary": "Update a component", + "operationId": "updateComponent", "parameters": [ { "name": "id", @@ -17984,25 +17852,34 @@ "type": "string", "format": "uuid" } + }, + { + "name": "componentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" } } } @@ -18088,15 +17965,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}": { - "get": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Get incident details with timeline", - "operationId": "getIncident", + "summary": "Remove a component from the status page", + "operationId": "deleteComponent", "parameters": [ { "name": "id", @@ -18108,7 +17983,7 @@ } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -18118,15 +17993,8 @@ } ], "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -18209,13 +18077,16 @@ } } } - }, - "put": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + "get": { "tags": [ "Status Pages" ], - "summary": "Update an incident", - "operationId": "updateIncident", + "summary": "Get measured (check-based) component uptime history", + "description": "Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365.", + "operationId": "componentMeasuredUptime", "parameters": [ { "name": "id", @@ -18227,32 +18098,32 @@ } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageMeasuredComponentUptimeDto" } } } @@ -18338,13 +18209,16 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/components/{componentId}/override": { + "put": { "tags": [ "Status Pages" ], - "summary": "Delete an incident", - "operationId": "deleteIncident", + "summary": "Set a timed human status override on a component", + "description": "ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours.", + "operationId": "setComponentOverride", "parameters": [ { "name": "id", @@ -18356,7 +18230,7 @@ } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -18365,9 +18239,26 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetStatusPageComponentOverrideRequest" + } + } + }, + "required": true + }, "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -18450,15 +18341,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { - "post": { + }, + "delete": { "tags": [ "Status Pages" ], - "summary": "Dismiss a draft incident (deletes it permanently)", - "operationId": "dismissIncident", + "summary": "Clear a timed human status override on a component", + "operationId": "clearComponentOverride", "parameters": [ { "name": "id", @@ -18470,7 +18359,7 @@ } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { @@ -18480,8 +18369,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -18566,13 +18462,14 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { - "post": { + "/api/v1/status-pages/{id}/components/{componentId}/uptime": { + "get": { "tags": [ "Status Pages" ], - "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", - "operationId": "publishIncident", + "summary": "Get component uptime history from published incident windows", + "description": "Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2).", + "operationId": "componentUptime_1", "parameters": [ { "name": "id", @@ -18584,31 +18481,32 @@ } }, { - "name": "incidentId", + "name": "componentId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" - } + }, + { + "name": "days", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 90 } } - }, + ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -18696,13 +18594,13 @@ } } }, - "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { - "post": { + "/api/v1/status-pages/{id}/components/reorder": { + "put": { "tags": [ "Status Pages" ], - "summary": "Post an incident timeline update", - "operationId": "postIncidentUpdate", + "summary": "Batch reorder components (and optionally move between groups)", + "operationId": "reorderComponents", "parameters": [ { "name": "id", @@ -18712,37 +18610,21 @@ "type": "string", "format": "uuid" } - }, - { - "name": "incidentId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + "$ref": "#/components/schemas/ReorderComponentsRequest" } } }, "required": true }, "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -18827,13 +18709,13 @@ } } }, - "/api/v1/status-pages/{id}/layout/reorder": { - "put": { + "/api/v1/status-pages/{id}/domains": { + "get": { "tags": [ "Status Pages" ], - "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", - "operationId": "reorderLayout", + "summary": "List custom domains", + "operationId": "listDomains", "parameters": [ { "name": "id", @@ -18845,20 +18727,17 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderPageLayoutRequest" + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + } } } }, - "required": true - }, - "responses": { - "204": { - "description": "No Content" - }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -18940,15 +18819,13 @@ } } } - } - }, - "/api/v1/status-pages/{id}/subscribers": { - "get": { + }, + "post": { "tags": [ "Status Pages" ], - "summary": "List confirmed subscribers (paginated)", - "operationId": "listSubscribers", + "summary": "Add a custom domain", + "operationId": "addDomain", "parameters": [ { "name": "id", @@ -18958,23 +18835,25 @@ "type": "string", "format": "uuid" } - }, - { - "name": "pageable", - "in": "query", - "required": true, - "schema": { - "$ref": "#/components/schemas/Pageable" - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddCustomDomainRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -19060,13 +18939,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/domains/{domainId}": { + "delete": { "tags": [ "Status Pages" ], - "summary": "Add a subscriber (immediately confirmed, skips double opt-in)", - "operationId": "addSubscriber", + "summary": "Remove a custom domain", + "operationId": "removeDomain", "parameters": [ { "name": "id", @@ -19076,28 +18957,20 @@ "type": "string", "format": "uuid" } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AdminAddSubscriberRequest" - } - } - }, - "required": true - }, "responses": { - "201": { - "description": "Created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -19182,13 +19055,13 @@ } } }, - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { - "delete": { + "/api/v1/status-pages/{id}/domains/{domainId}/primary": { + "post": { "tags": [ "Status Pages" ], - "summary": "Remove a subscriber", - "operationId": "removeSubscriber", + "summary": "Mark a verified custom domain as the page's primary host", + "operationId": "setPrimaryDomain", "parameters": [ { "name": "id", @@ -19200,7 +19073,7 @@ } }, { - "name": "subscriberId", + "name": "domainId", "in": "path", "required": true, "schema": { @@ -19210,8 +19083,15 @@ } ], "responses": { - "204": { - "description": "No Content" + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + } + } + } }, "400": { "description": "Bad request — the payload failed validation", @@ -19296,20 +19176,30 @@ } } }, - "/api/v1/tags": { - "get": { + "/api/v1/status-pages/{id}/domains/{domainId}/verify": { + "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "List tags for the authenticated organization", - "operationId": "list_3", + "summary": "Trigger domain verification check", + "operationId": "verifyDomain", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" + } + }, + { + "name": "domainId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } } ], @@ -19319,7 +19209,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" } } } @@ -19405,30 +19295,33 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/groups": { + "get": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Create a new tag", - "operationId": "create_4", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTagRequest" - } + "summary": "List component groups with nested components", + "operationId": "listGroups", + "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/SingleValueResponseTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageComponentGroupDto" } } } @@ -19514,15 +19407,13 @@ } } } - } - }, - "/api/v1/tags/{id}": { - "get": { + }, + "post": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Get a tag by ID", - "operationId": "getById", + "summary": "Create a component group", + "operationId": "createGroup", "parameters": [ { "name": "id", @@ -19534,13 +19425,23 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageComponentGroupRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -19626,13 +19527,15 @@ } } } - }, + } + }, + "/api/v1/status-pages/{id}/groups/{groupId}": { "put": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Update a tag's name and/or color", - "operationId": "update_2", + "summary": "Update a component group", + "operationId": "updateGroup", "parameters": [ { "name": "id", @@ -19642,13 +19545,22 @@ "type": "string", "format": "uuid" } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateTagRequest" + "$ref": "#/components/schemas/UpdateStatusPageComponentGroupRequest" } } }, @@ -19660,7 +19572,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseTagDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" } } } @@ -19749,10 +19661,10 @@ }, "delete": { "tags": [ - "Tags" + "Status Pages" ], - "summary": "Delete a tag (cascades to all monitor associations)", - "operationId": "delete_2", + "summary": "Delete a component group (components become ungrouped)", + "operationId": "deleteGroup", "parameters": [ { "name": "id", @@ -19762,6 +19674,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -19851,21 +19772,56 @@ } } }, - "/api/v1/vaults/rotate": { - "post": { + "/api/v1/status-pages/{id}/incidents": { + "get": { "tags": [ - "Vault" + "Status Pages" + ], + "summary": "List incidents for this status page (paginated)", + "operationId": "listIncidents", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } ], - "summary": "Rotate DEK", - "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", - "operationId": "rotateDek", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -19951,32 +19907,41 @@ } } } - } - }, - "/api/v1/webhooks": { - "get": { + }, + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List webhook endpoints for the authenticated org", - "operationId": "list_2", + "summary": "Create a status page incident (manual)", + "operationId": "createIncident", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -20062,30 +20027,42 @@ } } } - }, - "post": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}": { + "get": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Register a new webhook endpoint", - "operationId": "create_3", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWebhookEndpointRequest" - } + "summary": "Get incident details with timeline", + "operationId": "getIncident", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" } }, - "required": true - }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -20171,15 +20148,13 @@ } } } - } - }, - "/api/v1/webhooks/{id}": { - "get": { + }, + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get a single webhook endpoint", - "operationId": "get_1", + "summary": "Update an incident", + "operationId": "updateIncident", "parameters": [ { "name": "id", @@ -20189,15 +20164,34 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -20284,12 +20278,12 @@ } } }, - "put": { + "delete": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Update a webhook endpoint", - "operationId": "update_1", + "summary": "Delete an incident", + "operationId": "deleteIncident", "parameters": [ { "name": "id", @@ -20299,28 +20293,20 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" - } - } - }, - "required": true - }, "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" - } - } - } + "204": { + "description": "No Content" }, "400": { "description": "Bad request — the payload failed validation", @@ -20403,13 +20389,15 @@ } } } - }, - "delete": { + } + }, + "/api/v1/status-pages/{id}/incidents/{incidentId}/dismiss": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Delete a webhook endpoint", - "operationId": "delete_1", + "summary": "Dismiss a draft incident (soft-deletes: resolves without publishing)", + "operationId": "dismissIncident", "parameters": [ { "name": "id", @@ -20419,6 +20407,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "responses": { @@ -20508,13 +20505,13 @@ } } }, - "/api/v1/webhooks/{id}/deliveries": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/publish": { + "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List recent deliveries for a webhook endpoint", - "operationId": "listDeliveries", + "summary": "Publish a draft incident (sets publishedAt, applies component statuses, notifies subscribers)", + "operationId": "publishIncident", "parameters": [ { "name": "id", @@ -20526,23 +20523,31 @@ } }, { - "name": "limit", - "in": "query", - "required": false, + "name": "incidentId", + "in": "path", + "required": true, "schema": { - "type": "integer", - "format": "int32", - "default": 20 + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -20630,13 +20635,13 @@ } } }, - "/api/v1/webhooks/{id}/test": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates": { "post": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Send a test delivery to a webhook endpoint", - "operationId": "test", + "summary": "Post an incident timeline update", + "operationId": "postIncidentUpdate", "parameters": [ { "name": "id", @@ -20646,24 +20651,34 @@ "type": "string", "format": "uuid" } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TestWebhookEndpointRequest" + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" } } - } + }, + "required": true }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" } } } @@ -20751,21 +20766,59 @@ } } }, - "/api/v1/webhooks/events": { - "get": { + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + "patch": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "List all available webhook event types", - "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", - "operationId": "listEvents", + "summary": "Edit an existing incident timeline update body", + "operationId": "patchIncidentUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/WebhookEventCatalogResponse" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" } } } @@ -20853,24 +20906,38 @@ } } }, - "/api/v1/webhooks/signing-secret": { - "get": { + "/api/v1/status-pages/{id}/layout/reorder": { + "put": { "tags": [ - "Webhooks" + "Status Pages" ], - "summary": "Get signing secret metadata for the authenticated org", - "operationId": "getSigningSecretInfo", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" - } + "summary": "Reorder page-level layout: groups and ungrouped components share one ordering", + "operationId": "reorderLayout", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReorderPageLayoutRequest" } } }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, "400": { "description": "Bad request — the payload failed validation", "content": { @@ -20954,20 +21021,56 @@ } } }, - "/api/v1/webhooks/signing-secret/rotate": { - "post": { + "/api/v1/status-pages/{id}/maintenance": { + "get": { "tags": [ - "Webhooks" + "Status Pages" + ], + "summary": "List maintenance windows for this status page (paginated)", + "operationId": "listMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + } + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } ], - "summary": "Generate or rotate the organization webhook signing secret", - "operationId": "rotateSigningSecret", "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseString" + "$ref": "#/components/schemas/TableValueResultStatusPageIncidentDto" } } } @@ -21053,32 +21156,3521 @@ } } } - } - }, - "/api/v1/workspaces": { - "get": { + }, + "post": { "tags": [ - "Workspaces" + "Status Pages" ], - "summary": "List workspaces", - "operationId": "list_1", + "summary": "Schedule a maintenance window", + "operationId": "createMaintenance", "parameters": [ { - "name": "pageable", - "in": "query", + "name": "id", + "in": "path", "required": true, "schema": { - "$ref": "#/components/schemas/Pageable" + "type": "string", + "format": "uuid" } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageMaintenanceRequest" + } + } + }, + "required": true + }, "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultWorkspaceDto" + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a maintenance window with timeline", + "operationId": "getMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Status Pages" + ], + "summary": "Update a maintenance window", + "operationId": "updateMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Cancel a maintenance window", + "operationId": "deleteMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Dismiss a draft maintenance window", + "operationId": "dismissMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Publish a draft maintenance window", + "operationId": "publishMaintenance", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishStatusPageIncidentRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Post a maintenance window timeline update", + "operationId": "postMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + "patch": { + "tags": [ + "Status Pages" + ], + "summary": "Edit an existing maintenance timeline update body", + "operationId": "patchMaintenanceUpdate", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "windowId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "updateId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateStatusPageIncidentUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageIncidentUpdateDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List notification delivery receipts", + "description": "Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType.", + "operationId": "listNotificationDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "incidentId", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "eventType", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "SUBSCRIPTION_CONFIRMATION", + "INCIDENT_CREATED", + "INCIDENT_UPDATED", + "INCIDENT_RESOLVED" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "Get a notification delivery receipt", + "operationId": "getNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + "post": { + "tags": [ + "Status Pages" + ], + "summary": "Retry a failed notification delivery", + "description": "Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING.", + "operationId": "retryNotificationDelivery", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "deliveryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageNotificationDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers": { + "get": { + "tags": [ + "Status Pages" + ], + "summary": "List subscribers including awaiting confirmation (paginated)", + "operationId": "listSubscribers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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": [ + "Status Pages" + ], + "summary": "Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately", + "operationId": "addSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminAddSubscriberRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseStatusPageSubscriberDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + "delete": { + "tags": [ + "Status Pages" + ], + "summary": "Remove a subscriber", + "operationId": "removeSubscriber", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subscriberId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/tags": { + "get": { + "tags": [ + "Tags" + ], + "summary": "List tags for the authenticated organization", + "operationId": "list_3", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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": [ + "Tags" + ], + "summary": "Create a new tag", + "operationId": "create_4", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/tags/{id}": { + "get": { + "tags": [ + "Tags" + ], + "summary": "Get a tag by ID", + "operationId": "getById", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Tags" + ], + "summary": "Update a tag's name and/or color", + "operationId": "update_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTagRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Tags" + ], + "summary": "Delete a tag (cascades to all monitor associations)", + "operationId": "delete_2", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/vaults/rotate": { + "post": { + "tags": [ + "Vault" + ], + "summary": "Rotate DEK", + "description": "Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.", + "operationId": "rotateDek", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseDekRotationResultDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List webhook endpoints for the authenticated org", + "operationId": "list_2", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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": [ + "Webhooks" + ], + "summary": "Register a new webhook endpoint", + "operationId": "create_3", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/{id}": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get a single webhook endpoint", + "operationId": "get_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "put": { + "tags": [ + "Webhooks" + ], + "summary": "Update a webhook endpoint", + "operationId": "update_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookEndpointRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookEndpointDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Webhooks" + ], + "summary": "Delete a webhook endpoint", + "operationId": "delete_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/{id}/deliveries": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List recent deliveries for a webhook endpoint", + "operationId": "listDeliveries", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 20 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWebhookDeliveryDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/{id}/test": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Send a test delivery to a webhook endpoint", + "operationId": "test", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestWebhookEndpointRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookTestResult" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/events": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "List all available webhook event types", + "description": "Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.", + "operationId": "listEvents", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/WebhookEventCatalogResponse" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/signing-secret": { + "get": { + "tags": [ + "Webhooks" + ], + "summary": "Get signing secret metadata for the authenticated org", + "operationId": "getSigningSecretInfo", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseWebhookSigningSecretDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/webhooks/signing-secret/rotate": { + "post": { + "tags": [ + "Webhooks" + ], + "summary": "Generate or rotate the organization webhook signing secret", + "operationId": "rotateSigningSecret", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseString" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/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/workspaces": { + "get": { + "tags": [ + "Workspaces" + ], + "summary": "List workspaces", + "operationId": "list_1", + "parameters": [ + { + "name": "pageable", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/Pageable" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultWorkspaceDto" } } } @@ -21613,6 +25205,30 @@ }, "components": { "schemas": { + "AcknowledgeAllIncidentsResponse": { + "required": [ + "acknowledged", + "skipped" + ], + "type": "object", + "properties": { + "acknowledged": { + "type": "array", + "description": "Dispatches successfully acknowledged in this request", + "items": { + "$ref": "#/components/schemas/NotificationDispatchDto" + } + }, + "skipped": { + "type": "array", + "description": "Dispatches skipped (already acked or not in an acknowledgeable state)", + "items": { + "$ref": "#/components/schemas/SkippedDispatch" + } + } + }, + "description": "Result of acknowledging all acknowledgeable dispatches for an incident" + }, "AcquireDeployLockRequest": { "required": [ "lockedBy" @@ -21723,16 +25339,47 @@ "description": "Request body for adding a member to a resource group" }, "AdminAddSubscriberRequest": { - "required": [ - "email" - ], "type": "object", "properties": { "email": { - "minLength": 1, + "maxLength": 320, + "minLength": 0, "type": "string", - "description": "Email address to add as a confirmed subscriber", - "format": "email" + "description": "Email for EMAIL channel; legacy clients may send only this", + "format": "email", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Delivery channel (default: EMAIL)", + "nullable": true, + "enum": [ + "EMAIL", + "SMS", + "WEBHOOK" + ] + }, + "destination": { + "maxLength": 2048, + "minLength": 0, + "type": "string", + "description": "Channel destination (email, phone, or webhook URL)", + "nullable": true + }, + "componentIds": { + "type": "array", + "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", + "nullable": true, + "items": { + "type": "string", + "description": "Component IDs to scope; omit to leave existing scope; empty list widens to the whole page", + "format": "uuid" + } + }, + "requireConfirmation": { + "type": "boolean", + "description": "When true (EMAIL only), create unconfirmed and send opt-in; null/false confirms immediately", + "nullable": true } } }, @@ -21848,6 +25495,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 +25533,7 @@ "required": [ "channelType", "createdAt", + "enabled", "id", "name", "updatedAt" @@ -21894,7 +25572,9 @@ "zapier", "datadog", "jira", - "gitlab" + "gitlab", + "sms", + "phone_call" ] }, "displayConfig": { @@ -21905,6 +25585,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 +25682,11 @@ "DELIVERED", "RETRY_PENDING", "FAILED", - "CANCELLED" + "CANCELLED", + "SKIPPED_NO_CREDIT", + "SKIPPED_UNVERIFIED", + "SKIPPED_OPTED_OUT", + "SKIPPED_RATE_LIMITED" ] }, "eventType": { @@ -22845,7 +26533,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 +26552,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 +26709,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 +26790,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 +26974,9 @@ { "$ref": "#/components/schemas/PagerDutyChannelConfig" }, + { + "$ref": "#/components/schemas/PhoneCallChannelConfig" + }, { "$ref": "#/components/schemas/PushbulletChannelConfig" }, @@ -23155,6 +26989,9 @@ { "$ref": "#/components/schemas/SlackChannelConfig" }, + { + "$ref": "#/components/schemas/SmsChannelConfig" + }, { "$ref": "#/components/schemas/SplunkOnCallChannelConfig" }, @@ -23491,6 +27328,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 +27366,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -23537,6 +27388,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -23639,6 +27493,13 @@ "type": "string", "description": "Human-readable name for this policy" }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Optional note; omit or null when unused", + "nullable": true + }, "matchRules": { "type": "array", "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)", @@ -23679,8 +27540,10 @@ "description": "Human-readable name for this group" }, "description": { + "maxLength": 500, + "minLength": 0, "type": "string", - "description": "Optional description", + "description": "Optional description (max 500)", "nullable": true }, "alertPolicyId": { @@ -23859,11 +27722,12 @@ }, "type": { "type": "string", - "description": "Component type: MONITOR, GROUP, or STATIC", + "description": "Component type: MONITOR, GROUP, STATIC, or DEPENDENCY", "enum": [ "MONITOR", "GROUP", - "STATIC" + "STATIC", + "DEPENDENCY" ] }, "monitorId": { @@ -23878,6 +27742,12 @@ "format": "uuid", "nullable": true }, + "serviceSubscriptionId": { + "type": "string", + "description": "Service subscription (Dependency) ID — required when type=DEPENDENCY. Bind an existing org subscription; catalog picks must create the subscription first, then pass its id", + "format": "uuid", + "nullable": true + }, "groupId": { "type": "string", "description": "Component group ID for visual grouping", @@ -23886,7 +27756,7 @@ }, "showUptime": { "type": "boolean", - "description": "Whether to show the uptime bar (default: true)", + "description": "Whether to show the uptime bar (default: true; false for DEPENDENCY)", "nullable": true }, "displayOrder": { @@ -23897,7 +27767,7 @@ }, "excludeFromOverall": { "type": "boolean", - "description": "Exclude from overall status calculation (default: false, use true for third-party deps)", + "description": "Exclude from overall status calculation (default: false; true for DEPENDENCY)", "nullable": true }, "startDate": { @@ -23950,22 +27820,115 @@ }, "affectedComponents": { "type": "array", - "description": "Component IDs affected by this incident", + "description": "Component IDs affected by this incident", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AffectedComponent" + } + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to email confirmed subscribers about this incident (default: true)", + "nullable": true + }, + "monitoringIncidentId": { + "type": "string", + "description": "Monitoring incident ID to link this status page incident to; null for standalone", + "format": "uuid", + "nullable": true + } + } + }, + "CreateStatusPageIncidentUpdateRequest": { + "required": [ + "body", + "status" + ], + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Incident status at this point in the timeline", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "body": { + "minLength": 1, + "type": "string", + "description": "Update body in markdown" + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to email confirmed subscribers about this update (default: true)", + "nullable": true + }, + "affectedComponents": { + "type": "array", + "description": "Updated affected components; null preserves current", + "nullable": true, + "items": { + "$ref": "#/components/schemas/AffectedComponent" + } + } + } + }, + "CreateStatusPageMaintenanceRequest": { + "required": [ + "body", + "impact", + "scheduledFor", + "title" + ], + "type": "object", + "properties": { + "title": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "Customer-facing maintenance title" + }, + "status": { + "type": "string", + "description": "Initial status (default: INVESTIGATING)", + "nullable": true, + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "impact": { + "type": "string", + "description": "Impact level: NONE, MINOR, MAJOR, or CRITICAL", + "enum": [ + "NONE", + "MINOR", + "MAJOR", + "CRITICAL" + ] + }, + "body": { + "minLength": 1, + "type": "string", + "description": "Initial update body in markdown" + }, + "affectedComponents": { + "type": "array", + "description": "Component IDs affected by this window", "nullable": true, "items": { "$ref": "#/components/schemas/AffectedComponent" } }, - "scheduled": { - "type": "boolean", - "description": "Whether this is a scheduled maintenance (default: false)", - "nullable": true - }, "scheduledFor": { "type": "string", - "description": "Maintenance start time (required when scheduled=true)", - "format": "date-time", - "nullable": true + "description": "Maintenance start time", + "format": "date-time" }, "scheduledUntil": { "type": "string", @@ -23980,45 +27943,8 @@ }, "notifySubscribers": { "type": "boolean", - "description": "Whether to email confirmed subscribers about this incident (default: true)", - "nullable": true - } - } - }, - "CreateStatusPageIncidentUpdateRequest": { - "required": [ - "body", - "status" - ], - "type": "object", - "properties": { - "status": { - "type": "string", - "description": "Incident status at this point in the timeline", - "enum": [ - "INVESTIGATING", - "IDENTIFIED", - "MONITORING", - "RESOLVED" - ] - }, - "body": { - "minLength": 1, - "type": "string", - "description": "Update body in markdown" - }, - "notifySubscribers": { - "type": "boolean", - "description": "Whether to email confirmed subscribers about this update (default: true)", + "description": "Whether to email confirmed subscribers about this window (default: true)", "nullable": true - }, - "affectedComponents": { - "type": "array", - "description": "Updated affected components; null preserves current", - "nullable": true, - "items": { - "$ref": "#/components/schemas/AffectedComponent" - } } } }, @@ -24175,6 +28101,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", @@ -24201,6 +28193,32 @@ }, "description": "Cursor-paginated response for time-series and append-only data" }, + "CursorPageIncidentActivityEventDto": { + "required": [ + "data", + "hasMore" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Items on this page", + "items": { + "$ref": "#/components/schemas/IncidentActivityEventDto" + } + }, + "nextCursor": { + "type": "string", + "description": "Opaque cursor for the next page; null when there are no more results", + "nullable": true + }, + "hasMore": { + "type": "boolean", + "description": "Whether more results exist beyond this page" + } + }, + "description": "Cursor-paginated response for time-series and append-only data" + }, "CursorPageServiceCatalogDto": { "required": [ "data", @@ -24253,6 +28271,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", @@ -24301,6 +28345,7 @@ }, "DayIncident": { "required": [ + "affectedComponentIds", "affectedComponentNames", "id", "impact", @@ -24341,7 +28386,7 @@ }, "scheduled": { "type": "boolean", - "description": "True for scheduled maintenances; false for unplanned incidents" + "description": "True for a maintenance window; false for an incident" }, "startedAt": { "type": "string", @@ -24362,6 +28407,15 @@ "type": "string", "description": "Display names of components affected by this incident (deduplicated)" } + }, + "affectedComponentIds": { + "type": "array", + "description": "UUIDs of components this incident affected", + "items": { + "type": "string", + "description": "UUIDs of components this incident affected", + "format": "uuid" + } } }, "description": "Incident that overlapped the day" @@ -25806,6 +29860,189 @@ "warnMs" ] }, + "IncidentActivityEventDto": { + "required": [ + "at", + "id", + "kind", + "summary" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Stable event ID (source row ID)", + "format": "uuid" + }, + "at": { + "type": "string", + "description": "When the event occurred (ISO 8601)", + "format": "date-time" + }, + "kind": { + "type": "string", + "description": "Activity event kind in the merged incident activity stream", + "enum": [ + "update", + "dispatch", + "delivery", + "forensic_transition", + "status_page_update" + ] + }, + "actor": { + "type": "string", + "description": "Actor label when known (user email, system, etc.)", + "nullable": true + }, + "summary": { + "type": "string", + "description": "Human-readable summary of the event" + }, + "payload": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentActivityPayloadDto" + } + ] + } + }, + "description": "Merged incident activity event (updates, dispatches, deliveries, forensics, SP updates)" + }, + "IncidentActivityPayloadDto": { + "type": "object", + "properties": { + "oldStatus": { + "type": "string", + "description": "Previous incident status on an update", + "nullable": true + }, + "newStatus": { + "type": "string", + "description": "New incident status on an update", + "nullable": true + }, + "body": { + "type": "string", + "description": "Update or status-page note body", + "nullable": true + }, + "createdBy": { + "type": "string", + "description": "Who created the update (SYSTEM, USER, …)", + "nullable": true + }, + "phase": { + "type": "string", + "description": "Dispatch lifecycle phase (fired, acked)", + "nullable": true + }, + "status": { + "type": "string", + "description": "Dispatch, delivery, or status-page status", + "nullable": true + }, + "policyId": { + "type": "string", + "description": "Notification policy id for a dispatch row", + "nullable": true + }, + "policyName": { + "type": "string", + "description": "Notification policy name when resolved", + "nullable": true + }, + "currentStep": { + "type": "integer", + "description": "Current escalation step (1-based)", + "format": "int32", + "nullable": true + }, + "dispatchId": { + "type": "string", + "description": "Notification dispatch id", + "nullable": true + }, + "acknowledgedBy": { + "type": "string", + "description": "Who acknowledged the dispatch", + "nullable": true + }, + "acknowledgedVia": { + "type": "string", + "description": "Ack channel (UI, Slack, …)", + "nullable": true + }, + "eventType": { + "type": "string", + "description": "Alert delivery event type", + "nullable": true + }, + "stepNumber": { + "type": "integer", + "description": "Escalation step that sent this delivery", + "format": "int32", + "nullable": true + }, + "fireCount": { + "type": "integer", + "description": "How many times this delivery has fired", + "format": "int32", + "nullable": true + }, + "channelId": { + "type": "string", + "description": "Alert channel id", + "nullable": true + }, + "channelName": { + "type": "string", + "description": "Alert channel name", + "nullable": true + }, + "channelType": { + "type": "string", + "description": "Alert channel type", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Delivery error message when the send failed", + "nullable": true + }, + "fromStatus": { + "type": "string", + "description": "Forensic from-status", + "nullable": true + }, + "toStatus": { + "type": "string", + "description": "Forensic to-status", + "nullable": true + }, + "reason": { + "type": "string", + "description": "Forensic transition reason", + "nullable": true + }, + "affectedRegions": { + "type": "array", + "description": "Regions named on the forensic transition", + "nullable": true, + "items": { + "type": "string", + "description": "Regions named on the forensic transition" + } + }, + "statusPageIncidentId": { + "type": "string", + "description": "Linked status-page incident id", + "nullable": true + } + }, + "description": "Kind-specific activity fields; omitted keys are absent, not null" + }, "IncidentDetailDto": { "required": [ "incident", @@ -25828,6 +30065,14 @@ "items": { "$ref": "#/components/schemas/LinkedStatusPageIncidentDto" } + }, + "trigger": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentTriggerDto" + } + ] } } }, @@ -25842,7 +30087,8 @@ "updatedAt", "organizationId", "reopenCount", - "statusPageVisible" + "statusPageVisible", + "suppressDispatch" ], "type": "object", "properties": { @@ -25925,6 +30171,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 +30216,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 +30307,160 @@ "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 + }, + "alertCollapsedByResourceGroupIds": { + "type": "array", + "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", + "nullable": true, + "items": { + "type": "string", + "description": "Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy", + "format": "uuid" + } + }, + "peakFailingMemberCount": { + "type": "integer", + "description": "Peak non-operational member count while this RESOURCE_GROUP incident was open; null otherwise", + "format": "int32", + "nullable": true + }, + "failingMembersAtPeak": { + "type": "array", + "description": "Frozen failing members at peakFailingMemberCount; null when not a group incident or never snapshotted", + "nullable": true, + "items": { + "$ref": "#/components/schemas/IncidentFailingMemberSnapshotDto" + } } }, "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" + }, + "IncidentFailingMemberSnapshotDto": { + "required": [ + "memberType", + "name" + ], + "type": "object", + "properties": { + "memberType": { + "type": "string", + "description": "Member type: monitor or service" + }, + "monitorId": { + "type": "string", + "description": "Monitor ID when memberType is monitor", + "format": "uuid", + "nullable": true + }, + "serviceId": { + "type": "string", + "description": "Service ID when memberType is service", + "format": "uuid", + "nullable": true + }, + "name": { + "minLength": 1, + "type": "string", + "description": "Frozen display name at snapshot time" + }, + "membershipId": { + "type": "string", + "description": "Membership row ID when available", + "format": "uuid", + "nullable": true + } + }, + "description": "Frozen failing member identity at peak failing count for a resource-group incident" + }, "IncidentFilterParams": { "type": "object", "properties": { @@ -26106,7 +30511,7 @@ }, "resourceGroupId": { "type": "string", - "description": "Only return incidents whose monitor belongs to this resource group", + "description": "Only return incidents owned by this resource group (incidents.resource_group_id)", "format": "uuid", "nullable": true }, @@ -26122,6 +30527,12 @@ "format": "uuid", "nullable": true }, + "excludeId": { + "type": "string", + "description": "Exclude this incident ID from results (related-incident lists)", + "format": "uuid", + "nullable": true + }, "startedFrom": { "type": "string", "description": "Earliest startedAt to include (inclusive, ISO 8601)", @@ -26414,6 +30825,59 @@ } } }, + "IncidentTriggerDto": { + "required": [ + "source" + ], + "type": "object", + "properties": { + "ruleType": { + "type": "string", + "description": "Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown", + "nullable": true + }, + "ruleIndex": { + "type": "integer", + "description": "0-based index into the policy trigger_rules array; null when unknown", + "format": "int32", + "nullable": true + }, + "count": { + "type": "integer", + "description": "Observed failing_streak or failures_in_window from forensics; null when unavailable", + "format": "int32", + "nullable": true + }, + "threshold": { + "type": "integer", + "description": "Rule required count or threshold_ms from forensics; null when unavailable", + "format": "int32", + "nullable": true + }, + "lastError": { + "type": "string", + "description": "failure_reason from the triggering check result; null when unavailable", + "nullable": true + }, + "firstFailedCheckAt": { + "type": "string", + "description": "Earliest failing check timestamp in the confirm window when computable; null otherwise", + "format": "date-time", + "nullable": true + }, + "source": { + "minLength": 1, + "type": "string", + "description": "Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data)", + "enum": [ + "forensics", + "checks", + "none" + ] + } + }, + "description": "Honest trigger metadata for the incident origin tooltip / TTD strip" + }, "IncidentUpdateDto": { "required": [ "createdAt", @@ -26592,6 +31056,7 @@ }, "InviteDto": { "required": [ + "createdAt", "email", "expiresAt", "roleOffered", @@ -26617,6 +31082,11 @@ "MEMBER" ] }, + "createdAt": { + "type": "string", + "description": "Timestamp when the invite was created", + "format": "date-time" + }, "expiresAt": { "type": "string", "description": "Timestamp when the invite expires", @@ -26789,8 +31259,11 @@ }, "LinkedStatusPageIncidentDto": { "required": [ + "connectionMode", "id", "impact", + "pageIncidentMode", + "spIncidentId", "status", "statusPageId", "statusPageName", @@ -26802,23 +31275,34 @@ "properties": { "id": { "type": "string", + "description": "Status page incident ID (same value as spIncidentId; kept for backwards compatibility)", + "format": "uuid" + }, + "spIncidentId": { + "type": "string", + "description": "Status page incident ID (alias for id) — use this when the outer context is a monitoring incident", "format": "uuid" }, "statusPageId": { "type": "string", + "description": "Parent status page ID", "format": "uuid" }, "statusPageName": { - "type": "string" + "type": "string", + "description": "Parent status page display name" }, "statusPageSlug": { - "type": "string" + "type": "string", + "description": "Parent status page URL slug" }, "title": { - "type": "string" + "type": "string", + "description": "Customer-facing incident title" }, "status": { "type": "string", + "description": "Current lifecycle status (INVESTIGATING, IDENTIFIED, MONITORING, RESOLVED)", "enum": [ "INVESTIGATING", "IDENTIFIED", @@ -26828,6 +31312,7 @@ }, "impact": { "type": "string", + "description": "Impact level (NONE, MINOR, MAJOR, CRITICAL)", "enum": [ "NONE", "MINOR", @@ -26836,12 +31321,31 @@ ] }, "scheduled": { - "type": "boolean" + "type": "boolean", + "description": "Scheduled maintenance flag" }, "publishedAt": { "type": "string", + "description": "Publish time; null while draft", "format": "date-time", "nullable": true + }, + "connectionMode": { + "type": "string", + "description": "Whether the linked SPI was created by automation (AUTO) or by a human/API caller (MANUAL)", + "enum": [ + "AUTO", + "MANUAL" + ] + }, + "pageIncidentMode": { + "type": "string", + "description": "Incident mode of the parent status page at read time (MANUAL, REVIEW, AUTOMATIC)", + "enum": [ + "MANUAL", + "REVIEW", + "AUTOMATIC" + ] } } }, @@ -26869,6 +31373,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 +32263,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27706,6 +32285,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -27904,7 +32486,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27924,6 +32508,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -28087,6 +32674,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", @@ -28110,6 +32723,11 @@ "description": "Incident this dispatch is for", "format": "uuid" }, + "incidentTitle": { + "type": "string", + "description": "Incident title at read time; null if untitled or missing", + "nullable": true + }, "policyId": { "type": "string", "description": "Notification policy that matched this incident", @@ -28159,6 +32777,25 @@ "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 + }, + "matchedRules": { + "type": "array", + "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]", + "nullable": true, + "items": { + "type": "string", + "description": "Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is [\"(catch-all: no rules defined)\"]" + } + }, "nextEscalationAt": { "type": "string", "description": "Timestamp when the next escalation step will fire (null if not scheduled)", @@ -28270,6 +32907,11 @@ "type": "string", "description": "Human-readable name for this policy" }, + "description": { + "type": "string", + "description": "Optional note; null when unset", + "nullable": true + }, "matchRules": { "type": "array", "description": "Match rules (all must pass; empty = catch-all)", @@ -28298,10 +32940,146 @@ "type": "string", "description": "Timestamp when the policy was last updated", "format": "date-time" + }, + "stats7d": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" + } + ] + }, + "stats30d": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/NotificationPolicyWindowStatsDto" + } + ] + }, + "lastFiredAt": { + "type": "string", + "description": "Created-at of the most recent dispatch for this policy; null if never fired", + "format": "date-time", + "nullable": true + }, + "lastFiredIncidentId": { + "type": "string", + "description": "Incident id of the most recent dispatch; null if never fired", + "format": "uuid", + "nullable": true } }, "description": "Org-level notification policy with match rules and escalation chain" }, + "NotificationPolicyWindowStatsDto": { + "required": [ + "ackableFires", + "acknowledgements", + "expired", + "failedSends", + "fires", + "sends" + ], + "type": "object", + "properties": { + "fires": { + "type": "integer", + "description": "Dispatches created in the window", + "format": "int32" + }, + "acknowledgements": { + "type": "integer", + "description": "Fires in the window that were acknowledged", + "format": "int32" + }, + "ackableFires": { + "type": "integer", + "description": "Ack ratio denominator: fires when the policy has an ack gate, else 0", + "format": "int32" + }, + "expired": { + "type": "integer", + "description": "Fires that exhausted escalation without acknowledgment", + "format": "int32" + }, + "sends": { + "type": "integer", + "description": "Alert deliveries linked to fires in the window", + "format": "int32" + }, + "failedSends": { + "type": "integer", + "description": "Linked deliveries with status FAILED", + "format": "int32" + }, + "medianAckSeconds": { + "type": "integer", + "description": "Median seconds from fire to ack among acknowledged fires; null when none", + "format": "int64", + "nullable": true + }, + "deepestStepReached": { + "type": "integer", + "description": "Highest escalation step reached in the window; null when no fires", + "format": "int32", + "nullable": true + }, + "lastFiredAt": { + "type": "string", + "description": "Created-at of the most recent fire in the window; null when none", + "format": "date-time", + "nullable": true + }, + "lastFiredIncidentId": { + "type": "string", + "description": "Incident id of the most recent fire in the window; null when none", + "format": "uuid", + "nullable": true + } + }, + "description": "Time-bounded notification policy activity aggregates" + }, + "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 +33145,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 +33292,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 +33469,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": { @@ -28871,6 +33768,28 @@ }, "description": "Latest check result for a single region" }, + "RelatedIncidentsResponse": { + "required": [ + "data", + "total" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "description": "Related incident rows (newest first, capped by limit)", + "items": { + "$ref": "#/components/schemas/IncidentDto" + } + }, + "total": { + "type": "integer", + "description": "Total matching incidents in the window, excluding the current incident", + "format": "int64" + } + }, + "description": "Related incidents sharing the same origin within a time window" + }, "RemoveMonitorTagsRequest": { "required": [ "tagIds" @@ -28942,6 +33861,49 @@ } } }, + "ResourceGroupDeleteBlockerDto": { + "required": [ + "componentId", + "componentName", + "statusPageId", + "statusPageName", + "statusPageSlug" + ], + "type": "object", + "properties": { + "statusPageId": { + "type": "string", + "description": "Status page that owns the blocking component", + "format": "uuid" + }, + "statusPageName": { + "minLength": 1, + "type": "string", + "description": "Human-readable status page name" + }, + "statusPageSlug": { + "minLength": 1, + "type": "string", + "description": "URL-safe status page slug" + }, + "componentId": { + "type": "string", + "description": "Blocking GROUP-typed status page component ID", + "format": "uuid" + }, + "componentName": { + "minLength": 1, + "type": "string", + "description": "Blocking component display name" + }, + "hostname": { + "type": "string", + "description": "Public hostname when a custom domain is configured; null otherwise", + "nullable": true + } + }, + "description": "Status-page component that references this resource group (blocks delete; public exposure)" + }, "ResourceGroupDto": { "required": [ "createdAt", @@ -29066,6 +34028,22 @@ "$ref": "#/components/schemas/ResourceGroupMemberDto" } }, + "deleteBlockedBy": { + "type": "array", + "description": "Status-page GROUP components that reference this group (delete blockers / public exposure); populated on detail GET only — omitted on list", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ResourceGroupDeleteBlockerDto" + } + }, + "openRegionIncident": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/IncidentDto" + } + ] + }, "managedBy": { "type": "string", "description": "Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed.", @@ -29122,7 +34100,7 @@ }, "activeIncidents": { "type": "integer", - "description": "Number of members with an active incident or non-operational status", + "description": "Number of members currently non-operational (not an incident-row count)", "format": "int32" }, "thresholdStatus": { @@ -29137,9 +34115,21 @@ }, "failingCount": { "type": "integer", - "description": "Number of failing members at time of last evaluation", + "description": "Number of failing members at time of last evaluation; null when no threshold configured", "format": "int32", "nullable": true + }, + "healthBreachedSince": { + "type": "string", + "description": "When the health threshold was first breached in the current cycle; null when not breached", + "format": "date-time", + "nullable": true + }, + "healthEvaluatedAt": { + "type": "string", + "description": "When group health was last evaluated (threshold or stamp-only); null until first evaluation", + "format": "date-time", + "nullable": true } }, "description": "Aggregated health summary for a resource group" @@ -29259,10 +34249,60 @@ "type": "string", "description": "Environment name; monitors only", "nullable": true + }, + "groupMembershipCount": { + "type": "integer", + "description": "Count of resource groups this monitor or service belongs to; detail GET only — omitted on list", + "format": "int32", + "nullable": true + }, + "failingSince": { + "type": "string", + "description": "Start of the current non-operational stretch; null when operational or unknown (services OK); detail GET only — omitted on list", + "format": "date-time", + "nullable": true + }, + "alertCollapsed": { + "type": "boolean", + "description": "True when an active member incident records this group among alertCollapsedByResourceGroupIds; detail GET only — omitted on list", + "nullable": true + }, + "incidentMarks": { + "type": "array", + "description": "Incident marks for the trailing 24h strip; null when metrics omitted or failed; detail GET only — omitted on list", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ResourceGroupMemberIncidentMarkDto" + } } }, "description": "A single member of a resource group with its computed health status" }, + "ResourceGroupMemberIncidentMarkDto": { + "required": [ + "at" + ], + "type": "object", + "properties": { + "at": { + "type": "string", + "description": "Incident startedAt (or first confirmed) within the trailing 24h window", + "format": "date-time" + }, + "incidentId": { + "type": "string", + "description": "Incident ID for navigation; null when unknown", + "format": "uuid", + "nullable": true + }, + "severity": { + "type": "string", + "description": "Optional severity display hint", + "nullable": true + } + }, + "description": "Member incident mark for the trailing 24h uptime strip" + }, "ResponseSizeAssertion": { "type": "object", "properties": { @@ -29601,6 +34641,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 +34734,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 +34775,7 @@ "pollingIntervalSeconds", "enabled", "published", + "slaPublished", "componentCount", "activeIncidentCount" ], @@ -29739,6 +34830,10 @@ "published": { "type": "boolean" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "overallStatus": { "type": "string", "nullable": true @@ -29959,7 +35054,8 @@ "slug", "updatedAt", "pollingIntervalSeconds", - "enabled" + "enabled", + "slaPublished" ], "type": "object", "properties": { @@ -30062,6 +35158,10 @@ "dataCompleteness": { "type": "string" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "seoMetadata": { "nullable": true, "allOf": [ @@ -30070,6 +35170,14 @@ } ] }, + "slaData": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SlaDataDto" + } + ] + }, "relatedServices": { "type": "array", "nullable": true, @@ -30128,6 +35236,13 @@ "type": "string" } }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, "updates": { "type": "array", "items": { @@ -30203,6 +35318,13 @@ "type": "string", "format": "date-time", "nullable": true + }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } } } }, @@ -30566,6 +35688,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" @@ -30590,6 +35725,49 @@ } } }, + "SetStatusPageComponentOverrideRequest": { + "required": [ + "expiresAt", + "status" + ], + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Override status while active; takes precedence over binding until expiry/clear", + "enum": [ + "OPERATIONAL", + "DEGRADED_PERFORMANCE", + "PARTIAL_OUTAGE", + "MAJOR_OUTAGE", + "UNDER_MAINTENANCE" + ] + }, + "reason": { + "maxLength": 2000, + "minLength": 0, + "type": "string", + "description": "Optional operator reason shown in the builder", + "nullable": true + }, + "expiresAt": { + "type": "string", + "description": "When the override expires (must be in the future, at most 24h from now)", + "format": "date-time" + } + } + }, + "SingleValueResponseAcknowledgeAllIncidentsResponse": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/AcknowledgeAllIncidentsResponse" + } + } + }, "SingleValueResponseAlertChannelDto": { "required": [ "data" @@ -30766,6 +35944,17 @@ } } }, + "SingleValueResponseIncidentTriggerDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/IncidentTriggerDto" + } + } + }, "SingleValueResponseInviteDto": { "required": [ "data" @@ -31101,6 +36290,39 @@ } } }, + "SingleValueResponseStatusPageIncidentUpdateDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageIncidentUpdateDto" + } + } + }, + "SingleValueResponseStatusPageMeasuredComponentUptimeDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageMeasuredComponentUptimeDto" + } + } + }, + "SingleValueResponseStatusPageNotificationDeliveryDto": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageNotificationDeliveryDto" + } + } + }, "SingleValueResponseStatusPageSubscriberDto": { "required": [ "data" @@ -31211,6 +36433,39 @@ } } }, + "SkippedDispatch": { + "required": [ + "id", + "reason", + "status" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Dispatch identifier", + "format": "uuid" + }, + "status": { + "type": "string", + "description": "Current dispatch status", + "enum": [ + "PENDING", + "DISPATCHING", + "DELIVERED", + "ESCALATING", + "ACKNOWLEDGED", + "COMPLETED" + ] + }, + "reason": { + "minLength": 1, + "type": "string", + "description": "Why this dispatch was skipped" + } + }, + "description": "A dispatch that was not acknowledged by ack-all" + }, "SlackChannelConfig": { "required": [ "channelType", @@ -31236,6 +36491,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 +36727,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": { @@ -31482,7 +36943,8 @@ "enum": [ "MONITOR", "GROUP", - "STATIC" + "STATIC", + "DEPENDENCY" ] }, "monitorId": { @@ -31495,8 +36957,37 @@ "format": "uuid", "nullable": true }, + "serviceSubscriptionId": { + "type": "string", + "description": "Service subscription (Dependency) id when type=DEPENDENCY", + "format": "uuid", + "nullable": true + }, + "serviceSlug": { + "type": "string", + "description": "Slug of the subscribed catalog service (denormalized for display)", + "nullable": true + }, + "serviceName": { + "type": "string", + "description": "Display name of the subscribed catalog service (denormalized for display)", + "nullable": true + }, "currentStatus": { "type": "string", + "description": "Effective display status (incident > active override > binding)", + "enum": [ + "OPERATIONAL", + "DEGRADED_PERFORMANCE", + "PARTIAL_OUTAGE", + "MAJOR_OUTAGE", + "UNDER_MAINTENANCE" + ] + }, + "overrideStatus": { + "type": "string", + "description": "Active timed override status; null when unset or expired", + "nullable": true, "enum": [ "OPERATIONAL", "DEGRADED_PERFORMANCE", @@ -31505,6 +36996,23 @@ "UNDER_MAINTENANCE" ] }, + "overrideReason": { + "type": "string", + "description": "Optional operator reason for the active override", + "nullable": true + }, + "overrideExpiresAt": { + "type": "string", + "description": "When the active override expires; null when unset or expired", + "format": "date-time", + "nullable": true + }, + "overrideActor": { + "type": "integer", + "description": "User id who set the override; null for API-key actors or when inactive", + "format": "int32", + "nullable": true + }, "showUptime": { "type": "boolean" }, @@ -31754,6 +37262,14 @@ "UNDER_MAINTENANCE" ] }, + "openIncident": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/StatusPageOpenIncidentSummaryDto" + } + ] + }, "managedBy": { "type": "string", "description": "Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed.", @@ -31968,10 +37484,238 @@ } } }, + "StatusPageMeasuredComponentUptimeDto": { + "required": [ + "componentId", + "days", + "monitorId", + "source" + ], + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Uptime source discriminator; always measured for this resource", + "enum": [ + "incident_window", + "measured" + ] + }, + "componentId": { + "type": "string", + "description": "Status-page component ID", + "format": "uuid" + }, + "monitorId": { + "type": "string", + "description": "Linked monitor whose check rollups feed this series", + "format": "uuid" + }, + "trackingSince": { + "type": "string", + "description": "ISO-8601 date bars start (Camp A tracking-since); null only if unresolved", + "nullable": true + }, + "days": { + "type": "array", + "description": "Dense daily buckets from tracking start through today (oldest → newest)", + "items": { + "$ref": "#/components/schemas/StatusPageMeasuredUptimeDayDto" + } + } + }, + "description": "Measured (check-based) daily uptime for a MONITOR status-page component" + }, + "StatusPageMeasuredUptimeDayDto": { + "required": [ + "date", + "totalChecks", + "passedChecks" + ], + "type": "object", + "properties": { + "date": { + "type": "string", + "description": "Start-of-day timestamp for this bucket (UTC midnight, ISO 8601)", + "format": "date-time" + }, + "totalChecks": { + "type": "integer", + "description": "Total probe checks recorded that day across regions", + "format": "int64" + }, + "passedChecks": { + "type": "integer", + "description": "Checks that passed that day across regions", + "format": "int64" + }, + "uptimePercentage": { + "type": "number", + "description": "passedChecks / totalChecks × 100; null when totalChecks is 0", + "format": "double", + "nullable": true + } + }, + "description": "One UTC day of measured (check-based) uptime for a MONITOR status-page component" + }, + "StatusPageNotificationDeliveryDto": { + "required": [ + "channel", + "createdAt", + "eventType", + "id", + "status", + "statusPageId", + "subscriberId", + "attemptCount" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Delivery receipt ID", + "format": "uuid" + }, + "statusPageId": { + "type": "string", + "description": "Status page that owns this delivery", + "format": "uuid" + }, + "subscriberId": { + "type": "string", + "description": "Subscriber this delivery targeted", + "format": "uuid" + }, + "destination": { + "type": "string", + "description": "Subscriber destination (email, phone, or webhook URL)", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Delivery channel from the subscriber (EMAIL, SMS, WEBHOOK)" + }, + "incidentId": { + "type": "string", + "description": "Related status-page incident ID, if any", + "format": "uuid", + "nullable": true + }, + "incidentUpdateId": { + "type": "string", + "description": "Related incident update ID, if any", + "format": "uuid", + "nullable": true + }, + "eventType": { + "type": "string", + "description": "Notification event type that triggered this delivery", + "enum": [ + "SUBSCRIPTION_CONFIRMATION", + "INCIDENT_CREATED", + "INCIDENT_UPDATED", + "INCIDENT_RESOLVED" + ] + }, + "status": { + "type": "string", + "description": "Current delivery status", + "enum": [ + "PENDING", + "DELIVERED", + "RETRY_PENDING", + "FAILED", + "CANCELLED", + "SKIPPED_NO_CREDIT", + "SKIPPED_UNVERIFIED", + "SKIPPED_OPTED_OUT", + "SKIPPED_RATE_LIMITED" + ] + }, + "attemptCount": { + "type": "integer", + "description": "Number of delivery attempts made", + "format": "int32" + }, + "lastAttemptAt": { + "type": "string", + "description": "When the last attempt was made", + "format": "date-time", + "nullable": true + }, + "nextRetryAt": { + "type": "string", + "description": "When the next retry is scheduled; null if not retrying", + "format": "date-time", + "nullable": true + }, + "deliveredAt": { + "type": "string", + "description": "When delivery was confirmed; null if not delivered", + "format": "date-time", + "nullable": true + }, + "errorMessage": { + "type": "string", + "description": "Error summary from the last failed attempt", + "nullable": true + }, + "createdAt": { + "type": "string", + "description": "When the delivery row was created", + "format": "date-time" + } + }, + "description": "Delivery receipt for a status page subscriber notification" + }, + "StatusPageOpenIncidentSummaryDto": { + "required": [ + "startedAt", + "status", + "title", + "updatedAt" + ], + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Incident id for dashboard CTAs that open the matching drawer", + "format": "uuid", + "nullable": true + }, + "title": { + "minLength": 1, + "type": "string", + "description": "Incident title shown on the list card live row" + }, + "status": { + "type": "string", + "description": "Lifecycle status of the open incident", + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] + }, + "startedAt": { + "type": "string", + "description": "When the incident started (ISO 8601)", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "description": "When the incident was last updated (ISO 8601)", + "format": "date-time" + } + }, + "description": "Newest open status-page incident; omitted from JSON when none" + }, "StatusPageSubscriberDto": { "required": [ + "channel", "createdAt", - "email", + "destination", "id", "confirmed" ], @@ -31979,16 +37723,49 @@ "properties": { "id": { "type": "string", + "description": "Subscriber id", "format": "uuid" }, "email": { - "type": "string" + "type": "string", + "description": "Email when channel is EMAIL; null for other channels", + "nullable": true + }, + "channel": { + "type": "string", + "description": "Delivery channel (EMAIL, SMS, WEBHOOK)", + "enum": [ + "EMAIL", + "SMS", + "WEBHOOK" + ] + }, + "destination": { + "type": "string", + "description": "Channel destination (email, phone, or webhook URL)" + }, + "componentIds": { + "type": "array", + "description": "Scoped component IDs; null means whole page", + "nullable": true, + "items": { + "type": "string", + "description": "Scoped component IDs; null means whole page", + "format": "uuid" + } }, "confirmed": { - "type": "boolean" + "type": "boolean", + "description": "Whether the subscriber has confirmed opt-in" + }, + "confirmationSent": { + "type": "boolean", + "description": "True when this call sent a confirmation email; omitted on list reads", + "nullable": true }, "createdAt": { "type": "string", + "description": "When the subscriber was created", "format": "date-time" } } @@ -32045,6 +37822,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32077,6 +37858,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32109,6 +37894,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32141,6 +37930,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32173,6 +37966,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32205,6 +38002,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32237,6 +38038,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32269,6 +38074,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32301,6 +38110,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32333,6 +38146,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32365,6 +38182,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32397,6 +38218,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32429,6 +38254,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32461,6 +38290,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32493,6 +38326,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32525,6 +38362,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32557,6 +38398,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32589,6 +38434,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32621,6 +38470,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32653,6 +38506,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32685,6 +38542,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32717,6 +38578,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32749,6 +38614,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32781,6 +38650,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32813,6 +38686,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32845,6 +38722,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32877,6 +38758,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32909,6 +38794,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32941,6 +38830,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -32973,6 +38866,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33005,6 +38902,46 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true + } + } + }, + "TableValueResultStatusPageNotificationDeliveryDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StatusPageNotificationDeliveryDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33037,6 +38974,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33069,6 +39010,82 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true + } + } + }, + "TableValueResultTestChannelResult": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestChannelResult" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true + } + } + }, + "TableValueResultVoiceLanguageDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VoiceLanguageDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33101,6 +39118,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33133,6 +39154,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33165,6 +39190,10 @@ "type": "integer", "format": "int32", "nullable": true + }, + "nextCursor": { + "type": "string", + "nullable": true } } }, @@ -33413,6 +39442,9 @@ { "$ref": "#/components/schemas/PagerDutyChannelConfig" }, + { + "$ref": "#/components/schemas/PhoneCallChannelConfig" + }, { "$ref": "#/components/schemas/PushbulletChannelConfig" }, @@ -33425,6 +39457,9 @@ { "$ref": "#/components/schemas/SlackChannelConfig" }, + { + "$ref": "#/components/schemas/SmsChannelConfig" + }, { "$ref": "#/components/schemas/SplunkOnCallChannelConfig" }, @@ -33491,6 +39526,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 +39622,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 +39811,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 +39889,11 @@ "MCP", "API" ] + }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled (default: true); null preserves current value", + "nullable": true } } }, @@ -34004,6 +40073,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": { @@ -34011,25 +40158,98 @@ "maxLength": 100, "minLength": 0, "type": "string", - "description": "New environment name; null preserves current", + "description": "New environment name; null preserves current", + "nullable": true + }, + "variables": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "Replace all variables; null preserves current", + "nullable": true + }, + "description": "Replace all variables; null preserves current", + "nullable": true + }, + "isDefault": { + "type": "boolean", + "description": "Whether this is the default environment; null preserves current", + "nullable": true + } + } + }, + "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 }, - "variables": { - "type": "object", - "additionalProperties": { - "type": "string", - "description": "Replace all variables; null preserves current", - "nullable": true - }, - "description": "Replace all variables; null preserves current", + "severityId": { + "type": "string", + "description": "Severity ID for created incidents (from List Severities API)", "nullable": true }, - "isDefault": { - "type": "boolean", - "description": "Whether this is the default environment; null preserves current", + "visibility": { + "type": "string", + "description": "Incident visibility: public or private (default: public)", "nullable": true } - } + }, + "required": [ + "channelType" + ] }, "UpdateIncidentPolicyRequest": { "required": [ @@ -34056,6 +40276,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 +40414,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 +40495,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -34261,6 +40607,13 @@ "description": "Human-readable name for this policy; null preserves current", "nullable": true }, + "description": { + "maxLength": 500, + "minLength": 0, + "type": "string", + "description": "New note; null preserves current, empty string clears", + "nullable": true + }, "matchRules": { "type": "array", "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)", @@ -34291,6 +40644,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 +40710,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" @@ -34346,8 +40850,10 @@ "description": "Human-readable name for this group" }, "description": { + "maxLength": 500, + "minLength": 0, "type": "string", - "description": "Optional description; null clears the existing value", + "description": "Optional description (max 500); null clears the existing value", "nullable": true }, "alertPolicyId": { @@ -34451,6 +40957,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 +40995,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": { @@ -34595,10 +41214,57 @@ "postmortemUrl": { "maxLength": 2048, "minLength": 0, - "pattern": "^https?://.*", + "pattern": "^$|^https?://.*", "type": "string", "description": "URL to an external postmortem document; empty string clears", "nullable": true + }, + "published": { + "type": "boolean", + "description": "Whether the incident is published on the public page; null preserves current. true publishes (sets publishedAt); false unpublishes (clears publishedAt)", + "nullable": true + }, + "scheduledFor": { + "type": "string", + "description": "New maintenance window start; null preserves current. Only for scheduled incidents", + "format": "date-time", + "nullable": true + }, + "scheduledUntil": { + "type": "string", + "description": "New maintenance window end; null preserves current. Only for scheduled incidents", + "format": "date-time", + "nullable": true + }, + "autoResolve": { + "type": "boolean", + "description": "Whether the window auto-completes at scheduledUntil; null preserves current", + "nullable": true + } + } + }, + "UpdateStatusPageIncidentUpdateRequest": { + "required": [ + "body" + ], + "type": "object", + "properties": { + "body": { + "maxLength": 10000, + "minLength": 0, + "type": "string", + "description": "Replacement update body in markdown" + }, + "status": { + "type": "string", + "description": "Replacement lifecycle status for this update; null preserves current", + "nullable": true, + "enum": [ + "INVESTIGATING", + "IDENTIFIED", + "MONITORING", + "RESOLVED" + ] } } }, @@ -34685,6 +41351,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 +41489,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 +41572,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 +41634,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/scripts/generate-skill-references.mjs b/scripts/generate-skill-references.mjs index b0d84cd..14d999a 100644 --- a/scripts/generate-skill-references.mjs +++ b/scripts/generate-skill-references.mjs @@ -51,6 +51,7 @@ const RESOURCES = { 'status-pages': { singular: 'StatusPage' }, 'status-page-components': { singular: 'StatusPageComponent' }, 'status-page-incidents': { singular: 'StatusPageIncident' }, + 'status-page-maintenance': { singular: 'StatusPageMaintenance' }, 'status-page-subscribers': { singular: 'StatusPageSubscriber' }, 'status-page-domains': { singular: 'StatusPageDomain' }, }, diff --git a/skills/devhelm-communicate/references/_generated/status-page-components.fields.md b/skills/devhelm-communicate/references/_generated/status-page-components.fields.md index 224370e..25cff6b 100644 --- a/skills/devhelm-communicate/references/_generated/status-page-components.fields.md +++ b/skills/devhelm-communicate/references/_generated/status-page-components.fields.md @@ -9,13 +9,14 @@ |---|---|---|---|---| | `name` | string | ✓ | | Component display name | | `description` | string | | ✓ | Optional description shown on expand | -| `type` | "MONITOR" \| "GROUP" \| "STATIC" | ✓ | | Component type: MONITOR, GROUP, or STATIC | +| `type` | "MONITOR" \| "GROUP" \| "STATIC" \| "DEPENDENCY" | ✓ | | Component type: MONITOR, GROUP, STATIC, or DEPENDENCY | | `monitorId` | string (uuid) | | ✓ | Monitor ID (required when type=MONITOR) | | `resourceGroupId` | string (uuid) | | ✓ | Resource group ID (required when type=GROUP) | +| `serviceSubscriptionId` | string (uuid) | | ✓ | Service subscription (Dependency) ID — required when type=DEPENDENCY. Bind an existing org subscription; catalog picks must create the subscription first, then pass its id | | `groupId` | string (uuid) | | ✓ | Component group ID for visual grouping | -| `showUptime` | boolean | | ✓ | Whether to show the uptime bar (default: true) | +| `showUptime` | boolean | | ✓ | Whether to show the uptime bar (default: true; false for DEPENDENCY) | | `displayOrder` | integer (int32) | | ✓ | Position in the component list | -| `excludeFromOverall` | boolean | | ✓ | Exclude from overall status calculation (default: false, use true for third-party deps) | +| `excludeFromOverall` | boolean | | ✓ | Exclude from overall status calculation (default: false; true for DEPENDENCY) | | `startDate` | string (date) | | ✓ | Date from which to start showing uptime; defaults to component creation. Set earlier to backdate (e.g. launch day); clamped at the monitor's createdAt for MONITOR-type components | ## `UpdateStatusPageComponentRequest` @@ -43,7 +44,14 @@ | `type` | string | ✓ | | | | `monitorId` | string (uuid) | | ✓ | | | `resourceGroupId` | string (uuid) | | ✓ | | -| `currentStatus` | string | ✓ | | | +| `serviceSubscriptionId` | string (uuid) | | ✓ | Service subscription (Dependency) id when type=DEPENDENCY | +| `serviceSlug` | string | | ✓ | Slug of the subscribed catalog service (denormalized for display) | +| `serviceName` | string | | ✓ | Display name of the subscribed catalog service (denormalized for display) | +| `currentStatus` | string | ✓ | | Effective display status (incident > active override > binding) | +| `overrideStatus` | string | | ✓ | Active timed override status; null when unset or expired | +| `overrideReason` | string | | ✓ | Optional operator reason for the active override | +| `overrideExpiresAt` | string (date-time) | | ✓ | When the active override expires; null when unset or expired | +| `overrideActor` | integer (int32) | | ✓ | User id who set the override; null for API-key actors or when inactive | | `showUptime` | boolean | ✓ | | | | `displayOrder` | integer (int32) | ✓ | | | | `pageOrder` | integer (int32) | ✓ | | | diff --git a/skills/devhelm-communicate/references/_generated/status-page-incidents.fields.md b/skills/devhelm-communicate/references/_generated/status-page-incidents.fields.md index 539c852..6898a6f 100644 --- a/skills/devhelm-communicate/references/_generated/status-page-incidents.fields.md +++ b/skills/devhelm-communicate/references/_generated/status-page-incidents.fields.md @@ -12,11 +12,8 @@ | `impact` | "NONE" \| "MINOR" \| "MAJOR" \| "CRITICAL" | ✓ | | Impact level: NONE, MINOR, MAJOR, or CRITICAL | | `body` | string | ✓ | | Initial update body in markdown | | `affectedComponents` | AffectedComponent[] | | ✓ | Component IDs affected by this incident | -| `scheduled` | boolean | | ✓ | Whether this is a scheduled maintenance (default: false) | -| `scheduledFor` | string (date-time) | | ✓ | Maintenance start time (required when scheduled=true) | -| `scheduledUntil` | string (date-time) | | ✓ | Maintenance end time | -| `autoResolve` | boolean | | ✓ | Auto-resolve at scheduledUntil (default: false) | | `notifySubscribers` | boolean | | ✓ | Whether to email confirmed subscribers about this incident (default: true) | +| `monitoringIncidentId` | string (uuid) | | ✓ | Monitoring incident ID to link this status page incident to; null for standalone | ## `UpdateStatusPageIncidentRequest` @@ -28,6 +25,10 @@ | `affectedComponents` | AffectedComponent[] | | ✓ | Updated affected components; null preserves current | | `postmortemBody` | string | | ✓ | Postmortem body in markdown; empty string clears | | `postmortemUrl` | string | | ✓ | URL to an external postmortem document; empty string clears | +| `published` | boolean | | ✓ | Whether the incident is published on the public page; null preserves current. true publishes (sets publishedAt); false unpublishes (clears publishedAt) | +| `scheduledFor` | string (date-time) | | ✓ | New maintenance window start; null preserves current. Only for scheduled incidents | +| `scheduledUntil` | string (date-time) | | ✓ | New maintenance window end; null preserves current. Only for scheduled incidents | +| `autoResolve` | boolean | | ✓ | Whether the window auto-completes at scheduledUntil; null preserves current | ## `StatusPageIncidentDto` (response shape) diff --git a/skills/devhelm-communicate/references/_generated/status-page-maintenance.fields.md b/skills/devhelm-communicate/references/_generated/status-page-maintenance.fields.md new file mode 100644 index 0000000..563019e --- /dev/null +++ b/skills/devhelm-communicate/references/_generated/status-page-maintenance.fields.md @@ -0,0 +1,19 @@ +# status-page-maintenance — field reference + +> Auto-generated from the DevHelm OpenAPI spec. Do not edit by hand. +> Regenerate with `node scripts/generate-skill-references.mjs`. + +## `CreateStatusPageMaintenanceRequest` + +| Field | Type | Required | Nullable | Description | +|---|---|---|---|---| +| `title` | string | ✓ | | Customer-facing maintenance title | +| `status` | "INVESTIGATING" \| "IDENTIFIED" \| "MONITORING" \| "RESOLVED" | | ✓ | Initial status (default: INVESTIGATING) | +| `impact` | "NONE" \| "MINOR" \| "MAJOR" \| "CRITICAL" | ✓ | | Impact level: NONE, MINOR, MAJOR, or CRITICAL | +| `body` | string | ✓ | | Initial update body in markdown | +| `affectedComponents` | AffectedComponent[] | | ✓ | Component IDs affected by this window | +| `scheduledFor` | string (date-time) | ✓ | | Maintenance start time | +| `scheduledUntil` | string (date-time) | | ✓ | Maintenance end time | +| `autoResolve` | boolean | | ✓ | Auto-resolve at scheduledUntil (default: false) | +| `notifySubscribers` | boolean | | ✓ | Whether to email confirmed subscribers about this window (default: true) | + diff --git a/skills/devhelm-communicate/references/_generated/status-page-subscribers.fields.md b/skills/devhelm-communicate/references/_generated/status-page-subscribers.fields.md index d070a11..5a3e4f3 100644 --- a/skills/devhelm-communicate/references/_generated/status-page-subscribers.fields.md +++ b/skills/devhelm-communicate/references/_generated/status-page-subscribers.fields.md @@ -7,8 +7,12 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| -| `id` | string (uuid) | ✓ | | | -| `email` | string | ✓ | | | -| `confirmed` | boolean | ✓ | | | -| `createdAt` | string (date-time) | ✓ | | | +| `id` | string (uuid) | ✓ | | Subscriber id | +| `email` | string | | ✓ | Email when channel is EMAIL; null for other channels | +| `channel` | string | ✓ | | Delivery channel (EMAIL, SMS, WEBHOOK) | +| `destination` | string | ✓ | | Channel destination (email, phone, or webhook URL) | +| `componentIds` | string (uuid)[] | | ✓ | Scoped component IDs; null means whole page | +| `confirmed` | boolean | ✓ | | Whether the subscriber has confirmed opt-in | +| `confirmationSent` | boolean | | ✓ | True when this call sent a confirmation email; omitted on list reads | +| `createdAt` | string (date-time) | ✓ | | When the subscriber was created | diff --git a/skills/devhelm-communicate/references/_generated/status-pages.fields.md b/skills/devhelm-communicate/references/_generated/status-pages.fields.md index c016c0b..8a78e19 100644 --- a/skills/devhelm-communicate/references/_generated/status-pages.fields.md +++ b/skills/devhelm-communicate/references/_generated/status-pages.fields.md @@ -45,6 +45,7 @@ | `componentCount` | integer (int32) | | ✓ | | | `subscriberCount` | integer (int64) | | ✓ | | | `overallStatus` | string | | ✓ | | +| `openIncident` | any | | ✓ | | | `managedBy` | string | | ✓ | Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed. | | `createdAt` | string (date-time) | ✓ | | | | `updatedAt` | string (date-time) | ✓ | | | diff --git a/skills/devhelm-communicate/references/incidents.md b/skills/devhelm-communicate/references/incidents.md index 0d88382..81f6caa 100644 --- a/skills/devhelm-communicate/references/incidents.md +++ b/skills/devhelm-communicate/references/incidents.md @@ -10,8 +10,8 @@ Two flavors: - **Auto-created**: a monitor tied to a status page component went DOWN; DevHelm opened a public incident automatically. The user can edit/update it. -- **Manual**: the user creates one for scheduled maintenance or - vendor-side outages that monitors can't detect. +- **Manual**: the user creates one for outages monitors can't detect. + Planned work is a separate resource — see Maintenance below. ## List on a page @@ -24,21 +24,36 @@ devhelm status-pages incidents get ```bash devhelm status-pages incidents create \ - --title="Scheduled maintenance — DB upgrade" \ - --status=SCHEDULED \ - --scheduled-start=2026-05-01T02:00:00Z \ - --scheduled-end=2026-05-01T03:00:00Z \ - --affected-components=, \ - --body="Database upgrade. Expect 5-10m of read-only mode." + --title="API outage" \ + --impact=MAJOR \ + --status=INVESTIGATING \ + --body="Investigating elevated 5xx on the public API." ``` -### Incident kinds +`--scheduled` is rejected. Planned work goes on the maintenance resource. -| Kind | Use | Required fields | -|---|---|---| -| `REAL_TIME` | Something is broken right now | `status=INVESTIGATING`, `body` | -| `SCHEDULED` | Upcoming planned work | `scheduled_start`, `scheduled_end`, `body` | -| `HISTORICAL` | Retrospective entry for an outage already over | `status=RESOLVED`, `body` with timeline | +## Maintenance windows + +```bash +devhelm status-pages maintenance create \ + --title="Database upgrade" \ + --impact=MINOR \ + --body="Read-only for 30 minutes." \ + --scheduled-for=2026-05-01T02:00:00Z \ + --scheduled-until=2026-05-01T03:00:00Z + +devhelm status-pages maintenance list +devhelm status-pages maintenance get +devhelm status-pages maintenance update --status=MONITORING +devhelm status-pages maintenance post-update \ + --body="Halfway through." --status=MONITORING +devhelm status-pages maintenance publish +devhelm status-pages maintenance dismiss +devhelm status-pages maintenance delete +``` + +`@_generated/status-page-maintenance.fields.md`. Runtime pull: +`devhelm skills schema status-page-maintenance`. ## Update an incident (post an update) diff --git a/skills/devhelm-communicate/references/status-pages.md b/skills/devhelm-communicate/references/status-pages.md index e16fe01..f988c5d 100644 --- a/skills/devhelm-communicate/references/status-pages.md +++ b/skills/devhelm-communicate/references/status-pages.md @@ -97,11 +97,13 @@ Two sources: - **Auto-created** — from monitor failures. - **Manual** — `devhelm status-pages incidents create ...` - for maintenance windows, vendor-side outages, etc. + for outages monitors can't detect. -Both are rendered in the same section. Manual incidents need an -explicit resolve; auto-created ones resolve when the underlying -monitor returns to UP. +Do **not** use incident create for planned work. Schedule a window +with `devhelm status-pages maintenance create ...`. + +Manual incidents need an explicit resolve; auto-created ones resolve +when the underlying monitor returns to UP. ## Complete field reference diff --git a/skills/devhelm-configure/references/_generated/alert-channels.fields.md b/skills/devhelm-configure/references/_generated/alert-channels.fields.md index 8ef0f39..fdc40de 100644 --- a/skills/devhelm-configure/references/_generated/alert-channels.fields.md +++ b/skills/devhelm-configure/references/_generated/alert-channels.fields.md @@ -18,6 +18,7 @@ | `name` | string | ✓ | | New channel name (full replacement, not partial update) | | `config` | any | ✓ | | | | `managedBy` | "DASHBOARD" \| "CLI" \| "TERRAFORM" \| "MCP" \| "API" | | ✓ | New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value. | +| `enabled` | boolean | | ✓ | Whether this channel is enabled (default: true); null preserves current value | ## `AlertChannelDto` (response shape) @@ -27,6 +28,7 @@ | `name` | string | ✓ | | Human-readable channel name | | `channelType` | string | ✓ | | Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL) | | `displayConfig` | any | | ✓ | | +| `enabled` | boolean | ✓ | | Whether this channel is enabled and will receive alerts | | `createdAt` | string (date-time) | ✓ | | Timestamp when the channel was created | | `updatedAt` | string (date-time) | ✓ | | Timestamp when the channel was last updated | | `configHash` | string | | ✓ | SHA-256 hash of the channel config; use for change detection | diff --git a/skills/devhelm-configure/references/_generated/monitors.fields.md b/skills/devhelm-configure/references/_generated/monitors.fields.md index 82c0046..f96b3a8 100644 --- a/skills/devhelm-configure/references/_generated/monitors.fields.md +++ b/skills/devhelm-configure/references/_generated/monitors.fields.md @@ -8,7 +8,7 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| | `name` | string | ✓ | | Human-readable name for this monitor | -| `type` | "HTTP" \| "DNS" \| "MCP_SERVER" \| "TCP" \| "ICMP" \| "HEARTBEAT" | ✓ | | Monitor protocol type | +| `type` | "HTTP" \| "DNS" \| "MCP_SERVER" \| "TCP" \| "ICMP" \| "HEARTBEAT" \| "BROWSER" \| "MULTI_STEP_API" | ✓ | | Monitor protocol type | | `config` | any | ✓ | | | | `frequencySeconds` | integer (int32) | | ✓ | Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans) | | `enabled` | boolean | | ✓ | Whether the monitor is active (default: true) | diff --git a/skills/devhelm-configure/references/_generated/notification-policies.fields.md b/skills/devhelm-configure/references/_generated/notification-policies.fields.md index 7610a78..3078bf1 100644 --- a/skills/devhelm-configure/references/_generated/notification-policies.fields.md +++ b/skills/devhelm-configure/references/_generated/notification-policies.fields.md @@ -8,6 +8,7 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| | `name` | string | ✓ | | Human-readable name for this policy | +| `description` | string | | ✓ | Optional note; omit or null when unused | | `matchRules` | MatchRule[] | | ✓ | Match rules to evaluate (all must pass; omit or empty for catch-all) | | `escalation` | EscalationChain | ✓ | | | | `enabled` | boolean | | ✓ | Whether this policy is enabled (default true) | @@ -18,6 +19,7 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| | `name` | string | | ✓ | Human-readable name for this policy; null preserves current | +| `description` | string | | ✓ | New note; null preserves current, empty string clears | | `matchRules` | MatchRule[] | | ✓ | Match rules to evaluate (all must pass; omit or empty for catch-all) | | `escalation` | any | | ✓ | | | `enabled` | boolean | | ✓ | Whether this policy is enabled; null preserves current | @@ -30,10 +32,15 @@ | `id` | string (uuid) | ✓ | | Unique notification policy identifier | | `organizationId` | integer (int32) | ✓ | | Organization this policy belongs to | | `name` | string | ✓ | | Human-readable name for this policy | +| `description` | string | | ✓ | Optional note; null when unset | | `matchRules` | MatchRule[] | ✓ | | Match rules (all must pass; empty = catch-all) | | `escalation` | EscalationChain | ✓ | | | | `enabled` | boolean | ✓ | | Whether this policy is active | | `priority` | integer (int32) | ✓ | | Evaluation order; higher value = evaluated first | | `createdAt` | string (date-time) | ✓ | | Timestamp when the policy was created | | `updatedAt` | string (date-time) | ✓ | | Timestamp when the policy was last updated | +| `stats7d` | any | | ✓ | | +| `stats30d` | any | | ✓ | | +| `lastFiredAt` | string (date-time) | | ✓ | Created-at of the most recent dispatch for this policy; null if never fired | +| `lastFiredIncidentId` | string (uuid) | | ✓ | Incident id of the most recent dispatch; null if never fired | diff --git a/skills/devhelm-configure/references/_generated/resource-groups.fields.md b/skills/devhelm-configure/references/_generated/resource-groups.fields.md index 3916aac..b4fd186 100644 --- a/skills/devhelm-configure/references/_generated/resource-groups.fields.md +++ b/skills/devhelm-configure/references/_generated/resource-groups.fields.md @@ -8,7 +8,7 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| | `name` | string | ✓ | | Human-readable name for this group | -| `description` | string | | ✓ | Optional description | +| `description` | string | | ✓ | Optional description (max 500) | | `alertPolicyId` | string (uuid) | | ✓ | Optional notification policy to apply for this group | | `defaultFrequency` | integer (int32) | | ✓ | Default check frequency in seconds applied to members (30–86400) | | `defaultRegions` | string[] | | ✓ | Default regions applied to member monitors | @@ -27,7 +27,7 @@ | Field | Type | Required | Nullable | Description | |---|---|---|---|---| | `name` | string | ✓ | | Human-readable name for this group | -| `description` | string | | ✓ | Optional description; null clears the existing value | +| `description` | string | | ✓ | Optional description (max 500); null clears the existing value | | `alertPolicyId` | string (uuid) | | ✓ | Optional notification policy to apply for this group; null clears the existing value | | `defaultFrequency` | integer (int32) | | ✓ | Default check frequency in seconds for members (30–86400); null clears | | `defaultRegions` | string[] | | ✓ | Default regions for member monitors; null clears | @@ -63,6 +63,8 @@ | `recoveryCooldownMinutes` | integer (int32) | | ✓ | Cooldown minutes after group incident resolves before a new one can open | | `health` | ResourceGroupHealthDto | ✓ | | | | `members` | ResourceGroupMemberDto[] | | ✓ | Member list with individual statuses; populated on detail GET only | +| `deleteBlockedBy` | ResourceGroupDeleteBlockerDto[] | | ✓ | Status-page GROUP components that reference this group (delete blockers / public exposure); populated on detail GET only — omitted on list | +| `openRegionIncident` | any | | ✓ | | | `managedBy` | string | | ✓ | Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed. | | `createdAt` | string (date-time) | ✓ | | Timestamp when the group was created | | `updatedAt` | string (date-time) | ✓ | | Timestamp when the group was last updated | diff --git a/skills/devhelm-investigate/references/_generated/incidents.fields.md b/skills/devhelm-investigate/references/_generated/incidents.fields.md index a183ddc..0282a4e 100644 --- a/skills/devhelm-investigate/references/_generated/incidents.fields.md +++ b/skills/devhelm-investigate/references/_generated/incidents.fields.md @@ -3,6 +3,13 @@ > Auto-generated from the DevHelm OpenAPI spec. Do not edit by hand. > Regenerate with `node scripts/generate-skill-references.mjs`. +## `UpdateIncidentRequest` + +| Field | Type | Required | Nullable | Description | +|---|---|---|---|---| +| `title` | string | | ✓ | New title; null preserves current (min 1 char if present) | +| `severity` | "DOWN" \| "DEGRADED" \| "MAINTENANCE" | | ✓ | New severity: DOWN, DEGRADED, or MAINTENANCE; null preserves current | + ## `IncidentDto` (response shape) | Field | Type | Required | Nullable | Description | @@ -19,12 +26,14 @@ | `reopenCount` | integer (int32) | ✓ | | Number of times this incident has been reopened | | `createdByUserId` | integer (int32) | | ✓ | User who created the incident (manual incidents only) | | `statusPageVisible` | boolean | ✓ | | Whether this incident is visible on the status page | +| `suppressDispatch` | boolean | ✓ | | When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted | | `serviceIncidentId` | string (uuid) | | ✓ | Linked vendor service incident ID; null for monitor incidents | | `serviceId` | string (uuid) | | ✓ | Linked service catalog ID; null for monitor incidents | | `externalRef` | string | | ✓ | External reference ID (e.g. PagerDuty incident ID) | | `affectedComponents` | string[] | | ✓ | Service components affected by this incident | | `shortlink` | string | | ✓ | Short URL linking to the incident details | | `resolutionReason` | string | | ✓ | How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.) | +| `resolutionNote` | string | | ✓ | Body from the most recent resolve update; null when not currently resolved, auto-resolved without a note, or no resolve update body was provided | | `startedAt` | string (date-time) | | ✓ | Timestamp when the incident was detected or created | | `confirmedAt` | string (date-time) | | ✓ | Timestamp when the incident was confirmed (multi-region confirmation) | | `resolvedAt` | string (date-time) | | ✓ | Timestamp when the incident was resolved | @@ -41,4 +50,8 @@ | `triggeredByRuleSnapshotHashHex` | string | | ✓ | Hex SHA-256 of the canonical policy snapshot that fired; combined with triggeredByRuleIndex points to the exact TriggerRule. Omitted from JSON when null, treat missing as null. | | `triggeredByRuleIndex` | integer (int32) | | ✓ | Index of the fired rule inside the policy's trigger_rules array. Omitted from JSON when null, treat missing as null. | | `engineVersion` | string | | ✓ | Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null. | +| `displayKey` | string | | ✓ | 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 | +| `alertCollapsedByResourceGroupIds` | string (uuid)[] | | ✓ | Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy | +| `peakFailingMemberCount` | integer (int32) | | ✓ | Peak non-operational member count while this RESOURCE_GROUP incident was open; null otherwise | +| `failingMembersAtPeak` | IncidentFailingMemberSnapshotDto[] | | ✓ | Frozen failing members at peakFailingMemberCount; null when not a group incident or never snapshotted | diff --git a/src/commands/status-pages/incidents/create.ts b/src/commands/status-pages/incidents/create.ts index 1cbea15..79176f6 100644 --- a/src/commands/status-pages/incidents/create.ts +++ b/src/commands/status-pages/incidents/create.ts @@ -14,15 +14,22 @@ export default class StatusPagesIncidentsCreate extends Command { impact: Flags.string({description: 'Incident impact', required: true, options: [...SP_INCIDENT_IMPACTS]}), body: Flags.string({description: 'Initial update body in markdown', required: true}), status: Flags.string({description: 'Incident status', options: [...SP_INCIDENT_STATUSES]}), - scheduled: Flags.boolean({description: 'Whether this is a scheduled maintenance'}), + scheduled: Flags.boolean({ + description: 'Removed. Use `status-pages maintenance create` instead.', + hidden: true, + }), } async run() { const {args, flags} = await this.parse(StatusPagesIncidentsCreate) + if (flags.scheduled) { + this.error( + '`--scheduled` is no longer valid on incident create. Use `devhelm status-pages maintenance create` instead.', + ) + } const client = buildClient(flags) const body: Record = {title: flags.title, impact: flags.impact, body: flags.body} if (flags.status) body.status = flags.status - if (flags.scheduled) body.scheduled = flags.scheduled const resp = await apiPost(client, `/api/v1/status-pages/${args.id}/incidents`, body) display(this, unwrapData(resp), flags.output) } diff --git a/src/commands/status-pages/maintenance/create.ts b/src/commands/status-pages/maintenance/create.ts new file mode 100644 index 0000000..76dc065 --- /dev/null +++ b/src/commands/status-pages/maintenance/create.ts @@ -0,0 +1,41 @@ +import {Command, Flags} from '@oclif/core' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {apiPost, unwrapData} from '../../../lib/api-client.js' +import {SP_INCIDENT_IMPACTS, SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenanceCreate extends Command { + static description = 'Schedule a maintenance window on a status page' + static examples = [ + '<%= config.bin %> status-pages maintenance create --title "DB upgrade" --impact MINOR --body "Read-only for 30m" --scheduled-for 2026-09-01T02:00:00Z', + ] + static args = {id: uuidArg({description: 'Status page ID', required: true})} + static flags = { + ...globalFlags, + title: Flags.string({description: 'Customer-facing maintenance title', required: true}), + impact: Flags.string({description: 'Impact level', required: true, options: [...SP_INCIDENT_IMPACTS]}), + body: Flags.string({description: 'Initial update body in markdown', required: true}), + 'scheduled-for': Flags.string({description: 'Maintenance start time (ISO 8601)', required: true}), + 'scheduled-until': Flags.string({description: 'Maintenance end time (ISO 8601)'}), + status: Flags.string({description: 'Initial status', options: [...SP_INCIDENT_STATUSES]}), + 'auto-resolve': Flags.boolean({description: 'Auto-resolve at scheduled-until (default: false)'}), + 'notify-subscribers': Flags.boolean({description: 'Email confirmed subscribers (default: true)', allowNo: true}), + } + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceCreate) + const client = buildClient(flags) + const body: Record = { + title: flags.title, + impact: flags.impact, + body: flags.body, + scheduledFor: flags['scheduled-for'], + } + if (flags.status) body.status = flags.status + if (flags['scheduled-until']) body.scheduledUntil = flags['scheduled-until'] + if (flags['auto-resolve']) body.autoResolve = true + if (flags['notify-subscribers'] !== undefined) body.notifySubscribers = flags['notify-subscribers'] + const resp = await apiPost(client, `/api/v1/status-pages/${args.id}/maintenance`, body) + display(this, unwrapData(resp), flags.output) + } +} diff --git a/src/commands/status-pages/maintenance/delete.ts b/src/commands/status-pages/maintenance/delete.ts new file mode 100644 index 0000000..1130886 --- /dev/null +++ b/src/commands/status-pages/maintenance/delete.ts @@ -0,0 +1,21 @@ +import {Command} from '@oclif/core' +import {globalFlags, buildClient} from '../../../lib/base-command.js' +import {apiDelete} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenanceDelete extends Command { + static description = 'Delete a status page maintenance window' + static examples = ['<%= config.bin %> status-pages maintenance delete '] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = {...globalFlags} + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceDelete) + const client = buildClient(flags) + await apiDelete(client, `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}`) + this.log(`Maintenance window '${args['window-id']}' deleted.`) + } +} diff --git a/src/commands/status-pages/maintenance/dismiss.ts b/src/commands/status-pages/maintenance/dismiss.ts new file mode 100644 index 0000000..1473fe0 --- /dev/null +++ b/src/commands/status-pages/maintenance/dismiss.ts @@ -0,0 +1,21 @@ +import {Command} from '@oclif/core' +import {globalFlags, buildClient} from '../../../lib/base-command.js' +import {apiPost} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenanceDismiss extends Command { + static description = 'Dismiss a draft status page maintenance window' + static examples = ['<%= config.bin %> status-pages maintenance dismiss '] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = {...globalFlags} + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceDismiss) + const client = buildClient(flags) + await apiPost(client, `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}/dismiss`, {}) + this.log('Draft maintenance window dismissed.') + } +} diff --git a/src/commands/status-pages/maintenance/get.ts b/src/commands/status-pages/maintenance/get.ts new file mode 100644 index 0000000..f123da0 --- /dev/null +++ b/src/commands/status-pages/maintenance/get.ts @@ -0,0 +1,21 @@ +import {Command} from '@oclif/core' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {apiGet, unwrapData} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenanceGet extends Command { + static description = 'Get a status page maintenance window with timeline' + static examples = ['<%= config.bin %> status-pages maintenance get '] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = {...globalFlags} + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceGet) + const client = buildClient(flags) + const resp = await apiGet(client, `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}`) + display(this, unwrapData(resp), flags.output) + } +} diff --git a/src/commands/status-pages/maintenance/list.ts b/src/commands/status-pages/maintenance/list.ts new file mode 100644 index 0000000..21aed55 --- /dev/null +++ b/src/commands/status-pages/maintenance/list.ts @@ -0,0 +1,36 @@ +import {Command, Flags} from '@oclif/core' +import type {components} from '../../../lib/api.generated.js' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {fetchPaginated} from '../../../lib/typed-api.js' +import {uuidArg} from '../../../lib/validators.js' + +type StatusPageIncident = components['schemas']['StatusPageIncidentDto'] + +export default class StatusPagesMaintenanceList extends Command { + static description = 'List maintenance windows on a status page' + static examples = ['<%= config.bin %> status-pages maintenance list '] + static args = {id: uuidArg({description: 'Status page ID', required: true})} + static flags = { + ...globalFlags, + limit: Flags.integer({description: 'Maximum number of windows to show', default: 20}), + } + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceList) + const client = buildClient(flags) + const items = await fetchPaginated( + client, + `/api/v1/status-pages/${args.id}/maintenance`, + flags.limit, + ) + display(this, items, flags.output, [ + {header: 'ID', get: (r: StatusPageIncident) => r.id ?? ''}, + {header: 'TITLE', get: (r: StatusPageIncident) => r.title ?? ''}, + {header: 'IMPACT', get: (r: StatusPageIncident) => r.impact ?? ''}, + {header: 'STATUS', get: (r: StatusPageIncident) => r.status ?? ''}, + {header: 'SCHEDULED FOR', get: (r: StatusPageIncident) => r.scheduledFor ?? ''}, + {header: 'SCHEDULED UNTIL', get: (r: StatusPageIncident) => r.scheduledUntil ?? ''}, + {header: 'PUBLISHED', get: (r: StatusPageIncident) => r.publishedAt ?? ''}, + ]) + } +} diff --git a/src/commands/status-pages/maintenance/post-update.ts b/src/commands/status-pages/maintenance/post-update.ts new file mode 100644 index 0000000..de1a81a --- /dev/null +++ b/src/commands/status-pages/maintenance/post-update.ts @@ -0,0 +1,32 @@ +import {Command, Flags} from '@oclif/core' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {apiPost, unwrapData} from '../../../lib/api-client.js' +import {SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenancePostUpdate extends Command { + static description = 'Post a timeline update on a status page maintenance window' + static examples = [ + '<%= config.bin %> status-pages maintenance post-update --body "Halfway through" --status MONITORING', + ] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = { + ...globalFlags, + body: Flags.string({description: 'Update message', required: true}), + status: Flags.string({description: 'New status', required: true, options: [...SP_INCIDENT_STATUSES]}), + } + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenancePostUpdate) + const client = buildClient(flags) + const resp = await apiPost( + client, + `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}/updates`, + {body: flags.body, status: flags.status}, + ) + display(this, unwrapData(resp), flags.output) + } +} diff --git a/src/commands/status-pages/maintenance/publish.ts b/src/commands/status-pages/maintenance/publish.ts new file mode 100644 index 0000000..e3efd50 --- /dev/null +++ b/src/commands/status-pages/maintenance/publish.ts @@ -0,0 +1,21 @@ +import {Command} from '@oclif/core' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {apiPost, unwrapData} from '../../../lib/api-client.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenancePublish extends Command { + static description = 'Publish a draft status page maintenance window' + static examples = ['<%= config.bin %> status-pages maintenance publish '] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = {...globalFlags} + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenancePublish) + const client = buildClient(flags) + const resp = await apiPost(client, `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}/publish`, {}) + display(this, unwrapData(resp), flags.output) + } +} diff --git a/src/commands/status-pages/maintenance/update.ts b/src/commands/status-pages/maintenance/update.ts new file mode 100644 index 0000000..736cc94 --- /dev/null +++ b/src/commands/status-pages/maintenance/update.ts @@ -0,0 +1,39 @@ +import {Command, Flags} from '@oclif/core' +import {globalFlags, buildClient, display} from '../../../lib/base-command.js' +import {apiPut, unwrapData} from '../../../lib/api-client.js' +import {SP_INCIDENT_IMPACTS, SP_INCIDENT_STATUSES} from '../../../lib/spec-facts.generated.js' +import {uuidArg} from '../../../lib/validators.js' + +export default class StatusPagesMaintenanceUpdate extends Command { + static description = 'Update a status page maintenance window' + static examples = [ + '<%= config.bin %> status-pages maintenance update --scheduled-until 2026-09-01T04:00:00Z', + ] + static args = { + id: uuidArg({description: 'Status page ID', required: true}), + 'window-id': uuidArg({description: 'Maintenance window ID', required: true}), + } + static flags = { + ...globalFlags, + title: Flags.string({description: 'Maintenance title'}), + impact: Flags.string({description: 'Impact level', options: [...SP_INCIDENT_IMPACTS]}), + status: Flags.string({description: 'Status', options: [...SP_INCIDENT_STATUSES]}), + 'scheduled-for': Flags.string({description: 'New start time (ISO 8601)'}), + 'scheduled-until': Flags.string({description: 'New end time (ISO 8601)'}), + 'auto-resolve': Flags.boolean({description: 'Auto-resolve at scheduled-until', allowNo: true}), + } + + async run() { + const {args, flags} = await this.parse(StatusPagesMaintenanceUpdate) + const client = buildClient(flags) + const body: Record = {} + if (flags.title) body.title = flags.title + if (flags.impact) body.impact = flags.impact + if (flags.status) body.status = flags.status + if (flags['scheduled-for']) body.scheduledFor = flags['scheduled-for'] + if (flags['scheduled-until']) body.scheduledUntil = flags['scheduled-until'] + if (flags['auto-resolve'] !== undefined) body.autoResolve = flags['auto-resolve'] + const resp = await apiPut(client, `/api/v1/status-pages/${args.id}/maintenance/${args['window-id']}`, body) + display(this, unwrapData(resp), flags.output) + } +} diff --git a/src/lib/api-zod.generated.ts b/src/lib/api-zod.generated.ts index cbd263a..26a8281 100644 --- a/src/lib/api-zod.generated.ts +++ b/src/lib/api-zod.generated.ts @@ -108,6 +108,16 @@ const PagerDutyChannelConfig = z severityOverride: z.string().nullish(), }) .strict(); +const PhoneCallChannelConfig = z + .object({ + channelType: z.literal("phone_call"), + phoneNumber: z.string().nullish(), + verifiedPhoneNumberId: z.number().int().nullish(), + phoneNumbers: z.array(z.string().nullable()).nullish(), + voiceLanguage: z.string().nullish(), + preferredLanguage: z.string().nullish(), + }) + .strict(); const PushbulletChannelConfig = z .object({ channelType: z.literal("pushbullet"), @@ -138,6 +148,15 @@ const SlackChannelConfig = z mentionText: z.string().nullish(), }) .strict(); +const SmsChannelConfig = z + .object({ + channelType: z.literal("sms"), + phoneNumber: z.string().nullish(), + verifiedPhoneNumberId: z.number().int().nullish(), + phoneNumbers: z.array(z.string().nullable()).nullish(), + preferredLanguage: z.string().nullish(), + }) + .strict(); const SplunkOnCallChannelConfig = z .object({ channelType: z.literal("splunk_oncall"), @@ -181,10 +200,12 @@ const CreateAlertChannelRequest = z MattermostChannelConfig, OpsGenieChannelConfig, PagerDutyChannelConfig, + PhoneCallChannelConfig, PushbulletChannelConfig, PushoverChannelConfig, RootlyChannelConfig, SlackChannelConfig, + SmsChannelConfig, SplunkOnCallChannelConfig, TeamsChannelConfig, TelegramChannelConfig, @@ -196,36 +217,202 @@ const CreateAlertChannelRequest = z .nullish(), }) .strict(); +const UpdateDatadogChannelConfig = z + .object({ + channelType: z.literal("datadog"), + apiKey: z.string().nullish(), + site: z.string().nullish(), + tags: z.string().nullish(), + }) + .strict(); +const UpdateDiscordChannelConfig = z + .object({ + channelType: z.literal("discord"), + webhookUrl: z.string().nullish(), + mentionRoleId: z.string().nullish(), + }) + .strict(); +const UpdateEmailChannelConfig = z + .object({ + channelType: z.literal("email"), + recipients: z.array(z.string().email()).min(1), + }) + .strict(); +const UpdateGitLabChannelConfig = z + .object({ + channelType: z.literal("gitlab"), + endpointUrl: z.string().min(1), + authorizationKey: z.string().nullish(), + }) + .strict(); +const UpdateGoogleChatChannelConfig = z + .object({ + channelType: z.literal("google_chat"), + webhookUrl: z.string().nullish(), + }) + .strict(); +const UpdateIncidentIoChannelConfig = z + .object({ + channelType: z.literal("incident_io"), + apiKey: z.string().nullish(), + severityId: z.string().nullish(), + visibility: z.string().nullish(), + }) + .strict(); +const UpdateJiraChannelConfig = z + .object({ + channelType: z.literal("jira"), + domain: z.string().min(1), + email: z.string().min(1), + apiToken: z.string().nullish(), + projectKey: z.string().min(1), + issueType: z.string().nullish(), + }) + .strict(); +const UpdateLinearChannelConfig = z + .object({ + channelType: z.literal("linear"), + apiKey: z.string().nullish(), + teamId: z.string().min(1), + labelId: z.string().nullish(), + }) + .strict(); +const UpdateMattermostChannelConfig = z + .object({ + channelType: z.literal("mattermost"), + webhookUrl: z.string().nullish(), + channel: z.string().nullish(), + iconUrl: z.string().nullish(), + }) + .strict(); +const UpdateOpsGenieChannelConfig = z + .object({ + channelType: z.literal("opsgenie"), + apiKey: z.string().nullish(), + region: z.string().nullish(), + }) + .strict(); +const UpdatePagerDutyChannelConfig = z + .object({ + channelType: z.literal("pagerduty"), + routingKey: z.string().nullish(), + severityOverride: z.string().nullish(), + }) + .strict(); +const UpdatePhoneCallChannelConfig = z + .object({ + channelType: z.literal("phone_call"), + phoneNumber: z.string().nullish(), + verifiedPhoneNumberId: z.number().int().nullish(), + phoneNumbers: z.array(z.string().nullable()).nullish(), + voiceLanguage: z.string().nullish(), + preferredLanguage: z.string().nullish(), + }) + .strict(); +const UpdatePushbulletChannelConfig = z + .object({ + channelType: z.literal("pushbullet"), + accessToken: z.string().nullish(), + deviceIden: z.string().nullish(), + }) + .strict(); +const UpdatePushoverChannelConfig = z + .object({ + channelType: z.literal("pushover"), + userKey: z.string().nullish(), + appToken: z.string().nullish(), + priority: z.string().nullish(), + sound: z.string().nullish(), + }) + .strict(); +const UpdateRootlyChannelConfig = z + .object({ + channelType: z.literal("rootly"), + apiKey: z.string().nullish(), + severity: z.string().nullish(), + }) + .strict(); +const UpdateSlackChannelConfig = z + .object({ + channelType: z.literal("slack"), + webhookUrl: z.string().nullish(), + mentionText: z.string().nullish(), + }) + .strict(); +const UpdateSmsChannelConfig = z + .object({ + channelType: z.literal("sms"), + phoneNumber: z.string().nullish(), + verifiedPhoneNumberId: z.number().int().nullish(), + phoneNumbers: z.array(z.string().nullable()).nullish(), + preferredLanguage: z.string().nullish(), + }) + .strict(); +const UpdateSplunkOnCallChannelConfig = z + .object({ + channelType: z.literal("splunk_oncall"), + apiKey: z.string().nullish(), + routingKey: z.string().min(1), + }) + .strict(); +const UpdateTeamsChannelConfig = z + .object({ channelType: z.literal("teams"), webhookUrl: z.string().nullish() }) + .strict(); +const UpdateTelegramChannelConfig = z + .object({ + channelType: z.literal("telegram"), + botToken: z.string().nullish(), + chatId: z.string().min(1), + }) + .strict(); +const UpdateWebhookChannelConfig = z + .object({ + channelType: z.literal("webhook"), + url: z.string().nullish(), + signingSecret: z.string().nullish(), + customHeaders: z.record(z.string().nullable()).nullish(), + }) + .strict(); +const UpdateZapierChannelConfig = z + .object({ + channelType: z.literal("zapier"), + webhookUrl: z.string().nullish(), + }) + .strict(); const UpdateAlertChannelRequest = z .object({ name: z.string().min(0).max(255), config: z.union([ - 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, ]), managedBy: z .enum(["DASHBOARD", "CLI", "TERRAFORM", "MCP", "API"]) .nullish(), + enabled: z.boolean().nullish(), }) .strict(); +const SetEnabledRequest = z.object({ enabled: z.boolean() }).strict(); const TestAlertChannelRequest = z .object({ config: z.union([ @@ -240,10 +427,12 @@ const TestAlertChannelRequest = z MattermostChannelConfig, OpsGenieChannelConfig, PagerDutyChannelConfig, + PhoneCallChannelConfig, PushbulletChannelConfig, PushoverChannelConfig, RootlyChannelConfig, SlackChannelConfig, + SmsChannelConfig, SplunkOnCallChannelConfig, TeamsChannelConfig, TelegramChannelConfig, @@ -307,6 +496,7 @@ const params = z resourceGroupId: z.string().uuid().nullish(), tagId: z.string().uuid().nullish(), environmentId: z.string().uuid().nullish(), + excludeId: z.string().uuid().nullish(), startedFrom: z.string().datetime({ offset: true }).nullish(), startedTo: z.string().datetime({ offset: true }).nullish(), page: z.number().int().gte(0), @@ -319,7 +509,16 @@ const CreateManualIncidentRequest = z severity: z.enum(["DOWN", "DEGRADED", "MAINTENANCE"]), monitorId: z.string().uuid().nullish(), body: z.string().nullish(), + serviceId: z.string().uuid().nullish(), + serviceIncidentId: z.string().uuid().nullish(), + }) + .strict(); +const UpdateIncidentRequest = z + .object({ + title: z.string().min(1).max(2147483647).nullable(), + severity: z.enum(["DOWN", "DEGRADED", "MAINTENANCE"]).nullable(), }) + .partial() .strict(); const ResolveIncidentRequest = z .object({ body: z.string().nullable() }) @@ -431,6 +630,12 @@ const McpServerMonitorConfig = z env: z.record(z.string().nullable()).nullish(), }) .strict(); +const ScriptMonitorConfig = z + .object({ + script: z.string().min(1).max(65536), + timeoutSeconds: z.number().int().gte(5).lte(120).nullish(), + }) + .strict(); const TcpMonitorConfig = z .object({ host: z.string().min(1), @@ -808,13 +1013,23 @@ const AddMonitorTagsRequest = z const CreateMonitorRequest = z .object({ name: z.string().min(0).max(255), - type: z.enum(["HTTP", "DNS", "MCP_SERVER", "TCP", "ICMP", "HEARTBEAT"]), + type: z.enum([ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API", + ]), config: z.union([ DnsMonitorConfig, HeartbeatMonitorConfig, HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, + ScriptMonitorConfig, TcpMonitorConfig, ]), frequencySeconds: z.number().int().gte(10).lte(86400).nullish(), @@ -841,6 +1056,7 @@ const UpdateMonitorRequest = z HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, + ScriptMonitorConfig, TcpMonitorConfig, ]) .nullable(), @@ -864,6 +1080,12 @@ const UpdateMonitorRequest = z const RemoveMonitorTagsRequest = z .object({ tagIds: z.array(z.string().uuid()).min(1) }) .strict(); +const TestMonitorNotificationsRequest = z + .object({ + channelIds: z.array(z.string().uuid()).nullish(), + includeResolved: z.boolean(), + }) + .strict(); const SetAlertChannelsRequest = z .object({ channelIds: z.array(z.string().uuid()) }) .strict(); @@ -936,13 +1158,23 @@ const BulkMonitorActionRequest = z .strict(); const MonitorTestRequest = z .object({ - type: z.enum(["HTTP", "DNS", "MCP_SERVER", "TCP", "ICMP", "HEARTBEAT"]), + type: z.enum([ + "HTTP", + "DNS", + "MCP_SERVER", + "TCP", + "ICMP", + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API", + ]), config: z.union([ DnsMonitorConfig, HeartbeatMonitorConfig, HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, + ScriptMonitorConfig, TcpMonitorConfig, ]), assertions: z.array(CreateAssertionRequest).nullish(), @@ -985,6 +1217,7 @@ const EscalationChain = z const CreateNotificationPolicyRequest = z .object({ name: z.string().min(0).max(255), + description: z.string().min(0).max(500).nullish(), matchRules: z.array(MatchRule).nullish(), escalation: EscalationChain, enabled: z.boolean().nullish().default(true), @@ -994,6 +1227,7 @@ const CreateNotificationPolicyRequest = z const UpdateNotificationPolicyRequest = z .object({ name: z.string().min(0).max(255).nullable(), + description: z.string().min(0).max(500).nullable(), matchRules: z.array(MatchRule).nullable(), escalation: EscalationChain.nullable(), enabled: z.boolean().nullable(), @@ -1033,7 +1267,7 @@ const RetryStrategy = z const CreateResourceGroupRequest = z .object({ name: z.string().min(0).max(255), - description: z.string().nullish(), + description: z.string().min(0).max(500).nullish(), alertPolicyId: z.string().uuid().nullish(), defaultFrequency: z.number().int().gte(30).lte(86400).nullish(), defaultRegions: z.array(z.string()).nullish(), @@ -1053,7 +1287,7 @@ const CreateResourceGroupRequest = z const UpdateResourceGroupRequest = z .object({ name: z.string().min(0).max(255), - description: z.string().nullish(), + description: z.string().min(0).max(500).nullish(), alertPolicyId: z.string().uuid().nullish(), defaultFrequency: z.number().int().gte(30).lte(86400).nullish(), defaultRegions: z.array(z.string()).nullish(), @@ -1201,9 +1435,10 @@ const CreateStatusPageComponentRequest = z .object({ name: z.string().min(0).max(255), description: z.string().min(0).max(500).nullish(), - type: z.enum(["MONITOR", "GROUP", "STATIC"]), + type: z.enum(["MONITOR", "GROUP", "STATIC", "DEPENDENCY"]), monitorId: z.string().uuid().nullish(), resourceGroupId: z.string().uuid().nullish(), + serviceSubscriptionId: z.string().uuid().nullish(), groupId: z.string().uuid().nullish(), showUptime: z.boolean().nullish(), displayOrder: z.number().int().nullish(), @@ -1224,6 +1459,19 @@ const UpdateStatusPageComponentRequest = z }) .partial() .strict(); +const SetStatusPageComponentOverrideRequest = z + .object({ + status: z.enum([ + "OPERATIONAL", + "DEGRADED_PERFORMANCE", + "PARTIAL_OUTAGE", + "MAJOR_OUTAGE", + "UNDER_MAINTENANCE", + ]), + reason: z.string().min(0).max(2000).nullish(), + expiresAt: z.string().datetime({ offset: true }), + }) + .strict(); const ComponentPosition = z .object({ componentId: z.string().uuid(), @@ -1283,11 +1531,8 @@ const CreateStatusPageIncidentRequest = z impact: z.enum(["NONE", "MINOR", "MAJOR", "CRITICAL"]), body: z.string().min(1), affectedComponents: z.array(AffectedComponent).nullish(), - scheduled: z.boolean().nullish(), - scheduledFor: z.string().datetime({ offset: true }).nullish(), - scheduledUntil: z.string().datetime({ offset: true }).nullish(), - autoResolve: z.boolean().nullish(), notifySubscribers: z.boolean().nullish(), + monitoringIncidentId: z.string().uuid().nullish(), }) .strict(); const UpdateStatusPageIncidentRequest = z @@ -1303,8 +1548,12 @@ const UpdateStatusPageIncidentRequest = z .string() .min(0) .max(2048) - .regex(/^https?:\/\/.*/) + .regex(/^$|^https?:\/\/.*/) .nullable(), + published: z.boolean().nullable(), + scheduledFor: z.string().datetime({ offset: true }).nullable(), + scheduledUntil: z.string().datetime({ offset: true }).nullable(), + autoResolve: z.boolean().nullable(), }) .partial() .strict(); @@ -1329,6 +1578,14 @@ const CreateStatusPageIncidentUpdateRequest = z affectedComponents: z.array(AffectedComponent).nullish(), }) .strict(); +const UpdateStatusPageIncidentUpdateRequest = z + .object({ + body: z.string().min(0).max(10000), + status: z + .enum(["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]) + .nullish(), + }) + .strict(); const PageSection = z .object({ groupId: z.string().uuid().nullish(), @@ -1348,8 +1605,30 @@ const ReorderPageLayoutRequest = z groupOrders: z.array(GroupComponentOrder).nullish(), }) .strict(); +const CreateStatusPageMaintenanceRequest = z + .object({ + title: z.string().min(0).max(500), + status: z + .enum(["INVESTIGATING", "IDENTIFIED", "MONITORING", "RESOLVED"]) + .nullish(), + impact: z.enum(["NONE", "MINOR", "MAJOR", "CRITICAL"]), + body: z.string().min(1), + affectedComponents: z.array(AffectedComponent).nullish(), + scheduledFor: z.string().datetime({ offset: true }), + scheduledUntil: z.string().datetime({ offset: true }).nullish(), + autoResolve: z.boolean().nullish(), + notifySubscribers: z.boolean().nullish(), + }) + .strict(); const AdminAddSubscriberRequest = z - .object({ email: z.string().min(1).email() }) + .object({ + email: z.string().min(0).max(320).email().nullable(), + channel: z.enum(["EMAIL", "SMS", "WEBHOOK"]).nullable(), + destination: z.string().min(0).max(2048).nullable(), + componentIds: z.array(z.string().uuid()).nullable(), + requireConfirmation: z.boolean().nullable(), + }) + .partial() .strict(); const CreateTagRequest = z .object({ @@ -1426,6 +1705,68 @@ const CreateWorkspaceRequest = z.object({ name: z.string().min(1) }).strict(); const UpdateWorkspaceRequest = z .object({ name: z.string().min(0).max(200) }) .strict(); +const AlertDeliveryDto = z + .object({ + id: z.string().uuid(), + incidentId: z.string().uuid(), + dispatchId: z.string().uuid().nullish(), + channelId: z.string().uuid(), + channel: z.string(), + channelType: z.string(), + status: z.string(), + eventType: z.string(), + stepNumber: z.number().int(), + fireCount: z.number().int(), + attemptCount: z.number().int(), + lastAttemptAt: z.string().datetime({ offset: true }).nullish(), + nextRetryAt: z.string().datetime({ offset: true }).nullish(), + deliveredAt: z.string().datetime({ offset: true }).nullish(), + errorMessage: z.string().nullish(), + createdAt: z.string().datetime({ offset: true }), + }) + .passthrough(); +const NotificationDispatchDto = z + .object({ + id: z.string().uuid(), + incidentId: z.string().uuid(), + incidentTitle: z.string().nullish(), + policyId: z.string().uuid(), + policyName: z.string().nullish(), + status: z.string(), + completionReason: z.string().nullish(), + currentStep: z.number().int(), + totalSteps: z.number().int().nullish(), + acknowledgedAt: z.string().datetime({ offset: true }).nullish(), + acknowledgedBy: z.string().nullish(), + acknowledgedVia: z.string().nullish(), + matchedRules: z.array(z.string()).nullish(), + nextEscalationAt: z.string().datetime({ offset: true }).nullish(), + lastNotifiedAt: z.string().datetime({ offset: true }).nullish(), + deliveries: z.array(AlertDeliveryDto), + createdAt: z.string().datetime({ offset: true }), + updatedAt: z.string().datetime({ offset: true }), + }) + .passthrough(); +const SkippedDispatch = z + .object({ + id: z.string().uuid(), + status: z.enum([ + "PENDING", + "DISPATCHING", + "DELIVERED", + "ESCALATING", + "ACKNOWLEDGED", + "COMPLETED", + ]), + reason: z.string().min(1), + }) + .strict(); +const AcknowledgeAllIncidentsResponse = z + .object({ + acknowledged: z.array(NotificationDispatchDto), + skipped: z.array(SkippedDispatch), + }) + .passthrough(); const AlertChannelDisplayConfig = z .object({ recipients: z.array(z.string()).nullable(), @@ -1443,6 +1784,11 @@ const AlertChannelDisplayConfig = z severity: z.string().nullable(), site: z.string().nullable(), projectKey: z.string().nullable(), + phoneNumber: z.string().nullable(), + verifiedPhoneNumberId: z.number().int().nullable(), + phoneNumbers: z.array(z.string()).nullable(), + voiceLanguage: z.string().nullable(), + preferredLanguage: z.string().nullable(), }) .partial() .passthrough(); @@ -1452,6 +1798,7 @@ const AlertChannelDto = z name: z.string(), channelType: z.string(), displayConfig: AlertChannelDisplayConfig.nullish(), + enabled: z.boolean(), createdAt: z.string().datetime({ offset: true }), updatedAt: z.string().datetime({ offset: true }), configHash: z.string().nullish(), @@ -1460,26 +1807,6 @@ const AlertChannelDto = z lastDeliveryStatus: z.string().nullish(), }) .passthrough(); -const AlertDeliveryDto = z - .object({ - id: z.string().uuid(), - incidentId: z.string().uuid(), - dispatchId: z.string().uuid().nullish(), - channelId: z.string().uuid(), - channel: z.string(), - channelType: z.string(), - status: z.string(), - eventType: z.string(), - stepNumber: z.number().int(), - fireCount: z.number().int(), - attemptCount: z.number().int(), - lastAttemptAt: z.string().datetime({ offset: true }).nullish(), - nextRetryAt: z.string().datetime({ offset: true }).nullish(), - deliveredAt: z.string().datetime({ offset: true }).nullish(), - errorMessage: z.string().nullish(), - createdAt: z.string().datetime({ offset: true }), - }) - .passthrough(); const ApiKeyCreateResponse = z .object({ id: z.number().int(), @@ -1697,15 +2024,34 @@ const Dns = z failureKind: z.string().nullish(), }) .strict(); -const McpServer = z +const McpServer = z + .object({ + check_type: z.literal("mcp_server"), + url: z.string().nullish(), + protocolVersion: z.string().nullish(), + serverInfo: z.record(z.object({}).partial().strict().nullable()).nullish(), + toolCount: z.number().int().nullish(), + resourceCount: z.number().int().nullish(), + promptCount: z.number().int().nullish(), + }) + .strict(); +const CodeCheckStep = z + .object({ + name: z.string(), + status: z.string(), + durationMs: z.number().int().nullish(), + error: z.string().nullish(), + }) + .strict(); +const Code = z .object({ - check_type: z.literal("mcp_server"), - url: z.string().nullish(), - protocolVersion: z.string().nullish(), - serverInfo: z.record(z.object({}).partial().strict().nullable()).nullish(), - toolCount: z.number().int().nullish(), - resourceCount: z.number().int().nullish(), - promptCount: z.number().int().nullish(), + check_type: z.literal("code"), + exitCode: z.number().int(), + stdoutSnippet: z.string().nullish(), + stderrSnippet: z.string().nullish(), + steps: z.array(CodeCheckStep.nullable()).nullish(), + failureKind: z.string().nullish(), + timedOut: z.boolean().nullish(), }) .strict(); const CheckTypeDetailsDto = z.discriminatedUnion("check_type", [ @@ -1714,6 +2060,7 @@ const CheckTypeDetailsDto = z.discriminatedUnion("check_type", [ Icmp, Dns, McpServer, + Code, ]); const CheckResultDetailsDto = z .object({ @@ -1809,6 +2156,14 @@ const ComponentImpact = z majorOutageSeconds: z.number().int(), }) .strict(); +const ComponentSample = z + .object({ + componentId: z.string().uuid(), + componentName: z.string().nullish(), + oldStatus: z.string().nullish(), + newStatus: z.string(), + }) + .strict(); const ComponentsSummaryDto = z .object({ totalCount: z.number().int(), @@ -1819,6 +2174,13 @@ const ComponentsSummaryDto = z const ComponentStatusDto = z .object({ id: z.string(), name: z.string(), status: z.string() }) .passthrough(); +const ComponentTransitionEventDto = z + .object({ + newStatus: z.string(), + componentCount: z.number().int(), + componentSample: z.array(ComponentSample), + }) + .passthrough(); const ComponentUptimeSummaryDto = z .object({ day: z.number().nullish(), @@ -1827,6 +2189,24 @@ const ComponentUptimeSummaryDto = z source: z.string(), }) .passthrough(); +const CreditTier = z + .object({ + uptimeRange: z.string(), + creditPercent: z.number().int().nullish(), + formula: z.string().nullish(), + notes: z.string().nullish(), + }) + .strict(); +const CreditPolicy = z + .object({ + summary: z.string().nullable(), + maxCreditPercent: z.number().int().nullable(), + claimWindowDays: z.number().int().nullable(), + creditApplicationDays: z.number().int().nullable(), + tiers: z.array(CreditTier).nullable(), + }) + .partial() + .strict(); const CursorPageCheckResultDto = z .object({ data: z.array(CheckResultDto), @@ -1834,6 +2214,52 @@ const CursorPageCheckResultDto = z hasMore: z.boolean(), }) .passthrough(); +const IncidentActivityPayloadDto = z + .object({ + oldStatus: z.string().nullable(), + newStatus: z.string().nullable(), + body: z.string().nullable(), + createdBy: z.string().nullable(), + phase: z.string().nullable(), + status: z.string().nullable(), + policyId: z.string().nullable(), + policyName: z.string().nullable(), + currentStep: z.number().int().nullable(), + dispatchId: z.string().nullable(), + acknowledgedBy: z.string().nullable(), + acknowledgedVia: z.string().nullable(), + eventType: z.string().nullable(), + stepNumber: z.number().int().nullable(), + fireCount: z.number().int().nullable(), + channelId: z.string().nullable(), + channelName: z.string().nullable(), + channelType: z.string().nullable(), + errorMessage: z.string().nullable(), + fromStatus: z.string().nullable(), + toStatus: z.string().nullable(), + reason: z.string().nullable(), + affectedRegions: z.array(z.string()).nullable(), + statusPageIncidentId: z.string().nullable(), + }) + .partial() + .passthrough(); +const IncidentActivityEventDto = z + .object({ + id: z.string().uuid(), + at: z.string().datetime({ offset: true }), + kind: z.string(), + actor: z.string().nullish(), + summary: z.string(), + payload: IncidentActivityPayloadDto.nullish(), + }) + .passthrough(); +const CursorPageIncidentActivityEventDto = z + .object({ + data: z.array(IncidentActivityEventDto), + nextCursor: z.string().nullish(), + hasMore: z.boolean(), + }) + .passthrough(); const ServiceCatalogDto = z .object({ id: z.string().uuid(), @@ -1848,6 +2274,7 @@ const ServiceCatalogDto = z lifecycleStatus: z.string(), enabled: z.boolean(), published: z.boolean(), + slaPublished: z.boolean(), overallStatus: z.string().nullish(), createdAt: z.string().datetime({ offset: true }), updatedAt: z.string().datetime({ offset: true }), @@ -1884,6 +2311,66 @@ const CursorPageServicePollResultDto = z hasMore: z.boolean(), }) .passthrough(); +const IncidentEventDto = z + .object({ + incidentId: z.string().uuid(), + externalId: z.string().nullish(), + title: z.string(), + impact: z.string().nullish(), + status: z.string().nullish(), + body: z.string().nullish(), + shortlink: z.string().nullish(), + startedAt: z.string().datetime({ offset: true }).nullish(), + resolvedAt: z.string().datetime({ offset: true }).nullish(), + detectedAt: z.string().datetime({ offset: true }).nullish(), + vendorCreatedAt: z.string().datetime({ offset: true }).nullish(), + durationSeconds: z.number().int().nullish(), + affectedComponentIds: z.array(z.string().uuid()).nullish(), + }) + .passthrough(); +const MaintenanceEventDto = z + .object({ + maintenanceId: z.string().uuid(), + externalId: z.string(), + title: z.string(), + status: z.string(), + impact: z.string().nullish(), + shortlink: z.string().nullish(), + scheduledFor: z.string().datetime({ offset: true }).nullish(), + scheduledUntil: z.string().datetime({ offset: true }).nullish(), + startedAt: z.string().datetime({ offset: true }).nullish(), + completedAt: z.string().datetime({ offset: true }).nullish(), + affectedComponentIds: z.array(z.string().uuid()).nullish(), + }) + .passthrough(); +const OrgIncidentAnnotationDto = z + .object({ + incidentId: z.string().uuid(), + displayKey: z.string().nullish(), + status: z.string(), + severity: z.string(), + alerted: z.boolean(), + startedAt: z.string().datetime({ offset: true }).nullish(), + }) + .passthrough(); +const StatusEventDto = z + .object({ + id: z.string().uuid(), + type: z.string(), + at: z.string().datetime({ offset: true }), + incident: IncidentEventDto.nullish(), + maintenance: MaintenanceEventDto.nullish(), + component: ComponentTransitionEventDto.nullish(), + orgAnnotation: OrgIncidentAnnotationDto.nullish(), + }) + .passthrough(); +const CursorPageStatusEventDto = z + .object({ + data: z.array(StatusEventDto), + nextCursor: z.string().nullish(), + hasMore: z.boolean(), + }) + .passthrough(); const MonitorsSummaryDto = z .object({ total: z.number().int(), @@ -1915,6 +2402,7 @@ const DayIncident = z startedAt: z.string().datetime({ offset: true }).nullish(), resolvedAt: z.string().datetime({ offset: true }).nullish(), affectedComponentNames: z.array(z.string()), + affectedComponentIds: z.array(z.string().uuid()), }) .strict(); const DekRotationResultDto = z @@ -1983,6 +2471,15 @@ const GlobalStatusSummaryDto = z }) .passthrough(); const HeartbeatPingResponse = z.object({ ok: z.boolean() }).passthrough(); +const IncidentFailingMemberSnapshotDto = z + .object({ + memberType: z.string(), + monitorId: z.string().uuid().nullish(), + serviceId: z.string().uuid().nullish(), + name: z.string().min(1), + membershipId: z.string().uuid().nullish(), + }) + .passthrough(); const IncidentDto = z .object({ id: z.string().uuid(), @@ -1997,12 +2494,14 @@ const IncidentDto = z reopenCount: z.number().int(), createdByUserId: z.number().int().nullish(), statusPageVisible: z.boolean(), + suppressDispatch: z.boolean(), serviceIncidentId: z.string().uuid().nullish(), serviceId: z.string().uuid().nullish(), externalRef: z.string().nullish(), affectedComponents: z.array(z.string()).nullish(), shortlink: z.string().nullish(), resolutionReason: z.string().nullish(), + resolutionNote: z.string().nullish(), startedAt: z.string().datetime({ offset: true }).nullish(), confirmedAt: z.string().datetime({ offset: true }).nullish(), resolvedAt: z.string().datetime({ offset: true }).nullish(), @@ -2019,6 +2518,10 @@ const IncidentDto = z triggeredByRuleSnapshotHashHex: z.string().nullish(), triggeredByRuleIndex: z.number().int().nullish(), engineVersion: z.string().nullish(), + displayKey: z.string().nullish(), + alertCollapsedByResourceGroupIds: z.array(z.string().uuid()).nullish(), + peakFailingMemberCount: z.number().int().nullish(), + failingMembersAtPeak: z.array(IncidentFailingMemberSnapshotDto).nullish(), }) .passthrough(); const IncidentUpdateDto = z @@ -2036,6 +2539,7 @@ const IncidentUpdateDto = z const LinkedStatusPageIncidentDto = z .object({ id: z.string().uuid(), + spIncidentId: z.string().uuid(), statusPageId: z.string().uuid(), statusPageName: z.string(), statusPageSlug: z.string(), @@ -2044,6 +2548,19 @@ const LinkedStatusPageIncidentDto = z impact: z.string(), scheduled: z.boolean(), publishedAt: z.string().datetime({ offset: true }).nullish(), + connectionMode: z.string(), + pageIncidentMode: z.string(), + }) + .passthrough(); +const IncidentTriggerDto = z + .object({ + ruleType: z.string().nullish(), + ruleIndex: z.number().int().nullish(), + count: z.number().int().nullish(), + threshold: z.number().int().nullish(), + lastError: z.string().nullish(), + firstFailedCheckAt: z.string().datetime({ offset: true }).nullish(), + source: z.string().min(1), }) .passthrough(); const IncidentDetailDto = z @@ -2051,6 +2568,7 @@ const IncidentDetailDto = z incident: IncidentDto, updates: z.array(IncidentUpdateDto), statusPageIncidents: z.array(LinkedStatusPageIncidentDto).nullish(), + trigger: IncidentTriggerDto.nullish(), }) .passthrough(); const IncidentFilterParams = z @@ -2073,6 +2591,7 @@ const IncidentFilterParams = z resourceGroupId: z.string().uuid().nullish(), tagId: z.string().uuid().nullish(), environmentId: z.string().uuid().nullish(), + excludeId: z.string().uuid().nullish(), startedFrom: z.string().datetime({ offset: true }).nullish(), startedTo: z.string().datetime({ offset: true }).nullish(), page: z.number().int().gte(0), @@ -2136,6 +2655,7 @@ const InviteDto = z inviteId: z.number().int(), email: z.string(), roleOffered: z.string(), + createdAt: z.string().datetime({ offset: true }), expiresAt: z.string().datetime({ offset: true }), consumedAt: z.string().datetime({ offset: true }).nullish(), revokedAt: z.string().datetime({ offset: true }).nullish(), @@ -2264,6 +2784,7 @@ const MonitorDto = z HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, + ScriptMonitorConfig, TcpMonitorConfig, ]), frequencySeconds: z.number().int(), @@ -2314,24 +2835,15 @@ const MonitorVersionDto = z createdAt: z.string().datetime({ offset: true }), }) .passthrough(); -const NotificationDispatchDto = z +const NoSlaContext = z .object({ - id: z.string().uuid(), - incidentId: z.string().uuid(), - policyId: z.string().uuid(), - policyName: z.string().nullish(), - status: z.string(), - completionReason: z.string().nullish(), - currentStep: z.number().int(), - totalSteps: z.number().int().nullish(), - acknowledgedAt: z.string().datetime({ offset: true }).nullish(), - nextEscalationAt: z.string().datetime({ offset: true }).nullish(), - lastNotifiedAt: z.string().datetime({ offset: true }).nullish(), - deliveries: z.array(AlertDeliveryDto), - createdAt: z.string().datetime({ offset: true }), - updatedAt: z.string().datetime({ offset: true }), + reason: z.string().nullable(), + historicalClaim: z.string().nullable(), + supportSla: z.string().nullable(), + enterpriseNote: z.string().nullable(), }) - .passthrough(); + .partial() + .strict(); const NotificationDto = z .object({ id: z.number().int(), @@ -2344,19 +2856,49 @@ const NotificationDto = z createdAt: z.string().datetime({ offset: true }), }) .passthrough(); +const NotificationPolicyWindowStatsDto = z + .object({ + fires: z.number().int(), + acknowledgements: z.number().int(), + ackableFires: z.number().int(), + expired: z.number().int(), + sends: z.number().int(), + failedSends: z.number().int(), + medianAckSeconds: z.number().int().nullish(), + deepestStepReached: z.number().int().nullish(), + lastFiredAt: z.string().datetime({ offset: true }).nullish(), + lastFiredIncidentId: z.string().uuid().nullish(), + }) + .passthrough(); const NotificationPolicyDto = z .object({ id: z.string().uuid(), organizationId: z.number().int(), name: z.string().min(1), + description: z.string().nullish(), matchRules: z.array(MatchRule), escalation: EscalationChain, enabled: z.boolean(), priority: z.number().int(), createdAt: z.string().datetime({ offset: true }), updatedAt: z.string().datetime({ offset: true }), + stats7d: NotificationPolicyWindowStatsDto.nullish(), + stats30d: NotificationPolicyWindowStatsDto.nullish(), + lastFiredAt: z.string().datetime({ offset: true }).nullish(), + lastFiredIncidentId: z.string().uuid().nullish(), }) .passthrough(); +const OfficialSla = z + .object({ + percentage: z.string().nullable(), + scope: z.string().nullable(), + measurement: z.string().nullable(), + exclusions: z.string().nullable(), + appliesToPlans: z.array(z.string()).nullable(), + notCovered: z.string().nullable(), + }) + .partial() + .strict(); const OrganizationDto = z .object({ id: z.number().int(), @@ -2382,6 +2924,13 @@ const PollChartBucketDto = z totalPolls: z.number().int(), }) .passthrough(); +const PricingTier = z + .object({ + name: z.string(), + slaPercentage: z.string().nullish(), + priceFrom: z.string().nullish(), + }) + .strict(); const RegionStatusDto = z .object({ region: z.string(), @@ -2391,6 +2940,19 @@ const RegionStatusDto = z severityHint: z.string().nullish(), }) .passthrough(); +const RelatedIncidentsResponse = z + .object({ data: z.array(IncidentDto), total: z.number().int() }) + .passthrough(); +const ResourceGroupDeleteBlockerDto = z + .object({ + statusPageId: z.string().uuid(), + statusPageName: z.string().min(1), + statusPageSlug: z.string().min(1), + componentId: z.string().uuid(), + componentName: z.string().min(1), + hostname: z.string().nullish(), + }) + .passthrough(); const ResourceGroupHealthDto = z .object({ status: z.string(), @@ -2399,6 +2961,15 @@ const ResourceGroupHealthDto = z activeIncidents: z.number().int(), thresholdStatus: z.string().nullish(), failingCount: z.number().int().nullish(), + healthBreachedSince: z.string().datetime({ offset: true }).nullish(), + healthEvaluatedAt: z.string().datetime({ offset: true }).nullish(), + }) + .passthrough(); +const ResourceGroupMemberIncidentMarkDto = z + .object({ + at: z.string().datetime({ offset: true }), + incidentId: z.string().uuid().nullish(), + severity: z.string().nullish(), }) .passthrough(); const ResourceGroupMemberDto = z @@ -2421,6 +2992,10 @@ const ResourceGroupMemberDto = z lastCheckedAt: z.string().datetime({ offset: true }).nullish(), monitorType: z.string().nullish(), environmentName: z.string().nullish(), + groupMembershipCount: z.number().int().nullish(), + failingSince: z.string().datetime({ offset: true }).nullish(), + alertCollapsed: z.boolean().nullish(), + incidentMarks: z.array(ResourceGroupMemberIncidentMarkDto).nullish(), }) .passthrough(); const ResourceGroupDto = z @@ -2443,6 +3018,8 @@ const ResourceGroupDto = z recoveryCooldownMinutes: z.number().int().nullish(), health: ResourceGroupHealthDto, members: z.array(ResourceGroupMemberDto).nullish(), + deleteBlockedBy: z.array(ResourceGroupDeleteBlockerDto).nullish(), + openRegionIncident: IncidentDto.nullish(), managedBy: z.string().nullish(), createdAt: z.string().datetime({ offset: true }), updatedAt: z.string().datetime({ offset: true }), @@ -2492,6 +3069,14 @@ const SeoMetadataDto = z }) .partial() .passthrough(); +const ServiceBreakdown = z + .object({ + service: z.string(), + slaPercentage: z.string().nullish(), + scope: z.string().nullish(), + notes: z.string().nullish(), + }) + .strict(); const ServiceComponentDto = z .object({ id: z.string().uuid(), @@ -2552,7 +3137,32 @@ const ServiceIncidentDto = z shortlink: z.string().nullish(), detectedAt: z.string().datetime({ offset: true }).nullish(), vendorCreatedAt: z.string().datetime({ offset: true }).nullish(), + affectedRegions: z.array(z.string()).nullish(), + }) + .passthrough(); +const SourceUrls = z + .object({ + slaPage: z.string().nullable(), + pricingPage: z.string().nullable(), + tosPage: z.string().nullable(), + statusPage: z.string().nullable(), + allSlasPage: z.string().nullable(), + }) + .partial() + .strict(); +const SlaDataDto = z + .object({ + slaType: z.string().nullable(), + officialSla: OfficialSla.nullable(), + serviceBreakdown: z.array(ServiceBreakdown).nullable(), + pricingTiers: z.array(PricingTier).nullable(), + creditPolicy: CreditPolicy.nullable(), + noSlaContext: NoSlaContext.nullable(), + sourceUrls: SourceUrls.nullable(), + lastResearched: z.string().nullable(), + researchNotes: z.string().nullable(), }) + .partial() .passthrough(); const ServiceDetailDto = z .object({ @@ -2576,7 +3186,9 @@ const ServiceDetailDto = z uptime: ComponentUptimeSummaryDto.nullish(), activeMaintenances: z.array(ScheduledMaintenanceDto), dataCompleteness: z.string(), + slaPublished: z.boolean(), seoMetadata: SeoMetadataDto.nullish(), + slaData: SlaDataDto.nullish(), relatedServices: z.array(ServiceCatalogDto).nullish(), }) .passthrough(); @@ -2598,6 +3210,7 @@ const ServiceIncidentDetailDto = z detectedAt: z.string().datetime({ offset: true }).nullish(), shortlink: z.string().nullish(), affectedComponents: z.array(z.string()).nullish(), + affectedRegions: z.array(z.string()).nullish(), updates: z.array(ServiceIncidentUpdateDto), }) .passthrough(); @@ -2655,6 +3268,9 @@ const ServiceUptimeResponse = z source: z.string().nullish(), }) .passthrough(); +const SingleValueResponseAcknowledgeAllIncidentsResponse = z + .object({ data: AcknowledgeAllIncidentsResponse }) + .passthrough(); const SingleValueResponseAlertChannelDto = z .object({ data: AlertChannelDto }) .passthrough(); @@ -2701,6 +3317,9 @@ const SingleValueResponseIncidentPolicyDto = z const SingleValueResponseIncidentTimelineDto = z .object({ data: IncidentTimelineDto }) .passthrough(); +const SingleValueResponseIncidentTriggerDto = z + .object({ data: IncidentTriggerDto }) + .passthrough(); const SingleValueResponseInviteDto = z.object({ data: InviteDto }).passthrough(); const SingleValueResponseListUUID = z .object({ data: z.array(z.string().uuid()) }) @@ -2778,7 +3397,14 @@ const StatusPageComponentDto = z type: z.string(), monitorId: z.string().uuid().nullish(), resourceGroupId: z.string().uuid().nullish(), + serviceSubscriptionId: z.string().uuid().nullish(), + serviceSlug: z.string().nullish(), + serviceName: z.string().nullish(), currentStatus: z.string(), + overrideStatus: z.string().nullish(), + overrideReason: z.string().nullish(), + overrideExpiresAt: z.string().datetime({ offset: true }).nullish(), + overrideActor: z.number().int().nullish(), showUptime: z.boolean(), displayOrder: z.number().int(), pageOrder: z.number().int(), @@ -2829,6 +3455,15 @@ const StatusPageCustomDomainDto = z const SingleValueResponseStatusPageCustomDomainDto = z .object({ data: StatusPageCustomDomainDto }) .passthrough(); +const StatusPageOpenIncidentSummaryDto = z + .object({ + id: z.string().uuid().nullish(), + title: z.string().min(1), + status: z.string(), + startedAt: z.string().datetime({ offset: true }), + updatedAt: z.string().datetime({ offset: true }), + }) + .passthrough(); const StatusPageDto = z .object({ id: z.string().uuid(), @@ -2844,6 +3479,7 @@ const StatusPageDto = z componentCount: z.number().int().nullish(), subscriberCount: z.number().int().nullish(), overallStatus: z.string().nullish(), + openIncident: StatusPageOpenIncidentSummaryDto.nullish(), managedBy: z.string().nullish(), createdAt: z.string().datetime({ offset: true }), updatedAt: z.string().datetime({ offset: true }), @@ -2897,11 +3533,60 @@ const StatusPageIncidentDto = z const SingleValueResponseStatusPageIncidentDto = z .object({ data: StatusPageIncidentDto }) .passthrough(); +const SingleValueResponseStatusPageIncidentUpdateDto = z + .object({ data: StatusPageIncidentUpdateDto }) + .passthrough(); +const StatusPageMeasuredUptimeDayDto = z + .object({ + date: z.string().datetime({ offset: true }), + totalChecks: z.number().int(), + passedChecks: z.number().int(), + uptimePercentage: z.number().nullish(), + }) + .passthrough(); +const StatusPageMeasuredComponentUptimeDto = z + .object({ + source: z.string(), + componentId: z.string().uuid(), + monitorId: z.string().uuid(), + trackingSince: z.string().nullish(), + days: z.array(StatusPageMeasuredUptimeDayDto), + }) + .passthrough(); +const SingleValueResponseStatusPageMeasuredComponentUptimeDto = z + .object({ data: StatusPageMeasuredComponentUptimeDto }) + .passthrough(); +const StatusPageNotificationDeliveryDto = z + .object({ + id: z.string().uuid(), + statusPageId: z.string().uuid(), + subscriberId: z.string().uuid(), + destination: z.string().nullish(), + channel: z.string(), + incidentId: z.string().uuid().nullish(), + incidentUpdateId: z.string().uuid().nullish(), + eventType: z.string(), + status: z.string(), + attemptCount: z.number().int(), + lastAttemptAt: z.string().datetime({ offset: true }).nullish(), + nextRetryAt: z.string().datetime({ offset: true }).nullish(), + deliveredAt: z.string().datetime({ offset: true }).nullish(), + errorMessage: z.string().nullish(), + createdAt: z.string().datetime({ offset: true }), + }) + .passthrough(); +const SingleValueResponseStatusPageNotificationDeliveryDto = z + .object({ data: StatusPageNotificationDeliveryDto }) + .passthrough(); const StatusPageSubscriberDto = z .object({ id: z.string().uuid(), - email: z.string(), + email: z.string().nullish(), + channel: z.string(), + destination: z.string(), + componentIds: z.array(z.string().uuid()).nullish(), confirmed: z.boolean(), + confirmationSent: z.boolean().nullish(), createdAt: z.string().datetime({ offset: true }), }) .passthrough(); @@ -2933,6 +3618,8 @@ const UptimeDto = z passedChecks: z.number().int(), avgLatencyMs: z.number().nullish(), p95LatencyMs: z.number().nullish(), + p50LatencyMs: z.number().nullish(), + incidentCount: z.number().int(), }) .passthrough(); const SingleValueResponseUptimeDto = z.object({ data: UptimeDto }).passthrough(); @@ -2989,6 +3676,7 @@ const TableValueResultAlertChannelDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultAlertDeliveryDto = z @@ -2998,6 +3686,7 @@ const TableValueResultAlertDeliveryDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultApiKeyDto = z @@ -3007,6 +3696,7 @@ const TableValueResultApiKeyDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultAuditEventDto = z @@ -3016,6 +3706,7 @@ const TableValueResultAuditEventDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultCategoryDto = z @@ -3025,6 +3716,7 @@ const TableValueResultCategoryDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultComponentUptimeDayDto = z @@ -3034,6 +3726,7 @@ const TableValueResultComponentUptimeDayDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultDeliveryAttemptDto = z @@ -3043,6 +3736,7 @@ const TableValueResultDeliveryAttemptDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultEnvironmentDto = z @@ -3052,6 +3746,7 @@ const TableValueResultEnvironmentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultIncidentDto = z @@ -3061,6 +3756,7 @@ const TableValueResultIncidentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultIncidentStateTransitionDto = z @@ -3070,6 +3766,7 @@ const TableValueResultIncidentStateTransitionDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultIntegrationDto = z @@ -3079,6 +3776,7 @@ const TableValueResultIntegrationDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultInviteDto = z @@ -3088,6 +3786,7 @@ const TableValueResultInviteDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultMaintenanceWindowDto = z @@ -3097,6 +3796,7 @@ const TableValueResultMaintenanceWindowDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultMemberDto = z @@ -3106,6 +3806,7 @@ const TableValueResultMemberDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultMonitorDto = z @@ -3115,6 +3816,7 @@ const TableValueResultMonitorDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultMonitorVersionDto = z @@ -3124,6 +3826,7 @@ const TableValueResultMonitorVersionDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultNotificationDispatchDto = z @@ -3133,6 +3836,7 @@ const TableValueResultNotificationDispatchDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultNotificationDto = z @@ -3142,6 +3846,7 @@ const TableValueResultNotificationDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultNotificationPolicyDto = z @@ -3151,6 +3856,7 @@ const TableValueResultNotificationPolicyDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultResourceGroupDto = z @@ -3160,6 +3866,7 @@ const TableValueResultResourceGroupDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultRuleEvaluationDto = z @@ -3169,6 +3876,7 @@ const TableValueResultRuleEvaluationDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultScheduledMaintenanceDto = z @@ -3178,6 +3886,7 @@ const TableValueResultScheduledMaintenanceDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultSecretDto = z @@ -3187,6 +3896,7 @@ const TableValueResultSecretDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultServiceComponentDto = z @@ -3196,6 +3906,7 @@ const TableValueResultServiceComponentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultServiceIncidentDto = z @@ -3205,6 +3916,7 @@ const TableValueResultServiceIncidentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultServiceSubscriptionDto = z @@ -3214,6 +3926,7 @@ const TableValueResultServiceSubscriptionDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageComponentDto = z @@ -3223,6 +3936,7 @@ const TableValueResultStatusPageComponentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageComponentGroupDto = z @@ -3232,6 +3946,7 @@ const TableValueResultStatusPageComponentGroupDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageCustomDomainDto = z @@ -3241,6 +3956,7 @@ const TableValueResultStatusPageCustomDomainDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageDto = z @@ -3250,6 +3966,7 @@ const TableValueResultStatusPageDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageIncidentDto = z @@ -3259,6 +3976,17 @@ const TableValueResultStatusPageIncidentDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), + }) + .passthrough(); +const TableValueResultStatusPageNotificationDeliveryDto = z + .object({ + data: z.array(StatusPageNotificationDeliveryDto), + hasNext: z.boolean(), + hasPrev: z.boolean(), + totalElements: z.number().int().nullish(), + totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultStatusPageSubscriberDto = z @@ -3268,6 +3996,7 @@ const TableValueResultStatusPageSubscriberDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultTagDto = z @@ -3277,6 +4006,30 @@ const TableValueResultTagDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), + }) + .passthrough(); +const TableValueResultTestChannelResult = z + .object({ + data: z.array(TestChannelResult), + hasNext: z.boolean(), + hasPrev: z.boolean(), + totalElements: z.number().int().nullish(), + totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), + }) + .passthrough(); +const VoiceLanguageDto = z + .object({ code: z.string().min(1), label: z.string().min(1) }) + .passthrough(); +const TableValueResultVoiceLanguageDto = z + .object({ + data: z.array(VoiceLanguageDto), + hasNext: z.boolean(), + hasPrev: z.boolean(), + totalElements: z.number().int().nullish(), + totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const WebhookDeliveryDto = z @@ -3304,6 +4057,7 @@ const TableValueResultWebhookDeliveryDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultWebhookEndpointDto = z @@ -3313,6 +4067,7 @@ const TableValueResultWebhookEndpointDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const TableValueResultWorkspaceDto = z @@ -3322,6 +4077,7 @@ const TableValueResultWorkspaceDto = z hasPrev: z.boolean(), totalElements: z.number().int().nullish(), totalPages: z.number().int().nullish(), + nextCursor: z.string().nullish(), }) .passthrough(); const WebhookEventCatalogEntry = z @@ -3346,17 +4102,42 @@ export const schemas = { MattermostChannelConfig, OpsGenieChannelConfig, PagerDutyChannelConfig, + PhoneCallChannelConfig, PushbulletChannelConfig, PushoverChannelConfig, RootlyChannelConfig, SlackChannelConfig, + SmsChannelConfig, SplunkOnCallChannelConfig, TeamsChannelConfig, TelegramChannelConfig, WebhookChannelConfig, ZapierChannelConfig, CreateAlertChannelRequest, + UpdateDatadogChannelConfig, + UpdateDiscordChannelConfig, + UpdateEmailChannelConfig, + UpdateGitLabChannelConfig, + UpdateGoogleChatChannelConfig, + UpdateIncidentIoChannelConfig, + UpdateJiraChannelConfig, + UpdateLinearChannelConfig, + UpdateMattermostChannelConfig, + UpdateOpsGenieChannelConfig, + UpdatePagerDutyChannelConfig, + UpdatePhoneCallChannelConfig, + UpdatePushbulletChannelConfig, + UpdatePushoverChannelConfig, + UpdateRootlyChannelConfig, + UpdateSlackChannelConfig, + UpdateSmsChannelConfig, + UpdateSplunkOnCallChannelConfig, + UpdateTeamsChannelConfig, + UpdateTelegramChannelConfig, + UpdateWebhookChannelConfig, + UpdateZapierChannelConfig, UpdateAlertChannelRequest, + SetEnabledRequest, TestAlertChannelRequest, CreateApiKeyRequest, UpdateApiKeyRequest, @@ -3365,6 +4146,7 @@ export const schemas = { UpdateEnvironmentRequest, params, CreateManualIncidentRequest, + UpdateIncidentRequest, ResolveIncidentRequest, AddIncidentUpdateRequest, CreateInviteRequest, @@ -3377,6 +4159,7 @@ export const schemas = { HttpMonitorConfig, IcmpMonitorConfig, McpServerMonitorConfig, + ScriptMonitorConfig, TcpMonitorConfig, BodyContainsAssertion, DnsExpectedCnameAssertion, @@ -3435,6 +4218,7 @@ export const schemas = { CreateMonitorRequest, UpdateMonitorRequest, RemoveMonitorTagsRequest, + TestMonitorNotificationsRequest, SetAlertChannelsRequest, UpdateAssertionRequest, UpdateMonitorAuthRequest, @@ -3461,6 +4245,7 @@ export const schemas = { UpdateStatusPageRequest, CreateStatusPageComponentRequest, UpdateStatusPageComponentRequest, + SetStatusPageComponentOverrideRequest, ComponentPosition, ReorderComponentsRequest, AddCustomDomainRequest, @@ -3471,9 +4256,11 @@ export const schemas = { UpdateStatusPageIncidentRequest, PublishStatusPageIncidentRequest, CreateStatusPageIncidentUpdateRequest, + UpdateStatusPageIncidentUpdateRequest, PageSection, GroupComponentOrder, ReorderPageLayoutRequest, + CreateStatusPageMaintenanceRequest, AdminAddSubscriberRequest, CreateTagRequest, UpdateTagRequest, @@ -3482,9 +4269,12 @@ export const schemas = { TestWebhookEndpointRequest, CreateWorkspaceRequest, UpdateWorkspaceRequest, + AlertDeliveryDto, + NotificationDispatchDto, + SkippedDispatch, + AcknowledgeAllIncidentsResponse, AlertChannelDisplayConfig, AlertChannelDto, - AlertDeliveryDto, ApiKeyCreateResponse, ApiKeyDto, AssertionResultDto, @@ -3512,6 +4302,8 @@ export const schemas = { Icmp, Dns, McpServer, + CodeCheckStep, + Code, CheckTypeDetailsDto, CheckResultDetailsDto, CheckResultDto, @@ -3521,14 +4313,26 @@ export const schemas = { PolicySnapshotDto, CheckTraceDto, ComponentImpact, + ComponentSample, ComponentsSummaryDto, ComponentStatusDto, + ComponentTransitionEventDto, ComponentUptimeSummaryDto, + CreditTier, + CreditPolicy, CursorPageCheckResultDto, + IncidentActivityPayloadDto, + IncidentActivityEventDto, + CursorPageIncidentActivityEventDto, ServiceCatalogDto, CursorPageServiceCatalogDto, ServicePollResultDto, CursorPageServicePollResultDto, + IncidentEventDto, + MaintenanceEventDto, + OrgIncidentAnnotationDto, + StatusEventDto, + CursorPageStatusEventDto, MonitorsSummaryDto, IncidentsSummaryDto, DashboardOverviewDto, @@ -3540,9 +4344,11 @@ export const schemas = { EnvironmentDto, GlobalStatusSummaryDto, HeartbeatPingResponse, + IncidentFailingMemberSnapshotDto, IncidentDto, IncidentUpdateDto, LinkedStatusPageIncidentDto, + IncidentTriggerDto, IncidentDetailDto, IncidentFilterParams, IncidentPolicyDto, @@ -3563,24 +4369,33 @@ export const schemas = { MonitorReference, MonitorTestResultDto, MonitorVersionDto, - NotificationDispatchDto, + NoSlaContext, NotificationDto, + NotificationPolicyWindowStatsDto, NotificationPolicyDto, + OfficialSla, OrganizationDto, Pageable, PollChartBucketDto, + PricingTier, RegionStatusDto, + RelatedIncidentsResponse, + ResourceGroupDeleteBlockerDto, ResourceGroupHealthDto, + ResourceGroupMemberIncidentMarkDto, ResourceGroupMemberDto, ResourceGroupDto, ResultSummaryDto, ScheduledMaintenanceDto, SecretDto, SeoMetadataDto, + ServiceBreakdown, ServiceComponentDto, ServiceDayDetailDto, ServiceStatusDto, ServiceIncidentDto, + SourceUrls, + SlaDataDto, ServiceDetailDto, ServiceIncidentUpdateDto, ServiceIncidentDetailDto, @@ -3589,6 +4404,7 @@ export const schemas = { ServiceSubscriptionDto, UptimeBucketDto, ServiceUptimeResponse, + SingleValueResponseAcknowledgeAllIncidentsResponse, SingleValueResponseAlertChannelDto, SingleValueResponseAlertDeliveryDto, SingleValueResponseApiKeyCreateResponse, @@ -3605,6 +4421,7 @@ export const schemas = { SingleValueResponseIncidentDetailDto, SingleValueResponseIncidentPolicyDto, SingleValueResponseIncidentTimelineDto, + SingleValueResponseIncidentTriggerDto, SingleValueResponseInviteDto, SingleValueResponseListUUID, SingleValueResponseLong, @@ -3636,12 +4453,19 @@ export const schemas = { SingleValueResponseStatusPageComponentGroupDto, StatusPageCustomDomainDto, SingleValueResponseStatusPageCustomDomainDto, + StatusPageOpenIncidentSummaryDto, StatusPageDto, SingleValueResponseStatusPageDto, StatusPageIncidentComponentDto, StatusPageIncidentUpdateDto, StatusPageIncidentDto, SingleValueResponseStatusPageIncidentDto, + SingleValueResponseStatusPageIncidentUpdateDto, + StatusPageMeasuredUptimeDayDto, + StatusPageMeasuredComponentUptimeDto, + SingleValueResponseStatusPageMeasuredComponentUptimeDto, + StatusPageNotificationDeliveryDto, + SingleValueResponseStatusPageNotificationDeliveryDto, StatusPageSubscriberDto, SingleValueResponseStatusPageSubscriberDto, SingleValueResponseString, @@ -3691,8 +4515,12 @@ export const schemas = { TableValueResultStatusPageCustomDomainDto, TableValueResultStatusPageDto, TableValueResultStatusPageIncidentDto, + TableValueResultStatusPageNotificationDeliveryDto, TableValueResultStatusPageSubscriberDto, TableValueResultTagDto, + TableValueResultTestChannelResult, + VoiceLanguageDto, + TableValueResultVoiceLanguageDto, WebhookDeliveryDto, TableValueResultWebhookDeliveryDto, TableValueResultWebhookEndpointDto, diff --git a/src/lib/api.generated.ts b/src/lib/api.generated.ts index 62299b3..0cfd6ad 100644 --- a/src/lib/api.generated.ts +++ b/src/lib/api.generated.ts @@ -61,6 +61,23 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/alert-channels/{id}/enabled": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Enable or disable an alert channel without re-uploading config */ + patch: operations["setEnabled"]; + trace?: never; + }; "/api/v1/alert-channels/{id}/test": { parameters: { query?: never; @@ -168,7 +185,7 @@ export interface paths { options?: never; head?: never; /** Update API key */ - patch: operations["update_15"]; + patch: operations["update_16"]; trace?: never; }; "/api/v1/api-keys/{id}/regenerate": { @@ -213,7 +230,7 @@ export interface paths { cookie?: never; }; /** List audit events for the current organization */ - get: operations["list_19"]; + get: operations["list_20"]; put?: never; post?: never; delete?: never; @@ -409,7 +426,7 @@ export interface paths { }; /** * Paged list of rule evaluations for a monitor - * @description Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations, and occurredAt window. + * @description Filter by ruleType (e.g. consecutive_failures), region, onlyMatched=true to narrow to firing evaluations. Time window defaults to the last 7 days when from/to are omitted; windows wider than 30 days are clamped. */ get: operations["listMonitorRuleEvaluations"]; put?: never; @@ -427,7 +444,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Paged list of state transitions for a monitor (optionally time-bounded) */ + /** + * Paged list of state transitions for a monitor + * @description Time window defaults to the last 30 days when from/to are omitted; windows wider than 90 days are clamped. + */ get: operations["listMonitorTransitions"]; put?: never; post?: never; @@ -526,8 +546,72 @@ export interface paths { path?: never; cookie?: never; }; - /** Get incident details including update timeline */ - get: operations["get_11"]; + /** + * Get incident details including update timeline + * @description Shell payload: incident row, updates, and linked status-page incidents. Trigger enrichment (forensics / check_results) is GET /{id}/trigger so first paint is not blocked on hypertable reads. + */ + get: operations["get_9"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update incident title and/or severity */ + patch: operations["update_15"]; + trace?: never; + }; + "/api/v1/incidents/{id}/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Acknowledge all open notification dispatches for an incident + * @description Atomically acknowledges every DELIVERED or ESCALATING dispatch for the incident. Already-acknowledged and non-acknowledgeable dispatches are returned in skipped (not errors). MEMBER+. + */ + post: operations["acknowledgeAll"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/incidents/{id}/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List merged activity events for an incident + * @description Cursor-paginated unified activity stream merging incident updates, notification dispatches, alert deliveries, forensic state transitions, and linked status-page updates. Ordered by time descending. + */ + get: operations["listEvents_1"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/incidents/{id}/related": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List related incidents sharing the same origin + * @description Returns same-origin recurrence (monitor, service, or resource group) within the window, excluding the current incident. total is the full count for “Nth outage this month” copy. + */ + get: operations["listRelated"]; put?: never; post?: never; delete?: never; @@ -553,6 +637,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/incidents/{id}/trigger": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get incident trigger enrichment + * @description Rule type, count/threshold, last error, and first-failed-check time derived from forensics and check_results. Not required to render the incident shell. + */ + get: operations["getTrigger"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/incidents/{id}/updates": { parameters: { query?: never; @@ -581,7 +685,27 @@ export interface paths { * List all supported integration types * @description Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form. */ - get: operations["list_18"]; + get: operations["list_19"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/integrations/voice-languages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["listVoiceLanguages"]; put?: never; post?: never; delete?: never; @@ -693,7 +817,7 @@ export interface paths { cookie?: never; }; /** List organization members */ - get: operations["list_17"]; + get: operations["list_18"]; put?: never; post?: never; delete?: never; @@ -887,6 +1011,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/monitors/{id}/status-pages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["listStatusPagesForMonitor"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/monitors/{id}/tags": { parameters: { query?: never; @@ -917,7 +1061,7 @@ export interface paths { put?: never; /** * Test an existing monitor - * @description Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test. + * @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. */ post: operations["testExisting"]; delete?: never; @@ -926,6 +1070,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/monitors/{id}/test-notifications": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * 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. + */ + post: operations["testNotifications"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/monitors/{id}/uptime": { parameters: { query?: never; @@ -1112,7 +1276,7 @@ export interface paths { put?: never; /** * Ad-hoc monitor test - * @description Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers. + * @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. */ post: operations["testAdHoc"]; delete?: never; @@ -1181,6 +1345,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/notification-dispatches/{id}/unacknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Unacknowledge a notification dispatch + * @description Reverses a mistaken acknowledgment without reopening the incident. Allowed only from ACKNOWLEDGED. Clears ack fields, stays on the current escalation step, restores nextEscalationAt, and resumes escalation (ESCALATING if more steps remain, else DELIVERED). MEMBER+. + */ + post: operations["unacknowledge"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/notification-policies": { parameters: { query?: never; @@ -1225,7 +1409,10 @@ export interface paths { path?: never; cookie?: never; }; - /** List all dispatches (firing history) for a notification policy */ + /** + * List dispatches (firing history) for a notification policy + * @description Additive optional query params: since/until/cursor/limit. When all are omitted, returns the full history (legacy). When any is set, defaults to a 30-day window and limit 50, and may include nextCursor. Response remains TableValueResult — no CursorPage swap. + */ get: operations["listDispatches"]; put?: never; post?: never; @@ -1260,7 +1447,7 @@ export interface paths { cookie?: never; }; /** List notifications for the current user */ - get: operations["list_16"]; + get: operations["list_17"]; put?: never; post?: never; delete?: never; @@ -1398,6 +1585,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/resource-groups/{id}/matched-policies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List notification policies that match this resource group + * @description Policies whose match rules evaluate true for a DEGRADED or DOWN group-origin INCIDENT_CREATED context on this resource group (includes paused) + */ + get: operations["listMatchedPolicies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/resource-groups/{id}/members": { parameters: { query?: never; @@ -1476,7 +1683,7 @@ export interface paths { cookie?: never; }; /** List all service subscriptions for the organization */ - get: operations["list_15"]; + get: operations["list_16"]; put?: never; post?: never; delete?: never; @@ -1493,7 +1700,7 @@ export interface paths { cookie?: never; }; /** Get a subscription by its ID */ - get: operations["get_10"]; + get: operations["get_11"]; put?: never; post?: never; /** @@ -1592,7 +1799,7 @@ export interface paths { }; /** * 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``. */ get: operations["getComponents"]; put?: never; @@ -1768,6 +1975,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/services/{slugOrId}/status-events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["listStatusEvents"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/services/{slugOrId}/uptime": { parameters: { query?: never; @@ -1901,6 +2128,47 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/status-pages/{id}/components/{componentId}/measured-uptime": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get measured (check-based) component uptime history + * @description Additive measured daily uptime for MONITOR components (ASK-SP-2 / CHG-2). Reads time-bounded check_results_daily rollups for the linked monitor. Response source is always measured. Does not change legacy GET …/uptime incident-window semantics. days default 90, max 365. + */ + get: operations["componentMeasuredUptime"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/components/{componentId}/override": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** + * Set a timed human status override on a component + * @description ASK-SP-1 / CHG-1. Effective currentStatus reflects the override until expiry or clear, unless an active incident takes precedence (incident > override > binding). Max expiry horizon is 24 hours. + */ + put: operations["setComponentOverride"]; + post?: never; + /** Clear a timed human status override on a component */ + delete: operations["clearComponentOverride"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/status-pages/{id}/components/{componentId}/uptime": { parameters: { query?: never; @@ -1908,7 +2176,10 @@ export interface paths { path?: never; cookie?: never; }; - /** Get component uptime history (daily rollups) */ + /** + * Get component uptime history from published incident windows + * @description Legacy incident-window rollup (source semantics: incident_window). Daily % is derived from published status-page incident windows, not probe checks. For measured check-based uptime use GET …/measured-uptime (ASK-SP-2 / CHG-2). + */ get: operations["componentUptime_1"]; put?: never; post?: never; @@ -2047,7 +2318,7 @@ export interface paths { path?: never; cookie?: never; }; - /** List incidents for this status page (filterable by status, paginated) */ + /** List incidents for this status page (paginated) */ get: operations["listIncidents"]; put?: never; /** Create a status page incident (manual) */ @@ -2086,7 +2357,7 @@ export interface paths { }; get?: never; put?: never; - /** Dismiss a draft incident (deletes it permanently) */ + /** Dismiss a draft incident (soft-deletes: resolves without publishing) */ post: operations["dismissIncident"]; delete?: never; options?: never; @@ -2128,6 +2399,23 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/status-pages/{id}/incidents/{incidentId}/updates/{updateId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Edit an existing incident timeline update body */ + patch: operations["patchIncidentUpdate"]; + trace?: never; + }; "/api/v1/status-pages/{id}/layout/reorder": { parameters: { query?: never; @@ -2145,68 +2433,230 @@ export interface paths { patch?: never; trace?: never; }; - "/api/v1/status-pages/{id}/subscribers": { + "/api/v1/status-pages/{id}/maintenance": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** List confirmed subscribers (paginated) */ - get: operations["listSubscribers"]; + /** List maintenance windows for this status page (paginated) */ + get: operations["listMaintenance"]; put?: never; - /** Add a subscriber (immediately confirmed, skips double opt-in) */ - post: operations["addSubscriber"]; + /** Schedule a maintenance window */ + post: operations["createMaintenance"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + "/api/v1/status-pages/{id}/maintenance/{windowId}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; - put?: never; + /** Get a maintenance window with timeline */ + get: operations["getMaintenance"]; + /** Update a maintenance window */ + put: operations["updateMaintenance"]; post?: never; - /** Remove a subscriber */ - delete: operations["removeSubscriber"]; + /** Cancel a maintenance window */ + delete: operations["deleteMaintenance"]; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/v1/tags": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/dismiss": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** List tags for the authenticated organization */ - get: operations["list_3"]; + get?: never; put?: never; - /** Create a new tag */ - post: operations["create_4"]; + /** Dismiss a draft maintenance window */ + post: operations["dismissMaintenance"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/api/v1/tags/{id}": { + "/api/v1/status-pages/{id}/maintenance/{windowId}/publish": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get a tag by ID */ - get: operations["getById"]; + get?: never; + put?: never; + /** Publish a draft maintenance window */ + post: operations["publishMaintenance"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Post a maintenance window timeline update */ + post: operations["postMaintenanceUpdate"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/maintenance/{windowId}/updates/{updateId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Edit an existing maintenance timeline update body */ + patch: operations["patchMaintenanceUpdate"]; + trace?: never; + }; + "/api/v1/status-pages/{id}/notification-deliveries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List notification delivery receipts + * @description Returns delivery rows for this status page (newest first). Optional filters: incidentId, eventType. + */ + get: operations["listNotificationDeliveries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a notification delivery receipt */ + get: operations["getNotificationDelivery"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/notification-deliveries/{deliveryId}/retry": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Retry a failed notification delivery + * @description Queues a FAILED delivery for another attempt. Refuses terminal attempt_count (~5). Idempotent when already RETRY_PENDING. + */ + post: operations["retryNotificationDelivery"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/subscribers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List subscribers including awaiting confirmation (paginated) */ + get: operations["listSubscribers"]; + put?: never; + /** Add a subscriber; requireConfirmation=true for EMAIL double opt-in, omit/false confirms immediately */ + post: operations["addSubscriber"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/status-pages/{id}/subscribers/{subscriberId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Remove a subscriber */ + delete: operations["removeSubscriber"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List tags for the authenticated organization */ + get: operations["list_3"]; + put?: never; + /** Create a new tag */ + post: operations["create_4"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/tags/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a tag by ID */ + get: operations["getById"]; /** Update a tag's name and/or color */ put: operations["update_2"]; post?: never; @@ -2403,6 +2853,13 @@ export interface paths { export type webhooks = Record; export interface components { schemas: { + /** @description Result of acknowledging all acknowledgeable dispatches for an incident */ + AcknowledgeAllIncidentsResponse: { + /** @description Dispatches successfully acknowledged in this request */ + acknowledged: components["schemas"]["NotificationDispatchDto"][]; + /** @description Dispatches skipped (already acked or not in an acknowledgeable state) */ + skipped: components["schemas"]["SkippedDispatch"][]; + }; /** @description Request to acquire a deploy lock for the current workspace */ AcquireDeployLockRequest: { /** @description Identity of the lock requester (e.g. hostname, CI job ID) */ @@ -2449,9 +2906,20 @@ export interface components { AdminAddSubscriberRequest: { /** * Format: email - * @description Email address to add as a confirmed subscriber + * @description Email for EMAIL channel; legacy clients may send only this */ - email: string; + email?: string | null; + /** + * @description Delivery channel (default: EMAIL) + * @enum {string|null} + */ + channel?: "EMAIL" | "SMS" | "WEBHOOK" | null; + /** @description Channel destination (email, phone, or webhook URL) */ + destination?: string | null; + /** @description Component IDs to scope; omit to leave existing scope; empty list widens to the whole page */ + componentIds?: string[] | null; + /** @description When true (EMAIL only), create unconfirmed and send opt-in; null/false confirms immediately */ + requireConfirmation?: boolean | null; }; /** @description Updated affected components; null preserves current */ AffectedComponent: { @@ -2500,6 +2968,19 @@ export interface components { site?: string | null; /** @description Jira project key */ projectKey?: string | null; + /** @description Recipient phone number in E.164 format (SMS / phone-call channels) */ + phoneNumber?: string | null; + /** + * Format: int64 + * @description Id of the org verified_phone_number row bound to this channel + */ + verifiedPhoneNumberId?: number | null; + /** @description Deprecated mirror of phoneNumber as a length-1 list for older clients */ + phoneNumbers?: string[] | null; + /** @description BCP-47 voice language for phone-call TTS (e.g. en-US, de-DE) */ + voiceLanguage?: string | null; + /** @description Preferred language for SMS/voice (BCP-47, e.g. en-US, de-DE) */ + preferredLanguage?: string | null; }; /** @description Alert channel with non-sensitive configuration metadata */ AlertChannelDto: { @@ -2514,8 +2995,10 @@ export interface components { * @description Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL) * @enum {string} */ - channelType: "email" | "webhook" | "slack" | "pagerduty" | "opsgenie" | "teams" | "discord" | "telegram" | "google_chat" | "pushover" | "mattermost" | "splunk_oncall" | "pushbullet" | "linear" | "incident_io" | "rootly" | "zapier" | "datadog" | "jira" | "gitlab"; + channelType: "email" | "webhook" | "slack" | "pagerduty" | "opsgenie" | "teams" | "discord" | "telegram" | "google_chat" | "pushover" | "mattermost" | "splunk_oncall" | "pushbullet" | "linear" | "incident_io" | "rootly" | "zapier" | "datadog" | "jira" | "gitlab" | "sms" | "phone_call"; displayConfig?: components["schemas"]["AlertChannelDisplayConfig"] | null; + /** @description Whether this channel is enabled and will receive alerts */ + enabled: boolean; /** * Format: date-time * @description Timestamp when the channel was created @@ -2568,7 +3051,7 @@ export interface components { * @description Current delivery status * @enum {string} */ - status: "PENDING" | "DELIVERED" | "RETRY_PENDING" | "FAILED" | "CANCELLED"; + status: "PENDING" | "DELIVERED" | "RETRY_PENDING" | "FAILED" | "CANCELLED" | "SKIPPED_NO_CREDIT" | "SKIPPED_UNVERIFIED" | "SKIPPED_OPTED_OUT" | "SKIPPED_RATE_LIMITED"; /** * @description Incident lifecycle event that triggered this delivery * @enum {string} @@ -2968,7 +3451,44 @@ export interface components { policySnapshot?: components["schemas"]["PolicySnapshotDto"] | null; }; /** @description Check-type-specific details — polymorphic by check_type discriminator */ - CheckTypeDetailsDto: components["schemas"]["Http"] | components["schemas"]["Tcp"] | components["schemas"]["Icmp"] | components["schemas"]["Dns"] | components["schemas"]["McpServer"]; + CheckTypeDetailsDto: components["schemas"]["Http"] | components["schemas"]["Tcp"] | components["schemas"]["Icmp"] | components["schemas"]["Dns"] | components["schemas"]["McpServer"] | components["schemas"]["Code"]; + /** @description Code check (browser / multi-step API) specific details */ + Code: { + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + check_type: "code"; + /** + * Format: int32 + * @description Container exit code (0 = pass) + */ + exitCode: number; + /** @description Truncated stdout from the container */ + stdoutSnippet?: string | null; + /** @description Truncated stderr from the container */ + stderrSnippet?: string | null; + /** @description Named steps extracted from Playwright test output */ + steps?: (components["schemas"]["CodeCheckStep"] | null)[] | null; + /** @description Failure classification: timeout, assertion, or error */ + failureKind?: string | null; + /** @description Whether the run hit a step/total/run-budget timeout */ + timedOut?: boolean | null; + }; + /** @description A single named step within a code check execution */ + CodeCheckStep: { + /** @description Step name from test.step() or test() call */ + name: string; + /** @description Step outcome: passed, failed, skipped, or timedOut */ + status: string; + /** + * Format: int32 + * @description Step duration in milliseconds + */ + durationMs?: number | null; + /** @description Error message if the step failed */ + error?: string | null; + }; /** @description One component's uptime contribution for the day */ ComponentImpact: { /** @@ -3014,6 +3534,20 @@ export interface components { */ groupId?: string | null; }; + /** @description One component sample inside a transition rollup */ + ComponentSample: { + /** + * Format: uuid + * @description Component ID + */ + componentId: string; + /** @description Component display name */ + componentName?: string | null; + /** @description Previous status before the flip */ + oldStatus?: string | null; + /** @description New status after the flip */ + newStatus: string; + }; ComponentsSummaryDto: { /** * Format: int32 @@ -3039,6 +3573,18 @@ export interface components { /** @description Current component status, e.g. operational, degraded_performance */ status: string; }; + /** @description Rolled-up component status transitions for a status-events rail row */ + ComponentTransitionEventDto: { + /** @description New status that defines this rollup bucket */ + newStatus: string; + /** + * Format: int32 + * @description Total components in the 5-minute rollup bucket + */ + componentCount: number; + /** @description Up to 5 sample components from the bucket */ + componentSample: components["schemas"]["ComponentSample"][]; + }; /** @description Daily uptime data for a component */ ComponentUptimeDayDto: { /** @@ -3116,7 +3662,7 @@ export interface components { CreateAlertChannelRequest: { /** @description Human-readable name for this alert channel */ name: string; - config: components["schemas"]["DatadogChannelConfig"] | components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["GitLabChannelConfig"] | components["schemas"]["GoogleChatChannelConfig"] | components["schemas"]["IncidentIoChannelConfig"] | components["schemas"]["JiraChannelConfig"] | components["schemas"]["LinearChannelConfig"] | components["schemas"]["MattermostChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["PushbulletChannelConfig"] | components["schemas"]["PushoverChannelConfig"] | components["schemas"]["RootlyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["SplunkOnCallChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["TelegramChannelConfig"] | components["schemas"]["WebhookChannelConfig"] | components["schemas"]["ZapierChannelConfig"]; + config: components["schemas"]["DatadogChannelConfig"] | components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["GitLabChannelConfig"] | components["schemas"]["GoogleChatChannelConfig"] | components["schemas"]["IncidentIoChannelConfig"] | components["schemas"]["JiraChannelConfig"] | components["schemas"]["LinearChannelConfig"] | components["schemas"]["MattermostChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["PhoneCallChannelConfig"] | components["schemas"]["PushbulletChannelConfig"] | components["schemas"]["PushoverChannelConfig"] | components["schemas"]["RootlyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["SmsChannelConfig"] | components["schemas"]["SplunkOnCallChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["TelegramChannelConfig"] | components["schemas"]["WebhookChannelConfig"] | components["schemas"]["ZapierChannelConfig"]; /** * @description Source creating this channel: DASHBOARD, CLI, TERRAFORM, MCP, or API. Defaults to API when omitted. * @enum {string|null} @@ -3204,6 +3750,16 @@ export interface components { monitorId?: string | null; /** @description Detailed description or context for the incident */ body?: string | null; + /** + * Format: uuid + * @description Vendor service to link; optional for Dependencies create CTA + */ + serviceId?: string | null; + /** + * Format: uuid + * @description Vendor incident to link; idempotent if an active org incident already links it + */ + serviceIncidentId?: string | null; }; CreateMonitorRequest: { /** @description Human-readable name for this monitor */ @@ -3212,8 +3768,8 @@ export interface components { * @description Monitor protocol type * @enum {string} */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; + type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT" | "BROWSER" | "MULTI_STEP_API"; + config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["ScriptMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; /** * Format: int32 * @description Check frequency in seconds (10–86400); null defaults to plan minimum (60s on most paid plans) @@ -3245,6 +3801,8 @@ export interface components { CreateNotificationPolicyRequest: { /** @description Human-readable name for this policy */ name: string; + /** @description Optional note; omit or null when unused */ + description?: string | null; /** @description Match rules to evaluate (all must pass; omit or empty for catch-all) */ matchRules?: components["schemas"]["MatchRule"][] | null; escalation: components["schemas"]["EscalationChain"]; @@ -3264,7 +3822,7 @@ export interface components { CreateResourceGroupRequest: { /** @description Human-readable name for this group */ name: string; - /** @description Optional description */ + /** @description Optional description (max 500) */ description?: string | null; /** * Format: uuid @@ -3336,10 +3894,10 @@ export interface components { /** @description Optional description shown on expand */ description?: string | null; /** - * @description Component type: MONITOR, GROUP, or STATIC + * @description Component type: MONITOR, GROUP, STATIC, or DEPENDENCY * @enum {string} */ - type: "MONITOR" | "GROUP" | "STATIC"; + type: "MONITOR" | "GROUP" | "STATIC" | "DEPENDENCY"; /** * Format: uuid * @description Monitor ID (required when type=MONITOR) @@ -3350,19 +3908,24 @@ export interface components { * @description Resource group ID (required when type=GROUP) */ resourceGroupId?: string | null; + /** + * Format: uuid + * @description Service subscription (Dependency) ID — required when type=DEPENDENCY. Bind an existing org subscription; catalog picks must create the subscription first, then pass its id + */ + serviceSubscriptionId?: string | null; /** * Format: uuid * @description Component group ID for visual grouping */ groupId?: string | null; - /** @description Whether to show the uptime bar (default: true) */ + /** @description Whether to show the uptime bar (default: true; false for DEPENDENCY) */ showUptime?: boolean | null; /** * Format: int32 * @description Position in the component list */ displayOrder?: number | null; - /** @description Exclude from overall status calculation (default: false, use true for third-party deps) */ + /** @description Exclude from overall status calculation (default: false; true for DEPENDENCY) */ excludeFromOverall?: boolean | null; /** * Format: date @@ -3387,22 +3950,13 @@ export interface components { body: string; /** @description Component IDs affected by this incident */ affectedComponents?: components["schemas"]["AffectedComponent"][] | null; - /** @description Whether this is a scheduled maintenance (default: false) */ - scheduled?: boolean | null; - /** - * Format: date-time - * @description Maintenance start time (required when scheduled=true) - */ - scheduledFor?: string | null; - /** - * Format: date-time - * @description Maintenance end time - */ - scheduledUntil?: string | null; - /** @description Auto-resolve at scheduledUntil (default: false) */ - autoResolve?: boolean | null; /** @description Whether to email confirmed subscribers about this incident (default: true) */ notifySubscribers?: boolean | null; + /** + * Format: uuid + * @description Monitoring incident ID to link this status page incident to; null for standalone + */ + monitoringIncidentId?: string | null; }; CreateStatusPageIncidentUpdateRequest: { /** @@ -3417,6 +3971,38 @@ export interface components { /** @description Updated affected components; null preserves current */ affectedComponents?: components["schemas"]["AffectedComponent"][] | null; }; + CreateStatusPageMaintenanceRequest: { + /** @description Customer-facing maintenance title */ + title: string; + /** + * @description Initial status (default: INVESTIGATING) + * @enum {string|null} + */ + status?: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED" | null; + /** + * @description Impact level: NONE, MINOR, MAJOR, or CRITICAL + * @enum {string} + */ + impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; + /** @description Initial update body in markdown */ + body: string; + /** @description Component IDs affected by this window */ + affectedComponents?: components["schemas"]["AffectedComponent"][] | null; + /** + * Format: date-time + * @description Maintenance start time + */ + scheduledFor: string; + /** + * Format: date-time + * @description Maintenance end time + */ + scheduledUntil?: string | null; + /** @description Auto-resolve at scheduledUntil (default: false) */ + autoResolve?: boolean | null; + /** @description Whether to email confirmed subscribers about this window (default: true) */ + notifySubscribers?: boolean | null; + }; CreateStatusPageRequest: { /** @description Human-readable name for this status page */ name: string; @@ -3463,6 +4049,42 @@ export interface components { /** @description Workspace name */ name: string; }; + /** @description Service credit policy for SLA violations */ + CreditPolicy: { + /** @description Brief summary of credit policy */ + summary?: string | null; + /** + * Format: int32 + * @description Max credit as percent of monthly fee + */ + maxCreditPercent?: number | null; + /** + * Format: int32 + * @description Days to submit a credit claim after eligibility + */ + claimWindowDays?: number | null; + /** + * Format: int32 + * @description Days for credit to be applied after approval + */ + creditApplicationDays?: number | null; + /** @description Credit tiers by uptime threshold */ + tiers?: components["schemas"]["CreditTier"][] | null; + }; + /** @description Credit tiers by uptime threshold */ + CreditTier: { + /** @description Uptime range, e.g. '99.1% – 99.98%' */ + uptimeRange: string; + /** + * Format: int32 + * @description Credit percent of monthly fee + */ + creditPercent?: number | null; + /** @description Credit formula when percent is not a fixed number */ + formula?: string | null; + /** @description Additional notes on this credit tier */ + notes?: string | null; + }; /** @description Cursor-paginated response for time-series and append-only data */ CursorPageCheckResultDto: { /** @description Items on this page */ @@ -3473,6 +4095,15 @@ export interface components { hasMore: boolean; }; /** @description Cursor-paginated response for time-series and append-only data */ + CursorPageIncidentActivityEventDto: { + /** @description Items on this page */ + data: components["schemas"]["IncidentActivityEventDto"][]; + /** @description Opaque cursor for the next page; null when there are no more results */ + nextCursor?: string | null; + /** @description Whether more results exist beyond this page */ + hasMore: boolean; + }; + /** @description Cursor-paginated response for time-series and append-only data */ CursorPageServiceCatalogDto: { /** @description Items on this page */ data: components["schemas"]["ServiceCatalogDto"][]; @@ -3490,9 +4121,18 @@ export interface components { /** @description Whether more results exist beyond this page */ hasMore: boolean; }; - /** @description Combined dashboard overview for monitors and incidents */ - DashboardOverviewDto: { - monitors: components["schemas"]["MonitorsSummaryDto"]; + /** @description Cursor-paginated response for time-series and append-only data */ + CursorPageStatusEventDto: { + /** @description Items on this page */ + data: components["schemas"]["StatusEventDto"][]; + /** @description Opaque cursor for the next page; null when there are no more results */ + nextCursor?: string | null; + /** @description Whether more results exist beyond this page */ + hasMore: boolean; + }; + /** @description Combined dashboard overview for monitors and incidents */ + DashboardOverviewDto: { + monitors: components["schemas"]["MonitorsSummaryDto"]; incidents: components["schemas"]["IncidentsSummaryDto"]; }; DatadogChannelConfig: { @@ -3524,7 +4164,7 @@ export interface components { * @enum {string} */ impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; - /** @description True for scheduled maintenances; false for unplanned incidents */ + /** @description True for a maintenance window; false for an incident */ scheduled: boolean; /** * Format: date-time @@ -3538,6 +4178,8 @@ export interface components { resolvedAt?: string | null; /** @description Display names of components affected by this incident (deduplicated) */ affectedComponentNames: string[]; + /** @description UUIDs of components this incident affected */ + affectedComponentIds: string[]; }; /** @description Result of a data encryption key rotation operation */ DekRotationResultDto: { @@ -4209,10 +4851,94 @@ export interface components { */ warnMs: number; }; + /** @description Merged incident activity event (updates, dispatches, deliveries, forensics, SP updates) */ + IncidentActivityEventDto: { + /** + * Format: uuid + * @description Stable event ID (source row ID) + */ + id: string; + /** + * Format: date-time + * @description When the event occurred (ISO 8601) + */ + at: string; + /** + * @description Activity event kind in the merged incident activity stream + * @enum {string} + */ + kind: "update" | "dispatch" | "delivery" | "forensic_transition" | "status_page_update"; + /** @description Actor label when known (user email, system, etc.) */ + actor?: string | null; + /** @description Human-readable summary of the event */ + summary: string; + payload?: components["schemas"]["IncidentActivityPayloadDto"] | null; + }; + /** @description Kind-specific activity fields; omitted keys are absent, not null */ + IncidentActivityPayloadDto: { + /** @description Previous incident status on an update */ + oldStatus?: string | null; + /** @description New incident status on an update */ + newStatus?: string | null; + /** @description Update or status-page note body */ + body?: string | null; + /** @description Who created the update (SYSTEM, USER, …) */ + createdBy?: string | null; + /** @description Dispatch lifecycle phase (fired, acked) */ + phase?: string | null; + /** @description Dispatch, delivery, or status-page status */ + status?: string | null; + /** @description Notification policy id for a dispatch row */ + policyId?: string | null; + /** @description Notification policy name when resolved */ + policyName?: string | null; + /** + * Format: int32 + * @description Current escalation step (1-based) + */ + currentStep?: number | null; + /** @description Notification dispatch id */ + dispatchId?: string | null; + /** @description Who acknowledged the dispatch */ + acknowledgedBy?: string | null; + /** @description Ack channel (UI, Slack, …) */ + acknowledgedVia?: string | null; + /** @description Alert delivery event type */ + eventType?: string | null; + /** + * Format: int32 + * @description Escalation step that sent this delivery + */ + stepNumber?: number | null; + /** + * Format: int32 + * @description How many times this delivery has fired + */ + fireCount?: number | null; + /** @description Alert channel id */ + channelId?: string | null; + /** @description Alert channel name */ + channelName?: string | null; + /** @description Alert channel type */ + channelType?: string | null; + /** @description Delivery error message when the send failed */ + errorMessage?: string | null; + /** @description Forensic from-status */ + fromStatus?: string | null; + /** @description Forensic to-status */ + toStatus?: string | null; + /** @description Forensic transition reason */ + reason?: string | null; + /** @description Regions named on the forensic transition */ + affectedRegions?: string[] | null; + /** @description Linked status-page incident id */ + statusPageIncidentId?: string | null; + }; IncidentDetailDto: { incident: components["schemas"]["IncidentDto"]; updates: components["schemas"]["IncidentUpdateDto"][]; statusPageIncidents?: components["schemas"]["LinkedStatusPageIncidentDto"][] | null; + trigger?: components["schemas"]["IncidentTriggerDto"] | null; }; /** @description Incident triggered by a monitor check failure or manual creation */ IncidentDto: { @@ -4264,6 +4990,8 @@ export interface components { createdByUserId?: number | null; /** @description Whether this incident is visible on the status page */ statusPageVisible: boolean; + /** @description When true, alert channels are suppressed (AWARENESS silent tracking); false means Alerted */ + suppressDispatch: boolean; /** * Format: uuid * @description Linked vendor service incident ID; null for monitor incidents @@ -4285,6 +5013,8 @@ export interface components { * @enum {string|null} */ resolutionReason?: "MANUAL" | "AUTO_RECOVERED" | "AUTO_RESOLVED" | null; + /** @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 */ + resolutionNote?: string | null; /** * Format: date-time * @description Timestamp when the incident was detected or created @@ -4344,6 +5074,86 @@ export interface components { triggeredByRuleIndex?: number | null; /** @description Detection engine semver that evaluated the rule. Omitted from JSON when null, treat missing as null. */ engineVersion?: string | null; + /** @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 */ + displayKey?: string | null; + /** @description Sticky union of resource-group IDs that suppressed a paging dispatch for this member incident; null when never written / legacy */ + alertCollapsedByResourceGroupIds?: string[] | null; + /** + * Format: int32 + * @description Peak non-operational member count while this RESOURCE_GROUP incident was open; null otherwise + */ + peakFailingMemberCount?: number | null; + /** @description Frozen failing members at peakFailingMemberCount; null when not a group incident or never snapshotted */ + failingMembersAtPeak?: components["schemas"]["IncidentFailingMemberSnapshotDto"][] | null; + }; + /** @description Vendor incident fields for a status-events rail row */ + IncidentEventDto: { + /** + * Format: uuid + * @description Vendor catalog incident ID + */ + incidentId: string; + /** @description Vendor-supplied external incident ID */ + externalId?: string | null; + /** @description Incident title from the vendor status page */ + title: string; + /** @description Vendor impact level (major, minor, none) */ + impact?: string | null; + /** @description Vendor lifecycle status (only set on incident.update rows) */ + status?: string | null; + /** @description Update body text (only set on incident.update rows) */ + body?: string | null; + /** @description Short public URL for the vendor incident */ + shortlink?: string | null; + /** + * Format: date-time + * @description When the vendor incident started + */ + startedAt?: string | null; + /** + * Format: date-time + * @description When the vendor incident resolved + */ + resolvedAt?: string | null; + /** + * Format: date-time + * @description When DevHelm first detected the incident + */ + detectedAt?: string | null; + /** + * Format: date-time + * @description Vendor-reported creation timestamp + */ + vendorCreatedAt?: string | null; + /** + * Format: int64 + * @description Total duration in seconds (set on incident.resolved) + */ + durationSeconds?: number | null; + /** @description Affected component IDs from the vendor incident join */ + affectedComponentIds?: string[] | null; + }; + /** @description Frozen failing member identity at peak failing count for a resource-group incident */ + IncidentFailingMemberSnapshotDto: { + /** @description Member type: monitor or service */ + memberType: string; + /** + * Format: uuid + * @description Monitor ID when memberType is monitor + */ + monitorId?: string | null; + /** + * Format: uuid + * @description Service ID when memberType is service + */ + serviceId?: string | null; + /** @description Frozen display name at snapshot time */ + name: string; + /** + * Format: uuid + * @description Membership row ID when available + */ + membershipId?: string | null; }; IncidentFilterParams: { /** @@ -4373,7 +5183,7 @@ export interface components { serviceId?: string | null; /** * Format: uuid - * @description Only return incidents whose monitor belongs to this resource group + * @description Only return incidents owned by this resource group (incidents.resource_group_id) */ resourceGroupId?: string | null; /** @@ -4386,6 +5196,11 @@ export interface components { * @description Only return incidents whose monitor lives in this environment */ environmentId?: string | null; + /** + * Format: uuid + * @description Exclude this incident ID from results (related-incident lists) + */ + excludeId?: string | null; /** * Format: date-time * @description Earliest startedAt to include (inclusive, ISO 8601) @@ -4527,6 +5342,38 @@ export interface components { triggeringEvaluations: components["schemas"]["RuleEvaluationDto"][]; policySnapshot?: components["schemas"]["PolicySnapshotDto"] | null; }; + /** @description Honest trigger metadata for the incident origin tooltip / TTD strip */ + IncidentTriggerDto: { + /** @description Trigger rule type (consecutive_failures, failures_in_window, response_time); null when unknown */ + ruleType?: string | null; + /** + * Format: int32 + * @description 0-based index into the policy trigger_rules array; null when unknown + */ + ruleIndex?: number | null; + /** + * Format: int32 + * @description Observed failing_streak or failures_in_window from forensics; null when unavailable + */ + count?: number | null; + /** + * Format: int32 + * @description Rule required count or threshold_ms from forensics; null when unavailable + */ + threshold?: number | null; + /** @description failure_reason from the triggering check result; null when unavailable */ + lastError?: string | null; + /** + * Format: date-time + * @description Earliest failing check timestamp in the confirm window when computable; null otherwise + */ + firstFailedCheckAt?: string | null; + /** + * @description Where the enrichment came from: forensics, checks, or none (STATUS_DATA/manual/no data) + * @enum {string} + */ + source: "forensics" | "checks" | "none"; + }; IncidentUpdateDto: { /** Format: uuid */ id: string; @@ -4584,6 +5431,11 @@ export interface components { * @enum {string} */ roleOffered: "OWNER" | "ADMIN" | "MEMBER"; + /** + * Format: date-time + * @description Timestamp when the invite was created + */ + createdAt: string; /** * Format: date-time * @description Timestamp when the invite expires @@ -4663,20 +5515,54 @@ export interface components { labelId?: string | null; }; LinkedStatusPageIncidentDto: { - /** Format: uuid */ + /** + * Format: uuid + * @description Status page incident ID (same value as spIncidentId; kept for backwards compatibility) + */ id: string; - /** Format: uuid */ + /** + * Format: uuid + * @description Status page incident ID (alias for id) — use this when the outer context is a monitoring incident + */ + spIncidentId: string; + /** + * Format: uuid + * @description Parent status page ID + */ statusPageId: string; + /** @description Parent status page display name */ statusPageName: string; + /** @description Parent status page URL slug */ statusPageSlug: string; + /** @description Customer-facing incident title */ title: string; - /** @enum {string} */ + /** + * @description Current lifecycle status (INVESTIGATING, IDENTIFIED, MONITORING, RESOLVED) + * @enum {string} + */ status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; - /** @enum {string} */ + /** + * @description Impact level (NONE, MINOR, MAJOR, CRITICAL) + * @enum {string} + */ impact: "NONE" | "MINOR" | "MAJOR" | "CRITICAL"; + /** @description Scheduled maintenance flag */ scheduled: boolean; - /** Format: date-time */ + /** + * Format: date-time + * @description Publish time; null while draft + */ publishedAt?: string | null; + /** + * @description Whether the linked SPI was created by automation (AUTO) or by a human/API caller (MANUAL) + * @enum {string} + */ + connectionMode: "AUTO" | "MANUAL"; + /** + * @description Incident mode of the parent status page at read time (MANUAL, REVIEW, AUTOMATIC) + * @enum {string} + */ + pageIncidentMode: "MANUAL" | "REVIEW" | "AUTOMATIC"; }; /** @description A component affected by a scheduled maintenance window */ MaintenanceComponentRef: { @@ -4690,6 +5576,46 @@ export interface components { /** @description Component status at the time of the maintenance update */ status: string; }; + /** @description Vendor maintenance fields for a status-events rail row */ + MaintenanceEventDto: { + /** + * Format: uuid + * @description Vendor catalog maintenance ID + */ + maintenanceId: string; + /** @description Vendor-supplied external maintenance ID */ + externalId: string; + /** @description Maintenance title from the vendor status page */ + title: string; + /** @description Lifecycle status: scheduled, in_progress, verifying, completed */ + status: string; + /** @description Vendor impact level */ + impact?: string | null; + /** @description Short public URL for the vendor maintenance */ + shortlink?: string | null; + /** + * Format: date-time + * @description Scheduled start; null for undated maintenance + */ + scheduledFor?: string | null; + /** + * Format: date-time + * @description Scheduled end + */ + scheduledUntil?: string | null; + /** + * Format: date-time + * @description When maintenance actually started + */ + startedAt?: string | null; + /** + * Format: date-time + * @description When maintenance completed + */ + completedAt?: string | null; + /** @description Affected component IDs */ + affectedComponentIds?: string[] | null; + }; /** @description A status update within a scheduled maintenance lifecycle */ MaintenanceUpdateDto: { /** @@ -4953,8 +5879,8 @@ export interface components { /** @description Human-readable name for this monitor */ name: string; /** @enum {string} */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; + type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT" | "BROWSER" | "MULTI_STEP_API"; + config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["ScriptMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; /** * Format: int32 * @description Check frequency in seconds (30–86400) @@ -5049,8 +5975,8 @@ export interface components { * @description Monitor protocol type to test * @enum {string} */ - type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; + type: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT" | "BROWSER" | "MULTI_STEP_API"; + config: components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["ScriptMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]; /** @description Optional assertions to evaluate against the test result */ assertions?: components["schemas"]["CreateAssertionRequest"][] | null; }; @@ -5116,6 +6042,17 @@ export interface components { /** @description Hex color code (defaults to #6B7280 if omitted) */ color?: string | null; }; + /** @description Context for vendors with no public SLA */ + NoSlaContext: { + /** @description Reason no SLA is published */ + reason?: string | null; + /** @description Non-binding historical uptime claim */ + historicalClaim?: string | null; + /** @description Support response time SLA if different from uptime SLA */ + supportSla?: string | null; + /** @description Note about enterprise/custom SLA availability */ + enterpriseNote?: string | null; + }; /** @description Dispatch state for a single (incident, notification policy) pair, with delivery history */ NotificationDispatchDto: { /** @@ -5128,6 +6065,8 @@ export interface components { * @description Incident this dispatch is for */ incidentId: string; + /** @description Incident title at read time; null if untitled or missing */ + incidentTitle?: string | null; /** * Format: uuid * @description Notification policy that matched this incident @@ -5160,6 +6099,12 @@ export interface components { * @description Timestamp when this dispatch was acknowledged (null if not acknowledged) */ acknowledgedAt?: string | null; + /** @description Actor who acknowledged this dispatch (user email, api-key:, voice:, etc.); null if not acknowledged */ + acknowledgedBy?: string | null; + /** @description Channel used to acknowledge (DASHBOARD, API, PHONE_CALL, INTERNAL, etc.); null if not acknowledged */ + acknowledgedVia?: string | null; + /** @description Labels of match rules that caused this dispatch (same wording as TestMatchResult); null on pre-V138 rows; catch-all is ["(catch-all: no rules defined)"] */ + matchedRules?: string[] | null; /** * Format: date-time * @description Timestamp when the next escalation step will fire (null if not scheduled) @@ -5222,6 +6167,8 @@ export interface components { organizationId: number; /** @description Human-readable name for this policy */ name: string; + /** @description Optional note; null when unset */ + description?: string | null; /** @description Match rules (all must pass; empty = catch-all) */ matchRules: components["schemas"]["MatchRule"][]; escalation: components["schemas"]["EscalationChain"]; @@ -5242,6 +6189,86 @@ export interface components { * @description Timestamp when the policy was last updated */ updatedAt: string; + stats7d?: components["schemas"]["NotificationPolicyWindowStatsDto"] | null; + stats30d?: components["schemas"]["NotificationPolicyWindowStatsDto"] | null; + /** + * Format: date-time + * @description Created-at of the most recent dispatch for this policy; null if never fired + */ + lastFiredAt?: string | null; + /** + * Format: uuid + * @description Incident id of the most recent dispatch; null if never fired + */ + lastFiredIncidentId?: string | null; + }; + /** @description Time-bounded notification policy activity aggregates */ + NotificationPolicyWindowStatsDto: { + /** + * Format: int32 + * @description Dispatches created in the window + */ + fires: number; + /** + * Format: int32 + * @description Fires in the window that were acknowledged + */ + acknowledgements: number; + /** + * Format: int32 + * @description Ack ratio denominator: fires when the policy has an ack gate, else 0 + */ + ackableFires: number; + /** + * Format: int32 + * @description Fires that exhausted escalation without acknowledgment + */ + expired: number; + /** + * Format: int32 + * @description Alert deliveries linked to fires in the window + */ + sends: number; + /** + * Format: int32 + * @description Linked deliveries with status FAILED + */ + failedSends: number; + /** + * Format: int64 + * @description Median seconds from fire to ack among acknowledged fires; null when none + */ + medianAckSeconds?: number | null; + /** + * Format: int32 + * @description Highest escalation step reached in the window; null when no fires + */ + deepestStepReached?: number | null; + /** + * Format: date-time + * @description Created-at of the most recent fire in the window; null when none + */ + lastFiredAt?: string | null; + /** + * Format: uuid + * @description Incident id of the most recent fire in the window; null when none + */ + lastFiredIncidentId?: string | null; + }; + /** @description The vendor's officially advertised SLA commitment */ + OfficialSla: { + /** @description Advertised uptime percentage, e.g. '99.99%' */ + percentage?: string | null; + /** @description Scope of the SLA, e.g. 'Monthly uptime per region' */ + scope?: string | null; + /** @description How the vendor measures uptime for SLA purposes */ + measurement?: string | null; + /** @description Summary of exclusions from SLA calculation */ + exclusions?: string | null; + /** @description Plan names this SLA applies to, e.g. ['Enterprise'] */ + appliesToPlans?: string[] | null; + /** @description Services/components NOT covered by the SLA */ + notCovered?: string | null; }; OpsGenieChannelConfig: { /** @enum {string} */ @@ -5269,6 +6296,33 @@ export interface components { /** @description Organization website URL */ websiteUrl?: string | null; }; + /** @description Linked internal incident annotation on a vendor status-event row */ + OrgIncidentAnnotationDto: { + /** + * Format: uuid + * @description Internal org incident ID + */ + incidentId: string; + /** @description Human display key (e.g. DEV-42); null until platform INC codes ship */ + displayKey?: string | null; + /** + * @description Internal incident lifecycle status + * @enum {string} + */ + status: "WATCHING" | "TRIGGERED" | "CONFIRMED" | "RESOLVED"; + /** + * @description Internal incident severity + * @enum {string} + */ + severity: "DOWN" | "DEGRADED" | "MAINTENANCE"; + /** @description Whether alert channels were eligible to fire (false for AWARENESS silent tracking) */ + alerted: boolean; + /** + * Format: date-time + * @description When the internal incident started + */ + startedAt?: string | null; + }; /** @description Organization the key belongs to */ OrgInfo: { /** @@ -5312,6 +6366,23 @@ export interface components { */ pageOrder: number; }; + PhoneCallChannelConfig: { + /** @enum {string} */ + channelType: "phone_call"; + /** @description Recipient phone number in E.164 format, e.g. +14155550123 */ + phoneNumber?: string | null; + /** + * Format: int64 + * @description Id of an org verified_phone_number row; alternative to phoneNumber + */ + verifiedPhoneNumberId?: number | null; + /** @description Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set */ + phoneNumbers?: (string | null)[] | null; + /** @description TTS voice language/locale (default: en-US). See VoiceLanguage for supported values */ + voiceLanguage?: string | null; + /** @description Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage */ + preferredLanguage?: string | null; + }; /** @description Billing plan and entitlement state */ PlanInfo: { /** @@ -5384,6 +6455,15 @@ export interface components { */ totalPolls: number; }; + /** @description Pricing tiers with associated SLA levels */ + PricingTier: { + /** @description Tier name, e.g. 'Free', 'Pro', 'Enterprise' */ + name: string; + /** @description SLA percentage for this tier, e.g. '99.9%' */ + slaPercentage?: string | null; + /** @description Starting price, e.g. '$0', '$25/mo', 'Custom' */ + priceFrom?: string | null; + }; PublishStatusPageIncidentRequest: { /** @description Customer-facing title; null keeps draft value */ title?: string | null; @@ -5512,6 +6592,16 @@ export interface components { /** @description Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing */ severityHint?: string | null; }; + /** @description Related incidents sharing the same origin within a time window */ + RelatedIncidentsResponse: { + /** @description Related incident rows (newest first, capped by limit) */ + data: components["schemas"]["IncidentDto"][]; + /** + * Format: int64 + * @description Total matching incidents in the window, excluding the current incident + */ + total: number; + }; /** @description Request body for removing tags from a monitor */ RemoveMonitorTagsRequest: { /** @description IDs of the tags to detach from the monitor */ @@ -5533,6 +6623,27 @@ export interface components { /** @description Optional resolution message or post-mortem notes */ body?: string | null; }; + /** @description Status-page component that references this resource group (blocks delete; public exposure) */ + ResourceGroupDeleteBlockerDto: { + /** + * Format: uuid + * @description Status page that owns the blocking component + */ + statusPageId: string; + /** @description Human-readable status page name */ + statusPageName: string; + /** @description URL-safe status page slug */ + statusPageSlug: string; + /** + * Format: uuid + * @description Blocking GROUP-typed status page component ID + */ + componentId: string; + /** @description Blocking component display name */ + componentName: string; + /** @description Public hostname when a custom domain is configured; null otherwise */ + hostname?: string | null; + }; /** @description Resource group with health summary and optional member details */ ResourceGroupDto: { /** @@ -5593,6 +6704,9 @@ export interface components { health: components["schemas"]["ResourceGroupHealthDto"]; /** @description Member list with individual statuses; populated on detail GET only */ members?: components["schemas"]["ResourceGroupMemberDto"][] | null; + /** @description Status-page GROUP components that reference this group (delete blockers / public exposure); populated on detail GET only — omitted on list */ + deleteBlockedBy?: components["schemas"]["ResourceGroupDeleteBlockerDto"][] | null; + openRegionIncident?: components["schemas"]["IncidentDto"] | null; /** * @description Source that created/owns this group: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on groups created before this attribution column existed. * @enum {string|null} @@ -5628,7 +6742,7 @@ export interface components { operationalCount: number; /** * Format: int32 - * @description Number of members with an active incident or non-operational status + * @description Number of members currently non-operational (not an incident-row count) */ activeIncidents: number; /** @@ -5638,9 +6752,19 @@ export interface components { thresholdStatus?: "healthy" | "degraded" | "down" | null; /** * Format: int32 - * @description Number of failing members at time of last evaluation + * @description Number of failing members at time of last evaluation; null when no threshold configured */ failingCount?: number | null; + /** + * Format: date-time + * @description When the health threshold was first breached in the current cycle; null when not breached + */ + healthBreachedSince?: string | null; + /** + * Format: date-time + * @description When group health was last evaluated (threshold or stamp-only); null until first evaluation + */ + healthEvaluatedAt?: string | null; }; /** @description A single member of a resource group with its computed health status */ ResourceGroupMemberDto: { @@ -5713,17 +6837,46 @@ export interface components { monitorType?: string | null; /** @description Environment name; monitors only */ environmentName?: string | null; - }; - ResponseSizeAssertion: { - /** @enum {string} */ - type: "response_size"; /** * Format: int32 - * @description Maximum response body size in bytes before the check fails + * @description Count of resource groups this monitor or service belongs to; detail GET only — omitted on list */ - maxBytes: number; - }; - ResponseTimeAssertion: { + groupMembershipCount?: number | null; + /** + * Format: date-time + * @description Start of the current non-operational stretch; null when operational or unknown (services OK); detail GET only — omitted on list + */ + failingSince?: string | null; + /** @description True when an active member incident records this group among alertCollapsedByResourceGroupIds; detail GET only — omitted on list */ + alertCollapsed?: boolean | null; + /** @description Incident marks for the trailing 24h strip; null when metrics omitted or failed; detail GET only — omitted on list */ + incidentMarks?: components["schemas"]["ResourceGroupMemberIncidentMarkDto"][] | null; + }; + /** @description Member incident mark for the trailing 24h uptime strip */ + ResourceGroupMemberIncidentMarkDto: { + /** + * Format: date-time + * @description Incident startedAt (or first confirmed) within the trailing 24h window + */ + at: string; + /** + * Format: uuid + * @description Incident ID for navigation; null when unknown + */ + incidentId?: string | null; + /** @description Optional severity display hint */ + severity?: string | null; + }; + ResponseSizeAssertion: { + /** @enum {string} */ + type: "response_size"; + /** + * Format: int32 + * @description Maximum response body size in bytes before the check fails + */ + maxBytes: number; + }; + ResponseTimeAssertion: { /** @enum {string} */ type: "response_time"; /** @@ -5881,6 +7034,15 @@ export interface components { /** @description Status updates posted during the maintenance lifecycle */ updates: components["schemas"]["MaintenanceUpdateDto"][]; }; + ScriptMonitorConfig: { + /** @description Playwright test script source code */ + script: string; + /** + * Format: int32 + * @description Maximum execution time in seconds (5–120) + */ + timeoutSeconds?: number | null; + }; /** @description Secret with change-detection hash; plaintext value is never returned */ SecretDto: { /** @@ -5919,6 +7081,17 @@ export interface components { /** @description Long-form about text for the About section on pSEO pages */ about?: string | null; }; + /** @description Per-service breakdown for vendors with per_service SLA type */ + ServiceBreakdown: { + /** @description Sub-service name, e.g. 'EC2', 'S3' */ + service: string; + /** @description SLA percentage for this sub-service */ + slaPercentage?: string | null; + /** @description Scope qualifier, e.g. 'Region (Multi-AZ)' */ + scope?: string | null; + /** @description Additional notes on measurement or conditions */ + notes?: string | null; + }; /** @description Related services */ ServiceCatalogDto: { /** Format: uuid */ @@ -5939,6 +7112,8 @@ export interface components { lifecycleStatus: "ACTIVE" | "DEGRADED" | "DEPRECATED" | "RETIRED"; enabled: boolean; published: boolean; + /** @description Whether the service's SLA page is publicly visible */ + slaPublished: boolean; overallStatus?: string | null; /** Format: date-time */ createdAt: string; @@ -6062,7 +7237,10 @@ export interface components { uptime?: components["schemas"]["ComponentUptimeSummaryDto"] | null; activeMaintenances: components["schemas"]["ScheduledMaintenanceDto"][]; dataCompleteness: string; + /** @description Whether the service's SLA page is publicly visible */ + slaPublished: boolean; seoMetadata?: components["schemas"]["SeoMetadataDto"] | null; + slaData?: components["schemas"]["SlaDataDto"] | null; relatedServices?: components["schemas"]["ServiceCatalogDto"][] | null; }; ServiceIncidentDetailDto: { @@ -6079,6 +7257,7 @@ export interface components { detectedAt?: string | null; shortlink?: string | null; affectedComponents?: string[] | null; + affectedRegions?: string[] | null; updates: components["schemas"]["ServiceIncidentUpdateDto"][]; }; ServiceIncidentDto: { @@ -6103,6 +7282,7 @@ export interface components { detectedAt?: string | null; /** Format: date-time */ vendorCreatedAt?: string | null; + affectedRegions?: string[] | null; }; ServiceIncidentUpdateDto: { status: string; @@ -6299,9 +7479,31 @@ export interface components { /** @description IDs of alert channels to link (replaces current list) */ channelIds: string[]; }; + /** @description Request body for toggling a resource's enabled state */ + SetEnabledRequest: { + /** @description Whether the resource should be enabled */ + enabled: boolean; + }; SetMonitorAuthRequest: { config: components["schemas"]["ApiKeyAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["BearerAuthConfig"] | components["schemas"]["HeaderAuthConfig"]; }; + SetStatusPageComponentOverrideRequest: { + /** + * @description Override status while active; takes precedence over binding until expiry/clear + * @enum {string} + */ + status: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE"; + /** @description Optional operator reason shown in the builder */ + reason?: string | null; + /** + * Format: date-time + * @description When the override expires (must be in the future, at most 24h from now) + */ + expiresAt: string; + }; + SingleValueResponseAcknowledgeAllIncidentsResponse: { + data: components["schemas"]["AcknowledgeAllIncidentsResponse"]; + }; SingleValueResponseAlertChannelDto: { data: components["schemas"]["AlertChannelDto"]; }; @@ -6350,6 +7552,9 @@ export interface components { SingleValueResponseIncidentTimelineDto: { data: components["schemas"]["IncidentTimelineDto"]; }; + SingleValueResponseIncidentTriggerDto: { + data: components["schemas"]["IncidentTriggerDto"]; + }; SingleValueResponseInviteDto: { data: components["schemas"]["InviteDto"]; }; @@ -6441,6 +7646,15 @@ export interface components { SingleValueResponseStatusPageIncidentDto: { data: components["schemas"]["StatusPageIncidentDto"]; }; + SingleValueResponseStatusPageIncidentUpdateDto: { + data: components["schemas"]["StatusPageIncidentUpdateDto"]; + }; + SingleValueResponseStatusPageMeasuredComponentUptimeDto: { + data: components["schemas"]["StatusPageMeasuredComponentUptimeDto"]; + }; + SingleValueResponseStatusPageNotificationDeliveryDto: { + data: components["schemas"]["StatusPageNotificationDeliveryDto"]; + }; SingleValueResponseStatusPageSubscriberDto: { data: components["schemas"]["StatusPageSubscriberDto"]; }; @@ -6471,6 +7685,21 @@ export interface components { SingleValueResponseWorkspaceDto: { data: components["schemas"]["WorkspaceDto"]; }; + /** @description A dispatch that was not acknowledged by ack-all */ + SkippedDispatch: { + /** + * Format: uuid + * @description Dispatch identifier + */ + id: string; + /** + * @description Current dispatch status + * @enum {string} + */ + status: "PENDING" | "DISPATCHING" | "DELIVERED" | "ESCALATING" | "ACKNOWLEDGED" | "COMPLETED"; + /** @description Why this dispatch was skipped */ + reason: string; + }; SlackChannelConfig: { /** @enum {string} */ channelType: "slack"; @@ -6479,6 +7708,51 @@ export interface components { /** @description Optional mention text included in notifications, e.g. @channel */ mentionText?: string | null; }; + /** @description Researched vendor SLA/pricing data for pSEO SLA report pages */ + SlaDataDto: { + /** @description SLA pattern: plan_gated, per_service, no_public_sla, or universal */ + slaType?: string | null; + officialSla?: components["schemas"]["OfficialSla"] | null; + /** @description Per-service breakdown for vendors with per_service SLA type */ + serviceBreakdown?: components["schemas"]["ServiceBreakdown"][] | null; + /** @description Pricing tiers with associated SLA levels */ + pricingTiers?: components["schemas"]["PricingTier"][] | null; + creditPolicy?: components["schemas"]["CreditPolicy"] | null; + noSlaContext?: components["schemas"]["NoSlaContext"] | null; + sourceUrls?: components["schemas"]["SourceUrls"] | null; + /** @description ISO date when this data was last manually researched */ + lastResearched?: string | null; + /** @description Freeform operator notes about the research */ + researchNotes?: string | null; + }; + SmsChannelConfig: { + /** @enum {string} */ + channelType: "sms"; + /** @description Recipient phone number in E.164 format, e.g. +14155550123 */ + phoneNumber?: string | null; + /** + * Format: int64 + * @description Id of an org verified_phone_number row; alternative to phoneNumber + */ + verifiedPhoneNumberId?: number | null; + /** @description Deprecated: use phoneNumber. Accepted as a length-1 list for one release; ignored when phoneNumber or id is set */ + phoneNumbers?: (string | null)[] | null; + /** @description Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US */ + preferredLanguage?: string | null; + }; + /** @description Source URLs for SLA, pricing, and ToS pages */ + SourceUrls: { + /** @description URL to vendor's SLA page */ + slaPage?: string | null; + /** @description URL to vendor's pricing page */ + pricingPage?: string | null; + /** @description URL to vendor's Terms of Service */ + tosPage?: string | null; + /** @description URL to vendor's status page */ + statusPage?: string | null; + /** @description URL to vendor's all-services SLA listing */ + allSlasPage?: string | null; + }; SplunkOnCallChannelConfig: { /** @enum {string} */ channelType: "splunk_oncall"; @@ -6515,6 +7789,28 @@ export interface components { */ operator: "equals" | "contains" | "less_than" | "greater_than" | "matches" | "range"; }; + /** @description Curated vendor status-event row for the Dependencies Detail rail */ + StatusEventDto: { + /** + * Format: uuid + * @description Stable row ID (incident/update/maintenance UUID or transition bucket key) + */ + id: string; + /** + * @description Status event row type on the Dependencies Detail rail + * @enum {string} + */ + type: "incident.opened" | "incident.update" | "incident.resolved" | "maintenance.scheduled" | "maintenance.started" | "maintenance.completed" | "component.transition"; + /** + * Format: date-time + * @description Canonical timestamp used for reverse-chronological ordering + */ + at: string; + incident?: components["schemas"]["IncidentEventDto"] | null; + maintenance?: components["schemas"]["MaintenanceEventDto"] | null; + component?: components["schemas"]["ComponentTransitionEventDto"] | null; + orgAnnotation?: components["schemas"]["OrgIncidentAnnotationDto"] | null; + }; /** @description Updated branding configuration; null preserves current */ StatusPageBranding: { /** @description URL for the logo image displayed in the header */ @@ -6562,13 +7858,42 @@ export interface components { name: string; description?: string | null; /** @enum {string} */ - type: "MONITOR" | "GROUP" | "STATIC"; + type: "MONITOR" | "GROUP" | "STATIC" | "DEPENDENCY"; /** Format: uuid */ monitorId?: string | null; /** Format: uuid */ resourceGroupId?: string | null; - /** @enum {string} */ + /** + * Format: uuid + * @description Service subscription (Dependency) id when type=DEPENDENCY + */ + serviceSubscriptionId?: string | null; + /** @description Slug of the subscribed catalog service (denormalized for display) */ + serviceSlug?: string | null; + /** @description Display name of the subscribed catalog service (denormalized for display) */ + serviceName?: string | null; + /** + * @description Effective display status (incident > active override > binding) + * @enum {string} + */ currentStatus: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE"; + /** + * @description Active timed override status; null when unset or expired + * @enum {string|null} + */ + overrideStatus?: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE" | null; + /** @description Optional operator reason for the active override */ + overrideReason?: string | null; + /** + * Format: date-time + * @description When the active override expires; null when unset or expired + */ + overrideExpiresAt?: string | null; + /** + * Format: int32 + * @description User id who set the override; null for API-key actors or when inactive + */ + overrideActor?: number | null; showUptime: boolean; /** Format: int32 */ displayOrder: number; @@ -6645,6 +7970,7 @@ export interface components { subscriberCount?: number | null; /** @enum {string|null} */ overallStatus?: "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE" | null; + openIncident?: components["schemas"]["StatusPageOpenIncidentSummaryDto"] | null; /** * @description Source that created/owns this status page: DASHBOARD, CLI, TERRAFORM, MCP, or API. Null on pages created before this attribution column existed. * @enum {string|null} @@ -6711,12 +8037,170 @@ export interface components { /** Format: date-time */ createdAt: string; }; + /** @description Measured (check-based) daily uptime for a MONITOR status-page component */ + StatusPageMeasuredComponentUptimeDto: { + /** + * @description Uptime source discriminator; always measured for this resource + * @enum {string} + */ + source: "incident_window" | "measured"; + /** + * Format: uuid + * @description Status-page component ID + */ + componentId: string; + /** + * Format: uuid + * @description Linked monitor whose check rollups feed this series + */ + monitorId: string; + /** @description ISO-8601 date bars start (Camp A tracking-since); null only if unresolved */ + trackingSince?: string | null; + /** @description Dense daily buckets from tracking start through today (oldest → newest) */ + days: components["schemas"]["StatusPageMeasuredUptimeDayDto"][]; + }; + /** @description One UTC day of measured (check-based) uptime for a MONITOR status-page component */ + StatusPageMeasuredUptimeDayDto: { + /** + * Format: date-time + * @description Start-of-day timestamp for this bucket (UTC midnight, ISO 8601) + */ + date: string; + /** + * Format: int64 + * @description Total probe checks recorded that day across regions + */ + totalChecks: number; + /** + * Format: int64 + * @description Checks that passed that day across regions + */ + passedChecks: number; + /** + * Format: double + * @description passedChecks / totalChecks × 100; null when totalChecks is 0 + */ + uptimePercentage?: number | null; + }; + /** @description Delivery receipt for a status page subscriber notification */ + StatusPageNotificationDeliveryDto: { + /** + * Format: uuid + * @description Delivery receipt ID + */ + id: string; + /** + * Format: uuid + * @description Status page that owns this delivery + */ + statusPageId: string; + /** + * Format: uuid + * @description Subscriber this delivery targeted + */ + subscriberId: string; + /** @description Subscriber destination (email, phone, or webhook URL) */ + destination?: string | null; + /** @description Delivery channel from the subscriber (EMAIL, SMS, WEBHOOK) */ + channel: string; + /** + * Format: uuid + * @description Related status-page incident ID, if any + */ + incidentId?: string | null; + /** + * Format: uuid + * @description Related incident update ID, if any + */ + incidentUpdateId?: string | null; + /** + * @description Notification event type that triggered this delivery + * @enum {string} + */ + eventType: "SUBSCRIPTION_CONFIRMATION" | "INCIDENT_CREATED" | "INCIDENT_UPDATED" | "INCIDENT_RESOLVED"; + /** + * @description Current delivery status + * @enum {string} + */ + status: "PENDING" | "DELIVERED" | "RETRY_PENDING" | "FAILED" | "CANCELLED" | "SKIPPED_NO_CREDIT" | "SKIPPED_UNVERIFIED" | "SKIPPED_OPTED_OUT" | "SKIPPED_RATE_LIMITED"; + /** + * Format: int32 + * @description Number of delivery attempts made + */ + attemptCount: number; + /** + * Format: date-time + * @description When the last attempt was made + */ + lastAttemptAt?: string | null; + /** + * Format: date-time + * @description When the next retry is scheduled; null if not retrying + */ + nextRetryAt?: string | null; + /** + * Format: date-time + * @description When delivery was confirmed; null if not delivered + */ + deliveredAt?: string | null; + /** @description Error summary from the last failed attempt */ + errorMessage?: string | null; + /** + * Format: date-time + * @description When the delivery row was created + */ + createdAt: string; + }; + /** @description Newest open status-page incident; omitted from JSON when none */ + StatusPageOpenIncidentSummaryDto: { + /** + * Format: uuid + * @description Incident id for dashboard CTAs that open the matching drawer + */ + id?: string | null; + /** @description Incident title shown on the list card live row */ + title: string; + /** + * @description Lifecycle status of the open incident + * @enum {string} + */ + status: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"; + /** + * Format: date-time + * @description When the incident started (ISO 8601) + */ + startedAt: string; + /** + * Format: date-time + * @description When the incident was last updated (ISO 8601) + */ + updatedAt: string; + }; StatusPageSubscriberDto: { - /** Format: uuid */ + /** + * Format: uuid + * @description Subscriber id + */ id: string; - email: string; + /** @description Email when channel is EMAIL; null for other channels */ + email?: string | null; + /** + * @description Delivery channel (EMAIL, SMS, WEBHOOK) + * @enum {string} + */ + channel: "EMAIL" | "SMS" | "WEBHOOK"; + /** @description Channel destination (email, phone, or webhook URL) */ + destination: string; + /** @description Scoped component IDs; null means whole page */ + componentIds?: string[] | null; + /** @description Whether the subscriber has confirmed opt-in */ confirmed: boolean; - /** Format: date-time */ + /** @description True when this call sent a confirmation email; omitted on list reads */ + confirmationSent?: boolean | null; + /** + * Format: date-time + * @description When the subscriber was created + */ createdAt: string; }; /** @description Environment associated with this monitor; null when unassigned */ @@ -6734,6 +8218,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultAlertDeliveryDto: { data: components["schemas"]["AlertDeliveryDto"][]; @@ -6743,6 +8228,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultApiKeyDto: { data: components["schemas"]["ApiKeyDto"][]; @@ -6752,6 +8238,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultAuditEventDto: { data: components["schemas"]["AuditEventDto"][]; @@ -6761,6 +8248,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultCategoryDto: { data: components["schemas"]["CategoryDto"][]; @@ -6770,6 +8258,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultComponentUptimeDayDto: { data: components["schemas"]["ComponentUptimeDayDto"][]; @@ -6779,6 +8268,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultDeliveryAttemptDto: { data: components["schemas"]["DeliveryAttemptDto"][]; @@ -6788,6 +8278,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultEnvironmentDto: { data: components["schemas"]["EnvironmentDto"][]; @@ -6797,6 +8288,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultIncidentDto: { data: components["schemas"]["IncidentDto"][]; @@ -6806,6 +8298,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultIncidentStateTransitionDto: { data: components["schemas"]["IncidentStateTransitionDto"][]; @@ -6815,6 +8308,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultIntegrationDto: { data: components["schemas"]["IntegrationDto"][]; @@ -6824,6 +8318,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultInviteDto: { data: components["schemas"]["InviteDto"][]; @@ -6833,6 +8328,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultMaintenanceWindowDto: { data: components["schemas"]["MaintenanceWindowDto"][]; @@ -6842,6 +8338,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultMemberDto: { data: components["schemas"]["MemberDto"][]; @@ -6851,6 +8348,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultMonitorDto: { data: components["schemas"]["MonitorDto"][]; @@ -6860,6 +8358,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultMonitorVersionDto: { data: components["schemas"]["MonitorVersionDto"][]; @@ -6869,6 +8368,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultNotificationDispatchDto: { data: components["schemas"]["NotificationDispatchDto"][]; @@ -6878,6 +8378,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultNotificationDto: { data: components["schemas"]["NotificationDto"][]; @@ -6887,6 +8388,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultNotificationPolicyDto: { data: components["schemas"]["NotificationPolicyDto"][]; @@ -6896,6 +8398,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultResourceGroupDto: { data: components["schemas"]["ResourceGroupDto"][]; @@ -6905,6 +8408,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultRuleEvaluationDto: { data: components["schemas"]["RuleEvaluationDto"][]; @@ -6914,6 +8418,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultScheduledMaintenanceDto: { data: components["schemas"]["ScheduledMaintenanceDto"][]; @@ -6923,6 +8428,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultSecretDto: { data: components["schemas"]["SecretDto"][]; @@ -6932,6 +8438,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultServiceComponentDto: { data: components["schemas"]["ServiceComponentDto"][]; @@ -6941,6 +8448,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultServiceIncidentDto: { data: components["schemas"]["ServiceIncidentDto"][]; @@ -6950,6 +8458,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultServiceSubscriptionDto: { data: components["schemas"]["ServiceSubscriptionDto"][]; @@ -6959,6 +8468,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageComponentDto: { data: components["schemas"]["StatusPageComponentDto"][]; @@ -6968,6 +8478,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageComponentGroupDto: { data: components["schemas"]["StatusPageComponentGroupDto"][]; @@ -6977,6 +8488,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageCustomDomainDto: { data: components["schemas"]["StatusPageCustomDomainDto"][]; @@ -6986,6 +8498,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageDto: { data: components["schemas"]["StatusPageDto"][]; @@ -6995,6 +8508,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageIncidentDto: { data: components["schemas"]["StatusPageIncidentDto"][]; @@ -7004,6 +8518,17 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; + }; + TableValueResultStatusPageNotificationDeliveryDto: { + data: components["schemas"]["StatusPageNotificationDeliveryDto"][]; + hasNext: boolean; + hasPrev: boolean; + /** Format: int64 */ + totalElements?: number | null; + /** Format: int32 */ + totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultStatusPageSubscriberDto: { data: components["schemas"]["StatusPageSubscriberDto"][]; @@ -7013,6 +8538,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultTagDto: { data: components["schemas"]["TagDto"][]; @@ -7022,6 +8548,27 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; + }; + TableValueResultTestChannelResult: { + data: components["schemas"]["TestChannelResult"][]; + hasNext: boolean; + hasPrev: boolean; + /** Format: int64 */ + totalElements?: number | null; + /** Format: int32 */ + totalPages?: number | null; + nextCursor?: string | null; + }; + TableValueResultVoiceLanguageDto: { + data: components["schemas"]["VoiceLanguageDto"][]; + hasNext: boolean; + hasPrev: boolean; + /** Format: int64 */ + totalElements?: number | null; + /** Format: int32 */ + totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultWebhookDeliveryDto: { data: components["schemas"]["WebhookDeliveryDto"][]; @@ -7031,6 +8578,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultWebhookEndpointDto: { data: components["schemas"]["WebhookEndpointDto"][]; @@ -7040,6 +8588,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; TableValueResultWorkspaceDto: { data: components["schemas"]["WorkspaceDto"][]; @@ -7049,6 +8598,7 @@ export interface components { totalElements?: number | null; /** Format: int32 */ totalPages?: number | null; + nextCursor?: string | null; }; /** @description Tag for organizing and filtering monitors */ TagDto: { @@ -7150,7 +8700,7 @@ export interface components { }; /** @description Alert channel configuration to test without saving */ TestAlertChannelRequest: { - config: components["schemas"]["DatadogChannelConfig"] | components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["GitLabChannelConfig"] | components["schemas"]["GoogleChatChannelConfig"] | components["schemas"]["IncidentIoChannelConfig"] | components["schemas"]["JiraChannelConfig"] | components["schemas"]["LinearChannelConfig"] | components["schemas"]["MattermostChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["PushbulletChannelConfig"] | components["schemas"]["PushoverChannelConfig"] | components["schemas"]["RootlyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["SplunkOnCallChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["TelegramChannelConfig"] | components["schemas"]["WebhookChannelConfig"] | components["schemas"]["ZapierChannelConfig"]; + config: components["schemas"]["DatadogChannelConfig"] | components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["GitLabChannelConfig"] | components["schemas"]["GoogleChatChannelConfig"] | components["schemas"]["IncidentIoChannelConfig"] | components["schemas"]["JiraChannelConfig"] | components["schemas"]["LinearChannelConfig"] | components["schemas"]["MattermostChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["PhoneCallChannelConfig"] | components["schemas"]["PushbulletChannelConfig"] | components["schemas"]["PushoverChannelConfig"] | components["schemas"]["RootlyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["SmsChannelConfig"] | components["schemas"]["SplunkOnCallChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["TelegramChannelConfig"] | components["schemas"]["WebhookChannelConfig"] | components["schemas"]["ZapierChannelConfig"]; }; TestChannelResult: { success: boolean; @@ -7165,6 +8715,13 @@ export interface components { /** @description Rules that did not pass evaluation */ unmatchedRules: string[]; }; + /** @description Request to send test notifications through a monitor's alert channels */ + TestMonitorNotificationsRequest: { + /** @description Channel IDs to test; null or empty tests all channels attached to the monitor */ + channelIds?: string[] | null; + /** @description Whether to include a resolved notification in the test (default: false) */ + includeResolved: boolean; + }; /** @description Event context for a dry-run match evaluation against a notification policy */ TestNotificationPolicyRequest: { /** @description Incident severity to test against (e.g. DOWN, DEGRADED, MAINTENANCE) */ @@ -7199,7 +8756,7 @@ export interface components { TimingPhasesDto: { /** * Format: int32 - * @description DNS resolution time in milliseconds + * @description Legacy DNS phase; null for new checks (no longer measured) * @example 12 */ dns_ms?: number | null; @@ -7310,12 +8867,14 @@ export interface components { UpdateAlertChannelRequest: { /** @description New channel name (full replacement, not partial update) */ name: string; - config: components["schemas"]["DatadogChannelConfig"] | components["schemas"]["DiscordChannelConfig"] | components["schemas"]["EmailChannelConfig"] | components["schemas"]["GitLabChannelConfig"] | components["schemas"]["GoogleChatChannelConfig"] | components["schemas"]["IncidentIoChannelConfig"] | components["schemas"]["JiraChannelConfig"] | components["schemas"]["LinearChannelConfig"] | components["schemas"]["MattermostChannelConfig"] | components["schemas"]["OpsGenieChannelConfig"] | components["schemas"]["PagerDutyChannelConfig"] | components["schemas"]["PushbulletChannelConfig"] | components["schemas"]["PushoverChannelConfig"] | components["schemas"]["RootlyChannelConfig"] | components["schemas"]["SlackChannelConfig"] | components["schemas"]["SplunkOnCallChannelConfig"] | components["schemas"]["TeamsChannelConfig"] | components["schemas"]["TelegramChannelConfig"] | components["schemas"]["WebhookChannelConfig"] | components["schemas"]["ZapierChannelConfig"]; + config: components["schemas"]["UpdateDatadogChannelConfig"] | components["schemas"]["UpdateDiscordChannelConfig"] | components["schemas"]["UpdateEmailChannelConfig"] | components["schemas"]["UpdateGitLabChannelConfig"] | components["schemas"]["UpdateGoogleChatChannelConfig"] | components["schemas"]["UpdateIncidentIoChannelConfig"] | components["schemas"]["UpdateJiraChannelConfig"] | components["schemas"]["UpdateLinearChannelConfig"] | components["schemas"]["UpdateMattermostChannelConfig"] | components["schemas"]["UpdateOpsGenieChannelConfig"] | components["schemas"]["UpdatePagerDutyChannelConfig"] | components["schemas"]["UpdatePhoneCallChannelConfig"] | components["schemas"]["UpdatePushbulletChannelConfig"] | components["schemas"]["UpdatePushoverChannelConfig"] | components["schemas"]["UpdateRootlyChannelConfig"] | components["schemas"]["UpdateSlackChannelConfig"] | components["schemas"]["UpdateSmsChannelConfig"] | components["schemas"]["UpdateSplunkOnCallChannelConfig"] | components["schemas"]["UpdateTeamsChannelConfig"] | components["schemas"]["UpdateTelegramChannelConfig"] | components["schemas"]["UpdateWebhookChannelConfig"] | components["schemas"]["UpdateZapierChannelConfig"]; /** * @description New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value. * @enum {string|null} */ managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM" | "MCP" | "API" | null; + /** @description Whether this channel is enabled (default: true); null preserves current value */ + enabled?: boolean | null; }; /** @description Request body for updating alert sensitivity on a service subscription */ UpdateAlertSensitivityRequest: { @@ -7334,6 +8893,30 @@ export interface components { */ severity?: "fail" | "warn" | null; }; + UpdateDatadogChannelConfig: { + /** @enum {string} */ + channelType: "datadog"; + /** @description Datadog API key */ + apiKey?: string | null; + /** @description Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com) */ + site?: string | null; + /** @description Comma-separated tags to attach to events */ + tags?: string | null; + }; + UpdateDiscordChannelConfig: { + /** @enum {string} */ + channelType: "discord"; + /** @description Discord webhook URL */ + webhookUrl?: string | null; + /** @description Optional Discord role ID to mention in notifications */ + mentionRoleId?: string | null; + }; + UpdateEmailChannelConfig: { + /** @enum {string} */ + channelType: "email"; + /** @description Email addresses to send notifications to */ + recipients: string[]; + }; UpdateEnvironmentRequest: { /** @description New environment name; null preserves current */ name?: string | null; @@ -7344,6 +8927,30 @@ export interface components { /** @description Whether this is the default environment; null preserves current */ isDefault?: boolean | null; }; + UpdateGitLabChannelConfig: { + /** @enum {string} */ + channelType: "gitlab"; + /** @description GitLab alert integration endpoint URL */ + endpointUrl: string; + /** @description Authorization key from GitLab alert integration settings */ + authorizationKey?: string | null; + }; + UpdateGoogleChatChannelConfig: { + /** @enum {string} */ + channelType: "google_chat"; + /** @description Google Chat space webhook URL */ + webhookUrl?: string | null; + }; + UpdateIncidentIoChannelConfig: { + /** @enum {string} */ + channelType: "incident_io"; + /** @description incident.io API key with 'Create incidents' permission */ + apiKey?: string | null; + /** @description Severity ID for created incidents (from List Severities API) */ + severityId?: string | null; + /** @description Incident visibility: public or private (default: public) */ + visibility?: string | null; + }; /** @description Request body for updating an incident policy */ UpdateIncidentPolicyRequest: { /** @description Array of trigger rules; at least one required */ @@ -7351,6 +8958,39 @@ export interface components { confirmation: components["schemas"]["ConfirmationPolicy"]; recovery: components["schemas"]["RecoveryPolicy"]; }; + UpdateIncidentRequest: { + /** @description New title; null preserves current (min 1 char if present) */ + title?: string | null; + /** + * @description New severity: DOWN, DEGRADED, or MAINTENANCE; null preserves current + * @enum {string|null} + */ + severity?: "DOWN" | "DEGRADED" | "MAINTENANCE" | null; + }; + UpdateJiraChannelConfig: { + /** @enum {string} */ + channelType: "jira"; + /** @description Atlassian instance domain (e.g. yourteam.atlassian.net) */ + domain: string; + /** @description Atlassian account email for API authentication */ + email: string; + /** @description Atlassian API token */ + apiToken?: string | null; + /** @description Jira project key where issues are created (e.g. OPS) */ + projectKey: string; + /** @description Issue type name (e.g. Bug, Task, Incident) */ + issueType?: string | null; + }; + UpdateLinearChannelConfig: { + /** @enum {string} */ + channelType: "linear"; + /** @description Linear API key */ + apiKey?: string | null; + /** @description Team ID to create issues in */ + teamId: string; + /** @description Label ID to attach to created issues */ + labelId?: string | null; + }; UpdateMaintenanceWindowRequest: { /** * Format: uuid @@ -7374,13 +9014,23 @@ export interface components { /** @description Whether to suppress alerts during this window; null defaults to true */ suppressAlerts?: boolean | null; }; + UpdateMattermostChannelConfig: { + /** @enum {string} */ + channelType: "mattermost"; + /** @description Mattermost incoming webhook URL */ + webhookUrl?: string | null; + /** @description Override channel (if webhook allows) */ + channel?: string | null; + /** @description Custom bot icon URL */ + iconUrl?: string | null; + }; UpdateMonitorAuthRequest: { config: components["schemas"]["ApiKeyAuthConfig"] | components["schemas"]["BasicAuthConfig"] | components["schemas"]["BearerAuthConfig"] | components["schemas"]["HeaderAuthConfig"]; }; UpdateMonitorRequest: { /** @description New monitor name; null preserves current */ name?: string | null; - config?: (components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]) | null; + config?: (components["schemas"]["DnsMonitorConfig"] | components["schemas"]["HeartbeatMonitorConfig"] | components["schemas"]["HttpMonitorConfig"] | components["schemas"]["IcmpMonitorConfig"] | components["schemas"]["McpServerMonitorConfig"] | components["schemas"]["ScriptMonitorConfig"] | components["schemas"]["TcpMonitorConfig"]) | null; /** * Format: int32 * @description New check frequency in seconds (10–86400); null preserves current @@ -7416,6 +9066,8 @@ export interface components { UpdateNotificationPolicyRequest: { /** @description Human-readable name for this policy; null preserves current */ name?: string | null; + /** @description New note; null preserves current, empty string clears */ + description?: string | null; /** @description Match rules to evaluate (all must pass; omit or empty for catch-all) */ matchRules?: components["schemas"]["MatchRule"][] | null; escalation?: components["schemas"]["EscalationChain"] | null; @@ -7427,6 +9079,14 @@ export interface components { */ priority?: number | null; }; + UpdateOpsGenieChannelConfig: { + /** @enum {string} */ + channelType: "opsgenie"; + /** @description OpsGenie API key for alert creation */ + apiKey?: string | null; + /** @description OpsGenie API region: us or eu */ + region?: string | null; + }; UpdateOrgDetailsRequest: { /** @description New organization name (max 200 chars) */ name: string; @@ -7442,11 +9102,56 @@ export interface components { /** @description Organization website URL (max 255 chars) */ websiteUrl?: string | null; }; + UpdatePagerDutyChannelConfig: { + /** @enum {string} */ + channelType: "pagerduty"; + /** @description PagerDuty Events API v2 routing (integration) key */ + routingKey?: string | null; + /** @description Override PagerDuty severity mapping */ + severityOverride?: string | null; + }; + UpdatePhoneCallChannelConfig: { + /** @enum {string} */ + channelType: "phone_call"; + /** @description Recipient phone number in E.164 format; null preserves current */ + phoneNumber?: string | null; + /** + * Format: int64 + * @description Id of an org verified_phone_number row; null preserves current when phoneNumber also null + */ + verifiedPhoneNumberId?: number | null; + /** @description Deprecated: use phoneNumber */ + phoneNumbers?: (string | null)[] | null; + /** @description TTS voice language/locale (default: en-US). See VoiceLanguage for supported values */ + voiceLanguage?: string | null; + /** @description Preferred language for TTS and notifications (BCP-47, e.g. en-US, de-DE). Alias for voiceLanguage */ + preferredLanguage?: string | null; + }; + UpdatePushbulletChannelConfig: { + /** @enum {string} */ + channelType: "pushbullet"; + /** @description Pushbullet access token */ + accessToken?: string | null; + /** @description Target device identifier (broadcasts to all if empty) */ + deviceIden?: string | null; + }; + UpdatePushoverChannelConfig: { + /** @enum {string} */ + channelType: "pushover"; + /** @description Pushover user or group key */ + userKey?: string | null; + /** @description Pushover application API token */ + appToken?: string | null; + /** @description Notification priority override (-2 to 2) */ + priority?: string | null; + /** @description Notification sound override */ + sound?: string | null; + }; /** @description Request body for updating a resource group */ UpdateResourceGroupRequest: { /** @description Human-readable name for this group */ name: string; - /** @description Optional description; null clears the existing value */ + /** @description Optional description (max 500); null clears the existing value */ description?: string | null; /** * Format: uuid @@ -7493,10 +9198,49 @@ export interface components { */ managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM" | "MCP" | "API" | null; }; + UpdateRootlyChannelConfig: { + /** @enum {string} */ + channelType: "rootly"; + /** @description Rootly API token with incident creation permission */ + apiKey?: string | null; + /** @description Severity slug override (e.g. sev0, sev1) */ + severity?: string | null; + }; UpdateSecretRequest: { /** @description New secret value, stored encrypted (max 32KB) */ value: string; }; + UpdateSlackChannelConfig: { + /** @enum {string} */ + channelType: "slack"; + /** @description Slack incoming webhook URL */ + webhookUrl?: string | null; + /** @description Optional mention text included in notifications, e.g. @channel */ + mentionText?: string | null; + }; + UpdateSmsChannelConfig: { + /** @enum {string} */ + channelType: "sms"; + /** @description Recipient phone number in E.164 format; null preserves current */ + phoneNumber?: string | null; + /** + * Format: int64 + * @description Id of an org verified_phone_number row; null preserves current when phoneNumber also null + */ + verifiedPhoneNumberId?: number | null; + /** @description Deprecated: use phoneNumber */ + phoneNumbers?: (string | null)[] | null; + /** @description Preferred language for SMS body (BCP-47, e.g. en-US, de-DE). Default: en-US */ + preferredLanguage?: string | null; + }; + UpdateSplunkOnCallChannelConfig: { + /** @enum {string} */ + channelType: "splunk_oncall"; + /** @description Splunk On-Call REST API key */ + apiKey?: string | null; + /** @description Routing key for alert routing */ + routingKey: string; + }; UpdateStatusPageComponentGroupRequest: { /** @description New group name; null preserves current */ name?: string | null; @@ -7556,6 +9300,29 @@ export interface components { postmortemBody?: string | null; /** @description URL to an external postmortem document; empty string clears */ postmortemUrl?: string | null; + /** @description Whether the incident is published on the public page; null preserves current. true publishes (sets publishedAt); false unpublishes (clears publishedAt) */ + published?: boolean | null; + /** + * Format: date-time + * @description New maintenance window start; null preserves current. Only for scheduled incidents + */ + scheduledFor?: string | null; + /** + * Format: date-time + * @description New maintenance window end; null preserves current. Only for scheduled incidents + */ + scheduledUntil?: string | null; + /** @description Whether the window auto-completes at scheduledUntil; null preserves current */ + autoResolve?: boolean | null; + }; + UpdateStatusPageIncidentUpdateRequest: { + /** @description Replacement update body in markdown */ + body: string; + /** + * @description Replacement lifecycle status for this update; null preserves current + * @enum {string|null} + */ + status?: "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED" | null; }; UpdateStatusPageRequest: { /** @description New name; null preserves current */ @@ -7588,6 +9355,32 @@ export interface components { /** @description New hex color code */ color?: string | null; }; + UpdateTeamsChannelConfig: { + /** @enum {string} */ + channelType: "teams"; + /** @description Microsoft Teams incoming webhook URL */ + webhookUrl?: string | null; + }; + UpdateTelegramChannelConfig: { + /** @enum {string} */ + channelType: "telegram"; + /** @description Telegram bot token from @BotFather */ + botToken?: string | null; + /** @description Chat, group, or channel ID to send alerts to */ + chatId: string; + }; + UpdateWebhookChannelConfig: { + /** @enum {string} */ + channelType: "webhook"; + /** @description Webhook endpoint URL that receives alert payloads */ + url?: string | null; + /** @description HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery */ + signingSecret?: string | null; + /** @description Additional HTTP headers to include in webhook requests */ + customHeaders?: { + [key: string]: string | null; + } | null; + }; UpdateWebhookEndpointRequest: { /** @description New webhook URL; null preserves current */ url?: string | null; @@ -7603,6 +9396,12 @@ export interface components { /** @description New workspace name */ name: string; }; + UpdateZapierChannelConfig: { + /** @enum {string} */ + channelType: "zapier"; + /** @description Zapier/n8n/Make catch webhook URL */ + webhookUrl?: string | null; + }; /** @description Uptime statistics for a single time bucket */ UptimeBucketDto: { /** @@ -7656,13 +9455,32 @@ export interface components { * @example 312 */ p95LatencyMs?: number | null; + /** + * Format: double + * @description 50th-percentile (median) latency in milliseconds; null when no data + * @example 128 + */ + p50LatencyMs?: number | null; + /** + * Format: int64 + * @description Number of incidents that started within the requested window + * @example 2 + */ + incidentCount: number; + }; + /** @description Supported TTS voice language for phone call alerts */ + VoiceLanguageDto: { + /** @description BCP-47 locale code, e.g. en-US */ + code: string; + /** @description Human-readable label, e.g. English (US) */ + label: string; }; WebhookChannelConfig: { /** @enum {string} */ channelType: "webhook"; /** @description Webhook endpoint URL that receives alert payloads */ url: string; - /** @description Optional HMAC signing secret for payload verification */ + /** @description HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery */ signingSecret?: string | null; /** @description Additional HTTP headers to include in webhook requests */ customHeaders?: { @@ -7802,7 +9620,7 @@ export interface operations { parameters: { query: { /** @description Filter by channel integration type (e.g. SLACK, WEBHOOK, EMAIL) */ - type?: "email" | "webhook" | "slack" | "pagerduty" | "opsgenie" | "teams" | "discord" | "telegram" | "google_chat" | "pushover" | "mattermost" | "splunk_oncall" | "pushbullet" | "linear" | "incident_io" | "rootly" | "zapier" | "datadog" | "jira" | "gitlab"; + type?: "email" | "webhook" | "slack" | "pagerduty" | "opsgenie" | "teams" | "discord" | "telegram" | "google_chat" | "pushover" | "mattermost" | "splunk_oncall" | "pushbullet" | "linear" | "incident_io" | "rootly" | "zapier" | "datadog" | "jira" | "gitlab" | "sms" | "phone_call"; /** @description Filter by managed-by source (DASHBOARD, CLI, TERRAFORM, MCP, API) */ managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM" | "MCP" | "API"; /** @description Case-insensitive contains-match on the channel name */ @@ -8374,7 +10192,7 @@ export interface operations { }; }; }; - test_2: { + setEnabled: { parameters: { query?: never; header?: never; @@ -8383,7 +10201,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SetEnabledRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -8391,7 +10213,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; + "*/*": components["schemas"]["SingleValueResponseAlertChannelDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -8468,18 +10290,16 @@ export interface operations { }; }; }; - testConfig: { + test_2: { parameters: { query?: never; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["TestAlertChannelRequest"]; + path: { + id: string; }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -8564,16 +10384,18 @@ export interface operations { }; }; }; - listAttempts: { + testConfig: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["TestAlertChannelRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -8581,7 +10403,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultDeliveryAttemptDto"]; + "*/*": components["schemas"]["SingleValueResponseTestChannelResult"]; }; }; /** @description Bad request — the payload failed validation */ @@ -8658,7 +10480,7 @@ export interface operations { }; }; }; - retry: { + listAttempts: { parameters: { query?: never; header?: never; @@ -8675,7 +10497,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseAlertDeliveryDto"]; + "*/*": components["schemas"]["TableValueResultDeliveryAttemptDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -8752,11 +10574,13 @@ export interface operations { }; }; }; - list_13: { + retry: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -8767,7 +10591,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultApiKeyDto"]; + "*/*": components["schemas"]["SingleValueResponseAlertDeliveryDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -8844,26 +10668,22 @@ export interface operations { }; }; }; - create_14: { + list_13: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateApiKeyRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; + "*/*": components["schemas"]["TableValueResultApiKeyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -8940,19 +10760,115 @@ export interface operations { }; }; }; - delete_11: { + create_14: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateApiKeyRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseApiKeyCreateResponse"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_11: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; @@ -9032,7 +10948,7 @@ export interface operations { }; }; }; - update_15: { + update_16: { parameters: { query?: never; header?: never; @@ -9318,7 +11234,7 @@ export interface operations { }; }; }; - list_19: { + list_20: { parameters: { query?: { action?: string; @@ -11406,7 +13322,7 @@ export interface operations { }; }; }; - get_11: { + get_9: { parameters: { query?: never; header?: never; @@ -11500,7 +13416,7 @@ export interface operations { }; }; }; - resolve: { + update_15: { parameters: { query?: never; header?: never; @@ -11509,9 +13425,9 @@ export interface operations { }; cookie?: never; }; - requestBody?: { + requestBody: { content: { - "application/json": components["schemas"]["ResolveIncidentRequest"]; + "application/json": components["schemas"]["UpdateIncidentRequest"]; }; }; responses: { @@ -11598,7 +13514,7 @@ export interface operations { }; }; }; - addUpdate: { + acknowledgeAll: { parameters: { query?: never; header?: never; @@ -11607,19 +13523,15 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AddIncidentUpdateRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + "*/*": components["schemas"]["SingleValueResponseAcknowledgeAllIncidentsResponse"]; }; }; /** @description Bad request — the payload failed validation */ @@ -11696,11 +13608,16 @@ export interface operations { }; }; }; - list_18: { + listEvents_1: { parameters: { - query?: never; + query?: { + cursor?: string; + limit?: number; + }; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -11711,7 +13628,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultIntegrationDto"]; + "*/*": components["schemas"]["CursorPageIncidentActivityEventDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -11788,11 +13705,16 @@ export interface operations { }; }; }; - list_10: { + listRelated: { parameters: { - query?: never; + query?: { + windowDays?: number; + limit?: number; + }; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -11803,7 +13725,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultInviteDto"]; + "*/*": components["schemas"]["RelatedIncidentsResponse"]; }; }; /** @description Bad request — the payload failed validation */ @@ -11880,26 +13802,28 @@ export interface operations { }; }; }; - create_11: { + resolve: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["CreateInviteRequest"]; + "application/json": components["schemas"]["ResolveIncidentRequest"]; }; }; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -11976,12 +13900,12 @@ export interface operations { }; }; }; - resend_1: { + getTrigger: { parameters: { query?: never; header?: never; path: { - inviteId: number; + id: string; }; cookie?: never; }; @@ -11993,7 +13917,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentTriggerDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -12070,23 +13994,29 @@ export interface operations { }; }; }; - revoke: { + addUpdate: { parameters: { query?: never; header?: never; path: { - inviteId: number; + id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AddIncidentUpdateRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseIncidentDetailDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -12162,14 +14092,9 @@ export interface operations { }; }; }; - list_9: { + list_19: { parameters: { - query?: { - /** @description Filter by monitor UUID */ - monitorId?: string; - /** @description Filter by status: 'active' or 'upcoming' */ - filter?: string; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -12182,7 +14107,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMaintenanceWindowDto"]; + "*/*": components["schemas"]["TableValueResultIntegrationDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -12259,26 +14184,22 @@ export interface operations { }; }; }; - create_10: { + listVoiceLanguages: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateMaintenanceWindowRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "*/*": components["schemas"]["TableValueResultVoiceLanguageDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -12355,13 +14276,11 @@ export interface operations { }; }; }; - getById_2: { + list_10: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -12372,7 +14291,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "*/*": components["schemas"]["TableValueResultInviteDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -12449,28 +14368,26 @@ export interface operations { }; }; }; - update_12: { + create_11: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateMaintenanceWindowRequest"]; + "application/json": components["schemas"]["CreateInviteRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + "*/*": components["schemas"]["SingleValueResponseInviteDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -12547,23 +14464,25 @@ export interface operations { }; }; }; - delete_8: { + resend_1: { parameters: { query?: never; header?: never; path: { - id: string; + inviteId: number; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseInviteDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -12639,25 +14558,23 @@ export interface operations { }; }; }; - list_17: { + revoke: { parameters: { - query: { - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; - path?: never; + path: { + inviteId: number; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultMemberDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -12733,23 +14650,2532 @@ export interface operations { }; }; }; - remove_2: { + list_9: { parameters: { - query?: never; - header?: never; - path: { - userId: number; - }; - cookie?: never; + query?: { + /** @description Filter by monitor UUID */ + monitorId?: string; + /** @description Filter by status: 'active' or 'upcoming' */ + filter?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_10: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateMaintenanceWindowRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getById_2: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_12: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMaintenanceWindowRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMaintenanceWindowDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_8: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_18: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMemberDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + remove_2: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + changeRole: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ChangeRoleRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + changeStatus: { + parameters: { + query?: never; + header?: never; + path: { + userId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ChangeStatusRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + list_8: { + parameters: { + query: { + /** @description Filter by enabled state (true/false) */ + enabled?: boolean; + /** @description Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied. */ + status?: string; + /** @description Filter by monitor type */ + type?: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT" | "BROWSER" | "MULTI_STEP_API"; + /** @description Filter by managed-by source */ + managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM" | "MCP" | "API"; + /** @description Filter by tag names, comma-separated (e.g. prod,critical); OR semantics */ + tags?: string; + /** @description Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics */ + tag?: string; + /** @description Case-insensitive name search */ + search?: string; + /** @description Filter by environment ID */ + environmentId?: string; + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + create_9: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateMonitorRequest"]; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + get_6: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_11: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMonitorRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + delete_7: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + pause: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getResults: { + parameters: { + query?: { + /** @description Start of time range (ISO 8601, inclusive); defaults to 24 hours ago */ + from?: string; + /** @description End of time range (ISO 8601, inclusive); defaults to now */ + to?: string; + /** @description Opaque cursor from a previous response for pagination */ + cursor?: string; + /** + * @description Maximum results per page (1–200) + * @example 50 + */ + limit?: number; + /** @description Filter by region (e.g. us-east) */ + region?: string; + /** @description Filter by pass/fail status */ + passed?: boolean; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Paginated check results */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Invalid query parameters */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CursorPageCheckResultDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getSummary: { + parameters: { + query?: { + /** @description Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets */ + chartWindow?: "24h" | "7d" | "30d" | "90d"; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Results summary */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ResultSummaryDto"]; + }; + }; + /** @description Invalid chartWindow parameter */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + resume: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + rotateToken: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listStatusPagesForMonitor: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultStatusPageDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + addMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AddMonitorTagsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTagDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + removeMonitorTags: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RemoveMonitorTagsRequest"]; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + testExisting: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + testNotifications: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["TestMonitorNotificationsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableValueResultTestChannelResult"]; + }; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + getUptime: { + parameters: { + query?: { + /** @description Time window for uptime calculation */ + window?: "24h" | "7d" | "30d" | "90d"; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Uptime statistics */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UptimeDto"]; + }; + }; + /** @description Invalid window parameter */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Monitor does not belong to the caller's org */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Monitor not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listVersions: { + parameters: { + query: { + pageable: components["schemas"]["Pageable"]; + }; + header?: never; + path: { + id: string; + }; + cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultMonitorVersionDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -12825,27 +17251,26 @@ export interface operations { }; }; }; - changeRole: { + getVersion: { parameters: { query?: never; header?: never; path: { - userId: number; + id: string; + version: number; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ChangeRoleRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseMonitorVersionDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -12921,27 +17346,29 @@ export interface operations { }; }; }; - changeStatus: { + setChannels: { parameters: { query?: never; header?: never; path: { - userId: number; + monitorId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["ChangeStatusRequest"]; + "application/json": components["schemas"]["SetAlertChannelsRequest"]; }; }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseListUUID"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -13017,40 +17444,28 @@ export interface operations { }; }; }; - list_8: { + add: { parameters: { - query: { - /** @description Filter by enabled state (true/false) */ - enabled?: boolean; - /** @description Lifecycle status alias: 'active' (enabled=true) or 'paused' (enabled=false). Ignored when ?enabled is also supplied. */ - status?: string; - /** @description Filter by monitor type */ - type?: "HTTP" | "DNS" | "MCP_SERVER" | "TCP" | "ICMP" | "HEARTBEAT"; - /** @description Filter by managed-by source */ - managedBy?: "DASHBOARD" | "CLI" | "TERRAFORM" | "MCP" | "API"; - /** @description Filter by tag names, comma-separated (e.g. prod,critical); OR semantics */ - tags?: string; - /** @description Filter by a single tag name (alias for ?tags=); merged with ?tags using OR semantics */ - tag?: string; - /** @description Case-insensitive name search */ - search?: string; - /** @description Filter by environment ID */ - environmentId?: string; - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; - path?: never; + path: { + monitorId: string; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateAssertionRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13127,26 +17542,29 @@ export interface operations { }; }; }; - create_9: { + update_10: { parameters: { query?: never; header?: never; - path?: never; + path: { + monitorId: string; + assertionId: string; + }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["CreateMonitorRequest"]; + "application/json": components["schemas"]["UpdateAssertionRequest"]; }; }; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13223,16 +17641,113 @@ export interface operations { }; }; }; - get_6: { + remove_1: { parameters: { query?: never; header?: never; path: { - id: string; + monitorId: string; + assertionId: string; }; cookie?: never; }; requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request — the payload failed validation */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Unauthorized — missing or invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Forbidden — the actor lacks permission for this resource */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Not found — the requested resource does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Conflict — the request collides with current resource state */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Internal server error — see the message field for details */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Bad gateway — an upstream provider returned an error */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Service unavailable — try again shortly */ + 503: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + update_9: { + parameters: { + query?: never; + header?: never; + path: { + monitorId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateMonitorAuthRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -13240,7 +17755,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13317,28 +17832,28 @@ export interface operations { }; }; }; - update_11: { + set: { parameters: { query?: never; header?: never; path: { - id: string; + monitorId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateMonitorRequest"]; + "application/json": components["schemas"]["SetMonitorAuthRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13415,12 +17930,12 @@ export interface operations { }; }; }; - delete_7: { + remove: { parameters: { query?: never; header?: never; path: { - id: string; + monitorId: string; }; cookie?: never; }; @@ -13507,24 +18022,25 @@ export interface operations { }; }; }; - pause: { + get_5: { parameters: { query?: never; header?: never; path: { - id: string; + /** @description Monitor UUID */ + monitorId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ + /** @description Policy found */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["IncidentPolicyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13554,13 +18070,13 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Not found — the requested resource does not exist */ + /** @description Monitor or policy not found */ 404: { headers: { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["ErrorResponse"]; + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -13601,49 +18117,38 @@ export interface operations { }; }; }; - getResults: { + update_8: { parameters: { - query?: { - /** @description Start of time range (ISO 8601, inclusive); defaults to 24 hours ago */ - from?: string; - /** @description End of time range (ISO 8601, inclusive); defaults to now */ - to?: string; - /** @description Opaque cursor from a previous response for pagination */ - cursor?: string; - /** - * @description Maximum results per page (1–200) - * @example 50 - */ - limit?: number; - /** @description Filter by region (e.g. us-east) */ - region?: string; - /** @description Filter by pass/fail status */ - passed?: boolean; - }; + query?: never; header?: never; path: { - id: string; + /** @description Monitor UUID */ + monitorId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateIncidentPolicyRequest"]; + }; + }; responses: { - /** @description Paginated check results */ + /** @description Policy updated */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "*/*": components["schemas"]["IncidentPolicyDto"]; }; }; - /** @description Invalid query parameters */ + /** @description Validation error in JSONB shape */ 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; }; }; /** @description Unauthorized — missing or invalid credentials */ @@ -13655,22 +18160,22 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ + /** @description Forbidden — the actor lacks permission for this resource */ 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ + /** @description Monitor or policy not found */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageCheckResultDto"]; + "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -13711,36 +18216,35 @@ export interface operations { }; }; }; - getSummary: { + bulkAction: { parameters: { - query?: { - /** @description Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets */ - chartWindow?: "24h" | "7d" | "30d" | "90d"; - }; + query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["BulkMonitorActionRequest"]; + }; + }; responses: { - /** @description Results summary */ + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["ResultSummaryDto"]; + "*/*": components["schemas"]["SingleValueResponseBulkMonitorActionResult"]; }; }; - /** @description Invalid chartWindow parameter */ + /** @description Bad request — the payload failed validation */ 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized — missing or invalid credentials */ @@ -13752,22 +18256,22 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ + /** @description Forbidden — the actor lacks permission for this resource */ 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResultSummaryDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -13808,16 +18312,18 @@ export interface operations { }; }; }; - resume: { + testAdHoc: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["MonitorTestRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -13825,7 +18331,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13902,13 +18408,14 @@ export interface operations { }; }; }; - rotateToken: { + listByIncident: { parameters: { - query?: never; - header?: never; - path: { - id: string; + query: { + /** @description UUID of the incident to inspect */ + incident_id: string; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -13919,7 +18426,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorDto"]; + "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -13996,7 +18503,7 @@ export interface operations { }; }; }; - getMonitorTags: { + getById_3: { parameters: { query?: never; header?: never; @@ -14013,7 +18520,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultTagDto"]; + "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14090,7 +18597,7 @@ export interface operations { }; }; }; - addMonitorTags: { + acknowledge: { parameters: { query?: never; header?: never; @@ -14099,11 +18606,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AddMonitorTagsRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -14111,7 +18614,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultTagDto"]; + "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14188,7 +18691,7 @@ export interface operations { }; }; }; - removeMonitorTags: { + unacknowledge: { parameters: { query?: never; header?: never; @@ -14197,18 +18700,16 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["RemoveMonitorTagsRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -14284,13 +18785,11 @@ export interface operations { }; }; }; - testExisting: { + list_7: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -14301,7 +18800,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + "*/*": components["schemas"]["TableValueResultNotificationPolicyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14378,36 +18877,35 @@ export interface operations { }; }; }; - getUptime: { + create_8: { parameters: { - query?: { - /** @description Time window for uptime calculation */ - window?: "24h" | "7d" | "30d" | "90d"; - }; + query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateNotificationPolicyRequest"]; + }; + }; responses: { - /** @description Uptime statistics */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["UptimeDto"]; + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; }; }; - /** @description Invalid window parameter */ + /** @description Bad request — the payload failed validation */ 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized — missing or invalid credentials */ @@ -14419,22 +18917,22 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor does not belong to the caller's org */ + /** @description Forbidden — the actor lacks permission for this resource */ 403: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseUptimeDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -14475,11 +18973,9 @@ export interface operations { }; }; }; - listVersions: { + getById_1: { parameters: { - query: { - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; path: { id: string; @@ -14494,7 +18990,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultMonitorVersionDto"]; + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14571,17 +19067,20 @@ export interface operations { }; }; }; - getVersion: { + update_7: { parameters: { query?: never; header?: never; path: { id: string; - version: number; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateNotificationPolicyRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -14589,7 +19088,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorVersionDto"]; + "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14666,29 +19165,23 @@ export interface operations { }; }; }; - setChannels: { + delete_6: { parameters: { query?: never; header?: never; path: { - monitorId: string; + id: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SetAlertChannelsRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseListUUID"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -14764,28 +19257,33 @@ export interface operations { }; }; }; - add: { + listDispatches: { parameters: { - query?: never; + query?: { + /** @description Inclusive lower bound (ISO-8601); defaults to now−30d when windowing */ + since?: string; + /** @description Exclusive upper bound (ISO-8601); defaults to now when windowing */ + until?: string; + /** @description Opaque cursor from a previous nextCursor */ + cursor?: string; + /** @description Page size 1–100 when windowing/paginating (default 50) */ + limit?: number; + }; header?: never; path: { - monitorId: string; + id: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateAssertionRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14862,19 +19360,18 @@ export interface operations { }; }; }; - update_10: { + test_1: { parameters: { query?: never; header?: never; path: { - monitorId: string; - assertionId: string; + id: string; }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["UpdateAssertionRequest"]; + "application/json": components["schemas"]["TestNotificationPolicyRequest"]; }; }; responses: { @@ -14884,7 +19381,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAssertionDto"]; + "*/*": components["schemas"]["SingleValueResponseTestMatchResult"]; }; }; /** @description Bad request — the payload failed validation */ @@ -14961,24 +19458,27 @@ export interface operations { }; }; }; - remove_1: { + list_17: { parameters: { - query?: never; - header?: never; - path: { - monitorId: string; - assertionId: string; + query?: { + unreadOnly?: boolean; + page?: number; + size?: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultNotificationDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -15054,29 +19554,23 @@ export interface operations { }; }; }; - update_9: { + markRead: { parameters: { query?: never; header?: never; path: { - monitorId: string; + id: number; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateMonitorAuthRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -15152,29 +19646,21 @@ export interface operations { }; }; }; - set: { + markAllRead: { parameters: { query?: never; header?: never; - path: { - monitorId: string; - }; + path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["SetMonitorAuthRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseMonitorAuthDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -15250,23 +19736,23 @@ export interface operations { }; }; }; - remove: { + unreadCount: { parameters: { query?: never; header?: never; - path: { - monitorId: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseLong"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -15342,25 +19828,22 @@ export interface operations { }; }; }; - get_5: { + get_4: { parameters: { query?: never; header?: never; - path: { - /** @description Monitor UUID */ - monitorId: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description Policy found */ + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["IncidentPolicyDto"]; + "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -15390,13 +19873,13 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor or policy not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -15437,38 +19920,35 @@ export interface operations { }; }; }; - update_8: { + update_6: { parameters: { query?: never; header?: never; - path: { - /** @description Monitor UUID */ - monitorId: string; - }; + path?: never; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateIncidentPolicyRequest"]; + "application/json": components["schemas"]["UpdateOrgDetailsRequest"]; }; }; responses: { - /** @description Policy updated */ + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["IncidentPolicyDto"]; + "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; }; }; - /** @description Validation error in JSONB shape */ + /** @description Bad request — the payload failed validation */ 400: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Unauthorized — missing or invalid credentials */ @@ -15489,13 +19969,13 @@ export interface operations { "application/json": components["schemas"]["ErrorResponse"]; }; }; - /** @description Monitor or policy not found */ + /** @description Not found — the requested resource does not exist */ 404: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseIncidentPolicyDto"]; + "application/json": components["schemas"]["ErrorResponse"]; }; }; /** @description Conflict — the request collides with current resource state */ @@ -15536,18 +20016,14 @@ export interface operations { }; }; }; - bulkAction: { + list_6: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["BulkMonitorActionRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -15555,7 +20031,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseBulkMonitorActionResult"]; + "*/*": components["schemas"]["TableValueResultResourceGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -15632,7 +20108,7 @@ export interface operations { }; }; }; - testAdHoc: { + create_7: { parameters: { query?: never; header?: never; @@ -15641,17 +20117,17 @@ export interface operations { }; requestBody: { content: { - "application/json": components["schemas"]["MonitorTestRequest"]; + "application/json": components["schemas"]["CreateResourceGroupRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseMonitorTestResultDto"]; + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -15728,14 +20204,15 @@ export interface operations { }; }; }; - listByIncident: { + get_3: { parameters: { - query: { - /** @description UUID of the incident to inspect */ - incident_id: string; + query?: { + includeMetrics?: boolean; }; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -15746,7 +20223,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -15823,7 +20300,7 @@ export interface operations { }; }; }; - getById_3: { + update_5: { parameters: { query?: never; header?: never; @@ -15832,7 +20309,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateResourceGroupRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -15840,7 +20321,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; + "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -15917,7 +20398,7 @@ export interface operations { }; }; }; - acknowledge: { + delete_5: { parameters: { query?: never; header?: never; @@ -15928,14 +20409,12 @@ export interface operations { }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseNotificationDispatchDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16011,11 +20490,13 @@ export interface operations { }; }; }; - list_7: { + getHealth: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -16026,7 +20507,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationPolicyDto"]; + "*/*": components["schemas"]["SingleValueResponseResourceGroupHealthDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -16103,26 +20584,24 @@ export interface operations { }; }; }; - create_8: { + listMatchedPolicies: { parameters: { query?: never; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateNotificationPolicyRequest"]; + path: { + id: string; }; + cookie?: never; }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + "*/*": components["schemas"]["TableValueResultNotificationPolicyDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -16199,7 +20678,7 @@ export interface operations { }; }; }; - getById_1: { + addMember_1: { parameters: { query?: never; header?: never; @@ -16208,15 +20687,19 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AddResourceGroupMemberRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; + "*/*": components["schemas"]["SingleValueResponseResourceGroupMemberDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -16293,29 +20776,24 @@ export interface operations { }; }; }; - update_7: { + removeMember_1: { parameters: { query?: never; header?: never; path: { id: string; + memberId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateNotificationPolicyRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseNotificationPolicyDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16391,23 +20869,23 @@ export interface operations { }; }; }; - delete_6: { + list_5: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultSecretDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16483,24 +20961,26 @@ export interface operations { }; }; }; - listDispatches: { + create_6: { parameters: { query?: never; header?: never; - path: { - id: string; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateSecretRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultNotificationDispatchDto"]; + "*/*": components["schemas"]["SingleValueResponseSecretDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -16577,18 +21057,18 @@ export interface operations { }; }; }; - test_1: { + update_4: { parameters: { query?: never; header?: never; path: { - id: string; + key: string; }; cookie?: never; }; - requestBody?: { + requestBody: { content: { - "application/json": components["schemas"]["TestNotificationPolicyRequest"]; + "application/json": components["schemas"]["UpdateSecretRequest"]; }; }; responses: { @@ -16598,7 +21078,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseTestMatchResult"]; + "*/*": components["schemas"]["SingleValueResponseSecretDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -16675,27 +21155,23 @@ export interface operations { }; }; }; - list_16: { + delete_4: { parameters: { - query?: { - unreadOnly?: boolean; - page?: number; - size?: number; - }; + query?: never; header?: never; - path?: never; + path: { + key: string; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultNotificationDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16771,23 +21247,23 @@ export interface operations { }; }; }; - markRead: { + list_16: { parameters: { - query?: never; - header?: never; - path: { - id: number; - }; + query?: never; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultServiceSubscriptionDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16863,21 +21339,25 @@ export interface operations { }; }; }; - markAllRead: { + get_11: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -16953,23 +21433,23 @@ export interface operations { }; }; }; - unreadCount: { + unsubscribe_1: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseLong"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -17045,14 +21525,20 @@ export interface operations { }; }; }; - get_4: { + updateAlertSensitivity: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateAlertSensitivityRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -17060,7 +21546,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17137,26 +21623,28 @@ export interface operations { }; }; }; - update_6: { + subscribe_1: { parameters: { query?: never; header?: never; - path?: never; + path: { + slug: string; + }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["UpdateOrgDetailsRequest"]; + "application/json": components["schemas"]["ServiceSubscribeRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseOrganizationDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17233,9 +21721,26 @@ export interface operations { }; }; }; - list_6: { + listServices: { parameters: { - query?: never; + query?: { + /** @description Filter by category (exact match) */ + category?: string; + /** @description Filter by current overall_status (exact match) */ + status?: string; + /** @description Filter by published status for pSEO pages */ + published?: boolean; + /** @description Filter by SLA page publication status */ + slaPublished?: boolean; + /** @description Case-insensitive substring match on service name or slug */ + search?: string; + /** @description Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first) */ + sort?: string; + /** @description Opaque cursor from a previous response */ + cursor?: string; + /** @description Page size (1–100, default 20) */ + limit?: number; + }; header?: never; path?: never; cookie?: never; @@ -17248,7 +21753,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultResourceGroupDto"]; + "*/*": components["schemas"]["CursorPageServiceCatalogDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17325,26 +21830,29 @@ export interface operations { }; }; }; - create_7: { + getService: { parameters: { - query?: never; + query?: { + /** @description Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false */ + summary?: boolean; + /** @description Resolve only published services (curated public pSEO set); 404 otherwise. Default false */ + publishedOnly?: boolean; + }; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateResourceGroupRequest"]; + path: { + slugOrId: string; }; + cookie?: never; }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceDetailDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17421,14 +21929,21 @@ export interface operations { }; }; }; - get_3: { + getComponents: { parameters: { query?: { - includeMetrics?: boolean; + /** @description Restrict result to direct children of this group component id */ + groupId?: string; + /** @description Case-insensitive substring match on component name */ + search?: string; + /** @description Zero-based page index */ + page?: number; + /** @description Page size (default 25, max 100) */ + size?: number; }; header?: never; path: { - id: string; + slugOrId: string; }; cookie?: never; }; @@ -17440,7 +21955,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "*/*": components["schemas"]["TableValueResultServiceComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17517,20 +22032,24 @@ export interface operations { }; }; }; - update_5: { + getComponentUptime: { parameters: { - query?: never; + query?: { + /** @description Preset time window (used when ``from`` is omitted) */ + period?: "7d" | "30d" | "90d" | "1y"; + /** @description Explicit window start (ISO date); overrides ``period`` */ + from?: string; + /** @description Explicit window end (ISO date); defaults to today */ + to?: string; + }; header?: never; path: { - id: string; + slugOrId: string; + componentId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateResourceGroupRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -17538,7 +22057,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupDto"]; + "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17615,23 +22134,32 @@ export interface operations { }; }; }; - delete_5: { + getBatchComponentUptime: { parameters: { - query?: never; + query?: { + /** @description Preset time window (used when ``from`` is omitted) */ + period?: "7d" | "30d" | "90d" | "1y"; + /** @description Explicit window start (ISO date); overrides ``period`` */ + from?: string; + /** @description Explicit window end (ISO date); defaults to today */ + to?: string; + }; header?: never; path: { - id: string; + slugOrId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseBatchComponentUptimeDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -17707,12 +22235,14 @@ export interface operations { }; }; }; - getHealth: { + getServiceDayDetail: { parameters: { query?: never; header?: never; path: { - id: string; + slugOrId: string; + /** @description UTC calendar day in ISO format (YYYY-MM-DD) */ + date: string; }; cookie?: never; }; @@ -17724,7 +22254,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupHealthDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceDayDetailDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17801,28 +22331,30 @@ export interface operations { }; }; }; - addMember_1: { + listIncidents_1: { parameters: { - query?: never; + query: { + /** @description Earliest start date (ISO 8601 date) */ + from?: string; + /** @description Filter: active (unresolved), resolved, or omit for all */ + status?: "active" | "resolved"; + pageable: components["schemas"]["Pageable"]; + }; header?: never; path: { - id: string; + slugOrId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AddResourceGroupMemberRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseResourceGroupMemberDto"]; + "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -17899,24 +22431,26 @@ export interface operations { }; }; }; - removeMember_1: { + getIncident_1: { parameters: { query?: never; header?: never; path: { - id: string; - memberId: string; + slugOrId: string; + incidentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseServiceIncidentDetailDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -17992,11 +22526,13 @@ export interface operations { }; }; }; - list_5: { + getServiceLiveStatus: { parameters: { query?: never; header?: never; - path?: never; + path: { + slugOrId: string; + }; cookie?: never; }; requestBody?: never; @@ -18007,7 +22543,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultSecretDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceLiveStatusDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18084,26 +22620,27 @@ export interface operations { }; }; }; - create_6: { + getScheduledMaintenances: { parameters: { - query?: never; + query?: { + /** @description Filter by status (e.g. scheduled, in_progress, verifying, completed) */ + status?: string[]; + }; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateSecretRequest"]; + path: { + slugOrId: string; }; + cookie?: never; }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + "*/*": components["schemas"]["TableValueResultScheduledMaintenanceDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18180,20 +22717,21 @@ export interface operations { }; }; }; - update_4: { + listPollResults: { parameters: { - query?: never; + query?: { + /** @description ISO 8601 timestamp cursor from a previous response */ + cursor?: string; + /** @description Page size (1–100, default 50) */ + limit?: number; + }; header?: never; path: { - key: string; + slugOrId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateSecretRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -18201,7 +22739,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseSecretDto"]; + "*/*": components["schemas"]["CursorPageServicePollResultDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18278,23 +22816,28 @@ export interface operations { }; }; }; - delete_4: { + getPollSummary: { parameters: { - query?: never; + query?: { + /** @description Time window */ + window?: "24h" | "7d" | "30d"; + }; header?: never; path: { - key: string; + slugOrId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseServicePollSummaryDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -18370,11 +22913,26 @@ export interface operations { }; }; }; - list_15: { + listStatusEvents: { parameters: { - query?: never; + query?: { + /** @description Comma-separated type buckets: incident, maintenance, component (default: all) */ + types?: string; + /** @description Preset window */ + period?: "7d" | "30d" | "90d"; + /** @description Explicit lower bound (ISO 8601); overrides period */ + from?: string; + /** @description Explicit upper bound (ISO 8601); default now */ + to?: string; + /** @description Opaque cursor from a previous response */ + cursor?: string; + /** @description Page size (1–100, default 50) */ + limit?: number; + }; header?: never; - path?: never; + path: { + slugOrId: string; + }; cookie?: never; }; requestBody?: never; @@ -18385,7 +22943,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceSubscriptionDto"]; + "*/*": components["schemas"]["CursorPageStatusEventDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18462,12 +23020,17 @@ export interface operations { }; }; }; - get_10: { + getServiceUptime: { parameters: { - query?: never; + query?: { + /** @description Time window */ + period?: "24h" | "7d" | "30d" | "90d" | "1y" | "2y" | "all"; + /** @description Bucket granularity */ + granularity?: "hourly" | "daily" | "monthly"; + }; header?: never; path: { - id: string; + slugOrId: string; }; cookie?: never; }; @@ -18479,7 +23042,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "*/*": components["schemas"]["SingleValueResponseServiceUptimeResponse"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18556,23 +23119,31 @@ export interface operations { }; }; }; - unsubscribe_1: { + listCrossServiceIncidents: { parameters: { - query?: never; - header?: never; - path: { - id: string; + query: { + /** @description Earliest start date (ISO 8601 date) */ + from?: string; + /** @description Filter: active (unresolved), resolved, or omit for all */ + status?: "active" | "resolved"; + /** @description Filter by service category */ + category?: string; + pageable: components["schemas"]["Pageable"]; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -18648,20 +23219,17 @@ export interface operations { }; }; }; - updateAlertSensitivity: { + getGlobalStatusSummary: { parameters: { - query?: never; - header?: never; - path: { - id: string; + query?: { + /** @description Aggregate only published services (curated public pSEO set); default false */ + publishedOnly?: boolean; }; + header?: never; + path?: never; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateAlertSensitivityRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -18669,7 +23237,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "*/*": components["schemas"]["SingleValueResponseGlobalStatusSummaryDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18746,28 +23314,22 @@ export interface operations { }; }; }; - subscribe_1: { + list_4: { parameters: { query?: never; header?: never; - path: { - slug: string; - }; + path?: never; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["ServiceSubscribeRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceSubscriptionDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18844,37 +23406,26 @@ export interface operations { }; }; }; - listServices: { + create_5: { parameters: { - query?: { - /** @description Filter by category (exact match) */ - category?: string; - /** @description Filter by current overall_status (exact match) */ - status?: string; - /** @description Filter by published status for pSEO pages */ - published?: boolean; - /** @description Case-insensitive substring match on service name or slug */ - search?: string; - /** @description Result ordering: 'recent' (default, newest first) or 'curated' (curated/recognizable first) */ - sort?: string; - /** @description Opaque cursor from a previous response */ - cursor?: string; - /** @description Page size (1–100, default 20) */ - limit?: number; - }; + query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageServiceCatalogDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -18951,17 +23502,12 @@ export interface operations { }; }; }; - getService: { + get_2: { parameters: { - query?: { - /** @description Return a curated subset of components (groups + showcase + impacted + ungrouped) and a componentsSummary block; default false */ - summary?: boolean; - /** @description Resolve only published services (curated public pSEO set); 404 otherwise. Default false */ - publishedOnly?: boolean; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; }; cookie?: never; }; @@ -18973,7 +23519,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceDetailDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19050,19 +23596,20 @@ export interface operations { }; }; }; - getComponents: { + update_3: { parameters: { - query?: { - /** @description Restrict result to direct children of this group component id */ - groupId?: string; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -19070,7 +23617,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceComponentDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19147,33 +23694,23 @@ export interface operations { }; }; }; - getComponentUptime: { + delete_3: { parameters: { - query?: { - /** @description Preset time window (used when ``from`` is omitted) */ - period?: "7d" | "30d" | "90d" | "1y"; - /** @description Explicit window start (ISO date); overrides ``period`` */ - from?: string; - /** @description Explicit window end (ISO date); defaults to today */ - to?: string; - }; + query?: never; header?: never; path: { - slugOrId: string; - componentId: string; + id: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -19249,19 +23786,12 @@ export interface operations { }; }; }; - getBatchComponentUptime: { + listComponents: { parameters: { - query?: { - /** @description Preset time window (used when ``from`` is omitted) */ - period?: "7d" | "30d" | "90d" | "1y"; - /** @description Explicit window start (ISO date); overrides ``period`` */ - from?: string; - /** @description Explicit window end (ISO date); defaults to today */ - to?: string; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; }; cookie?: never; }; @@ -19273,7 +23803,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseBatchComponentUptimeDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19350,26 +23880,28 @@ export interface operations { }; }; }; - getServiceDayDetail: { + createComponent: { parameters: { query?: never; header?: never; path: { - slugOrId: string; - /** @description UTC calendar day in ISO format (YYYY-MM-DD) */ - date: string; + id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageComponentRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceDayDetailDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19446,22 +23978,21 @@ export interface operations { }; }; }; - listIncidents_1: { + updateComponent: { parameters: { - query: { - /** @description Earliest start date (ISO 8601 date) */ - from?: string; - /** @description Filter: active (unresolved), resolved, or omit for all */ - status?: "active" | "resolved"; - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; + componentId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageComponentRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -19469,7 +24000,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19546,26 +24077,24 @@ export interface operations { }; }; }; - getIncident_1: { + deleteComponent: { parameters: { query?: never; header?: never; - path: { - slugOrId: string; - incidentId: string; + path: { + id: string; + componentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseServiceIncidentDetailDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -19641,12 +24170,15 @@ export interface operations { }; }; }; - getServiceLiveStatus: { + componentMeasuredUptime: { parameters: { - query?: never; + query?: { + days?: number; + }; header?: never; path: { - slugOrId: string; + id: string; + componentId: string; }; cookie?: never; }; @@ -19658,7 +24190,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServiceLiveStatusDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageMeasuredComponentUptimeDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19735,19 +24267,21 @@ export interface operations { }; }; }; - getScheduledMaintenances: { + setComponentOverride: { parameters: { - query?: { - /** @description Filter by status (e.g. scheduled, in_progress, verifying, completed) */ - status?: string[]; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; + componentId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["SetStatusPageComponentOverrideRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -19755,7 +24289,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultScheduledMaintenanceDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19832,17 +24366,13 @@ export interface operations { }; }; }; - listPollResults: { + clearComponentOverride: { parameters: { - query?: { - /** @description ISO 8601 timestamp cursor from a previous response */ - cursor?: string; - /** @description Page size (1–100, default 50) */ - limit?: number; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; + componentId: string; }; cookie?: never; }; @@ -19854,7 +24384,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["CursorPageServicePollResultDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -19931,15 +24461,15 @@ export interface operations { }; }; }; - getPollSummary: { + componentUptime_1: { parameters: { query?: { - /** @description Time window */ - window?: "24h" | "7d" | "30d"; + days?: number; }; header?: never; path: { - slugOrId: string; + id: string; + componentId: string; }; cookie?: never; }; @@ -19951,7 +24481,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseServicePollSummaryDto"]; + "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20028,30 +24558,27 @@ export interface operations { }; }; }; - getServiceUptime: { + reorderComponents: { parameters: { - query?: { - /** @description Time window */ - period?: "24h" | "7d" | "30d" | "90d" | "1y" | "2y" | "all"; - /** @description Bucket granularity */ - granularity?: "hourly" | "daily" | "monthly"; - }; + query?: never; header?: never; path: { - slugOrId: string; + id: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["ReorderComponentsRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseServiceUptimeResponse"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -20127,19 +24654,13 @@ export interface operations { }; }; }; - listCrossServiceIncidents: { + listDomains: { parameters: { - query: { - /** @description Earliest start date (ISO 8601 date) */ - from?: string; - /** @description Filter: active (unresolved), resolved, or omit for all */ - status?: "active" | "resolved"; - /** @description Filter by service category */ - category?: string; - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; requestBody?: never; @@ -20150,7 +24671,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultServiceIncidentDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageCustomDomainDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20227,25 +24748,28 @@ export interface operations { }; }; }; - getGlobalStatusSummary: { + addDomain: { parameters: { - query?: { - /** @description Aggregate only published services (curated public pSEO set); default false */ - publishedOnly?: boolean; - }; + query?: never; header?: never; - path?: never; + path: { + id: string; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AddCustomDomainRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseGlobalStatusSummaryDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20322,23 +24846,24 @@ export interface operations { }; }; }; - list_4: { + removeDomain: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: string; + domainId: string; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultStatusPageDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -20414,26 +24939,25 @@ export interface operations { }; }; }; - create_5: { + setPrimaryDomain: { parameters: { query?: never; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageRequest"]; + path: { + id: string; + domainId: string; }; + cookie?: never; }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20510,12 +25034,13 @@ export interface operations { }; }; }; - get_2: { + verifyDomain: { parameters: { query?: never; header?: never; path: { id: string; + domainId: string; }; cookie?: never; }; @@ -20527,7 +25052,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20604,7 +25129,7 @@ export interface operations { }; }; }; - update_3: { + listGroups: { parameters: { query?: never; header?: never; @@ -20613,11 +25138,7 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -20625,7 +25146,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageComponentGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20702,7 +25223,7 @@ export interface operations { }; }; }; - delete_3: { + createGroup: { parameters: { query?: never; header?: never; @@ -20711,14 +25232,20 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageComponentGroupRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -20794,16 +25321,21 @@ export interface operations { }; }; }; - listComponents: { + updateGroup: { parameters: { query?: never; header?: never; path: { id: string; + groupId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageComponentGroupRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -20811,7 +25343,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageComponentDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -20888,29 +25420,24 @@ export interface operations { }; }; }; - createComponent: { + deleteGroup: { parameters: { query?: never; header?: never; path: { id: string; + groupId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageComponentRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -20986,21 +25513,19 @@ export interface operations { }; }; }; - updateComponent: { + listIncidents: { parameters: { - query?: never; + query: { + status?: ("INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED")[]; + pageable: components["schemas"]["Pageable"]; + }; header?: never; path: { id: string; - componentId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["UpdateStatusPageComponentRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -21008,7 +25533,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -21085,24 +25610,29 @@ export interface operations { }; }; }; - deleteComponent: { + createIncident: { parameters: { query?: never; header?: never; path: { id: string; - componentId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageIncidentRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21178,15 +25708,13 @@ export interface operations { }; }; }; - componentUptime_1: { + getIncident: { parameters: { - query?: { - days?: number; - }; + query?: never; header?: never; path: { id: string; - componentId: string; + incidentId: string; }; cookie?: never; }; @@ -21198,7 +25726,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultComponentUptimeDayDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -21275,27 +25803,30 @@ export interface operations { }; }; }; - reorderComponents: { + updateIncident: { parameters: { query?: never; header?: never; path: { id: string; + incidentId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["ReorderComponentsRequest"]; + "application/json": components["schemas"]["UpdateStatusPageIncidentRequest"]; }; }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21371,25 +25902,24 @@ export interface operations { }; }; }; - listDomains: { + deleteIncident: { parameters: { query?: never; header?: never; path: { id: string; + incidentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultStatusPageCustomDomainDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21465,29 +25995,24 @@ export interface operations { }; }; }; - addDomain: { + dismissIncident: { parameters: { query?: never; header?: never; path: { id: string; + incidentId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["AddCustomDomainRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21563,24 +26088,30 @@ export interface operations { }; }; }; - removeDomain: { + publishIncident: { parameters: { query?: never; header?: never; path: { id: string; - domainId: string; + incidentId: string; }; cookie?: never; }; - requestBody?: never; + requestBody?: { + content: { + "application/json": components["schemas"]["PublishStatusPageIncidentRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21656,25 +26187,29 @@ export interface operations { }; }; }; - setPrimaryDomain: { + postIncidentUpdate: { parameters: { query?: never; header?: never; path: { id: string; - domainId: string; + incidentId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageIncidentUpdateRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -21751,17 +26286,22 @@ export interface operations { }; }; }; - verifyDomain: { + patchIncidentUpdate: { parameters: { query?: never; header?: never; path: { id: string; - domainId: string; + incidentId: string; + updateId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageIncidentUpdateRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -21769,7 +26309,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageCustomDomainDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentUpdateDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -21846,7 +26386,7 @@ export interface operations { }; }; }; - listGroups: { + reorderLayout: { parameters: { query?: never; header?: never; @@ -21855,16 +26395,18 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["ReorderPageLayoutRequest"]; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["TableValueResultStatusPageComponentGroupDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -21940,28 +26482,27 @@ export interface operations { }; }; }; - createGroup: { + listMaintenance: { parameters: { - query?: never; + query: { + status?: ("INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED")[]; + pageable: components["schemas"]["Pageable"]; + }; header?: never; path: { id: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageComponentGroupRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -22038,29 +26579,28 @@ export interface operations { }; }; }; - updateGroup: { + createMaintenance: { parameters: { query?: never; header?: never; path: { id: string; - groupId: string; }; cookie?: never; }; requestBody: { content: { - "application/json": components["schemas"]["UpdateStatusPageComponentGroupRequest"]; + "application/json": components["schemas"]["CreateStatusPageMaintenanceRequest"]; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageComponentGroupDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -22137,24 +26677,26 @@ export interface operations { }; }; }; - deleteGroup: { + getMaintenance: { parameters: { query?: never; header?: never; path: { id: string; - groupId: string; + windowId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -22230,19 +26772,21 @@ export interface operations { }; }; }; - listIncidents: { + updateMaintenance: { parameters: { - query: { - status?: ("INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED")[]; - pageable: components["schemas"]["Pageable"]; - }; + query?: never; header?: never; path: { id: string; + windowId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageIncidentRequest"]; + }; + }; responses: { /** @description OK */ 200: { @@ -22250,7 +26794,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["TableValueResultStatusPageIncidentDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -22327,29 +26871,24 @@ export interface operations { }; }; }; - createIncident: { + deleteMaintenance: { parameters: { query?: never; header?: never; path: { id: string; + windowId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageIncidentRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -22425,26 +26964,24 @@ export interface operations { }; }; }; - getIncident: { + dismissMaintenance: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; + windowId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description No Content */ + 204: { headers: { [name: string]: unknown; }; - content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; - }; + content?: never; }; /** @description Bad request — the payload failed validation */ 400: { @@ -22520,19 +27057,19 @@ export interface operations { }; }; }; - updateIncident: { + publishMaintenance: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; + windowId: string; }; cookie?: never; }; - requestBody: { + requestBody?: { content: { - "application/json": components["schemas"]["UpdateStatusPageIncidentRequest"]; + "application/json": components["schemas"]["PublishStatusPageIncidentRequest"]; }; }; responses: { @@ -22619,24 +27156,30 @@ export interface operations { }; }; }; - deleteIncident: { + postMaintenanceUpdate: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; + windowId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["CreateStatusPageIncidentUpdateRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -22712,24 +27255,31 @@ export interface operations { }; }; }; - dismissIncident: { + patchMaintenanceUpdate: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; + windowId: string; + updateId: string; }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateStatusPageIncidentUpdateRequest"]; + }; + }; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentUpdateDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { @@ -22805,21 +27355,19 @@ export interface operations { }; }; }; - publishIncident: { + listNotificationDeliveries: { parameters: { - query?: never; + query?: { + incidentId?: string; + eventType?: "SUBSCRIPTION_CONFIRMATION" | "INCIDENT_CREATED" | "INCIDENT_UPDATED" | "INCIDENT_RESOLVED"; + }; header?: never; path: { id: string; - incidentId: string; }; cookie?: never; }; - requestBody?: { - content: { - "application/json": components["schemas"]["PublishStatusPageIncidentRequest"]; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -22827,7 +27375,7 @@ export interface operations { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "*/*": components["schemas"]["TableValueResultStatusPageNotificationDeliveryDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -22904,29 +27452,25 @@ export interface operations { }; }; }; - postIncidentUpdate: { + getNotificationDelivery: { parameters: { query?: never; header?: never; path: { id: string; - incidentId: string; + deliveryId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateStatusPageIncidentUpdateRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description Created */ - 201: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - "*/*": components["schemas"]["SingleValueResponseStatusPageIncidentDto"]; + "*/*": components["schemas"]["SingleValueResponseStatusPageNotificationDeliveryDto"]; }; }; /** @description Bad request — the payload failed validation */ @@ -23003,27 +27547,26 @@ export interface operations { }; }; }; - reorderLayout: { + retryNotificationDelivery: { parameters: { query?: never; header?: never; path: { id: string; + deliveryId: string; }; cookie?: never; }; - requestBody: { - content: { - "application/json": components["schemas"]["ReorderPageLayoutRequest"]; - }; - }; + requestBody?: never; responses: { - /** @description No Content */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + "*/*": components["schemas"]["SingleValueResponseStatusPageNotificationDeliveryDto"]; + }; }; /** @description Bad request — the payload failed validation */ 400: { diff --git a/src/lib/descriptions.generated.ts b/src/lib/descriptions.generated.ts index a29bee2..8d57d02 100644 --- a/src/lib/descriptions.generated.ts +++ b/src/lib/descriptions.generated.ts @@ -30,7 +30,9 @@ export const fieldDescriptions: Record> = "title": "Short summary of the incident", "severity": "Incident severity: DOWN, DEGRADED, or MAINTENANCE", "monitorId": "Monitor to associate with this incident", - "body": "Detailed description or context for the incident" + "body": "Detailed description or context for the incident", + "serviceId": "Vendor service to link; optional for Dependencies create CTA", + "serviceIncidentId": "Vendor incident to link; idempotent if an active org incident already links it" }, "CreateAlertChannelRequest": { "name": "Human-readable name for this alert channel", @@ -38,16 +40,19 @@ export const fieldDescriptions: Record> = }, "UpdateAlertChannelRequest": { "name": "New channel name (full replacement, not partial update)", - "managedBy": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value." + "managedBy": "New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.", + "enabled": "Whether this channel is enabled (default: true); null preserves current value" }, "CreateNotificationPolicyRequest": { "name": "Human-readable name for this policy", + "description": "Optional note; omit or null when unused", "matchRules": "Match rules to evaluate (all must pass; omit or empty for catch-all)", "enabled": "Whether this policy is enabled (default true)", "priority": "Evaluation priority; higher value = evaluated first (default 0)" }, "UpdateNotificationPolicyRequest": { "name": "Human-readable name for this policy; null preserves current", + "description": "New note; null preserves current, empty string clears", "matchRules": "Match rules to evaluate (all must pass; omit or empty for catch-all)", "enabled": "Whether this policy is enabled; null preserves current", "priority": "Evaluation priority; higher value = evaluated first; null preserves current" @@ -80,7 +85,7 @@ export const fieldDescriptions: Record> = }, "CreateResourceGroupRequest": { "name": "Human-readable name for this group", - "description": "Optional description", + "description": "Optional description (max 500)", "alertPolicyId": "Optional notification policy to apply for this group", "defaultFrequency": "Default check frequency in seconds applied to members (30–86400)", "defaultRegions": "Default regions applied to member monitors", @@ -95,7 +100,7 @@ export const fieldDescriptions: Record> = }, "UpdateResourceGroupRequest": { "name": "Human-readable name for this group", - "description": "Optional description; null clears the existing value", + "description": "Optional description (max 500); null clears the existing value", "alertPolicyId": "Optional notification policy to apply for this group; null clears the existing value", "defaultFrequency": "Default check frequency in seconds for members (30–86400); null clears", "defaultRegions": "Default regions for member monitors; null clears", @@ -200,7 +205,7 @@ export const fieldDescriptions: Record> = }, "WebhookChannelConfig": { "url": "Webhook endpoint URL that receives alert payloads", - "signingSecret": "Optional HMAC signing secret for payload verification", + "signingSecret": "HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", "customHeaders": "Additional HTTP headers to include in webhook requests" }, "PagerDutyChannelConfig": { diff --git a/src/lib/resources.ts b/src/lib/resources.ts index e51b47d..e01fcdf 100644 --- a/src/lib/resources.ts +++ b/src/lib/resources.ts @@ -413,6 +413,8 @@ const CHANNEL_CONFIG_SCHEMA_LIST: z.AnyZodObject[] = [ apiSchemas.PushoverChannelConfig, apiSchemas.RootlyChannelConfig, apiSchemas.SlackChannelConfig, + apiSchemas.SmsChannelConfig, + apiSchemas.PhoneCallChannelConfig, apiSchemas.SplunkOnCallChannelConfig, apiSchemas.TeamsChannelConfig, apiSchemas.TelegramChannelConfig, diff --git a/src/lib/spec-facts.generated.ts b/src/lib/spec-facts.generated.ts index cb4fa70..9e0cfd4 100644 --- a/src/lib/spec-facts.generated.ts +++ b/src/lib/spec-facts.generated.ts @@ -1,7 +1,7 @@ // Auto-generated from OpenAPI spec. DO NOT EDIT. // Re-run `npm run zodgen` to regenerate. -export const MONITOR_TYPES = ['HTTP', 'DNS', 'MCP_SERVER', 'TCP', 'ICMP', 'HEARTBEAT'] as const +export const MONITOR_TYPES = ['HTTP', 'DNS', 'MCP_SERVER', 'TCP', 'ICMP', 'HEARTBEAT', 'BROWSER', 'MULTI_STEP_API'] as const export type MonitorTypes = (typeof MONITOR_TYPES)[number] export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'] as const @@ -16,7 +16,7 @@ export type IncidentSeverities = (typeof INCIDENT_SEVERITIES)[number] export const ASSERTION_SEVERITIES = ['fail', 'warn'] as const export type AssertionSeverities = (typeof ASSERTION_SEVERITIES)[number] -export const CHANNEL_TYPES = ['email', 'webhook', 'slack', 'pagerduty', 'opsgenie', 'teams', 'discord', 'telegram', 'google_chat', 'pushover', 'mattermost', 'splunk_oncall', 'pushbullet', 'linear', 'incident_io', 'rootly', 'zapier', 'datadog', 'jira', 'gitlab'] as const +export const CHANNEL_TYPES = ['email', 'webhook', 'slack', 'pagerduty', 'opsgenie', 'teams', 'discord', 'telegram', 'google_chat', 'pushover', 'mattermost', 'splunk_oncall', 'pushbullet', 'linear', 'incident_io', 'rootly', 'zapier', 'datadog', 'jira', 'gitlab', 'sms', 'phone_call'] as const export type ChannelTypes = (typeof CHANNEL_TYPES)[number] export const TRIGGER_RULE_TYPES = ['consecutive_failures', 'failures_in_window', 'response_time'] as const @@ -43,7 +43,7 @@ export type StatusPageVisibilities = (typeof STATUS_PAGE_VISIBILITIES)[number] export const STATUS_PAGE_INCIDENT_MODES = ['MANUAL', 'REVIEW', 'AUTOMATIC'] as const export type StatusPageIncidentModes = (typeof STATUS_PAGE_INCIDENT_MODES)[number] -export const STATUS_PAGE_COMPONENT_TYPES = ['MONITOR', 'GROUP', 'STATIC'] as const +export const STATUS_PAGE_COMPONENT_TYPES = ['MONITOR', 'GROUP', 'STATIC', 'DEPENDENCY'] as const export type StatusPageComponentTypes = (typeof STATUS_PAGE_COMPONENT_TYPES)[number] export const SP_INCIDENT_IMPACTS = ['NONE', 'MINOR', 'MAJOR', 'CRITICAL'] as const diff --git a/src/lib/yaml/handlers.ts b/src/lib/yaml/handlers.ts index d77e986..84e035d 100644 --- a/src/lib/yaml/handlers.ts +++ b/src/lib/yaml/handlers.ts @@ -495,22 +495,34 @@ const alertChannelHandler = defineHandler ({ name: api.name, channelType: api.channelType?.toLowerCase?.() ?? '', configHash: api.configHash ?? '', + enabled: api.enabled ?? true, }), fetchAll: (client) => fetchPaginated(client, '/api/v1/alert-channels'), async applyCreate(yaml, _refs, client) { const resp = await checkedFetch(client.POST('/api/v1/alert-channels', {body: toCreateAlertChannelRequest(yaml)})) - return idToString(resp?.data?.id) + const id = idToString(resp?.data?.id) + if (id && yaml.enabled === false) { + await checkedFetch(client.PUT('/api/v1/alert-channels/{id}', { + params: {path: {id}}, + body: {...toCreateAlertChannelRequest(yaml), enabled: false}, + })) + } + return id }, async applyUpdate(yaml, id, _refs, client) { - await checkedFetch(client.PUT('/api/v1/alert-channels/{id}', {params: {path: {id}}, body: toCreateAlertChannelRequest(yaml)})) + await checkedFetch(client.PUT('/api/v1/alert-channels/{id}', { + params: {path: {id}}, + body: {...toCreateAlertChannelRequest(yaml), enabled: yaml.enabled ?? true}, + })) }, deletePath: (id) => `/api/v1/alert-channels/${id}`, }) @@ -533,6 +545,7 @@ const notificationPolicyHandler = defineHandler ({ name: api.name ?? '', + description: api.description ?? '', enabled: api.enabled ?? true, priority: api.priority ?? 0, matchRules: stripNullish(api.matchRules ?? []), @@ -957,6 +971,7 @@ export function statusPageComponentDesiredSnapshot( group: yaml.group ?? null, monitor: yaml.monitor ?? null, resourceGroup: yaml.resourceGroup ?? null, + service: yaml.service ?? null, } } @@ -1012,6 +1027,12 @@ export function statusPageComponentCurrentSnapshot( if (entry.id === String(api.resourceGroupId)) {resourceGroupName = entry.refKey; break} } } + let serviceName: string | null = null + if (api.serviceSubscriptionId) { + for (const entry of refs.allEntries('dependencies')) { + if (entry.id === api.serviceSubscriptionId) {serviceName = entry.refKey; break} + } + } return { name: api.name ?? '', description: api.description ?? null, @@ -1024,6 +1045,7 @@ export function statusPageComponentCurrentSnapshot( group: groupName, monitor: monitorName, resourceGroup: resourceGroupName, + service: serviceName, } } @@ -1082,6 +1104,9 @@ function makeComponentCollectionDef( if (yaml.type === 'GROUP' && yaml.resourceGroup) { body.resourceGroupId = refs.resolve('resourceGroups', yaml.resourceGroup) ?? yaml.resourceGroup } + if (yaml.type === 'DEPENDENCY' && yaml.service) { + body.serviceSubscriptionId = refs.resolve('dependencies', yaml.service) ?? yaml.service + } const resp = (await apiPost( client, `/api/v1/status-pages/${parentId}/components`, body, )) as {data?: Schemas['StatusPageComponentDto']} @@ -1100,6 +1125,9 @@ function makeComponentCollectionDef( } else if (!yaml.group) { body.removeFromGroup = true } + if (yaml.type === 'DEPENDENCY' && yaml.service) { + body.serviceSubscriptionId = refs.resolve('dependencies', yaml.service) ?? yaml.service + } await apiPut(client, `/api/v1/status-pages/${parentId}/components/${childId}`, body) }, async applyDelete(parentId, childId) { diff --git a/src/lib/yaml/schema.ts b/src/lib/yaml/schema.ts index 7a8ca73..d61ccf1 100644 --- a/src/lib/yaml/schema.ts +++ b/src/lib/yaml/schema.ts @@ -379,11 +379,13 @@ export interface YamlSecret { export interface YamlAlertChannel { name: string + enabled?: boolean config: {channelType: ChannelType} & YamlChannelConfig } export interface YamlNotificationPolicy { name: string + description?: string enabled?: boolean priority?: number matchRules?: YamlMatchRule[] @@ -495,6 +497,8 @@ export interface YamlStatusPageComponent { type: StatusPageComponentType monitor?: string resourceGroup?: string + /** Service subscription slug or id — required when type=DEPENDENCY. */ + service?: string group?: string showUptime?: boolean /** Exclude from overall status calculation (e.g. third-party deps). */ diff --git a/src/lib/yaml/transform.ts b/src/lib/yaml/transform.ts index d5de4ee..35396a6 100644 --- a/src/lib/yaml/transform.ts +++ b/src/lib/yaml/transform.ts @@ -58,6 +58,7 @@ export function toCreateNotificationPolicyRequest( ): Schemas['CreateNotificationPolicyRequest'] { return { name: policy.name, + description: policy.description, enabled: policy.enabled ?? true, priority: policy.priority ?? 0, matchRules: policy.matchRules?.map((r) => toMatchRule(r, refs)) ?? [], @@ -155,6 +156,9 @@ function toMonitorConfig( case 'ICMP': return cfg as Schemas['IcmpMonitorConfig'] case 'HEARTBEAT': return cfg as Schemas['HeartbeatMonitorConfig'] case 'MCP_SERVER': return cfg as Schemas['McpServerMonitorConfig'] + case 'BROWSER': + case 'MULTI_STEP_API': + return cfg as Schemas['ScriptMonitorConfig'] } } diff --git a/src/lib/yaml/validator.ts b/src/lib/yaml/validator.ts index 07a048b..27ea69f 100644 --- a/src/lib/yaml/validator.ts +++ b/src/lib/yaml/validator.ts @@ -560,8 +560,12 @@ function validateStatusPageComponent(comp: YamlStatusPageComponent, path: string if (comp.type === 'GROUP' && !comp.resourceGroup) { ctx.error(`${path}.resourceGroup`, 'GROUP component requires "resourceGroup" reference') } + if (comp.type === 'DEPENDENCY' && !comp.service) { + ctx.error(`${path}.service`, 'DEPENDENCY component requires "service" reference') + } if (comp.monitor) ctx.checkRef('monitors', comp.monitor, `${path}.monitor`) if (comp.resourceGroup) ctx.checkRef('resourceGroups', comp.resourceGroup, `${path}.resourceGroup`) + if (comp.service) ctx.checkRef('dependencies', comp.service, `${path}.service`) if (comp.group && !groupNames.has(comp.group)) { ctx.warn(`${path}.group`, `Component group "${comp.group}" not found in this status page's componentGroups`) } diff --git a/src/lib/yaml/zod-schemas.ts b/src/lib/yaml/zod-schemas.ts index e496b85..d071f06 100644 --- a/src/lib/yaml/zod-schemas.ts +++ b/src/lib/yaml/zod-schemas.ts @@ -112,6 +112,8 @@ const CHANNEL_CONFIG_SCHEMA_LIST: z.AnyZodObject[] = [ apiSchemas.PushoverChannelConfig, apiSchemas.RootlyChannelConfig, apiSchemas.SlackChannelConfig, + apiSchemas.SmsChannelConfig, + apiSchemas.PhoneCallChannelConfig, apiSchemas.SplunkOnCallChannelConfig, apiSchemas.TeamsChannelConfig, apiSchemas.TelegramChannelConfig, @@ -320,6 +322,7 @@ const SecretSchema = z.object({ const AlertChannelSchema = z.object({ name: z.string(), + enabled: z.boolean().optional(), config: z.record(z.unknown()).refine( (c) => typeof c.channelType === 'string', {message: 'config.channelType is required'}, @@ -343,10 +346,21 @@ const AlertChannelSchema = z.object({ ctx.addIssue({...issue, path: ['config', ...issue.path]}) } } + if (result.success && (channelType === 'sms' || channelType === 'phone_call')) { + const cfg = data.config as {phoneNumber?: unknown; verifiedPhoneNumberId?: unknown} + if (!cfg.phoneNumber && cfg.verifiedPhoneNumberId == null) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: ['config'], + message: `${channelType} requires phoneNumber or verifiedPhoneNumberId`, + }) + } + } }) const NotificationPolicySchema = z.object({ name: z.string(), + description: z.string().optional(), enabled: z.boolean().optional(), priority: z.number().int().optional(), matchRules: z.array(MatchRuleSchema).optional(), @@ -445,6 +459,7 @@ const StatusPageComponentSchema = z.object({ type: z.enum(STATUS_PAGE_COMPONENT_TYPES), monitor: z.string().optional(), resourceGroup: z.string().optional(), + service: z.string().optional(), group: z.string().optional(), showUptime: z.boolean().optional(), excludeFromOverall: z.boolean().optional(), diff --git a/test/fixtures/yaml/invalid/bad-channel-type.yml b/test/fixtures/yaml/invalid/bad-channel-type.yml index 66cabab..e699ecc 100644 --- a/test/fixtures/yaml/invalid/bad-channel-type.yml +++ b/test/fixtures/yaml/invalid/bad-channel-type.yml @@ -1,5 +1,5 @@ alertChannels: - name: bad config: - channelType: sms + channelType: not_a_channel phone: "+1234567890" diff --git a/test/yaml/differ.test.ts b/test/yaml/differ.test.ts index 0eac952..9db91f0 100644 --- a/test/yaml/differ.test.ts +++ b/test/yaml/differ.test.ts @@ -534,7 +534,7 @@ describe('differ', () => { const baseApiComponent = { name: 'API', description: null, type: 'STATIC', showUptime: true, excludeFromOverall: false, startDate: null, group: null, - monitor: null, resourceGroup: null, + monitor: null, resourceGroup: null, service: null, } it('FIXED: component added in YAML is detected as page-level update', async () => { diff --git a/test/yaml/negative-validation.test.ts b/test/yaml/negative-validation.test.ts index 8072255..0d88364 100644 --- a/test/yaml/negative-validation.test.ts +++ b/test/yaml/negative-validation.test.ts @@ -458,7 +458,7 @@ describe('invalid channel configs per type', () => { }) it('rejects unknown channel type', () => { - expectFail(channel({channelType: 'sms', phone: '+1234'})) + expectFail(channel({channelType: 'not_a_channel', phone: '+1234'})) }) it('rejects missing channelType', () => { diff --git a/test/yaml/spec-field-parity.test.ts b/test/yaml/spec-field-parity.test.ts index 1f40818..9e3e0c0 100644 --- a/test/yaml/spec-field-parity.test.ts +++ b/test/yaml/spec-field-parity.test.ts @@ -55,7 +55,7 @@ const YAML_ONLY_FIELDS: Record = { 'monitors', 'services', ], statusPage: ['componentGroups', 'components'], - statusPageComponent: ['monitor', 'resourceGroup', 'group'], + statusPageComponent: ['monitor', 'resourceGroup', 'service', 'group'], webhook: [], tag: [], environment: [], @@ -77,7 +77,7 @@ const API_ONLY_FIELDS: Record = { 'managedBy', 'alertPolicyId', 'defaultEnvironmentId', ], statusPage: ['managedBy'], - statusPageComponent: ['monitorId', 'resourceGroupId', 'groupId', 'displayOrder', 'removeFromGroup'], + statusPageComponent: ['monitorId', 'resourceGroupId', 'serviceSubscriptionId', 'groupId', 'displayOrder', 'removeFromGroup'], webhook: ['enabled'], tag: [], environment: [], @@ -110,14 +110,14 @@ const MAPPINGS: FieldMapping[] = [ { yamlName: 'alertChannel', apiSchemaNames: ['CreateAlertChannelRequest', 'UpdateAlertChannelRequest'], - yamlFields: ['name', 'config'], + yamlFields: ['name', 'config', 'enabled'], yamlOnlyFields: YAML_ONLY_FIELDS['alertChannel'], apiOnlyFields: API_ONLY_FIELDS['alertChannel'], }, { yamlName: 'notificationPolicy', apiSchemaNames: ['CreateNotificationPolicyRequest', 'UpdateNotificationPolicyRequest'], - yamlFields: ['name', 'enabled', 'priority', 'matchRules', 'escalation'], + yamlFields: ['name', 'description', 'enabled', 'priority', 'matchRules', 'escalation'], yamlOnlyFields: YAML_ONLY_FIELDS['notificationPolicy'], apiOnlyFields: API_ONLY_FIELDS['notificationPolicy'], }, @@ -148,7 +148,7 @@ const MAPPINGS: FieldMapping[] = [ apiSchemaNames: ['CreateStatusPageComponentRequest', 'UpdateStatusPageComponentRequest'], yamlFields: [ 'name', 'description', 'type', 'monitor', 'resourceGroup', - 'group', 'showUptime', 'excludeFromOverall', 'startDate', + 'service', 'group', 'showUptime', 'excludeFromOverall', 'startDate', ], yamlOnlyFields: YAML_ONLY_FIELDS['statusPageComponent'], apiOnlyFields: API_ONLY_FIELDS['statusPageComponent'], @@ -251,12 +251,14 @@ describe('YAML ↔ OpenAPI field parity', () => { const SNAPSHOT_COMPONENT_FIELDS = [ 'name', 'description', 'type', 'showUptime', 'excludeFromOverall', - 'startDate', 'group', 'monitor', 'resourceGroup', + 'startDate', 'group', 'monitor', 'resourceGroup', 'service', ] const SNAPSHOT_COMPONENT_DTO_ONLY = [ 'id', 'statusPageId', 'groupId', 'monitorId', 'resourceGroupId', + 'serviceSubscriptionId', 'serviceName', 'serviceSlug', 'displayOrder', 'pageOrder', 'currentStatus', 'createdAt', 'updatedAt', + 'overrideActor', 'overrideExpiresAt', 'overrideReason', 'overrideStatus', ] const SNAPSHOT_GROUP_FIELDS = ['name', 'description', 'defaultOpen'] @@ -275,7 +277,7 @@ describe('Snapshot ↔ DTO field parity', () => { }) it('every snapshot field maps to a DTO field or is a YAML name ref', () => { - const yamlNameRefs = ['group', 'monitor', 'resourceGroup'] + const yamlNameRefs = ['group', 'monitor', 'resourceGroup', 'service'] for (const field of SNAPSHOT_COMPONENT_FIELDS) { if (yamlNameRefs.includes(field)) continue expect( diff --git a/test/yaml/zod-schemas.test.ts b/test/yaml/zod-schemas.test.ts index 700811b..137cb1e 100644 --- a/test/yaml/zod-schemas.test.ts +++ b/test/yaml/zod-schemas.test.ts @@ -178,7 +178,7 @@ describe('DevhelmConfigSchema', () => { it('rejects unknown channel type', () => { const result = DevhelmConfigSchema.safeParse({ - alertChannels: [{name: 'x', config: {channelType: 'sms', webhookUrl: 'x'}}], + alertChannels: [{name: 'x', config: {channelType: 'not_a_channel', webhookUrl: 'x'}}], }) expect(result.success).toBe(false) }) From 00922a8a31c7fd1eb08fe609e9a74078f05b6647 Mon Sep 17 00:00:00 2001 From: caballeto Date: Sun, 23 Aug 2026 12:30:21 +0200 Subject: [PATCH 2/2] test: cover status-page maintenance help and --scheduled rejection Locks the new command family and the incident-create migration guard. Also steers communicate skill copy away from scheduling via incidents. Co-authored-by: Cursor --- skills/devhelm-communicate/SKILL.md | 9 ++- .../references/incidents.md | 4 +- .../commands/status-pages-maintenance.test.ts | 66 +++++++++++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 test/commands/status-pages-maintenance.test.ts diff --git a/skills/devhelm-communicate/SKILL.md b/skills/devhelm-communicate/SKILL.md index b37485e..14d58da 100644 --- a/skills/devhelm-communicate/SKILL.md +++ b/skills/devhelm-communicate/SKILL.md @@ -124,9 +124,12 @@ Ask which one if ambiguous. - **Existing auto-created incident** (from a monitor going down): list recent ones with `devhelm status-pages incidents list ` and ask the user which to post under. -- **New manual incident**: create with `devhelm status-pages incidents - create ...` (planned maintenance, external provider - outages, etc.). +- **New incident**: create with `devhelm status-pages incidents + create ...` for outages monitors can't detect + (external provider outages, etc.). +- **Maintenance window**: schedule with + `devhelm status-pages maintenance create ...`. + Do not use incident create for planned work. **Step 3 — Compose the update.** diff --git a/skills/devhelm-communicate/references/incidents.md b/skills/devhelm-communicate/references/incidents.md index 81f6caa..a685be5 100644 --- a/skills/devhelm-communicate/references/incidents.md +++ b/skills/devhelm-communicate/references/incidents.md @@ -66,12 +66,14 @@ devhelm status-pages incidents updates create \ Valid status values: -- `SCHEDULED` → upcoming maintenance - `INVESTIGATING` → just started, cause unknown - `IDENTIFIED` → cause known, fix in progress - `MONITORING` → fix applied, watching - `RESOLVED` → over +Window timing belongs on the maintenance resource +(`status-pages maintenance create` / `update`), not incident status. + Each update is appended to the incident; the page shows the full timeline. diff --git a/test/commands/status-pages-maintenance.test.ts b/test/commands/status-pages-maintenance.test.ts new file mode 100644 index 0000000..07311f7 --- /dev/null +++ b/test/commands/status-pages-maintenance.test.ts @@ -0,0 +1,66 @@ +import {expect, test, describe} from 'vitest' +import {execSync} from 'node:child_process' +import {dirname, join} from 'node:path' +import {fileURLToPath} from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const repoRoot = join(__dirname, '..', '..') + +function run(argv: string): string { + try { + return execSync(`node bin/dev.js ${argv}`, { + cwd: repoRoot, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }) + } catch (err) { + const e = err as {stdout?: string; stderr?: string} + return `${e.stdout ?? ''}${e.stderr ?? ''}` + } +} + +describe('status-pages maintenance topic', () => { + test('parent --help lists the maintenance topic', () => { + const out = run('status-pages --help') + expect(out).toContain('status-pages maintenance') + }) + + test('topic --help lists every subcommand', () => { + const out = run('status-pages maintenance --help') + for (const cmd of [ + 'create', + 'list', + 'get', + 'update', + 'delete', + 'publish', + 'dismiss', + 'post-update', + ]) { + expect(out).toContain(`status-pages maintenance ${cmd}`) + } + }) + + test('create --help requires title, impact, body, and scheduled-for', () => { + const out = run('status-pages maintenance create --help') + expect(out).toContain('--title=') + expect(out).toContain('--impact') + expect(out).toContain('--body=') + expect(out).toContain('--scheduled-for=') + }) +}) + +describe('status-pages incidents create --scheduled', () => { + test('errors and points at maintenance create', () => { + const out = run( + 'status-pages incidents create 00000000-0000-0000-0000-000000000001 --title t --impact MINOR --body b --scheduled --api-token x --api-url http://127.0.0.1:9', + ) + expect(out).toContain('`--scheduled` is no longer valid on incident create') + expect(out).toContain('status-pages maintenance create') + }) + + test('create --help does not advertise --scheduled', () => { + const out = run('status-pages incidents create --help') + expect(out).not.toContain('--scheduled') + }) +})