From d9764b7ee67e8b7f4fca16448d57dbf375e22612 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 5 Jul 2026 14:29:20 +0000 Subject: [PATCH] chore: update generated API types from latest spec --- docs/openapi/monitoring-api.json | 1786 +++++++++++++++++++++++++++--- src/devhelm/_generated.py | 934 ++++++++++++++-- 2 files changed, 2430 insertions(+), 290 deletions(-) diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index a9b7d44..3247791 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -891,6 +891,128 @@ } } }, + "/api/v1/alert-channels/{id}/enabled": { + "patch": { + "tags": [ + "Alert Channels" + ], + "summary": "Enable or disable an alert channel without re-uploading config", + "operationId": "setEnabled", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SetEnabledRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseAlertChannelDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/api/v1/alert-channels/{id}/test": { "post": { "tags": [ @@ -6477,7 +6599,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] } }, @@ -7718,13 +7842,14 @@ } } }, - "/api/v1/monitors/{id}/tags": { + "/api/v1/monitors/{id}/status-pages": { "get": { "tags": [ "Monitors" ], - "summary": "Get all tags applied to a monitor", - "operationId": "getMonitorTags", + "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", @@ -7742,7 +7867,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultTagDto" + "$ref": "#/components/schemas/TableValueResultStatusPageDto" } } } @@ -7828,13 +7953,15 @@ } } } - }, - "post": { + } + }, + "/api/v1/monitors/{id}/tags": { + "get": { "tags": [ "Monitors" ], - "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", - "operationId": "addMonitorTags", + "summary": "Get all tags applied to a monitor", + "operationId": "getMonitorTags", "parameters": [ { "name": "id", @@ -7846,16 +7973,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddMonitorTagsRequest" - } - } - }, - "required": true - }, "responses": { "200": { "description": "OK", @@ -7949,12 +8066,12 @@ } } }, - "delete": { + "post": { "tags": [ "Monitors" ], - "summary": "Remove tags from a monitor by their IDs", - "operationId": "removeMonitorTags", + "summary": "Add tags to a monitor; supports existing tag IDs and inline creation of new tags", + "operationId": "addMonitorTags", "parameters": [ { "name": "id", @@ -7970,125 +8087,368 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + "$ref": "#/components/schemas/AddMonitorTagsRequest" } } }, "required": true }, - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad request — the payload failed validation", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Unauthorized — missing or invalid credentials", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "403": { - "description": "Forbidden — the actor lacks permission for this resource", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "404": { - "description": "Not found — the requested resource does not exist", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "409": { - "description": "Conflict — the request collides with current resource state", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "500": { - "description": "Internal server error — see the message field for details", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "502": { - "description": "Bad gateway — an upstream provider returned an error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "503": { - "description": "Service unavailable — try again shortly", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/api/v1/monitors/{id}/test": { - "post": { - "tags": [ - "Monitors" - ], - "summary": "Test an existing monitor", - "description": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test.", - "operationId": "testExisting", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], "responses": { "200": { "description": "OK", "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "$ref": "#/components/schemas/TableValueResultTagDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Monitors" + ], + "summary": "Remove tags from a monitor by their IDs", + "operationId": "removeMonitorTags", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveMonitorTagsRequest" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/test": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Test an existing monitor", + "description": "Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test.", + "operationId": "testExisting", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseMonitorTestResultDto" + } + } + } + }, + "400": { + "description": "Bad request — the payload failed validation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized — missing or invalid credentials", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden — the actor lacks permission for this resource", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Not found — the requested resource does not exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "409": { + "description": "Conflict — the request collides with current resource state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Internal server error — see the message field for details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Bad gateway — an upstream provider returned an error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Service unavailable — try again shortly", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/api/v1/monitors/{id}/test-notifications": { + "post": { + "tags": [ + "Monitors" + ], + "summary": "Send test notifications through the monitor's alert channels", + "description": "Sends a test alert to all specified channel IDs (must be channels attached to this monitor). If no channelIds are provided, tests all attached channels. Returns per-channel results.", + "operationId": "testNotifications", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestMonitorNotificationsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultTestChannelResult" } } } @@ -13532,6 +13892,15 @@ "type": "boolean" } }, + { + "name": "slaPublished", + "in": "query", + "description": "Filter by SLA page publication status", + "required": false, + "schema": { + "type": "boolean" + } + }, { "name": "search", "in": "query", @@ -13803,7 +14172,7 @@ "Status Data" ], "summary": "List active components for a service with current status and inline uptime", - "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service.", + "description": "When ``groupId`` is supplied, only direct children of that group are returned — used by the pSEO renderer to lazy-load the leaves under a group that summary mode trimmed. Without ``groupId`` the response includes every active component for the service. Supports pagination via ``page``/``size`` and case-insensitive name search via ``search``.", "operationId": "getComponents", "parameters": [ { @@ -13823,6 +14192,35 @@ "type": "string", "format": "uuid" } + }, + { + "name": "search", + "in": "query", + "description": "Case-insensitive substring match on component name", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Zero-based page index", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "in": "query", + "description": "Page size (default 25, max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } } ], "responses": { @@ -21856,6 +22254,7 @@ "required": [ "channelType", "createdAt", + "enabled", "id", "name", "updatedAt" @@ -21905,6 +22304,10 @@ } ] }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled and will receive alerts" + }, "createdAt": { "type": "string", "description": "Timestamp when the channel was created", @@ -22845,7 +23248,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 +23267,85 @@ }, { "$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" + } + ] + } + } + }, + "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", @@ -23517,7 +23997,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -23537,6 +24019,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -24175,6 +24660,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", @@ -27686,7 +28237,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27706,6 +28259,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -27904,7 +28460,9 @@ "MCP_SERVER", "TCP", "ICMP", - "HEARTBEAT" + "HEARTBEAT", + "BROWSER", + "MULTI_STEP_API" ] }, "config": { @@ -27924,6 +28482,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -28087,6 +28648,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", @@ -28302,6 +28889,46 @@ }, "description": "Org-level notification policy with match rules and escalation chain" }, + "OfficialSla": { + "type": "object", + "properties": { + "percentage": { + "type": "string", + "description": "Advertised uptime percentage, e.g. '99.99%'", + "nullable": true + }, + "scope": { + "type": "string", + "description": "Scope of the SLA, e.g. 'Monthly uptime per region'", + "nullable": true + }, + "measurement": { + "type": "string", + "description": "How the vendor measures uptime for SLA purposes", + "nullable": true + }, + "exclusions": { + "type": "string", + "description": "Summary of exclusions from SLA calculation", + "nullable": true + }, + "appliesToPlans": { + "type": "array", + "description": "Plan names this SLA applies to, e.g. ['Enterprise']", + "nullable": true, + "items": { + "type": "string", + "description": "Plan names this SLA applies to, e.g. ['Enterprise']" + } + }, + "notCovered": { + "type": "string", + "description": "Services/components NOT covered by the SLA", + "nullable": true + } + }, + "description": "The vendor's officially advertised SLA commitment" + }, "OpsGenieChannelConfig": { "required": [ "channelType", @@ -28595,6 +29222,29 @@ }, "description": "Aggregated poll metrics for a time bucket" }, + "PricingTier": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Tier name, e.g. 'Free', 'Pro', 'Enterprise'" + }, + "slaPercentage": { + "type": "string", + "description": "SLA percentage for this tier, e.g. '99.9%'", + "nullable": true + }, + "priceFrom": { + "type": "string", + "description": "Starting price, e.g. '$0', '$25/mo', 'Custom'", + "nullable": true + } + }, + "description": "Pricing tiers with associated SLA levels" + }, "PublishStatusPageIncidentRequest": { "type": "object", "properties": { @@ -29601,6 +30251,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 +30344,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 +30385,7 @@ "pollingIntervalSeconds", "enabled", "published", + "slaPublished", "componentCount", "activeIncidentCount" ], @@ -29739,6 +30440,10 @@ "published": { "type": "boolean" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "overallStatus": { "type": "string", "nullable": true @@ -29959,7 +30664,8 @@ "slug", "updatedAt", "pollingIntervalSeconds", - "enabled" + "enabled", + "slaPublished" ], "type": "object", "properties": { @@ -30062,6 +30768,10 @@ "dataCompleteness": { "type": "string" }, + "slaPublished": { + "type": "boolean", + "description": "Whether the service's SLA page is publicly visible" + }, "seoMetadata": { "nullable": true, "allOf": [ @@ -30070,6 +30780,14 @@ } ] }, + "slaData": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/SlaDataDto" + } + ] + }, "relatedServices": { "type": "array", "nullable": true, @@ -30128,6 +30846,13 @@ "type": "string" } }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, "updates": { "type": "array", "items": { @@ -30203,6 +30928,13 @@ "type": "string", "format": "date-time", "nullable": true + }, + "affectedRegions": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } } } }, @@ -30566,6 +31298,19 @@ }, "description": "Replace the alert channels linked to a monitor" }, + "SetEnabledRequest": { + "required": [ + "enabled" + ], + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether the resource should be enabled" + } + }, + "description": "Request body for toggling a resource's enabled state" + }, "SetMonitorAuthRequest": { "required": [ "config" @@ -31236,6 +31981,106 @@ } } }, + "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" + }, + "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", @@ -32912,7 +33757,39 @@ } } }, - "TableValueResultStatusPageCustomDomainDto": { + "TableValueResultStatusPageCustomDomainDto": { + "required": [ + "data", + "hasNext", + "hasPrev" + ], + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StatusPageCustomDomainDto" + } + }, + "hasNext": { + "type": "boolean" + }, + "hasPrev": { + "type": "boolean" + }, + "totalElements": { + "type": "integer", + "format": "int64", + "nullable": true + }, + "totalPages": { + "type": "integer", + "format": "int32", + "nullable": true + } + } + }, + "TableValueResultStatusPageDto": { "required": [ "data", "hasNext", @@ -32923,7 +33800,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageCustomDomainDto" + "$ref": "#/components/schemas/StatusPageDto" } }, "hasNext": { @@ -32944,7 +33821,7 @@ } } }, - "TableValueResultStatusPageDto": { + "TableValueResultStatusPageIncidentDto": { "required": [ "data", "hasNext", @@ -32955,7 +33832,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageDto" + "$ref": "#/components/schemas/StatusPageIncidentDto" } }, "hasNext": { @@ -32976,7 +33853,7 @@ } } }, - "TableValueResultStatusPageIncidentDto": { + "TableValueResultStatusPageSubscriberDto": { "required": [ "data", "hasNext", @@ -32987,7 +33864,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageIncidentDto" + "$ref": "#/components/schemas/StatusPageSubscriberDto" } }, "hasNext": { @@ -33008,7 +33885,7 @@ } } }, - "TableValueResultStatusPageSubscriberDto": { + "TableValueResultTagDto": { "required": [ "data", "hasNext", @@ -33019,7 +33896,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/StatusPageSubscriberDto" + "$ref": "#/components/schemas/TagDto" } }, "hasNext": { @@ -33040,7 +33917,7 @@ } } }, - "TableValueResultTagDto": { + "TableValueResultTestChannelResult": { "required": [ "data", "hasNext", @@ -33051,7 +33928,7 @@ "data": { "type": "array", "items": { - "$ref": "#/components/schemas/TagDto" + "$ref": "#/components/schemas/TestChannelResult" } }, "hasNext": { @@ -33491,6 +34368,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": { @@ -33753,64 +34653,64 @@ "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/UpdatePushbulletChannelConfig" }, { - "$ref": "#/components/schemas/PushoverChannelConfig" + "$ref": "#/components/schemas/UpdatePushoverChannelConfig" }, { - "$ref": "#/components/schemas/RootlyChannelConfig" + "$ref": "#/components/schemas/UpdateRootlyChannelConfig" }, { - "$ref": "#/components/schemas/SlackChannelConfig" + "$ref": "#/components/schemas/UpdateSlackChannelConfig" }, { - "$ref": "#/components/schemas/SplunkOnCallChannelConfig" + "$ref": "#/components/schemas/UpdateSplunkOnCallChannelConfig" }, { - "$ref": "#/components/schemas/TeamsChannelConfig" + "$ref": "#/components/schemas/UpdateTeamsChannelConfig" }, { - "$ref": "#/components/schemas/TelegramChannelConfig" + "$ref": "#/components/schemas/UpdateTelegramChannelConfig" }, { - "$ref": "#/components/schemas/WebhookChannelConfig" + "$ref": "#/components/schemas/UpdateWebhookChannelConfig" }, { - "$ref": "#/components/schemas/ZapierChannelConfig" + "$ref": "#/components/schemas/UpdateZapierChannelConfig" } ] }, @@ -33825,6 +34725,11 @@ "MCP", "API" ] + }, + "enabled": { + "type": "boolean", + "description": "Whether this channel is enabled (default: true); null preserves current value", + "nullable": true } } }, @@ -34004,6 +34909,84 @@ } } }, + "UpdateDatadogChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "datadog" + ] + }, + "apiKey": { + "type": "string", + "description": "Datadog API key", + "nullable": true + }, + "site": { + "type": "string", + "description": "Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)", + "nullable": true + }, + "tags": { + "type": "string", + "description": "Comma-separated tags to attach to events", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateDiscordChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "discord" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Discord webhook URL", + "nullable": true + }, + "mentionRoleId": { + "type": "string", + "description": "Optional Discord role ID to mention in notifications", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateEmailChannelConfig": { + "required": [ + "channelType", + "recipients" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "email" + ] + }, + "recipients": { + "minItems": 1, + "type": "array", + "description": "Email addresses to send notifications to", + "items": { + "type": "string", + "description": "Email addresses to send notifications to", + "format": "email" + } + } + } + }, "UpdateEnvironmentRequest": { "type": "object", "properties": { @@ -34031,6 +35014,79 @@ } } }, + "UpdateGitLabChannelConfig": { + "required": [ + "channelType", + "endpointUrl" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "endpointUrl": { + "minLength": 1, + "type": "string", + "description": "GitLab alert integration endpoint URL" + }, + "authorizationKey": { + "type": "string", + "description": "Authorization key from GitLab alert integration settings", + "nullable": true + } + } + }, + "UpdateGoogleChatChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "google_chat" + ] + }, + "webhookUrl": { + "type": "string", + "description": "Google Chat space webhook URL", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdateIncidentIoChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "incident_io" + ] + }, + "apiKey": { + "type": "string", + "description": "incident.io API key with 'Create incidents' permission", + "nullable": true + }, + "severityId": { + "type": "string", + "description": "Severity ID for created incidents (from List Severities API)", + "nullable": true + }, + "visibility": { + "type": "string", + "description": "Incident visibility: public or private (default: public)", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateIncidentPolicyRequest": { "required": [ "confirmation", @@ -34056,6 +35112,78 @@ }, "description": "Request body for updating an incident policy" }, + "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 +35228,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 +35309,9 @@ { "$ref": "#/components/schemas/McpServerMonitorConfig" }, + { + "$ref": "#/components/schemas/ScriptMonitorConfig" + }, { "$ref": "#/components/schemas/TcpMonitorConfig" } @@ -34291,6 +35451,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 +35517,88 @@ } } }, + "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" + ] + }, + "UpdatePushbulletChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pushbullet" + ] + }, + "accessToken": { + "type": "string", + "description": "Pushbullet access token", + "nullable": true + }, + "deviceIden": { + "type": "string", + "description": "Target device identifier (broadcasts to all if empty)", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, + "UpdatePushoverChannelConfig": { + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "pushover" + ] + }, + "userKey": { + "type": "string", + "description": "Pushover user or group key", + "nullable": true + }, + "appToken": { + "type": "string", + "description": "Pushover application API token", + "nullable": true + }, + "priority": { + "type": "string", + "description": "Notification priority override (-2 to 2)", + "nullable": true + }, + "sound": { + "type": "string", + "description": "Notification sound override", + "nullable": true + } + }, + "required": [ + "channelType" + ] + }, "UpdateResourceGroupRequest": { "required": [ "name" @@ -34451,6 +35717,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 +35755,55 @@ } } }, + "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" + ] + }, + "UpdateSplunkOnCallChannelConfig": { + "required": [ + "channelType", + "routingKey" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string", + "enum": [ + "splunk_oncall" + ] + }, + "apiKey": { + "type": "string", + "description": "Splunk On-Call REST API key", + "nullable": true + }, + "routingKey": { + "minLength": 1, + "type": "string", + "description": "Routing key for alert routing" + } + } + }, "UpdateStatusPageComponentGroupRequest": { "type": "object", "properties": { @@ -34685,6 +36024,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 +36162,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,12 +36245,26 @@ "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" ] }, "WebhookChannelConfig": { @@ -34837,7 +36287,7 @@ }, "signingSecret": { "type": "string", - "description": "Optional HMAC signing secret for payload verification", + "description": "HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", "nullable": true }, "customHeaders": { diff --git a/src/devhelm/_generated.py b/src/devhelm/_generated.py index 0b19ffa..4470b3d 100644 --- a/src/devhelm/_generated.py +++ b/src/devhelm/_generated.py @@ -189,6 +189,10 @@ class AlertChannelDto(BaseModel): display_config: Annotated[ AlertChannelDisplayConfig | None, Field(alias="displayConfig") ] = None + enabled: Annotated[ + bool, + Field(description="Whether this channel is enabled and will receive alerts"), + ] created_at: Annotated[ AwareDatetime, Field(alias="createdAt", description="Timestamp when the channel was created"), @@ -549,6 +553,21 @@ class ChartBucketDto(BaseModel): ] = None +class CodeCheckStep(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[str, Field(description="Step name from test.step() or test() call")] + status: Annotated[ + str, Field(description="Step outcome: passed, failed, skipped, or timedOut") + ] + duration_ms: Annotated[ + int | None, + Field(alias="durationMs", description="Step duration in milliseconds"), + ] = None + error: Annotated[ + str | None, Field(description="Error message if the step failed") + ] = None + + class ComponentImpact(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) component_id: Annotated[ @@ -843,6 +862,8 @@ class Type(StrEnum): tcp = "TCP" icmp = "ICMP" heartbeat = "HEARTBEAT" + browser = "BROWSER" + multi_step_api = "MULTI_STEP_API" class HealthThresholdType(StrEnum): @@ -1121,6 +1142,25 @@ class CreateWorkspaceRequest(BaseModel): name: Annotated[str, Field(description="Workspace name", min_length=1)] +class CreditTier(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + uptime_range: Annotated[ + str, + Field(alias="uptimeRange", description="Uptime range, e.g. '99.1% – 99.98%'"), + ] + credit_percent: Annotated[ + int | None, + Field(alias="creditPercent", description="Credit percent of monthly fee"), + ] = None + formula: Annotated[ + str | None, + Field(description="Credit formula when percent is not a fixed number"), + ] = None + notes: Annotated[ + str | None, Field(description="Additional notes on this credit tier") + ] = None + + class DatadogChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["datadog"], Field(alias="channelType")] = "datadog" @@ -2946,6 +2986,8 @@ class Type3(StrEnum): tcp = "TCP" icmp = "ICMP" heartbeat = "HEARTBEAT" + browser = "BROWSER" + multi_step_api = "MULTI_STEP_API" class MonitorTestResultDto(BaseModel): @@ -2979,6 +3021,33 @@ class NewTagRequest(BaseModel): ] = None +class NoSlaContext(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + reason: Annotated[str | None, Field(description="Reason no SLA is published")] = ( + None + ) + historical_claim: Annotated[ + str | None, + Field( + alias="historicalClaim", description="Non-binding historical uptime claim" + ), + ] = None + support_sla: Annotated[ + str | None, + Field( + alias="supportSla", + description="Support response time SLA if different from uptime SLA", + ), + ] = None + enterprise_note: Annotated[ + str | None, + Field( + alias="enterpriseNote", + description="Note about enterprise/custom SLA availability", + ), + ] = None + + class NotificationDispatchDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique dispatch record identifier")] @@ -3095,6 +3164,36 @@ class NotificationDto(BaseModel): ] +class OfficialSla(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + percentage: Annotated[ + str | None, Field(description="Advertised uptime percentage, e.g. '99.99%'") + ] = None + scope: Annotated[ + str | None, + Field(description="Scope of the SLA, e.g. 'Monthly uptime per region'"), + ] = None + measurement: Annotated[ + str | None, Field(description="How the vendor measures uptime for SLA purposes") + ] = None + exclusions: Annotated[ + str | None, Field(description="Summary of exclusions from SLA calculation") + ] = None + applies_to_plans: Annotated[ + list[str] | None, + Field( + alias="appliesToPlans", + description="Plan names this SLA applies to, e.g. ['Enterprise']", + ), + ] = None + not_covered: Annotated[ + str | None, + Field( + alias="notCovered", description="Services/components NOT covered by the SLA" + ), + ] = None + + class OpsGenieChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( @@ -3286,6 +3385,27 @@ class PollChartBucketDto(BaseModel): ] +class PricingTier(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str, Field(description="Tier name, e.g. 'Free', 'Pro', 'Enterprise'") + ] + sla_percentage: Annotated[ + str | None, + Field( + alias="slaPercentage", + description="SLA percentage for this tier, e.g. '99.9%'", + ), + ] = None + price_from: Annotated[ + str | None, + Field( + alias="priceFrom", + description="Starting price, e.g. '$0', '$25/mo', 'Custom'", + ), + ] = None + + class Status6(StrEnum): investigating = "INVESTIGATING" identified = "IDENTIFIED" @@ -3930,6 +4050,27 @@ class ScheduledMaintenanceDto(BaseModel): ] +class ScriptMonitorConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + script: Annotated[ + str, + Field( + description="Playwright test script source code", + max_length=65536, + min_length=1, + ), + ] + timeout_seconds: Annotated[ + int | None, + Field( + alias="timeoutSeconds", + description="Maximum execution time in seconds (5–120)", + ge=5, + le=120, + ), + ] = None + + class SecretDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: Annotated[UUID, Field(description="Unique secret identifier")] @@ -3986,6 +4127,21 @@ class SeoMetadataDto(BaseModel): ] = None +class ServiceBreakdown(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + service: Annotated[str, Field(description="Sub-service name, e.g. 'EC2', 'S3'")] + sla_percentage: Annotated[ + str | None, + Field(alias="slaPercentage", description="SLA percentage for this sub-service"), + ] = None + scope: Annotated[ + str | None, Field(description="Scope qualifier, e.g. 'Region (Multi-AZ)'") + ] = None + notes: Annotated[ + str | None, Field(description="Additional notes on measurement or conditions") + ] = None + + class ServiceCatalogDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -4006,6 +4162,13 @@ class ServiceCatalogDto(BaseModel): ] enabled: bool published: bool + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] overall_status: Annotated[str | None, Field(alias="overallStatus")] = None created_at: Annotated[AwareDatetime, Field(alias="createdAt")] updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] @@ -4147,6 +4310,7 @@ class ServiceIncidentDto(BaseModel): vendor_created_at: Annotated[ AwareDatetime | None, Field(alias="vendorCreatedAt") ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None class ServiceIncidentUpdateDto(BaseModel): @@ -4388,6 +4552,13 @@ class SetAlertChannelsRequest(BaseModel): ] +class SetEnabledRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + enabled: Annotated[ + bool, Field(description="Whether the resource should be enabled") + ] + + class SetMonitorAuthRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig @@ -4536,6 +4707,30 @@ class SlackChannelConfig(BaseModel): ] = None +class SourceUrls(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + sla_page: Annotated[ + str | None, Field(alias="slaPage", description="URL to vendor's SLA page") + ] = None + pricing_page: Annotated[ + str | None, + Field(alias="pricingPage", description="URL to vendor's pricing page"), + ] = None + tos_page: Annotated[ + str | None, + Field(alias="tosPage", description="URL to vendor's Terms of Service"), + ] = None + status_page: Annotated[ + str | None, Field(alias="statusPage", description="URL to vendor's status page") + ] = None + all_slas_page: Annotated[ + str | None, + Field( + alias="allSlasPage", description="URL to vendor's all-services SLA listing" + ), + ] = None + + class SplunkOnCallChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) channel_type: Annotated[Literal["splunk_oncall"], Field(alias="channelType")] = ( @@ -5188,6 +5383,24 @@ class TestMatchResult(BaseModel): ] +class TestMonitorNotificationsRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_ids: Annotated[ + list[UUID] | None, + Field( + alias="channelIds", + description="Channel IDs to test; null or empty tests all channels attached to the monitor", + ), + ] = None + include_resolved: Annotated[ + bool, + Field( + alias="includeResolved", + description="Whether to include a resolved notification in the test (default: false)", + ), + ] + + class TestNotificationPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) severity: Annotated[ @@ -5489,6 +5702,47 @@ class UpdateAssertionRequest(BaseModel): ] = None +class UpdateDatadogChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["datadog"], Field(alias="channelType")] = "datadog" + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Datadog API key") + ] = None + site: Annotated[ + str | None, + Field( + description="Datadog site region (e.g. datadoghq.com, datadoghq.eu, us3.datadoghq.com)" + ), + ] = None + tags: Annotated[ + str | None, Field(description="Comma-separated tags to attach to events") + ] = None + + +class UpdateDiscordChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["discord"], Field(alias="channelType")] = "discord" + webhook_url: Annotated[ + str | None, Field(alias="webhookUrl", description="Discord webhook URL") + ] = None + mention_role_id: Annotated[ + str | None, + Field( + alias="mentionRoleId", + description="Optional Discord role ID to mention in notifications", + ), + ] = None + + +class UpdateEmailChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["email"], Field(alias="channelType")] = "email" + recipients: Annotated[ + list[EmailStr], + Field(description="Email addresses to send notifications to", min_length=1), + ] + + class UpdateEnvironmentRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -5512,85 +5766,223 @@ class UpdateEnvironmentRequest(BaseModel): ] = None -class UpdateIncidentPolicyRequest(BaseModel): +class UpdateGitLabChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - trigger_rules: Annotated[ - list[TriggerRule], + channel_type: Annotated[Literal["gitlab"], Field(alias="channelType")] = "gitlab" + endpoint_url: Annotated[ + str, Field( - alias="triggerRules", - description="Array of trigger rules; at least one required", + alias="endpointUrl", + description="GitLab alert integration endpoint URL", min_length=1, ), ] - confirmation: ConfirmationPolicy - recovery: RecoveryPolicy + authorization_key: Annotated[ + str | None, + Field( + alias="authorizationKey", + description="Authorization key from GitLab alert integration settings", + ), + ] = None -class UpdateMaintenanceWindowRequest(BaseModel): +class UpdateGoogleChatChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - monitor_id: Annotated[ - UUID | None, - Field( - alias="monitorId", - description="Monitor this window applies to; null switches the window to org-wide", - ), + channel_type: Annotated[Literal["google_chat"], Field(alias="channelType")] = ( + "google_chat" + ) + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Google Chat space webhook URL"), ] = None - starts_at: Annotated[ - AwareDatetime, - Field(alias="startsAt", description="Updated start time (ISO 8601)"), - ] - ends_at: Annotated[ - AwareDatetime, Field(alias="endsAt", description="Updated end time (ISO 8601)") - ] - repeat_rule: Annotated[ + + +class UpdateIncidentIoChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["incident_io"], Field(alias="channelType")] = ( + "incident_io" + ) + api_key: Annotated[ str | None, Field( - alias="repeatRule", - description="Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it", - max_length=100, - min_length=0, + alias="apiKey", + description="incident.io API key with 'Create incidents' permission", ), ] = None - reason: Annotated[ + severity_id: Annotated[ str | None, Field( - description="Updated reason (max 500 chars); null clears the existing reason", - max_length=500, - min_length=0, + alias="severityId", + description="Severity ID for created incidents (from List Severities API)", ), ] = None - suppress_alerts: Annotated[ - bool | None, - Field( - alias="suppressAlerts", - description="Whether to suppress alerts during this window; null defaults to true", - ), + visibility: Annotated[ + str | None, + Field(description="Incident visibility: public or private (default: public)"), ] = None -class UpdateMonitorAuthRequest(BaseModel): +class UpdateIncidentPolicyRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig + trigger_rules: Annotated[ + list[TriggerRule], + Field( + alias="triggerRules", + description="Array of trigger rules; at least one required", + min_length=1, + ), + ] + confirmation: ConfirmationPolicy + recovery: RecoveryPolicy -class UpdateOrgDetailsRequest(BaseModel): +class UpdateJiraChannelConfig(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) - name: Annotated[ + channel_type: Annotated[Literal["jira"], Field(alias="channelType")] = "jira" + domain: Annotated[ str, Field( - description="New organization name (max 200 chars)", - max_length=200, - min_length=0, + description="Atlassian instance domain (e.g. yourteam.atlassian.net)", + min_length=1, ), ] email: Annotated[ - EmailStr, - Field(description="New billing and contact email address", min_length=1), - ] - size: Annotated[ - str | None, + str, Field( - description="Team size range (e.g. 1-10, 11-50)", + description="Atlassian account email for API authentication", min_length=1 + ), + ] + api_token: Annotated[ + str | None, Field(alias="apiToken", description="Atlassian API token") + ] = None + project_key: Annotated[ + str, + Field( + alias="projectKey", + description="Jira project key where issues are created (e.g. OPS)", + min_length=1, + ), + ] + issue_type: Annotated[ + str | None, + Field( + alias="issueType", description="Issue type name (e.g. Bug, Task, Incident)" + ), + ] = None + + +class UpdateLinearChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["linear"], Field(alias="channelType")] = "linear" + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Linear API key") + ] = None + team_id: Annotated[ + str, + Field(alias="teamId", description="Team ID to create issues in", min_length=1), + ] + label_id: Annotated[ + str | None, + Field(alias="labelId", description="Label ID to attach to created issues"), + ] = None + + +class UpdateMaintenanceWindowRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + monitor_id: Annotated[ + UUID | None, + Field( + alias="monitorId", + description="Monitor this window applies to; null switches the window to org-wide", + ), + ] = None + starts_at: Annotated[ + AwareDatetime, + Field(alias="startsAt", description="Updated start time (ISO 8601)"), + ] + ends_at: Annotated[ + AwareDatetime, Field(alias="endsAt", description="Updated end time (ISO 8601)") + ] + repeat_rule: Annotated[ + str | None, + Field( + alias="repeatRule", + description="Reserved: iCal RRULE for recurring windows (stored but not yet honored); null clears it", + max_length=100, + min_length=0, + ), + ] = None + reason: Annotated[ + str | None, + Field( + description="Updated reason (max 500 chars); null clears the existing reason", + max_length=500, + min_length=0, + ), + ] = None + suppress_alerts: Annotated[ + bool | None, + Field( + alias="suppressAlerts", + description="Whether to suppress alerts during this window; null defaults to true", + ), + ] = None + + +class UpdateMattermostChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["mattermost"], Field(alias="channelType")] = ( + "mattermost" + ) + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Mattermost incoming webhook URL"), + ] = None + channel: Annotated[ + str | None, Field(description="Override channel (if webhook allows)") + ] = None + icon_url: Annotated[ + str | None, Field(alias="iconUrl", description="Custom bot icon URL") + ] = None + + +class UpdateMonitorAuthRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + config: ApiKeyAuthConfig | BasicAuthConfig | BearerAuthConfig | HeaderAuthConfig + + +class UpdateOpsGenieChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["opsgenie"], Field(alias="channelType")] = ( + "opsgenie" + ) + api_key: Annotated[ + str | None, + Field(alias="apiKey", description="OpsGenie API key for alert creation"), + ] = None + region: Annotated[ + str | None, Field(description="OpsGenie API region: us or eu") + ] = None + + +class UpdateOrgDetailsRequest(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + name: Annotated[ + str, + Field( + description="New organization name (max 200 chars)", + max_length=200, + min_length=0, + ), + ] + email: Annotated[ + EmailStr, + Field(description="New billing and contact email address", min_length=1), + ] + size: Annotated[ + str | None, + Field( + description="Team size range (e.g. 1-10, 11-50)", max_length=50, min_length=0, ), @@ -5614,6 +6006,63 @@ class UpdateOrgDetailsRequest(BaseModel): ] = None +class UpdatePagerDutyChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pagerduty"], Field(alias="channelType")] = ( + "pagerduty" + ) + routing_key: Annotated[ + str | None, + Field( + alias="routingKey", + description="PagerDuty Events API v2 routing (integration) key", + ), + ] = None + severity_override: Annotated[ + str | None, + Field( + alias="severityOverride", description="Override PagerDuty severity mapping" + ), + ] = None + + +class UpdatePushbulletChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pushbullet"], Field(alias="channelType")] = ( + "pushbullet" + ) + access_token: Annotated[ + str | None, Field(alias="accessToken", description="Pushbullet access token") + ] = None + device_iden: Annotated[ + str | None, + Field( + alias="deviceIden", + description="Target device identifier (broadcasts to all if empty)", + ), + ] = None + + +class UpdatePushoverChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["pushover"], Field(alias="channelType")] = ( + "pushover" + ) + user_key: Annotated[ + str | None, Field(alias="userKey", description="Pushover user or group key") + ] = None + app_token: Annotated[ + str | None, + Field(alias="appToken", description="Pushover application API token"), + ] = None + priority: Annotated[ + str | None, Field(description="Notification priority override (-2 to 2)") + ] = None + sound: Annotated[str | None, Field(description="Notification sound override")] = ( + None + ) + + class UpdateResourceGroupRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -5718,6 +6167,21 @@ class UpdateResourceGroupRequest(BaseModel): ] = None +class UpdateRootlyChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["rootly"], Field(alias="channelType")] = "rootly" + api_key: Annotated[ + str | None, + Field( + alias="apiKey", + description="Rootly API token with incident creation permission", + ), + ] = None + severity: Annotated[ + str | None, Field(description="Severity slug override (e.g. sev0, sev1)") + ] = None + + class UpdateSecretRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) value: Annotated[ @@ -5730,6 +6194,39 @@ class UpdateSecretRequest(BaseModel): ] +class UpdateSlackChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["slack"], Field(alias="channelType")] = "slack" + webhook_url: Annotated[ + str | None, Field(alias="webhookUrl", description="Slack incoming webhook URL") + ] = None + mention_text: Annotated[ + str | None, + Field( + alias="mentionText", + description="Optional mention text included in notifications, e.g. @channel", + ), + ] = None + + +class UpdateSplunkOnCallChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["splunk_oncall"], Field(alias="channelType")] = ( + "splunk_oncall" + ) + api_key: Annotated[ + str | None, Field(alias="apiKey", description="Splunk On-Call REST API key") + ] = None + routing_key: Annotated[ + str, + Field( + alias="routingKey", + description="Routing key for alert routing", + min_length=1, + ), + ] + + class UpdateStatusPageComponentGroupRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) name: Annotated[ @@ -5922,6 +6419,57 @@ class UpdateTagRequest(BaseModel): ] = None +class UpdateTeamsChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["teams"], Field(alias="channelType")] = "teams" + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Microsoft Teams incoming webhook URL"), + ] = None + + +class UpdateTelegramChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["telegram"], Field(alias="channelType")] = ( + "telegram" + ) + bot_token: Annotated[ + str | None, + Field(alias="botToken", description="Telegram bot token from @BotFather"), + ] = None + chat_id: Annotated[ + str, + Field( + alias="chatId", + description="Chat, group, or channel ID to send alerts to", + min_length=1, + ), + ] + + +class UpdateWebhookChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["webhook"], Field(alias="channelType")] = "webhook" + url: Annotated[ + str | None, + Field(description="Webhook endpoint URL that receives alert payloads"), + ] = None + signing_secret: Annotated[ + str | None, + Field( + alias="signingSecret", + description="HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", + ), + ] = None + custom_headers: Annotated[ + dict[str, str] | None, + Field( + alias="customHeaders", + description="Additional HTTP headers to include in webhook requests", + ), + ] = None + + class UpdateWebhookEndpointRequest(BaseModel): model_config = ConfigDict(extra="forbid", populate_by_name=True) url: Annotated[ @@ -5960,6 +6508,15 @@ class UpdateWorkspaceRequest(BaseModel): ] +class UpdateZapierChannelConfig(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + channel_type: Annotated[Literal["zapier"], Field(alias="channelType")] = "zapier" + webhook_url: Annotated[ + str | None, + Field(alias="webhookUrl", description="Zapier/n8n/Make catch webhook URL"), + ] = None + + class UptimeBucketDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) timestamp: Annotated[ @@ -6029,6 +6586,22 @@ class UptimeDto(BaseModel): examples=[312], ), ] = None + p50_latency_ms: Annotated[ + float | None, + Field( + alias="p50LatencyMs", + description="50th-percentile (median) latency in milliseconds; null when no data", + examples=[128], + ), + ] = None + incident_count: Annotated[ + int, + Field( + alias="incidentCount", + description="Number of incidents that started within the requested window", + examples=[2], + ), + ] class WebhookChannelConfig(BaseModel): @@ -6045,7 +6618,7 @@ class WebhookChannelConfig(BaseModel): str | None, Field( alias="signingSecret", - description="Optional HMAC signing secret for payload verification", + description="HMAC secret for X-DevHelm-Signature header; omit for unsigned delivery", ), ] = None custom_headers: Annotated[ @@ -6278,6 +6851,26 @@ class BulkMonitorActionResult(BaseModel): ] +class Code(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + check_type: Literal["code"] = "code" + exit_code: Annotated[ + int, Field(alias="exitCode", description="Container exit code (0 = pass)") + ] + stdout_snippet: Annotated[ + str | None, + Field(alias="stdoutSnippet", description="Truncated stdout from the container"), + ] = None + stderr_snippet: Annotated[ + str | None, + Field(alias="stderrSnippet", description="Truncated stderr from the container"), + ] = None + steps: Annotated[ + list[CodeCheckStep] | None, + Field(description="Named steps extracted from Playwright test output"), + ] = None + + class ComponentUptimeDayDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) date: Annotated[ @@ -6434,6 +7027,7 @@ class CreateMonitorRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) frequency_seconds: Annotated[ @@ -6640,6 +7234,36 @@ class CreateStatusPageRequest(BaseModel): ] = None +class CreditPolicy(BaseModel): + model_config = ConfigDict(extra="forbid", populate_by_name=True) + summary: Annotated[ + str | None, Field(description="Brief summary of credit policy") + ] = None + max_credit_percent: Annotated[ + int | None, + Field( + alias="maxCreditPercent", description="Max credit as percent of monthly fee" + ), + ] = None + claim_window_days: Annotated[ + int | None, + Field( + alias="claimWindowDays", + description="Days to submit a credit claim after eligibility", + ), + ] = None + credit_application_days: Annotated[ + int | None, + Field( + alias="creditApplicationDays", + description="Days for credit to be applied after approval", + ), + ] = None + tiers: Annotated[ + list[CreditTier] | None, Field(description="Credit tiers by uptime threshold") + ] = None + + class CursorPageServiceCatalogDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: Annotated[list[ServiceCatalogDto], Field(description="Items on this page")] @@ -7004,9 +7628,6 @@ class MonitorDto(BaseModel): """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" model_config = ConfigDict(extra="ignore", populate_by_name=True) - """Note: ``currentStatus`` was removed from this DTO. Inspect ``enabled`` and the incident-policy API to derive a live status for a monitor instead.""" - - model_config = ConfigDict(extra="forbid", populate_by_name=True) id: Annotated[UUID, Field(description="Unique monitor identifier")] organization_id: Annotated[ int, @@ -7024,6 +7645,7 @@ class MonitorDto(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) frequency_seconds: Annotated[ @@ -7100,6 +7722,7 @@ class MonitorTestRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig ) assertions: Annotated[ @@ -7287,48 +7910,6 @@ class ResourceGroupDto(BaseModel): ] -class ServiceDetailDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - id: UUID - slug: str - name: str - category: str | None = None - official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None - developer_context: Annotated[str | None, Field(alias="developerContext")] = None - logo_url: Annotated[str | None, Field(alias="logoUrl")] = None - adapter_type: Annotated[str, Field(alias="adapterType")] - polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] - lifecycle_status: Annotated[ - str, - Field( - alias="lifecycleStatus", - description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", - ), - ] - enabled: bool - created_at: Annotated[AwareDatetime, Field(alias="createdAt")] - updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] - current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( - None - ) - recent_incidents: Annotated[ - list[ServiceIncidentDto], Field(alias="recentIncidents") - ] - components: list[ServiceComponentDto] - components_summary: Annotated[ - ComponentsSummaryDto | None, Field(alias="componentsSummary") - ] = None - uptime: ComponentUptimeSummaryDto | None = None - active_maintenances: Annotated[ - list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") - ] - data_completeness: Annotated[str, Field(alias="dataCompleteness")] - seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None - related_services: Annotated[ - list[ServiceCatalogDto] | None, Field(alias="relatedServices") - ] = None - - class ServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7342,6 +7923,7 @@ class ServiceIncidentDetailDto(BaseModel): affected_components: Annotated[ list[str] | None, Field(alias="affectedComponents") ] = None + affected_regions: Annotated[list[str] | None, Field(alias="affectedRegions")] = None updates: list[ServiceIncidentUpdateDto] @@ -7432,11 +8014,6 @@ class SingleValueResponseResourceGroupDto(BaseModel): data: ResourceGroupDto -class SingleValueResponseServiceDetailDto(BaseModel): - model_config = ConfigDict(extra="ignore", populate_by_name=True) - data: ServiceDetailDto - - class SingleValueResponseServiceIncidentDetailDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: ServiceIncidentDetailDto @@ -7512,6 +8089,48 @@ class SingleValueResponseWorkspaceDto(BaseModel): data: WorkspaceDto +class SlaDataDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + sla_type: Annotated[ + str | None, + Field( + alias="slaType", + description="SLA pattern: plan_gated, per_service, no_public_sla, or universal", + ), + ] = None + official_sla: Annotated[OfficialSla | None, Field(alias="officialSla")] = None + service_breakdown: Annotated[ + list[ServiceBreakdown] | None, + Field( + alias="serviceBreakdown", + description="Per-service breakdown for vendors with per_service SLA type", + ), + ] = None + pricing_tiers: Annotated[ + list[PricingTier] | None, + Field( + alias="pricingTiers", description="Pricing tiers with associated SLA levels" + ), + ] = None + credit_policy: Annotated[CreditPolicy | None, Field(alias="creditPolicy")] = None + no_sla_context: Annotated[NoSlaContext | None, Field(alias="noSlaContext")] = None + source_urls: Annotated[SourceUrls | None, Field(alias="sourceUrls")] = None + last_researched: Annotated[ + str | None, + Field( + alias="lastResearched", + description="ISO date when this data was last manually researched", + ), + ] = None + research_notes: Annotated[ + str | None, + Field( + alias="researchNotes", + description="Freeform operator notes about the research", + ), + ] = None + + class StatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) id: UUID @@ -7621,6 +8240,15 @@ class TableValueResultTagDto(BaseModel): total_pages: Annotated[int | None, Field(alias="totalPages")] = None +class TableValueResultTestChannelResult(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: list[TestChannelResult] + has_next: Annotated[bool, Field(alias="hasNext")] + has_prev: Annotated[bool, Field(alias="hasPrev")] + total_elements: Annotated[int | None, Field(alias="totalElements")] = None + total_pages: Annotated[int | None, Field(alias="totalPages")] = None + + class TableValueResultWebhookDeliveryDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: list[WebhookDeliveryDto] @@ -7686,26 +8314,26 @@ class UpdateAlertChannelRequest(BaseModel): ), ] config: Annotated[ - DatadogChannelConfig - | DiscordChannelConfig - | EmailChannelConfig - | GitLabChannelConfig - | GoogleChatChannelConfig - | IncidentIoChannelConfig - | JiraChannelConfig - | LinearChannelConfig - | MattermostChannelConfig - | OpsGenieChannelConfig - | PagerDutyChannelConfig - | PushbulletChannelConfig - | PushoverChannelConfig - | RootlyChannelConfig - | SlackChannelConfig - | SplunkOnCallChannelConfig - | TeamsChannelConfig - | TelegramChannelConfig - | WebhookChannelConfig - | ZapierChannelConfig, + UpdateDatadogChannelConfig + | UpdateDiscordChannelConfig + | UpdateEmailChannelConfig + | UpdateGitLabChannelConfig + | UpdateGoogleChatChannelConfig + | UpdateIncidentIoChannelConfig + | UpdateJiraChannelConfig + | UpdateLinearChannelConfig + | UpdateMattermostChannelConfig + | UpdateOpsGenieChannelConfig + | UpdatePagerDutyChannelConfig + | UpdatePushbulletChannelConfig + | UpdatePushoverChannelConfig + | UpdateRootlyChannelConfig + | UpdateSlackChannelConfig + | UpdateSplunkOnCallChannelConfig + | UpdateTeamsChannelConfig + | UpdateTelegramChannelConfig + | UpdateWebhookChannelConfig + | UpdateZapierChannelConfig, Field(discriminator="channel_type"), ] managed_by: Annotated[ @@ -7715,6 +8343,12 @@ class UpdateAlertChannelRequest(BaseModel): description="New attribution source: DASHBOARD, CLI, TERRAFORM, MCP, or API; null preserves current value.", ), ] = None + enabled: Annotated[ + bool | None, + Field( + description="Whether this channel is enabled (default: true); null preserves current value" + ), + ] = None class UpdateMonitorRequest(BaseModel): @@ -7733,6 +8367,7 @@ class UpdateMonitorRequest(BaseModel): | HttpMonitorConfig | IcmpMonitorConfig | McpServerMonitorConfig + | ScriptMonitorConfig | TcpMonitorConfig | None ) = None @@ -7906,9 +8541,9 @@ class CheckTraceDto(BaseModel): ] = None -class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer]): +class CheckTypeDetailsDto(RootModel[Http | Tcp | Icmp | Dns | McpServer | Code]): root: Annotated[ - Http | Tcp | Icmp | Dns | McpServer, + Http | Tcp | Icmp | Dns | McpServer | Code, Field( description="Check-type-specific details — polymorphic by check_type discriminator", discriminator="check_type", @@ -7945,6 +8580,56 @@ class CreateNotificationPolicyRequest(BaseModel): ] = 0 +class ServiceDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + id: UUID + slug: str + name: str + category: str | None = None + official_status_url: Annotated[str | None, Field(alias="officialStatusUrl")] = None + developer_context: Annotated[str | None, Field(alias="developerContext")] = None + logo_url: Annotated[str | None, Field(alias="logoUrl")] = None + adapter_type: Annotated[str, Field(alias="adapterType")] + polling_interval_seconds: Annotated[int, Field(alias="pollingIntervalSeconds")] + lifecycle_status: Annotated[ + str, + Field( + alias="lifecycleStatus", + description="Service lifecycle state: ACTIVE, DEGRADED, DEPRECATED, or RETIRED", + ), + ] + enabled: bool + created_at: Annotated[AwareDatetime, Field(alias="createdAt")] + updated_at: Annotated[AwareDatetime, Field(alias="updatedAt")] + current_status: Annotated[ServiceStatusDto | None, Field(alias="currentStatus")] = ( + None + ) + recent_incidents: Annotated[ + list[ServiceIncidentDto], Field(alias="recentIncidents") + ] + components: list[ServiceComponentDto] + components_summary: Annotated[ + ComponentsSummaryDto | None, Field(alias="componentsSummary") + ] = None + uptime: ComponentUptimeSummaryDto | None = None + active_maintenances: Annotated[ + list[ScheduledMaintenanceDto], Field(alias="activeMaintenances") + ] + data_completeness: Annotated[str, Field(alias="dataCompleteness")] + sla_published: Annotated[ + bool, + Field( + alias="slaPublished", + description="Whether the service's SLA page is publicly visible", + ), + ] + seo_metadata: Annotated[SeoMetadataDto | None, Field(alias="seoMetadata")] = None + sla_data: Annotated[SlaDataDto | None, Field(alias="slaData")] = None + related_services: Annotated[ + list[ServiceCatalogDto] | None, Field(alias="relatedServices") + ] = None + + class SingleValueResponseBatchComponentUptimeDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: BatchComponentUptimeDto @@ -7955,6 +8640,11 @@ class SingleValueResponseCheckTraceDto(BaseModel): data: CheckTraceDto +class SingleValueResponseServiceDetailDto(BaseModel): + model_config = ConfigDict(extra="ignore", populate_by_name=True) + data: ServiceDetailDto + + class SingleValueResponseStatusPageIncidentDto(BaseModel): model_config = ConfigDict(extra="ignore", populate_by_name=True) data: StatusPageIncidentDto