From 9f6e585d7d235762846f9b7eb454a47f8138fbff Mon Sep 17 00:00:00 2001 From: caballeto Date: Thu, 23 Apr 2026 16:58:40 +0200 Subject: [PATCH] fix(api): regen for unified ComponentUptimeDayDto Mono PR devhelmhq/mono#269 collapses the catalog/status-page DTOs into a single canonical `ComponentUptimeDayDto` (typed `incidents[]` + `degradedSeconds`; `eventsJson`/`source` gone, `StatusPageComponentUptimeDayDto` removed). Regen of `api.generated.ts`, `api-zod.generated.ts`, `descriptions.generated.ts`, and the vendored OpenAPI spec follows. 870/870 vitests pass; tsc + eslint clean. Made-with: Cursor --- docs/openapi/monitoring-api.json | 102 +- docs/openapi/monitoring-api.yaml | 21893 ++++++++++++++++++++++++++++- src/lib/api-zod.generated.ts | 31 +- src/lib/api.generated.ts | 54 +- 4 files changed, 21920 insertions(+), 160 deletions(-) diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 8337378..ccd3413 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -15794,7 +15794,7 @@ "content": { "*/*": { "schema": { - "$ref": "#/components/schemas/TableValueResultStatusPageComponentUptimeDayDto" + "$ref": "#/components/schemas/TableValueResultComponentUptimeDayDto" } } } @@ -22091,7 +22091,6 @@ "ComponentUptimeDayDto": { "required": [ "date", - "source", "partialOutageSeconds", "majorOutageSeconds", "degradedSeconds", @@ -22101,7 +22100,7 @@ "properties": { "date": { "type": "string", - "description": "Date of the daily bucket (ISO 8601)", + "description": "Start-of-day timestamp for this bucket (UTC midnight, ISO 8601)", "format": "date-time" }, "partialOutageSeconds": { @@ -22121,17 +22120,16 @@ }, "uptimePercentage": { "type": "number", - "description": "Computed uptime percentage for the day", + "description": "Computed uptime percentage using the weighted formula (degraded does not lower it)", "format": "double" }, - "eventsJson": { - "type": "string", - "description": "Incident event references for this day as raw JSON", - "nullable": true - }, - "source": { - "type": "string", - "description": "Data source: vendor_reported or incident_derived" + "incidents": { + "type": "array", + "description": "Incidents that overlapped this day, in display order", + "nullable": true, + "items": { + "$ref": "#/components/schemas/IncidentRef" + } } }, "description": "Daily uptime data for a component" @@ -25112,19 +25110,19 @@ "properties": { "id": { "type": "string", - "description": "Status page incident ID", + "description": "Internal incident ID — UUID for status-page incidents, service incident UUID for catalog", "format": "uuid" }, "title": { "type": "string", - "description": "Incident title" + "description": "Incident title at the time of the overlap" }, "impact": { "type": "string", - "description": "Incident impact level" + "description": "Incident impact level (e.g. minor, major, critical for catalog; NONE/MINOR/MAJOR/CRITICAL for status pages)" } }, - "description": "Lightweight reference to an incident overlapping this day" + "description": "Lightweight reference to an incident overlapping a given uptime day" }, "IncidentsSummaryDto": { "type": "object", @@ -29827,46 +29825,6 @@ } } }, - "StatusPageComponentUptimeDayDto": { - "required": [ - "date", - "partialOutageSeconds", - "majorOutageSeconds", - "uptimePercentage" - ], - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "Start-of-day timestamp for this bucket (UTC midnight)", - "format": "date-time" - }, - "partialOutageSeconds": { - "type": "integer", - "description": "Seconds of partial outage on this day", - "format": "int32" - }, - "majorOutageSeconds": { - "type": "integer", - "description": "Seconds of major outage on this day", - "format": "int32" - }, - "uptimePercentage": { - "type": "number", - "description": "Computed uptime percentage using weighted formula", - "format": "double" - }, - "incidents": { - "type": "array", - "description": "Incidents that overlapped this day", - "nullable": true, - "items": { - "$ref": "#/components/schemas/IncidentRef" - } - } - }, - "description": "Daily uptime data for a status page component" - }, "StatusPageCustomDomainDto": { "required": [ "createdAt", @@ -31113,38 +31071,6 @@ } } }, - "TableValueResultStatusPageComponentUptimeDayDto": { - "required": [ - "data", - "hasNext", - "hasPrev" - ], - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/StatusPageComponentUptimeDayDto" - } - }, - "hasNext": { - "type": "boolean" - }, - "hasPrev": { - "type": "boolean" - }, - "totalElements": { - "type": "integer", - "format": "int64", - "nullable": true - }, - "totalPages": { - "type": "integer", - "format": "int32", - "nullable": true - } - } - }, "TableValueResultStatusPageCustomDomainDto": { "required": [ "data", diff --git a/docs/openapi/monitoring-api.yaml b/docs/openapi/monitoring-api.yaml index a882f00..9eb7744 100644 --- a/docs/openapi/monitoring-api.yaml +++ b/docs/openapi/monitoring-api.yaml @@ -1 +1,21892 @@ -{"openapi":"3.0.1","info":{"title":"DevHelm API","description":"DevHelm platform and public API","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Generated server url"}],"tags":[{"name":"Heartbeat","description":"Public ping endpoint for heartbeat monitors"},{"name":"Invites","description":"Organization invite management"},{"name":"Onboarding","description":"User onboarding flow"},{"name":"Members","description":"Organization member management"},{"name":"Me","description":"Current user profile and organizations"},{"name":"Incidents","description":"Incident management and lifecycle"},{"name":"Maintenance Windows","description":"Schedule alert-suppression windows for monitors"},{"name":"Organizations","description":"Organization management"},{"name":"Integrations","description":"Static catalog of supported alert channel integrations"},{"name":"Incident Policies","description":"Manage trigger, confirmation, and recovery rules for monitors"},{"name":"Entitlements","description":"Plan entitlements and usage limits"},{"name":"Vault","description":"Organization vault management (admin-only)"},{"name":"Secrets","description":"Organization environment secret management"},{"name":"Transactions","description":"Subscription transaction history"},{"name":"Monitors","description":"Monitor CRUD and lifecycle management"},{"name":"Webhooks","description":"Webhook endpoint management, event catalog, and delivery history"},{"name":"Events","description":"Real-time event stream"},{"name":"Workspaces","description":"Workspace management within an organization"},{"name":"Notifications","description":"In-app notification center"},{"name":"Alert Channels","description":"Alert channel CRUD and connectivity testing"},{"name":"Subscriptions","description":"Organization subscription management"},{"name":"Service Subscriptions","description":"Manage which services an organization tracks"},{"name":"Tags","description":"Org-scoped tag management for monitors"},{"name":"Status Data","description":"Public service status catalog, components, uptime, and incident history"},{"name":"Check Results","description":"Query raw check results, uptime statistics, and summary data"},{"name":"API Keys","description":"Organization API key management"},{"name":"Dashboard","description":"Overview dashboard aggregates"},{"name":"Auth","description":"User registration"},{"name":"Monitor Auth","description":"Manage authentication configuration for a monitor"},{"name":"Audit Log","description":"Organization audit trail"},{"name":"Monitor Alert Channels","description":"Manage alert channel mappings for a monitor"},{"name":"Alert Deliveries","description":"Delivery audit trail: inspect per-attempt details for alert deliveries"},{"name":"Resource Groups","description":"Resource group CRUD and member management"},{"name":"Notification Policies","description":"Org-level notification routing policies with JSONB match rules"},{"name":"Notification Dispatches","description":"Dispatch debugging API: inspect which policies matched an incident and track delivery status"},{"name":"Environments","description":"Variable namespace management for monitors"},{"name":"Monitor Assertions","description":"Manage assertions for a monitor"},{"name":"Billing","description":"Billing plans and pricing"}],"paths":{"/platform/orgs/{orgId}/subscriptions/{subscriptionId}":{"put":{"tags":["Subscriptions"],"summary":"Update subscription","operationId":"updateSubscription","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"subscriptionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSubscriptionDto"}}}}}}},"/platform/onboarding/orgs/{orgId}/details":{"put":{"tags":["Onboarding"],"summary":"Update organization details","operationId":"updateOrgDetails","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/onboarding/advance":{"put":{"tags":["Onboarding"],"summary":"Advance onboarding stage forward","operationId":"advanceStage","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOnboardingStageRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me":{"get":{"tags":["Me"],"summary":"Get current user","operationId":"me","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user profile","operationId":"updateProfile","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me/notification-preferences":{"get":{"tags":["Me"],"summary":"Get current user's notification preferences","operationId":"getNotificationPreferences","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user's notification preferences","operationId":"updateNotificationPreferences","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationPreferencesRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}}},"/platform/admin/workspaces/{workspaceId}":{"get":{"tags":["admin-workspace-controller"],"operationId":"getWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"put":{"tags":["admin-workspace-controller"],"operationId":"updateWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"delete":{"tags":["admin-workspace-controller"],"operationId":"deleteWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/admin/users/{userId}":{"put":{"tags":["admin-controller"],"operationId":"updateUser","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/admin/orgs/{orgId}":{"put":{"tags":["admin-controller"],"operationId":"updateOrganization","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/admin/orgs/{orgId}/members/{userId}/role":{"put":{"tags":["admin-member-controller"],"operationId":"updateMemberRole","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/workspaces/{workspaceId}":{"get":{"tags":["Workspaces"],"summary":"Get workspace by ID","operationId":"get","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"put":{"tags":["Workspaces"],"summary":"Update workspace","operationId":"update","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"delete":{"tags":["Workspaces"],"summary":"Delete workspace","operationId":"delete","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get a single webhook endpoint","operationId":"get_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookEndpointDto"}}}}}},"put":{"tags":["Webhooks"],"summary":"Update a webhook endpoint","operationId":"update_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","operationId":"delete_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/tags/{id}":{"put":{"tags":["Tags"],"summary":"Update a tag's name and/or color","operationId":"update_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}}}},"delete":{"tags":["Tags"],"summary":"Delete a tag (cascades to all monitor associations)","operationId":"delete_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/secrets/{key}":{"put":{"tags":["Secrets"],"summary":"Update secret","operationId":"update_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSecretDto"}}}}}},"delete":{"tags":["Secrets"],"summary":"Delete secret","operationId":"delete_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}":{"get":{"tags":["Resource Groups"],"summary":"Get a resource group by id with member statuses and inherited settings","description":"Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.","operationId":"get_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"includeMetrics","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}},"put":{"tags":["Resource Groups"],"summary":"Update a resource group's name, description, alert policy, inherited settings, and health threshold","operationId":"update_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateResourceGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}},"delete":{"tags":["Resource Groups"],"summary":"Delete a resource group (cascades to member rows)","operationId":"delete_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/org":{"get":{"tags":["Organizations"],"summary":"Get the current organization","operationId":"get_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}},"put":{"tags":["Organizations"],"summary":"Update the current organization","operationId":"update_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/api/v1/notifications/{id}/read":{"put":{"tags":["Notifications"],"summary":"Mark a notification as read","operationId":"markRead","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/notifications/read-all":{"put":{"tags":["Notifications"],"summary":"Mark all notifications as read","operationId":"markAllRead","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/notification-policies/{id}":{"get":{"tags":["Notification Policies"],"summary":"Get a notification policy by ID","operationId":"getById","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}},"put":{"tags":["Notification Policies"],"summary":"Update a notification policy","operationId":"update_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationPolicyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}},"delete":{"tags":["Notification Policies"],"summary":"Delete a notification policy","operationId":"delete_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/policy":{"get":{"tags":["Incident Policies"],"summary":"Get incident policy for a monitor","description":"Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.","operationId":"get_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","description":"Monitor UUID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Policy found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IncidentPolicyDto"}}}},"404":{"description":"Monitor or policy not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}},"put":{"tags":["Incident Policies"],"summary":"Update incident policy for a monitor","description":"Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.","operationId":"update_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","description":"Monitor UUID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIncidentPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Policy updated","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IncidentPolicyDto"}}}},"400":{"description":"Validation error in JSONB shape","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}},"404":{"description":"Monitor or policy not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}}},"/api/v1/monitors/{monitorId}/auth":{"put":{"tags":["Monitor Auth"],"summary":"Update authentication config for a monitor","operationId":"update_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorAuthRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}},"post":{"tags":["Monitor Auth"],"summary":"Set authentication config for a monitor","operationId":"set","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMonitorAuthRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}},"delete":{"tags":["Monitor Auth"],"summary":"Remove authentication config from a monitor","operationId":"remove","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/assertions/{assertionId}":{"put":{"tags":["Monitor Assertions"],"summary":"Update an assertion on a monitor","operationId":"update_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"assertionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssertionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAssertionDto"}}}}}},"delete":{"tags":["Monitor Assertions"],"summary":"Remove an assertion from a monitor","operationId":"remove_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"assertionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/alert-channels":{"put":{"tags":["Monitor Alert Channels"],"summary":"Replace the linked alert channel set for a monitor","operationId":"setChannels","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAlertChannelsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListUUID"}}}}}}},"/api/v1/monitors/{id}":{"get":{"tags":["Monitors"],"summary":"Get a single monitor by id","operationId":"get_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}},"put":{"tags":["Monitors"],"summary":"Update a monitor","operationId":"update_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}},"delete":{"tags":["Monitors"],"summary":"Soft-delete a monitor","operationId":"delete_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}/status":{"put":{"tags":["Members"],"summary":"Change member status","operationId":"changeStatus","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeStatusRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}/role":{"put":{"tags":["Members"],"summary":"Change member role","operationId":"changeRole","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/maintenance-windows/{id}":{"get":{"tags":["Maintenance Windows"],"summary":"Get a single maintenance window by ID","operationId":"getById_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}},"put":{"tags":["Maintenance Windows"],"summary":"Update a maintenance window","operationId":"update_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMaintenanceWindowRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}},"delete":{"tags":["Maintenance Windows"],"summary":"Delete a maintenance window","operationId":"delete_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/environments/{slug}":{"get":{"tags":["Environments"],"summary":"Get environment by slug","operationId":"get_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}},"put":{"tags":["Environments"],"summary":"Update environment","operationId":"update_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEnvironmentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}},"delete":{"tags":["Environments"],"summary":"Delete environment","operationId":"delete_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/alert-channels/{id}":{"put":{"tags":["Alert Channels"],"summary":"Update an alert channel's name and re-encrypt config","operationId":"update_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertChannelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertChannelDto"}}}}}},"delete":{"tags":["Alert Channels"],"summary":"Soft-delete an alert channel and return affected policy summary","operationId":"delete_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DeleteChannelResult"}}}}}}},"/v1/webhooks/paddle":{"post":{"tags":["paddle-webhook-controller"],"operationId":"handleWebhook","parameters":[{"name":"paddle-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}}},"required":true},"responses":{"200":{"description":"OK"}}}},"/v1/internal/workspaces":{"post":{"tags":["workspaces-controller"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreateParams"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/v1/internal/service-incidents":{"post":{"tags":["service-incident-internal-controller"],"operationId":"createOrResolve","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceIncidentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}}},"/v1/internal/resource-groups/services/{serviceId}/re-evaluate-health":{"post":{"tags":["resource-groups-internal-controller"],"operationId":"reEvaluateGroupHealthForService","parameters":[{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/resource-groups/monitors/{monitorId}/re-evaluate-health":{"post":{"tags":["resource-groups-internal-controller"],"operationId":"reEvaluateGroupHealthForMonitor","parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/incidents":{"post":{"tags":["incidents-internal-controller"],"operationId":"createAutoIncident","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAutoIncidentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/incidents/{id}/resolve":{"post":{"tags":["incidents-internal-controller"],"operationId":"resolveAutoIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/incidents/{id}/reopen":{"post":{"tags":["incidents-internal-controller"],"operationId":"reopenAutoIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReopenAutoIncidentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/escalation-tick":{"post":{"tags":["escalation-internal-controller"],"operationId":"runEscalationTick","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/billing/sync":{"post":{"tags":["admin-billing-controller"],"operationId":"syncFromPaddle","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/adapters/health":{"get":{"tags":["adapter-health-internal-controller"],"operationId":"getAllHealth","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAdapterHealthDto"}}}}}},"post":{"tags":["adapter-health-internal-controller"],"operationId":"reportOutcome","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdapterHealthReportRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdapterHealthDto"}}}}}}},"/platform/orgs":{"post":{"tags":["Organizations"],"summary":"Create organization","operationId":"create_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"ifNotExists","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/orgs/{orgId}/transactions":{"get":{"tags":["Transactions"],"summary":"List transactions","operationId":"list","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"limit","in":"query","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTransactionDto"}}}}}},"post":{"tags":["Transactions"],"summary":"Create subscription transaction","operationId":"createSubscriptionTransaction","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTransactionDto"}}}}}}},"/platform/onboarding/quick-monitor":{"post":{"tags":["Onboarding"],"summary":"Create a monitor with smart defaults from URL analysis","operationId":"quickMonitor","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickMonitorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/platform/onboarding/complete-setup":{"post":{"tags":["Onboarding"],"summary":"Complete onboarding setup (creates org + workspace, advances to FIRST_MONITOR)","operationId":"completeSetup","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSetupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/onboarding/analyze-url":{"post":{"tags":["Onboarding"],"summary":"Analyze a URL and return suggested monitor configuration","operationId":"analyzeUrl","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeUrlRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAnalyzeUrlResponse"}}}}}}},"/platform/invites/accept":{"post":{"tags":["Invites"],"summary":"Accept invite","operationId":"accept","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAcceptInviteDto"}}}}}}},"/platform/auth/register":{"post":{"tags":["Auth"],"summary":"Register user","operationId":"register","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/admin/orgs/{orgId}/workspaces":{"get":{"tags":["admin-workspace-controller"],"operationId":"listWorkspaces","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}},"post":{"tags":["admin-workspace-controller"],"operationId":"createWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/platform/admin/orgs/{orgId}/members":{"get":{"tags":["admin-member-controller"],"operationId":"listMembers","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMemberDto"}}}}}},"post":{"tags":["admin-member-controller"],"operationId":"addMember","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMemberDto"}}}}}}},"/platform/admin/adapters/{serviceId}/enable":{"post":{"tags":["admin-adapter-health-controller"],"operationId":"reEnableAdapter","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdapterHealthDto"}}}}}}},"/api/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"List workspaces","operationId":"list_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}},"post":{"tags":["Workspaces"],"summary":"Create workspace","operationId":"create_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints for the authenticated org","operationId":"list_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWebhookEndpointDto"}}}}}},"post":{"tags":["Webhooks"],"summary":"Register a new webhook endpoint","operationId":"create_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookEndpointDto"}}}}}}},"/api/v1/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test delivery to a webhook endpoint","operationId":"test","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}}}}},"/api/v1/webhooks/signing-secret/rotate":{"post":{"tags":["Webhooks"],"summary":"Generate or rotate the organization webhook signing secret","operationId":"rotateSigningSecret","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseString"}}}}}}},"/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","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDekRotationResultDto"}}}}}}},"/api/v1/tags":{"get":{"tags":["Tags"],"summary":"List tags for the authenticated organization","operationId":"list_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"post":{"tags":["Tags"],"summary":"Create a new tag","operationId":"create_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTagDto"}}}}}}},"/api/v1/service-subscriptions/{slug}":{"post":{"tags":["Service Subscriptions"],"summary":"Subscribe to a service or a component of a service","description":"Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. Free tier: max 10 subscriptions. Paid tier: unlimited.","operationId":"subscribe","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceSubscribeRequest"}}}},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}}},"/api/v1/secrets":{"get":{"tags":["Secrets"],"summary":"List secrets","operationId":"list_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSecretDto"}}}}}},"post":{"tags":["Secrets"],"summary":"Create secret","operationId":"create_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSecretDto"}}}}}}},"/api/v1/resource-groups":{"get":{"tags":["Resource Groups"],"summary":"List all resource groups for the authenticated org with health summaries","operationId":"list_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultResourceGroupDto"}}}}}},"post":{"tags":["Resource Groups"],"summary":"Create a new resource group","operationId":"create_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateResourceGroupRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}}},"/api/v1/resource-groups/{id}/members":{"post":{"tags":["Resource Groups"],"summary":"Add a monitor or service member to a resource group","operationId":"addMember_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddResourceGroupMemberRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupMemberDto"}}}}}}},"/api/v1/notification-policies":{"get":{"tags":["Notification Policies"],"summary":"List all notification policies for the authenticated org","operationId":"list_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationPolicyDto"}}}}}},"post":{"tags":["Notification Policies"],"summary":"Create a notification policy with match rules and escalation chain","operationId":"create_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNotificationPolicyRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}}},"/api/v1/notification-policies/{id}/test":{"post":{"tags":["Notification Policies"],"summary":"Dry-run: evaluate a policy's match rules against a supplied incident context","operationId":"test_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestNotificationPolicyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestMatchResult"}}}}}}},"/api/v1/notification-dispatches/{id}/acknowledge":{"post":{"tags":["Notification Dispatches"],"summary":"Acknowledge a notification dispatch","description":"Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).","operationId":"acknowledge","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationDispatchDto"}}}}}}},"/api/v1/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors for the authenticated org","operationId":"list_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"enabled","in":"query","description":"Filter by enabled state","required":false,"schema":{"type":"boolean"}},{"name":"type","in":"query","description":"Filter by monitor type","required":false,"schema":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]}},{"name":"managedBy","in":"query","description":"Filter by managed-by source","required":false,"schema":{"type":"string","enum":["DASHBOARD","CLI"]}},{"name":"tags","in":"query","description":"Filter by tag names, comma-separated (e.g. prod,critical)","required":false,"schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive name search","required":false,"schema":{"type":"string"}},{"name":"environmentId","in":"query","description":"Filter by environment ID","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMonitorDto"}}}}}},"post":{"tags":["Monitors"],"summary":"Create a new monitor","operationId":"create_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMonitorRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{monitorId}/assertions":{"post":{"tags":["Monitor Assertions"],"summary":"Add an assertion to a monitor","operationId":"add","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssertionRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAssertionDto"}}}}}}},"/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":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorTestResultDto"}}}}}}},"/api/v1/monitors/{id}/tags":{"get":{"tags":["Monitors"],"summary":"Get all tags applied to a monitor","operationId":"getMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"post":{"tags":["Monitors"],"summary":"Add tags to a monitor; supports existing tag IDs and inline creation of new tags","operationId":"addMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMonitorTagsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"delete":{"tags":["Monitors"],"summary":"Remove tags from a monitor by their IDs","operationId":"removeMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}},"/api/v1/monitors/{id}/rotate-token":{"post":{"tags":["Monitors"],"summary":"Rotate the ping token for a heartbeat monitor","description":"Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.","operationId":"rotateToken","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume a monitor (set enabled=true)","operationId":"resume","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause a monitor (set enabled=false)","operationId":"pause","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/test":{"post":{"tags":["Monitors"],"summary":"Ad-hoc monitor test","description":"Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers.","operationId":"testAdHoc","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorTestRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorTestResultDto"}}}}}}},"/api/v1/monitors/bulk":{"post":{"tags":["Monitors"],"summary":"Bulk action on monitors","description":"Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.","operationId":"bulkAction","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorActionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseBulkMonitorActionResult"}}}}}}},"/api/v1/maintenance-windows":{"get":{"tags":["Maintenance Windows"],"summary":"List maintenance windows for the authenticated org","description":"Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).","operationId":"list_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"query","description":"Filter by monitor UUID","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"filter","in":"query","description":"Filter by status: 'active' or 'upcoming'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMaintenanceWindowDto"}}}}}},"post":{"tags":["Maintenance Windows"],"summary":"Create a maintenance window","description":"Creates a new maintenance window. Set monitorId to null to create an org-wide window that suppresses alerts for all monitors.","operationId":"create_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMaintenanceWindowRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}}},"/api/v1/invites":{"get":{"tags":["Invites"],"summary":"List invites","operationId":"list_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultInviteDto"}}}}}},"post":{"tags":["Invites"],"summary":"Create invite","operationId":"create_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInviteDto"}}}}}}},"/api/v1/invites/{inviteId}/revoke":{"post":{"tags":["Invites"],"summary":"Revoke invite","operationId":"revoke","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"inviteId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/invites/{inviteId}/resend":{"post":{"tags":["Invites"],"summary":"Resend invite","operationId":"resend","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"inviteId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInviteDto"}}}}}}},"/api/v1/incidents":{"get":{"tags":["Incidents"],"summary":"List incidents for the authenticated org","operationId":"list_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/IncidentFilterParams"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}},"post":{"tags":["Incidents"],"summary":"Create a manual incident","operationId":"create_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateManualIncidentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/incidents/{id}/updates":{"post":{"tags":["Incidents"],"summary":"Add an update to an incident (optionally change status)","operationId":"addUpdate","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddIncidentUpdateRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/incidents/{id}/resolve":{"post":{"tags":["Incidents"],"summary":"Resolve an incident","operationId":"resolve","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveIncidentRequest"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/heartbeat/{token}":{"get":{"tags":["Heartbeat"],"summary":"Record a heartbeat ping (GET)","description":"Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.","operationId":"pingGet","parameters":[{"name":"token","in":"path","description":"Ping endpoint token for the heartbeat monitor","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}}}},"post":{"tags":["Heartbeat"],"summary":"Record a heartbeat ping (POST)","description":"Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.","operationId":"pingPost","parameters":[{"name":"token","in":"path","description":"Ping endpoint token for the heartbeat monitor","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}},"*/*":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}}}}},"/api/v1/environments":{"get":{"tags":["Environments"],"summary":"List environments","operationId":"list_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultEnvironmentDto"}}}}}},"post":{"tags":["Environments"],"summary":"Create environment","operationId":"create_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEnvironmentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"List API keys","operationId":"list_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultApiKeyDto"}}}}}},"post":{"tags":["API Keys"],"summary":"Create API key","operationId":"create_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyCreateResponse"}}}}}}},"/api/v1/api-keys/{id}/revoke":{"post":{"tags":["API Keys"],"summary":"Revoke API key","operationId":"revoke_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyDto"}}}}}}},"/api/v1/api-keys/{id}/regenerate":{"post":{"tags":["API Keys"],"summary":"Regenerate API key","operationId":"regenerate","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyCreateResponse"}}}}}}},"/api/v1/alert-deliveries/{id}/retry":{"post":{"tags":["Alert Deliveries"],"summary":"Retry a failed delivery","description":"Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.","operationId":"retry","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertDeliveryDto"}}}}}}},"/api/v1/alert-channels":{"get":{"tags":["Alert Channels"],"summary":"List active alert channels for the authenticated org","operationId":"list_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAlertChannelDto"}}}}}},"post":{"tags":["Alert Channels"],"summary":"Create a new alert channel with encrypted config","operationId":"create_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlertChannelRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertChannelDto"}}}}}}},"/api/v1/alert-channels/{id}/test":{"post":{"tags":["Alert Channels"],"summary":"Test a saved alert channel's connectivity","operationId":"test_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestChannelResult"}}}}}}},"/api/v1/alert-channels/test":{"post":{"tags":["Alert Channels"],"summary":"Test alert channel connectivity using raw config (no saved channel required)","operationId":"testConfig","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestAlertChannelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestChannelResult"}}}}}}},"/v1/internal/service-incidents/by-ref/{serviceId}/{externalRef}/components":{"patch":{"tags":["service-incident-internal-controller"],"operationId":"addComponents","parameters":[{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"externalRef","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}}},"/api/v1/service-subscriptions/{id}/alert-sensitivity":{"patch":{"tags":["Service Subscriptions"],"summary":"Update alert sensitivity for a subscription","description":"Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents).","operationId":"updateAlertSensitivity","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertSensitivityRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}}},"/api/v1/api-keys/{id}":{"delete":{"tags":["API Keys"],"summary":"Delete API key","operationId":"delete_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}},"patch":{"tags":["API Keys"],"summary":"Update API key","operationId":"update_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}}}}},"/v1/internal/workspaces/{id}":{"get":{"tags":["workspaces-controller"],"operationId":"get_7","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/v1/internal/orgs/{id}/workspaces":{"get":{"tags":["orgs-controller"],"operationId":"listWorkspaces_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}}},"/v1/internal/monitors/{id}/policy":{"get":{"tags":["monitors-internal-controller"],"operationId":"policy","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}}},"/v1/internal/monitors/{id}/env-variables":{"get":{"tags":["monitors-internal-controller"],"operationId":"getEnvVariables","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMapStringString"}}}}}}},"/v1/internal/monitors/{id}/auth":{"get":{"tags":["monitors-internal-controller"],"operationId":"auth","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}}},"/v1/internal/monitors/{id}/assertions":{"get":{"tags":["monitors-internal-controller"],"operationId":"getAssertions","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListMonitorAssertionDto"}}}}}}},"/v1/internal/monitors/{id}/active-incident":{"get":{"tags":["monitors-internal-controller"],"operationId":"activeIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/monitors/schedulable":{"get":{"tags":["monitors-internal-controller"],"operationId":"schedulable","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulableMonitorDto"}}}}}}}},"/platform/plans":{"get":{"tags":["Billing"],"summary":"List public billing plans","operationId":"getPublicPlans","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListBillingPlanDto"}}}}}}},"/platform/orgs/{orgId}/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List active subscriptions","operationId":"listActive","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSubscriptionDto"}}}}}},"delete":{"tags":["Subscriptions"],"operationId":"cancel","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/orgs/{orgId}/subscriptions/upcoming-charge":{"get":{"tags":["Subscriptions"],"summary":"Get upcoming charge","operationId":"getUpcomingCharge","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"priceId","in":"query","required":true,"schema":{"minimum":1,"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUpcomingChargeResponse"}}}}}}},"/platform/orgs/{orgId}/subscriptions/management-urls":{"get":{"tags":["Subscriptions"],"summary":"Get subscription management URLs","operationId":"getManagementUrls","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMapStringString"}}}}}}},"/platform/orgs/{orgId}/subscriptions/customer-auth-token":{"get":{"tags":["Subscriptions"],"summary":"Get customer auth token","operationId":"getCustomerAuthToken","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseString"}}}}}}},"/platform/orgs/{orgId}/entitlements":{"get":{"tags":["Entitlements"],"summary":"Get resolved entitlements and current usage for the organization","operationId":"getEntitlements","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEntitlementResponse"}}}}}}},"/platform/orgs/search":{"get":{"tags":["Organizations"],"summary":"Search organizations","operationId":"searchOrganizations","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"paginationParams","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PaginationParams"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIdValuePair"}}}}}}},"/platform/me/orgs":{"get":{"tags":["Me"],"summary":"Get current user's organizations","operationId":"myOrgs","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMyOrgItemDto"}}}}}}},"/platform/events/stream":{"get":{"tags":["Events"],"summary":"Subscribe to real-time platform events via SSE","operationId":"stream","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}}}},"/platform/admin/users":{"get":{"tags":["admin-controller"],"operationId":"listUsers","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultUserDto"}}}}}}},"/platform/admin/stats":{"get":{"tags":["admin-controller"],"operationId":"getStats","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdminStatsDto"}}}}}}},"/platform/admin/orgs":{"get":{"tags":["admin-controller"],"operationId":"listOrgs","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultOrganizationDto"}}}}}}},"/platform/admin/adapters/health":{"get":{"tags":["admin-adapter-health-controller"],"operationId":"getAdapterHealth","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAdapterHealthDto"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"List recent deliveries for a webhook endpoint","operationId":"listDeliveries","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}}}}},"/api/v1/webhooks/signing-secret":{"get":{"tags":["Webhooks"],"summary":"Get signing secret metadata for the authenticated org","operationId":"getSigningSecretInfo","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookSigningSecretDto"}}}}}}},"/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"}}}}}}},"/api/v1/services":{"get":{"tags":["Status Data"],"summary":"List all enabled services (cursor-paginated)","operationId":"listServices","parameters":[{"name":"category","in":"query","description":"Filter by category (exact match)","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by current overall_status (exact match)","required":false,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–100, default 20)","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageServiceCatalogDto"}}}}}}},"/api/v1/services/{slugOrId}":{"get":{"tags":["Status Data"],"summary":"Get a single service by slug or UUID with current status, components, and recent incidents","operationId":"getService","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get uptime statistics for a service","description":"Uptime data aggregated across active non-group components.","operationId":"getServiceUptime","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","description":"Time window","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d","1y","2y","all"]}},{"name":"granularity","in":"query","description":"Bucket granularity","required":false,"schema":{"type":"string","enum":["hourly","daily","monthly"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceUptimeResponse"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/services/{slugOrId}/maintenances":{"get":{"tags":["Status Data"],"summary":"List scheduled maintenances for a service","operationId":"getScheduledMaintenances","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status (e.g. scheduled, in_progress, verifying, completed)","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultScheduledMaintenanceDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents":{"get":{"tags":["Status Data"],"summary":"List incident history for a service (paginated)","operationId":"listIncidents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents/{incidentId}":{"get":{"tags":["Status Data"],"summary":"Get incident detail with full update timeline","operationId":"getIncident","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"incidentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceIncidentDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/components":{"get":{"tags":["Status Data"],"summary":"List active components for a service with current status and inline uptime","operationId":"getComponents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceComponentDto"}}}}}}},"/api/v1/services/{slugOrId}/components/{componentId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get daily uptime data for a component","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":"Time window","required":false,"schema":{"type":"string","enum":["7d","30d","90d","1y"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultComponentUptimeDayDto"}}}}}}},"/api/v1/services/summary":{"get":{"tags":["Status Data"],"summary":"Global status summary across all services","description":"Returns aggregate counts of services by status and a list of services currently experiencing issues.","operationId":"getGlobalStatusSummary","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseGlobalStatusSummaryDto"}}}}}}},"/api/v1/services/incidents":{"get":{"tags":["Status Data"],"summary":"List vendor incidents across all services (paginated)","description":"Cross-service vendor incident feed ordered by start date descending.","operationId":"listCrossServiceIncidents","parameters":[{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"category","in":"query","description":"Filter by service category","required":false,"schema":{"type":"string"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/service-subscriptions":{"get":{"tags":["Service Subscriptions"],"summary":"List all service subscriptions for the organization","operationId":"list_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceSubscriptionDto"}}}}}}},"/api/v1/service-subscriptions/{id}":{"get":{"tags":["Service Subscriptions"],"summary":"Get a subscription by its ID","operationId":"get_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}},"delete":{"tags":["Service Subscriptions"],"summary":"Remove a subscription by its ID","description":"Removes a specific subscription (whole-service or component-level). No-op if not found.","operationId":"unsubscribe","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}/health":{"get":{"tags":["Resource Groups"],"summary":"Get the detailed health breakdown for a resource group","description":"Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.","operationId":"getHealth","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupHealthDto"}}}}}}},"/api/v1/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications for the current user","operationId":"list_15","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"unreadOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDto"}}}}}}},"/api/v1/notifications/unread-count":{"get":{"tags":["Notifications"],"summary":"Get unread notification count","operationId":"unreadCount","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseLong"}}}}}}},"/api/v1/notification-policies/{id}/dispatches":{"get":{"tags":["Notification Policies"],"summary":"List all dispatches (firing history) for a notification policy","operationId":"listDispatches","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDispatchDto"}}}}}}},"/api/v1/notification-dispatches":{"get":{"tags":["Notification Dispatches"],"summary":"List all dispatches for an incident","description":"Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.","operationId":"listByIncident","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"incident_id","in":"query","description":"UUID of the incident to inspect","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDispatchDto"}}}}}}},"/api/v1/notification-dispatches/{id}":{"get":{"tags":["Notification Dispatches"],"summary":"Get a single dispatch with full escalation and delivery history","description":"Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.","operationId":"getById_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationDispatchDto"}}}}}}},"/api/v1/monitors/{id}/versions":{"get":{"tags":["Monitors"],"summary":"List version history for a monitor","description":"Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.","operationId":"listVersions","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMonitorVersionDto"}}}}}}},"/api/v1/monitors/{id}/versions/{version}":{"get":{"tags":["Monitors"],"summary":"Get a specific version snapshot for a monitor","description":"Returns the full monitor config snapshot captured at the given version number.","operationId":"getVersion","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorVersionDto"}}}}}}},"/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":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"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"}}}},"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"}}}}}}},"/api/v1/monitors/{id}/results":{"get":{"tags":["Check Results"],"summary":"List raw check results","description":"Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.","operationId":"getResults","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","description":"Start of time range (ISO 8601, inclusive); defaults to 24 hours ago","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"End of time range (ISO 8601, inclusive); defaults to now","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response for pagination","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum results per page (1–200)","required":false,"schema":{"type":"integer","format":"int32","default":50},"example":50},{"name":"region","in":"query","description":"Filter by region (e.g. us-east)","required":false,"schema":{"type":"string"}},{"name":"passed","in":"query","description":"Filter by pass/fail status","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Paginated check results","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPage"}}}},"400":{"description":"Invalid query parameters","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}},"403":{"description":"Monitor does not belong to the caller's org","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}},"404":{"description":"Monitor not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}}}}},"/api/v1/monitors/{id}/results/summary":{"get":{"tags":["Check Results"],"summary":"Get results summary","description":"Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.","operationId":"getSummary","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"chartWindow","in":"query","description":"Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d"]}}],"responses":{"200":{"description":"Results summary","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ResultSummaryDto"}}}},"400":{"description":"Invalid chartWindow parameter","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}},"403":{"description":"Monitor does not belong to the caller's org","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}},"404":{"description":"Monitor not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}}}}},"/api/v1/members":{"get":{"tags":["Members"],"summary":"List organization members","operationId":"list_16","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMemberDto"}}}}}}},"/api/v1/integrations":{"get":{"tags":["Integrations"],"summary":"List all supported integration types","description":"Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.","operationId":"list_17","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IntegrationCatalogResponse"}}}}}}},"/api/v1/incidents/{id}":{"get":{"tags":["Incidents"],"summary":"Get incident details including update timeline","operationId":"get_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/dashboard/overview":{"get":{"tags":["Dashboard"],"summary":"Dashboard overview","description":"Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.","operationId":"overview","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDashboardOverviewDto"}}}}}}},"/api/v1/categories":{"get":{"tags":["Status Data"],"summary":"List categories with service counts","operationId":"listCategories","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultCategoryDto"}}}}}}},"/api/v1/audit-log":{"get":{"tags":["Audit Log"],"summary":"List audit events for the current organization","operationId":"list_18","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"action","in":"query","required":false,"schema":{"type":"string"}},{"name":"actorId","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"resourceType","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResultAuditEventDto"}}}}}}},"/api/v1/alert-deliveries/{id}/attempts":{"get":{"tags":["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":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultDeliveryAttemptDto"}}}}}}},"/api/v1/alert-channels/{id}/deliveries":{"get":{"tags":["Alert Channels"],"summary":"List delivery history for an alert channel","operationId":"listDeliveries_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAlertDeliveryDto"}}}}}}},"/platform/orgs/{orgId}":{"delete":{"tags":["Organizations"],"summary":"Delete organization","operationId":"delete_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/admin/orgs/{orgId}/members/{userId}":{"delete":{"tags":["admin-member-controller"],"operationId":"removeMember","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}/members/{memberId}":{"delete":{"tags":["Resource Groups"],"summary":"Remove a member from a resource group","operationId":"removeMember_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"memberId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}":{"delete":{"tags":["Members"],"summary":"Remove member from organization","operationId":"remove_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}}},"components":{"schemas":{"Actor":{"type":"object"},"ApiKey":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"},{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"keyId":{"type":"integer","format":"int32"}}}]},"Internal":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"}]},"OrgContext":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"role":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"UI":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"},{"type":"object","properties":{"userContext":{"$ref":"#/components/schemas/UserContext"},"orgContext":{"$ref":"#/components/schemas/OrgContext"},"workspaceId":{"type":"integer","format":"int32","nullable":true}}}]},"UserContext":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"role":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]}}},"CreateSubscriptionRequest":{"type":"object","properties":{"priceId":{"minimum":1,"type":"integer","format":"int32"}}},"BillingPlanDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"prices":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/BillingPriceDto"}}},"nullable":true},"BillingPriceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"amount":{"type":"integer","format":"int32"},"interval":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]},"intervalCount":{"type":"integer","format":"int32"},"description":{"type":"string","nullable":true},"billingPlan":{"$ref":"#/components/schemas/BillingPlanDto"}}},"ItemDto":{"type":"object","properties":{"billingPrice":{"$ref":"#/components/schemas/BillingPriceDto"},"quantity":{"type":"integer","format":"int32"},"amount":{"type":"integer","format":"int32"}}},"SingleValueResponseSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SubscriptionDto"}}},"SubscriptionDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"organizationId":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ACTIVE","CANCELED","PAST_DUE","PAUSED","TRIALING"]},"nextBilledAt":{"type":"string","format":"date-time","nullable":true},"willCancelAt":{"type":"string","format":"date-time","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}}}},"UpdateOrgDetailsRequest":{"required":["email","name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"minLength":1,"type":"string","format":"email"},"size":{"maxLength":50,"minLength":0,"type":"string"},"industry":{"maxLength":100,"minLength":0,"type":"string"},"websiteUrl":{"maxLength":255,"minLength":0,"type":"string"}}},"OrganizationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"size":{"type":"string","nullable":true},"industry":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true}}},"SingleValueResponseOrganizationDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationDto"}}},"UpdateOnboardingStageRequest":{"required":["stage"],"type":"object","properties":{"stage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]}}},"SingleValueResponseUserDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UserDto"}}},"UserDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"name":{"type":"string","nullable":true},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","nullable":true,"enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateProfileRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"UpdateNotificationPreferencesRequest":{"required":["preferences"],"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}}}},"NotificationPreferencesDto":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseNotificationPreferencesDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPreferencesDto"}}},"UpdateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"SingleValueResponseWorkspaceDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkspaceDto"}}},"WorkspaceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"name":{"type":"string"},"orgId":{"type":"integer","format":"int32"}}},"UpdateUserRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"type":"string","format":"email"},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"maxLength":500,"minLength":0,"type":"string"}}},"ChangeRoleRequest":{"required":["orgRole"],"type":"object","properties":{"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"UpdateWebhookEndpointRequest":{"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","nullable":true},"description":{"maxLength":255,"minLength":0,"type":"string","nullable":true},"subscribedEvents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"enabled":{"type":"boolean","nullable":true}}},"SingleValueResponseWebhookEndpointDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointDto"}}},"WebhookEndpointDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":"string","nullable":true},"subscribedEvents":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"consecutiveFailures":{"type":"integer","format":"int32"},"disabledReason":{"type":"string","nullable":true},"disabledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateTagRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"New tag name","nullable":true},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"New hex color code","nullable":true}},"description":"Request body for updating a tag; null fields are left unchanged"},"SingleValueResponseTagDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TagDto"}}},"TagDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"color":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateSecretRequest":{"required":["value"],"type":"object","properties":{"value":{"maxLength":32768,"minLength":0,"type":"string"}}},"MonitorReference":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"SecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"dekVersion":{"type":"integer","format":"int32"},"valueHash":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usedByMonitors":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorReference"}}}},"SingleValueResponseSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SecretDto"}}},"RetryStrategy":{"required":["type"],"type":"object","properties":{"type":{"type":"string"},"maxRetries":{"type":"integer","format":"int32"},"interval":{"type":"integer","format":"int32"}},"description":"Default retry strategy for member monitors; null clears"},"UpdateResourceGroupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this group"},"description":{"type":"string","description":"Optional description; null clears the existing value","nullable":true},"alertPolicyId":{"type":"string","description":"Optional notification policy to apply for this group; null clears the existing value","format":"uuid","nullable":true},"defaultFrequency":{"maximum":86400,"minimum":30,"type":"integer","description":"Default check frequency in seconds for members (30–86400); null clears","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default regions for member monitors; null clears","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors; null clears","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors; null clears","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE; null disables threshold","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"maximum":100,"exclusiveMaximum":false,"minimum":0,"exclusiveMinimum":false,"type":"number","description":"Health threshold value; null disables threshold","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"Suppress member-level alert notifications; null preserves current value","nullable":true},"confirmationDelaySeconds":{"maximum":600,"minimum":0,"type":"integer","description":"Confirmation delay in seconds; null clears","format":"int32","nullable":true},"recoveryCooldownMinutes":{"maximum":60,"minimum":0,"type":"integer","description":"Recovery cooldown in minutes; null clears","format":"int32","nullable":true}},"description":"Request body for updating a resource group"},"ResourceGroupDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"alertPolicyId":{"type":"string","description":"Notification policy applied to this group","format":"uuid","nullable":true},"defaultFrequency":{"type":"integer","description":"Default check frequency in seconds for member monitors","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors","nullable":true,"items":{"type":"string","description":"Default regions for member monitors","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"type":"number","description":"Health threshold value","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"When true, member-level incidents skip notification dispatch; only group alerts fire"},"confirmationDelaySeconds":{"type":"integer","description":"Seconds to wait after health threshold breach before creating group incident","format":"int32","nullable":true},"recoveryCooldownMinutes":{"type":"integer","description":"Cooldown minutes after group incident resolves before a new one can open","format":"int32","nullable":true},"health":{"$ref":"#/components/schemas/ResourceGroupHealthDto"},"members":{"type":"array","description":"Member list with individual statuses; populated on detail GET only","nullable":true,"items":{"$ref":"#/components/schemas/ResourceGroupMemberDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Resource group with health summary and optional member details"},"ResourceGroupHealthDto":{"type":"object","properties":{"status":{"type":"string","description":"Worst-of health status across all members","enum":["operational","maintenance","degraded","down"]},"totalMembers":{"type":"integer","description":"Total number of members in the group","format":"int32"},"operationalCount":{"type":"integer","description":"Number of members currently in operational status","format":"int32"},"activeIncidents":{"type":"integer","description":"Number of members with an active incident or non-operational status","format":"int32"},"thresholdStatus":{"type":"string","description":"Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured.","nullable":true,"enum":["healthy","degraded","down"]},"failingCount":{"type":"integer","description":"Number of failing members at time of last evaluation","format":"int32","nullable":true}},"description":"Aggregated health summary for a resource group"},"ResourceGroupMemberDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"memberType":{"type":"string","description":"Type of member: 'monitor' or 'service'"},"monitorId":{"type":"string","description":"Monitor ID; set when memberType is 'monitor'","format":"uuid","nullable":true},"serviceId":{"type":"string","description":"Service ID; set when memberType is 'service'","format":"uuid","nullable":true},"name":{"type":"string","description":"Display name of the referenced monitor or service","nullable":true},"slug":{"type":"string","description":"Slug identifier for the service (services only); used for icons and uptime API calls","nullable":true},"subscriptionId":{"type":"string","description":"Subscription ID for the service (services only); used to link to the dependency detail page","format":"uuid","nullable":true},"status":{"type":"string","description":"Computed health status for this member","enum":["operational","maintenance","degraded","down"]},"effectiveFrequency":{"type":"string","description":"Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured","nullable":true},"createdAt":{"type":"string","format":"date-time"},"uptime24h":{"type":"number","description":"24h uptime percentage; populated when includeMetrics=true","format":"double","nullable":true},"chartData":{"type":"array","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","nullable":true,"items":{"type":"number","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","format":"double","nullable":true}},"avgLatencyMs":{"type":"number","description":"Average latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"p95LatencyMs":{"type":"number","description":"P95 latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"lastCheckedAt":{"type":"string","description":"Timestamp of the most recent health check; populated when includeMetrics=true","format":"date-time","nullable":true},"monitorType":{"type":"string","description":"Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only","nullable":true},"environmentName":{"type":"string","description":"Environment name; monitors only","nullable":true}},"description":"A single member of a resource group with its computed health status"},"SingleValueResponseResourceGroupDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupDto"}}},"EscalationChain":{"required":["steps"],"type":"object","properties":{"steps":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/EscalationStep"}},"onResolve":{"type":"string","nullable":true},"onReopen":{"type":"string","nullable":true}},"description":"Escalation chain defining which channels to notify"},"EscalationStep":{"required":["channelIds"],"type":"object","properties":{"delayMinutes":{"minimum":0,"type":"integer","format":"int32"},"channelIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid"}},"requireAck":{"type":"boolean","nullable":true},"repeatIntervalSeconds":{"minimum":1,"type":"integer","format":"int32","nullable":true}}},"MatchRule":{"required":["type"],"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string","nullable":true},"monitorIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}},"regions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"values":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}}},"description":"Match rules to evaluate (all must pass; omit or empty for catch-all)"},"UpdateNotificationPolicyRequest":{"required":["enabled","escalation","name","priority"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules to evaluate (all must pass; omit or empty for catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is enabled"},"priority":{"type":"integer","description":"Evaluation priority; higher value = evaluated first","format":"int32"}},"description":"Request body for updating a notification policy"},"NotificationPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules (all must pass; empty = catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is active"},"priority":{"type":"integer","description":"Evaluation order; higher value = evaluated first","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Org-level notification policy with match rules and escalation chain"},"SingleValueResponseNotificationPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPolicyDto"}}},"ConfirmationPolicy":{"required":["type"],"type":"object","properties":{"type":{"type":"string","enum":["multi_region"]},"minRegionsFailing":{"type":"integer","format":"int32"},"maxWaitSeconds":{"type":"integer","format":"int32"}},"description":"Multi-region confirmation settings"},"IncidentPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"triggerRules":{"type":"array","description":"Array of trigger rules defining when an incident should be raised","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorRegionCount":{"type":"integer","description":"Number of regions configured on the monitor (only set in internal API responses)","format":"int32","nullable":true},"checkFrequencySeconds":{"type":"integer","description":"Monitor check frequency in seconds (only set in internal API responses)","format":"int32","nullable":true}},"description":"Incident detection, confirmation, and recovery policy for a monitor"},"RecoveryPolicy":{"type":"object","properties":{"consecutiveSuccesses":{"type":"integer","format":"int32"},"minRegionsPassing":{"type":"integer","format":"int32"},"cooldownMinutes":{"type":"integer","format":"int32"}},"description":"Auto-recovery settings"},"TriggerRule":{"required":["scope","severity","type"],"type":"object","properties":{"type":{"type":"string","enum":["consecutive_failures","failures_in_window","response_time"]},"count":{"type":"integer","format":"int32","nullable":true},"windowMinutes":{"type":"integer","format":"int32","nullable":true},"scope":{"type":"string","nullable":true,"enum":["per_region","any_region"]},"thresholdMs":{"type":"integer","format":"int32","nullable":true},"severity":{"type":"string","enum":["down","degraded"]},"aggregationType":{"type":"string","nullable":true,"enum":["all_exceed","average","p95","max"]}},"description":"Array of trigger rules defining when an incident should be raised"},"UpdateIncidentPolicyRequest":{"required":["confirmation","recovery","triggerRules"],"type":"object","properties":{"triggerRules":{"minItems":1,"type":"array","description":"Array of trigger rules; at least one required","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"}},"description":"Request body for updating an incident policy"},"SingleValueResponseIncidentPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentPolicyDto"}}},"ApiKeyAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BasicAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BearerAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"HeaderAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"MonitorAuthConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"UpdateMonitorAuthRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"MonitorAuthDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"authType":{"type":"string","enum":["bearer","basic","header","api_key"]},"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"SingleValueResponseMonitorAuthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAuthDto"}}},"AssertionConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"BodyContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"DnsExpectedCnameAssertion":{"required":["value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"value":{"minLength":1,"type":"string"}}}]},"DnsExpectedIpsAssertion":{"required":["ips"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"ips":{"minItems":1,"type":"array","items":{"type":"string"}}}}]},"DnsMaxAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"max":{"type":"integer","format":"int32"}}}]},"DnsMinAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"min":{"type":"integer","format":"int32"}}}]},"DnsRecordContainsAssertion":{"required":["recordType","substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"substring":{"minLength":1,"type":"string"}}}]},"DnsRecordEqualsAssertion":{"required":["recordType","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"value":{"minLength":1,"type":"string"}}}]},"DnsResolvesAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"DnsResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"DnsResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"DnsTtlHighAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxTtl":{"type":"integer","format":"int32"}}}]},"DnsTtlLowAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minTtl":{"type":"integer","format":"int32"}}}]},"DnsTxtContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"HeaderValueAssertion":{"required":["expected","headerName","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"HeartbeatIntervalDriftAssertion":{"required":["maxDeviationPercent"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxDeviationPercent":{"maximum":100,"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatMaxIntervalAssertion":{"required":["maxSeconds"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxSeconds":{"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatPayloadContainsAssertion":{"required":["path","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"value":{"type":"string"}}}]},"HeartbeatReceivedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpPacketLossAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxPercent":{"maximum":100.0,"exclusiveMaximum":false,"minimum":0.0,"exclusiveMinimum":false,"type":"number","format":"double"}}}]},"IcmpReachableAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"IcmpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"JsonPathAssertion":{"required":["expected","operator","path"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"McpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"McpHasCapabilityAssertion":{"required":["capability"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"capability":{"minLength":1,"type":"string"}}}]},"McpMinToolsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"min":{"type":"integer","format":"int32"}}}]},"McpProtocolVersionAssertion":{"required":["version"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"version":{"minLength":1,"type":"string"}}}]},"McpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"McpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"McpToolAvailableAssertion":{"required":["toolName"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"toolName":{"minLength":1,"type":"string"}}}]},"McpToolCountChangedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expectedCount":{"type":"integer","format":"int32"}}}]},"RedirectCountAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxCount":{"type":"integer","format":"int32"}}}]},"RedirectTargetAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"RegexBodyAssertion":{"required":["pattern"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"pattern":{"minLength":1,"type":"string"}}}]},"ResponseSizeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxBytes":{"type":"integer","format":"int32"}}}]},"ResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"thresholdMs":{"type":"integer","format":"int32"}}}]},"ResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"SslExpiryAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minDaysRemaining":{"type":"integer","format":"int32"}}}]},"StatusCodeAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"TcpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"TcpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"TcpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"UpdateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"MonitorAssertionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"assertionType":{"type":"string","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"SingleValueResponseMonitorAssertionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAssertionDto"}}},"SetAlertChannelsRequest":{"required":["channelIds"],"type":"object","properties":{"channelIds":{"type":"array","items":{"type":"string","format":"uuid"}}}},"SingleValueResponseListUUID":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid"}}}},"AddMonitorTagsRequest":{"type":"object","properties":{"tagIds":{"type":"array","description":"IDs of existing org tags to attach","nullable":true,"items":{"type":"string","description":"IDs of existing org tags to attach","format":"uuid","nullable":true}},"newTags":{"type":"array","description":"New tags to create (if not already present) and attach","nullable":true,"items":{"$ref":"#/components/schemas/NewTagRequest"}}},"description":"Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both."},"CreateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"DnsMonitorConfig":{"required":["hostname"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"hostname":{"minLength":1,"type":"string"},"recordTypes":{"type":"array","nullable":true,"items":{"type":"string","nullable":true,"enum":["A","AAAA","CNAME","MX","NS","TXT","SRV","SOA","CAA","PTR"]}},"nameservers":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"timeoutMs":{"type":"integer","format":"int32","nullable":true},"totalTimeoutMs":{"type":"integer","format":"int32","nullable":true}}}]},"HeartbeatMonitorConfig":{"required":["expectedInterval","gracePeriod"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"expectedInterval":{"maximum":86400,"minimum":1,"type":"integer","format":"int32"},"gracePeriod":{"minimum":1,"type":"integer","format":"int32"}}}]},"HttpMonitorConfig":{"required":["method","url"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"url":{"minLength":1,"type":"string"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD"]},"customHeaders":{"type":"object","additionalProperties":{"type":"string","nullable":true},"nullable":true},"requestBody":{"type":"string","nullable":true},"contentType":{"type":"string","nullable":true},"verifyTls":{"type":"boolean","nullable":true}}}]},"IcmpMonitorConfig":{"required":["host"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"host":{"minLength":1,"type":"string"},"packetCount":{"maximum":20,"minimum":1,"type":"integer","format":"int32","nullable":true},"timeoutMs":{"type":"integer","format":"int32","nullable":true}}}]},"McpServerMonitorConfig":{"required":["command"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"command":{"minLength":1,"type":"string"},"args":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"env":{"type":"object","additionalProperties":{"type":"string","nullable":true},"nullable":true}}}]},"MonitorConfig":{"type":"object"},"NewTagRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"Tag name"},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"Hex color code (defaults to #6B7280 if omitted)","nullable":true}},"description":"Inline tag creation — creates the tag if it does not already exist"},"TcpMonitorConfig":{"required":["host"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"type":"object","properties":{"host":{"minLength":1,"type":"string"},"port":{"maximum":65535,"minimum":1,"type":"integer","format":"int32"},"timeoutMs":{"type":"integer","format":"int32","nullable":true}}}]},"UpdateMonitorRequest":{"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","nullable":true},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32","nullable":true},"enabled":{"type":"boolean","nullable":true},"regions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"managedBy":{"type":"string","nullable":true,"enum":["DASHBOARD","CLI"]},"environmentId":{"type":"string","format":"uuid","nullable":true},"clearEnvironmentId":{"type":"boolean","nullable":true},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/CreateAssertionRequest"}},"auth":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]},"clearAuth":{"type":"boolean","nullable":true},"incidentPolicy":{"$ref":"#/components/schemas/UpdateIncidentPolicyRequest"},"alertChannelIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}},"tags":{"$ref":"#/components/schemas/AddMonitorTagsRequest"}}},"MonitorDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"regions":{"type":"array","items":{"type":"string"}},"managedBy":{"type":"string","enum":["DASHBOARD","CLI"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorAssertionDto"}},"tags":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/TagDto"}},"pingUrl":{"type":"string","nullable":true},"environment":{"$ref":"#/components/schemas/Summary"},"auth":{"$ref":"#/components/schemas/MonitorAuthDto"},"incidentPolicy":{"$ref":"#/components/schemas/IncidentPolicyDto"},"alertChannelIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}}}},"SingleValueResponseMonitorDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorDto"}}},"Summary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"}}},"ChangeStatusRequest":{"required":["status"],"type":"object","properties":{"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"UpdateMaintenanceWindowRequest":{"required":["endsAt","startsAt"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"MaintenanceWindowDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true},"suppressAlerts":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMaintenanceWindowDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MaintenanceWindowDto"}}},"UpdateEnvironmentRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","nullable":true},"variables":{"type":"object","additionalProperties":{"type":"string","nullable":true},"nullable":true},"isDefault":{"type":"boolean","nullable":true}}},"EnvironmentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"orgId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"variables":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorCount":{"type":"integer","format":"int32"},"isDefault":{"type":"boolean"}}},"SingleValueResponseEnvironmentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EnvironmentDto"}}},"ChannelConfig":{"required":["channelType"],"type":"object","properties":{"channelType":{"type":"string"}},"discriminator":{"propertyName":"channelType"}},"DiscordChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string"},"mentionRoleId":{"type":"string","nullable":true}}}]},"EmailChannelConfig":{"required":["recipients"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"recipients":{"minItems":1,"type":"array","items":{"type":"string","format":"email"}}}}]},"OpsGenieChannelConfig":{"required":["apiKey"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"apiKey":{"minLength":1,"type":"string"},"region":{"type":"string","nullable":true}}}]},"PagerDutyChannelConfig":{"required":["routingKey"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"routingKey":{"minLength":1,"type":"string"},"severityOverride":{"type":"string","nullable":true}}}]},"SlackChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string"},"mentionText":{"type":"string","nullable":true}}}]},"TeamsChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string"}}}]},"UpdateAlertChannelRequest":{"required":["config","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string"},"config":{"oneOf":[{"$ref":"#/components/schemas/DiscordChannelConfig"},{"$ref":"#/components/schemas/EmailChannelConfig"},{"$ref":"#/components/schemas/OpsGenieChannelConfig"},{"$ref":"#/components/schemas/PagerDutyChannelConfig"},{"$ref":"#/components/schemas/SlackChannelConfig"},{"$ref":"#/components/schemas/TeamsChannelConfig"},{"$ref":"#/components/schemas/WebhookChannelConfig"}]}}},"WebhookChannelConfig":{"required":["url"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"url":{"minLength":1,"type":"string"},"signingSecret":{"type":"string","nullable":true},"customHeaders":{"type":"object","additionalProperties":{"type":"string","nullable":true},"nullable":true}}}]},"AlertChannelDto":{"required":["channelType","createdAt","id","name","updatedAt"],"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"channelType":{"type":"string","enum":["email","webhook","slack","pagerduty","opsgenie","teams","discord"]},"displayConfig":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastDeliveryAt":{"type":"string","format":"date-time","nullable":true},"lastDeliveryStatus":{"type":"string","nullable":true}}},"SingleValueResponseAlertChannelDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertChannelDto"}}},"WorkspaceCreateParams":{"required":["name"],"type":"object","properties":{"organizationId":{"type":"integer","format":"int32"},"name":{"minLength":1,"type":"string"}}},"ServiceIncidentRequest":{"required":["action","externalRef","serviceId","title"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"externalRef":{"minLength":1,"type":"string"},"severity":{"type":"string","nullable":true},"title":{"minLength":1,"type":"string"},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"action":{"minLength":1,"type":"string"},"statusText":{"type":"string","nullable":true}}},"IncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"title":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","items":{"type":"string"}},"reopenCount":{"type":"integer","format":"int32"},"createdByUserId":{"type":"integer","format":"int32","nullable":true},"statusPageVisible":{"type":"boolean"},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"serviceId":{"type":"string","format":"uuid","nullable":true},"externalRef":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"shortlink":{"type":"string","nullable":true},"resolutionReason":{"type":"string","nullable":true,"enum":["MANUAL","AUTO_RECOVERED","AUTO_RESOLVED"]},"startedAt":{"type":"string","format":"date-time","nullable":true},"confirmedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"cooldownUntil":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorName":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"serviceSlug":{"type":"string","nullable":true},"monitorType":{"type":"string","nullable":true},"resourceGroupId":{"type":"string","format":"uuid","nullable":true},"resourceGroupName":{"type":"string","nullable":true}}},"TableValueResultIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseInteger":{"type":"object","properties":{"data":{"type":"integer","format":"int32"}}},"CreateAutoIncidentRequest":{"required":["monitorId"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"severity":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"startedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseIncidentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentDto"}}},"ReopenAutoIncidentRequest":{"type":"object","properties":{"affectedRegions":{"type":"array","items":{"type":"string"}},"severity":{"type":"string","nullable":true}}},"AdapterHealthReportRequest":{"required":["serviceId","success"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"success":{"type":"boolean"},"errorMessage":{"type":"string","nullable":true}}},"AdapterHealthDto":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string"},"serviceName":{"type":"string"},"adapterType":{"type":"string","nullable":true},"lastSuccessAt":{"type":"string","format":"date-time","nullable":true},"lastFailureAt":{"type":"string","format":"date-time","nullable":true},"consecutiveFailures":{"type":"integer","format":"int32"},"lastErrorMessage":{"type":"string","nullable":true},"disabledByHealth":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseAdapterHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdapterHealthDto"}}},"CreateOrgRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"},"email":{"type":"string","format":"email","nullable":true}}},"SingleValueResponseTransactionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionDto"}}},"TransactionDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","nullable":true},"currencyCode":{"type":"string","nullable":true},"invoiceNumber":{"type":"string","nullable":true},"billedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"total":{"type":"string","nullable":true},"subtotal":{"type":"string","nullable":true},"tax":{"type":"string","nullable":true}}},"QuickMonitorRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"},"name":{"type":"string","nullable":true},"frequencySeconds":{"type":"integer","format":"int32","nullable":true}}},"OnboardingSetupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"role":{"maxLength":50,"minLength":0,"type":"string","nullable":true},"teamSize":{"maxLength":50,"minLength":0,"type":"string","nullable":true}}},"AnalyzeUrlRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"}}},"AnalyzeUrlResponse":{"type":"object","properties":{"reachable":{"type":"boolean"},"responseTimeMs":{"type":"integer","format":"int64"},"statusCode":{"type":"integer","format":"int32"},"tlsExpiry":{"type":"string","format":"date-time","nullable":true},"tlsDaysRemaining":{"type":"integer","format":"int32","nullable":true},"contentType":{"type":"string","nullable":true},"suggestedName":{"type":"string"},"suggestedAssertions":{"type":"array","items":{"$ref":"#/components/schemas/SuggestedAssertion"}},"suggestedFrequencySeconds":{"type":"integer","format":"int32"}}},"SingleValueResponseAnalyzeUrlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnalyzeUrlResponse"}}},"SuggestedAssertion":{"type":"object","properties":{"type":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}}},"AcceptInviteRequest":{"required":["token"],"type":"object","properties":{"token":{"minLength":1,"type":"string"}}},"AcceptInviteDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"SingleValueResponseAcceptInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AcceptInviteDto"}}},"RegisterUserRequest":{"type":"object","properties":{"nickname":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"picture":{"type":"string","nullable":true}}},"CreateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"}}},"AddMemberRequest":{"required":["orgRole","userId"],"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"MemberDto":{"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMemberDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MemberDto"}}},"CreateWebhookEndpointRequest":{"required":["subscribedEvents","url"],"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string"},"description":{"maxLength":255,"minLength":0,"type":"string"},"subscribedEvents":{"minItems":1,"type":"array","items":{"minLength":1,"type":"string"}}}},"TestWebhookEndpointRequest":{"type":"object","properties":{"eventType":{"type":"string","nullable":true}}},"SingleValueResponseWebhookTestResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookTestResult"}}},"WebhookTestResult":{"type":"object","properties":{"success":{"type":"boolean"},"statusCode":{"type":"integer","format":"int32","nullable":true},"message":{"type":"string"},"durationMs":{"type":"integer","format":"int64","nullable":true}}},"SingleValueResponseString":{"type":"object","properties":{"data":{"type":"string"}}},"DekRotationResultDto":{"type":"object","properties":{"previousDekVersion":{"type":"integer","format":"int32"},"newDekVersion":{"type":"integer","format":"int32"},"secretsReEncrypted":{"type":"integer","format":"int32"},"channelsReEncrypted":{"type":"integer","format":"int32"},"rotatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseDekRotationResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DekRotationResultDto"}}},"CreateTagRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"Tag name, unique within the org"},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"Hex color code (defaults to #6B7280 if omitted)","nullable":true}},"description":"Request body for creating a tag"},"ServiceSubscribeRequest":{"type":"object","properties":{"componentId":{"type":"string","description":"ID of the component to subscribe to. Omit or null for whole-service subscription.","format":"uuid","nullable":true},"alertSensitivity":{"type":"string","description":"Alert sensitivity level. Defaults to INCIDENTS_ONLY when not provided.","nullable":true}},"description":"Optional body for subscribing to a specific component of a service"},"ComponentUptimeSummaryDto":{"type":"object","properties":{"day":{"type":"number","description":"Uptime percentage over the last 24 hours","format":"double","nullable":true,"example":99.95},"week":{"type":"number","description":"Uptime percentage over the last 7 days","format":"double","nullable":true,"example":99.98},"month":{"type":"number","description":"Uptime percentage over the last 30 days","format":"double","nullable":true,"example":99.92},"source":{"type":"string","description":"Data source: vendor_reported or incident_derived","example":"vendor_reported"}},"description":"Inline uptime percentages for 24h, 7d, 30d"},"ServiceComponentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"description":{"type":"string","nullable":true},"groupId":{"type":"string","format":"uuid","nullable":true},"position":{"type":"integer","format":"int32","nullable":true},"showcase":{"type":"boolean"},"onlyShowIfDegraded":{"type":"boolean"},"startDate":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true},"lifecycleStatus":{"type":"string"},"dataType":{"type":"string","description":"Data classification: full, status_only, or metric_only","example":"full"},"hasUptime":{"type":"boolean","description":"Whether uptime data is available for this component"},"region":{"type":"string","description":"Geographic region for regional components (AWS, GCP, Azure)","nullable":true},"groupName":{"type":"string","description":"Display name of the parent group","nullable":true},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"statusChangedAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"group":{"type":"boolean"}},"description":"A first-class service component with lifecycle and uptime data"},"ServiceSubscriptionDto":{"type":"object","properties":{"subscriptionId":{"type":"string","description":"Unique subscription identifier","format":"uuid"},"serviceId":{"type":"string","description":"Service identifier","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"logoUrl":{"type":"string","description":"Logo URL from the service catalog","nullable":true},"overallStatus":{"type":"string","description":"Current overall status; null when the service has never been polled","nullable":true},"componentId":{"type":"string","description":"Subscribed component id; null for whole-service subscription","format":"uuid","nullable":true},"component":{"$ref":"#/components/schemas/ServiceComponentDto"},"alertSensitivity":{"type":"string","description":"Alert sensitivity: ALL (synthetic + real incidents), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (real + DOWN severity)","enum":["ALL","INCIDENTS_ONLY","MAJOR_ONLY"]},"subscribedAt":{"type":"string","description":"When the organization subscribed to this service","format":"date-time"}},"description":"An org-level service subscription with current status information"},"SingleValueResponseServiceSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}}},"CreateSecretRequest":{"required":["key","value"],"type":"object","properties":{"key":{"maxLength":255,"minLength":0,"type":"string"},"value":{"maxLength":32768,"minLength":0,"type":"string"}}},"CreateResourceGroupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this group"},"description":{"type":"string","description":"Optional description","nullable":true},"alertPolicyId":{"type":"string","description":"Optional notification policy to apply for this group","format":"uuid","nullable":true},"defaultFrequency":{"maximum":86400,"minimum":30,"type":"integer","description":"Default check frequency in seconds applied to members (30–86400)","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions applied to member monitors","nullable":true,"items":{"type":"string","description":"Default regions applied to member monitors","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs applied to member monitors","nullable":true,"items":{"type":"string","description":"Default alert channel IDs applied to member monitors","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID applied to member monitors","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"maximum":100,"exclusiveMaximum":false,"minimum":0,"exclusiveMinimum":false,"type":"number","description":"Health threshold value: count (0+) or percentage (0–100)","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"Suppress member-level alert notifications when group manages alerting","nullable":true},"confirmationDelaySeconds":{"maximum":600,"minimum":0,"type":"integer","description":"Confirmation delay in seconds before group incident creation (0–600)","format":"int32","nullable":true},"recoveryCooldownMinutes":{"maximum":60,"minimum":0,"type":"integer","description":"Recovery cooldown in minutes after group incident resolves (0–60)","format":"int32","nullable":true}},"description":"Request body for creating a resource group"},"AddResourceGroupMemberRequest":{"required":["memberId","memberType"],"type":"object","properties":{"memberType":{"minLength":1,"pattern":"monitor|service","type":"string","description":"Type of member: 'monitor' or 'service'"},"memberId":{"type":"string","description":"ID of the monitor or service to add","format":"uuid"}},"description":"Request body for adding a member to a resource group"},"SingleValueResponseResourceGroupMemberDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupMemberDto"}}},"CreateNotificationPolicyRequest":{"required":["escalation","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules to evaluate (all must pass; omit or empty for catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is enabled (default true)","default":true},"priority":{"type":"integer","description":"Evaluation priority; higher value = evaluated first (default 0)","format":"int32","default":0}},"description":"Request body for creating a notification policy"},"TestNotificationPolicyRequest":{"type":"object","properties":{"severity":{"type":"string","description":"Incident severity to test against (e.g. DOWN, DEGRADED, MAINTENANCE)","nullable":true},"monitorId":{"type":"string","description":"Monitor UUID to test against (monitoring events)","format":"uuid","nullable":true},"regions":{"type":"array","description":"Affected region identifiers to test against (monitoring events)","nullable":true,"items":{"type":"string","description":"Affected region identifiers to test against (monitoring events)","nullable":true}},"eventType":{"type":"string","description":"Incident event type to test against — short form (e.g. created, resolved, reopened) or full form (e.g. incident.created)","nullable":true},"monitorType":{"type":"string","description":"Monitor check type to test against (e.g. HTTP, DNS, MCP_SERVER)","nullable":true},"serviceId":{"type":"string","description":"Service catalog UUID to test against (status data events)","format":"uuid","nullable":true},"componentName":{"type":"string","description":"Component name to test against (status data events, e.g. \"Actions\")","nullable":true},"resourceGroupIds":{"type":"array","description":"Resource group UUIDs the entity belongs to, for resource_group_id_in rules","nullable":true,"items":{"type":"string","description":"Resource group UUIDs the entity belongs to, for resource_group_id_in rules","format":"uuid","nullable":true}}},"description":"Event context for a dry-run match evaluation against a notification policy"},"SingleValueResponseTestMatchResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TestMatchResult"}}},"TestMatchResult":{"type":"object","properties":{"matched":{"type":"boolean","description":"Whether the policy would match the supplied incident context"},"matchedRules":{"type":"array","description":"Rules that passed evaluation","items":{"type":"string","description":"Rules that passed evaluation"}},"unmatchedRules":{"type":"array","description":"Rules that did not pass evaluation","items":{"type":"string","description":"Rules that did not pass evaluation"}}},"description":"Result of a dry-run match evaluation against a notification policy"},"AlertDeliveryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"incidentId":{"type":"string","description":"Incident that triggered this delivery","format":"uuid"},"dispatchId":{"type":"string","description":"Notification dispatch that created this delivery","format":"uuid","nullable":true},"channelId":{"type":"string","description":"Alert channel ID","format":"uuid"},"channel":{"type":"string","description":"Human-readable channel name"},"channelType":{"type":"string","description":"Alert channel type (e.g. slack, email, webhook)"},"status":{"type":"string","description":"Current delivery status","enum":["PENDING","DELIVERED","RETRY_PENDING","FAILED","CANCELLED"]},"eventType":{"type":"string","description":"Incident lifecycle event that triggered this delivery","enum":["INCIDENT_CREATED","INCIDENT_RESOLVED","INCIDENT_REOPENED"]},"stepNumber":{"type":"integer","description":"1-based escalation step this delivery belongs to","format":"int32"},"fireCount":{"type":"integer","description":"Fire sequence within the step: 1 = initial, 2+ = repeat re-fires","format":"int32"},"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":"Timestamp when the delivery was confirmed (null if not yet delivered)","format":"date-time","nullable":true},"errorMessage":{"type":"string","description":"Error message from the last failed attempt","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"description":"Delivery record for a single channel within a notification dispatch"},"NotificationDispatchDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"incidentId":{"type":"string","format":"uuid"},"policyId":{"type":"string","format":"uuid"},"policyName":{"type":"string","description":"Human-readable name of the matched policy (null if policy has been deleted)","nullable":true},"status":{"type":"string","description":"Current dispatch state","enum":["PENDING","DISPATCHING","DELIVERED","ESCALATING","ACKNOWLEDGED","COMPLETED"]},"completionReason":{"type":"string","description":"Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states.","nullable":true,"enum":["EXHAUSTED","RESOLVED","NO_STEPS"]},"currentStep":{"type":"integer","description":"1-based index of the currently active escalation step","format":"int32"},"totalSteps":{"type":"integer","description":"Total number of escalation steps in the policy (null if policy has been deleted)","format":"int32","nullable":true},"acknowledgedAt":{"type":"string","description":"Timestamp when this dispatch was acknowledged (null if not acknowledged)","format":"date-time","nullable":true},"nextEscalationAt":{"type":"string","description":"Timestamp when the next escalation step will fire (null if not scheduled)","format":"date-time","nullable":true},"lastNotifiedAt":{"type":"string","description":"Timestamp of the most recent notification delivery","format":"date-time","nullable":true},"deliveries":{"type":"array","description":"Delivery records for all channels associated with this dispatch","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Dispatch state for a single (incident, notification policy) pair, with delivery history"},"SingleValueResponseNotificationDispatchDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationDispatchDto"}}},"CreateMonitorRequest":{"required":["config","managedBy","name","type"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean","nullable":true},"regions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"managedBy":{"type":"string","enum":["DASHBOARD","CLI"]},"environmentId":{"type":"string","format":"uuid","nullable":true},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/CreateAssertionRequest"}},"auth":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]},"incidentPolicy":{"$ref":"#/components/schemas/UpdateIncidentPolicyRequest"},"alertChannelIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}},"tags":{"$ref":"#/components/schemas/AddMonitorTagsRequest"}}},"SetMonitorAuthRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"AssertionTestResultDto":{"type":"object","properties":{"assertionType":{"type":"string","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"passed":{"type":"boolean"},"severity":{"type":"string","enum":["fail","warn"]},"message":{"type":"string"},"expected":{"type":"string","nullable":true},"actual":{"type":"string","nullable":true}}},"MonitorTestResultDto":{"type":"object","properties":{"passed":{"type":"boolean"},"error":{"type":"string","nullable":true},"statusCode":{"type":"integer","format":"int32","nullable":true},"responseTimeMs":{"type":"integer","format":"int64","nullable":true},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"nullable":true},"bodyPreview":{"type":"string","nullable":true},"responseSizeBytes":{"type":"integer","format":"int64","nullable":true},"redirectCount":{"type":"integer","format":"int32","nullable":true},"finalUrl":{"type":"string","nullable":true},"assertionResults":{"type":"array","items":{"$ref":"#/components/schemas/AssertionTestResultDto"}},"warnings":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}}}},"SingleValueResponseMonitorTestResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorTestResultDto"}}},"TableValueResultTagDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TagDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorTestRequest":{"required":["config","type"],"type":"object","properties":{"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/CreateAssertionRequest"}}}},"BulkMonitorActionRequest":{"required":["action","monitorIds"],"type":"object","properties":{"monitorIds":{"maxItems":200,"minItems":0,"type":"array","description":"IDs of monitors to act on (max 200)","items":{"type":"string","description":"IDs of monitors to act on (max 200)","format":"uuid"}},"action":{"type":"string","description":"Action to perform: PAUSE, RESUME, DELETE, ADD_TAG, REMOVE_TAG","enum":["PAUSE","RESUME","DELETE","ADD_TAG","REMOVE_TAG"]},"tagIds":{"type":"array","description":"Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)","nullable":true,"items":{"type":"string","description":"Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG)","format":"uuid","nullable":true}},"newTags":{"type":"array","description":"New tags to create and attach (only for ADD_TAG)","nullable":true,"items":{"$ref":"#/components/schemas/NewTagRequest"}}},"description":"Request body for performing a bulk action on multiple monitors"},"BulkMonitorActionResult":{"type":"object","properties":{"succeeded":{"type":"array","description":"IDs of monitors on which the action succeeded","items":{"type":"string","description":"IDs of monitors on which the action succeeded","format":"uuid"}},"failed":{"type":"array","description":"Monitors on which the action failed, with the reason for each failure","items":{"$ref":"#/components/schemas/FailureDetail"}}},"description":"Result of a bulk monitor action, including partial-success details"},"FailureDetail":{"type":"object","properties":{"monitorId":{"type":"string","description":"Monitor ID that failed","format":"uuid"},"reason":{"type":"string","description":"Human-readable reason for the failure"}},"description":"Details about a single monitor that failed the bulk action"},"SingleValueResponseBulkMonitorActionResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/BulkMonitorActionResult"}}},"CreateMaintenanceWindowRequest":{"required":["endsAt","startsAt"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"CreateInviteRequest":{"required":["email","roleOffered"],"type":"object","properties":{"email":{"minLength":1,"type":"string","format":"email"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"InviteDto":{"type":"object","properties":{"inviteId":{"type":"integer","format":"int32"},"email":{"type":"string"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"expiresAt":{"type":"string","format":"date-time"},"consumedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InviteDto"}}},"CreateManualIncidentRequest":{"required":["severity","title"],"type":"object","properties":{"title":{"minLength":1,"type":"string"},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"monitorId":{"type":"string","format":"uuid","nullable":true},"body":{"type":"string","nullable":true}}},"IncidentDetailDto":{"type":"object","properties":{"incident":{"$ref":"#/components/schemas/IncidentDto"},"updates":{"type":"array","items":{"$ref":"#/components/schemas/IncidentUpdateDto"}}}},"IncidentUpdateDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"incidentId":{"type":"string","format":"uuid"},"oldStatus":{"type":"string","nullable":true,"enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"newStatus":{"type":"string","nullable":true,"enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"body":{"type":"string","nullable":true},"createdBy":{"type":"string","enum":["SYSTEM","USER"]},"notifySubscribers":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseIncidentDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentDetailDto"}}},"AddIncidentUpdateRequest":{"type":"object","properties":{"body":{"type":"string"},"newStatus":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"notifySubscribers":{"type":"boolean"}}},"ResolveIncidentRequest":{"type":"object","properties":{"body":{"type":"string"}}},"CreateEnvironmentRequest":{"required":["name","slug"],"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string"},"slug":{"maxLength":100,"minLength":0,"pattern":"^[a-z0-9][a-z0-9_-]*$","type":"string"},"variables":{"type":"object","additionalProperties":{"type":"string","nullable":true},"nullable":true},"isDefault":{"type":"boolean"}}},"CreateApiKeyRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"ApiKeyCreateResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyCreateResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}},"ApiKeyDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyDto"}}},"SingleValueResponseAlertDeliveryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertDeliveryDto"}}},"CreateAlertChannelRequest":{"required":["config","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string"},"config":{"oneOf":[{"$ref":"#/components/schemas/DiscordChannelConfig"},{"$ref":"#/components/schemas/EmailChannelConfig"},{"$ref":"#/components/schemas/OpsGenieChannelConfig"},{"$ref":"#/components/schemas/PagerDutyChannelConfig"},{"$ref":"#/components/schemas/SlackChannelConfig"},{"$ref":"#/components/schemas/TeamsChannelConfig"},{"$ref":"#/components/schemas/WebhookChannelConfig"}]}}},"SingleValueResponseTestChannelResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TestChannelResult"}}},"TestChannelResult":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}},"TestAlertChannelRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/DiscordChannelConfig"},{"$ref":"#/components/schemas/EmailChannelConfig"},{"$ref":"#/components/schemas/OpsGenieChannelConfig"},{"$ref":"#/components/schemas/PagerDutyChannelConfig"},{"$ref":"#/components/schemas/SlackChannelConfig"},{"$ref":"#/components/schemas/TeamsChannelConfig"},{"$ref":"#/components/schemas/WebhookChannelConfig"}]}}},"ComponentUpdateRequest":{"required":["addComponents"],"type":"object","properties":{"addComponents":{"minItems":1,"type":"array","items":{"type":"string"}}}},"UpdateAlertSensitivityRequest":{"required":["alertSensitivity"],"type":"object","properties":{"alertSensitivity":{"minLength":1,"pattern":"ALL|INCIDENTS_ONLY|MAJOR_ONLY","type":"string","description":"Alert sensitivity: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents)"}},"description":"Request body for updating alert sensitivity on a service subscription"},"UpdateApiKeyRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"TableValueResultWorkspaceDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkspaceDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseMapStringString":{"type":"object","properties":{"data":{"type":"object","additionalProperties":{"type":"string"}}}},"SingleValueResponseListMonitorAssertionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorAssertionDto"}}}},"SchedulableMonitorDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"regions":{"type":"array","items":{"type":"string"}},"organizationId":{"type":"integer","format":"int32"}}},"TableValueResultAdapterHealthDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AdapterHealthDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseListBillingPlanDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BillingPlanDto"}}}},"TableValueResultTransactionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransactionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseUpcomingChargeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UpcomingChargeResponse"}}},"UpcomingChargeResponse":{"type":"object","properties":{"action":{"type":"string","enum":["UPGRADE","DOWNGRADE","NOOP"]},"immediateAmount":{"type":"integer","format":"int32"},"nextBillingAmount":{"type":"integer","format":"int32"},"nextBillingDate":{"type":"string","format":"date-time","nullable":true}}},"EntitlementDto":{"type":"object","properties":{"key":{"type":"string","description":"Entitlement key"},"value":{"type":"integer","description":"Effective limit value (overrides applied)","format":"int64"},"defaultValue":{"type":"integer","description":"Plan-tier default value before overrides","format":"int64"},"overridden":{"type":"boolean","description":"Whether this entitlement has an org-level override"}},"description":"A single resolved entitlement for the organization"},"EntitlementResponse":{"type":"object","properties":{"tier":{"type":"string","description":"Resolved billing plan tier","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"entitlements":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EntitlementDto"},"description":"All entitlements keyed by entitlement key"},"usage":{"type":"object","additionalProperties":{"type":"integer","description":"Current usage counters keyed by entitlement key (only for countable resources)","format":"int64"},"description":"Current usage counters keyed by entitlement key (only for countable resources)"},"trialActive":{"type":"boolean","description":"Whether the org is currently on a trial"},"trialExpiresAt":{"type":"string","description":"Trial expiry date (null if not trialing)","format":"date-time","nullable":true},"subscriptionStatus":{"type":"string","description":"Current subscription status (null if no subscription)","nullable":true}},"description":"Full entitlement state for an organization: resolved limits, usage, and trial info"},"SingleValueResponseEntitlementResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EntitlementResponse"}}},"PaginationParams":{"required":["sortBy","sortOrder"],"type":"object","properties":{"sortBy":{"type":"string"},"sortOrder":{"type":"string","enum":["ASC","DESC"]},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"IdValuePair":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"value":{"type":"string"}}},"TableValueResultIdValuePair":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IdValuePair"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MyOrgItemDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"orgName":{"type":"string"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"TableValueResultMyOrgItemDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MyOrgItemDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64","nullable":true}}},"Pageable":{"type":"object","properties":{"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"minimum":1,"type":"integer","format":"int32"},"sort":{"type":"array","items":{"type":"string"}}}},"TableValueResultUserDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AdminStatsDto":{"type":"object","properties":{"userCount":{"type":"integer","format":"int64"},"orgCount":{"type":"integer","format":"int64"},"memberCount":{"type":"integer","format":"int64"}}},"SingleValueResponseAdminStatsDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdminStatsDto"}}},"TableValueResultOrganizationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMemberDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookEndpointDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"WebhookDeliveryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpointId":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"eventType":{"type":"string"},"status":{"type":"string"},"attemptCount":{"type":"integer","format":"int32"},"maxAttempts":{"type":"integer","format":"int32"},"responseStatus":{"type":"integer","format":"int32","nullable":true},"responseLatencyMs":{"type":"integer","format":"int32","nullable":true},"errorMessage":{"type":"string","nullable":true},"deliveredAt":{"type":"string","format":"date-time","nullable":true},"failedAt":{"type":"string","format":"date-time","nullable":true},"nextRetryAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseWebhookSigningSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSigningSecretDto"}}},"WebhookSigningSecretDto":{"type":"object","properties":{"configured":{"type":"boolean"},"maskedSecret":{"type":"string","nullable":true}}},"WebhookEventCatalogEntry":{"type":"object","properties":{"type":{"type":"string","description":"Dot-notation event type identifier, e.g. \"monitor.created\""},"surface":{"type":"string","description":"Product surface this event belongs to, e.g. \"monitoring\" or \"status_data\""},"description":{"type":"string","description":"Human-readable description of when this event fires"}}},"WebhookEventCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalogEntry"}}}},"CursorPageServiceCatalogDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}},"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"},"ServiceCatalogDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"overallStatus":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"componentCount":{"type":"integer","format":"int64"},"activeIncidentCount":{"type":"integer","format":"int64"},"dataCompleteness":{"type":"string"}},"description":"Items on this page"},"MaintenanceComponentRef":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string"}}},"MaintenanceUpdateDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}},"description":"A status update within a scheduled maintenance lifecycle"},"ScheduledMaintenanceDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"shortlink":{"type":"string","nullable":true},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"scheduledUntil":{"type":"string","format":"date-time","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"affectedComponents":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceComponentRef"}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceUpdateDto"}}},"description":"A scheduled maintenance window from a vendor status page"},"ServiceDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"currentStatus":{"$ref":"#/components/schemas/ServiceStatusDto"},"recentIncidents":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"components":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"activeMaintenances":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"dataCompleteness":{"type":"string"}}},"ServiceIncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true}}},"ServiceStatusDto":{"type":"object","properties":{"overallStatus":{"type":"string"},"lastPolledAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceDetailDto"}}},"ServiceUptimeResponse":{"type":"object","properties":{"overallUptimePct":{"type":"number","description":"Overall uptime percentage across the entire period; null when no polling data exists","format":"double","nullable":true,"example":99.95},"period":{"type":"string","description":"Requested period","example":"7d"},"granularity":{"type":"string","description":"Requested granularity","example":"hourly"},"buckets":{"type":"array","description":"Per-bucket breakdown ordered by time ascending","items":{"$ref":"#/components/schemas/UptimeBucketDto"}},"source":{"type":"string","description":"Data source: vendor_reported, incident_derived, or poll_derived","nullable":true,"example":"vendor_reported"}},"description":"Uptime response with per-bucket breakdown and overall percentage for the period"},"SingleValueResponseServiceUptimeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceUptimeResponse"}}},"UptimeBucketDto":{"type":"object","properties":{"timestamp":{"type":"string","description":"Start of the bucket interval (ISO 8601)","format":"date-time","example":"2024-01-01T00:00:00Z"},"uptimePct":{"type":"number","description":"Uptime percentage for this bucket; null when no polls occurred","format":"double","nullable":true,"example":100.0},"totalPolls":{"type":"integer","description":"Total number of polls recorded in this bucket","format":"int64","example":12}},"description":"Uptime statistics for a single time bucket"},"TableValueResultScheduledMaintenanceDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultServiceIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ServiceIncidentDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentUpdateDto"}}}},"ServiceIncidentUpdateDto":{"type":"object","properties":{"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceIncidentDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceIncidentDetailDto"}}},"TableValueResultServiceComponentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ComponentUptimeDayDto":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"partialOutageSeconds":{"type":"integer","format":"int32"},"majorOutageSeconds":{"type":"integer","format":"int32"},"uptimePercentage":{"type":"number","format":"double"},"eventsJson":{"type":"string","description":"Incident event references for this day as raw JSON","nullable":true},"source":{"type":"string"}},"description":"Daily uptime data for a component"},"TableValueResultComponentUptimeDayDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ComponentUptimeDayDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"GlobalStatusSummaryDto":{"type":"object","properties":{"totalServices":{"type":"integer","format":"int32"},"operationalCount":{"type":"integer","format":"int32"},"degradedCount":{"type":"integer","format":"int32"},"partialOutageCount":{"type":"integer","format":"int32"},"majorOutageCount":{"type":"integer","format":"int32"},"maintenanceCount":{"type":"integer","format":"int32"},"activeIncidentCount":{"type":"integer","format":"int64"},"servicesWithIssues":{"type":"array","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}}}},"SingleValueResponseGlobalStatusSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/GlobalStatusSummaryDto"}}},"TableValueResultServiceSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSecretDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SecretDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultResourceGroupDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ResourceGroupDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseResourceGroupHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupHealthDto"}}},"NotificationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"type":{"type":"string"},"title":{"type":"string"},"body":{"type":"string","nullable":true},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultNotificationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseLong":{"type":"object","properties":{"data":{"type":"integer","format":"int64"}}},"TableValueResultNotificationPolicyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationPolicyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultNotificationDispatchDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDispatchDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMonitorDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorVersionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"version":{"type":"integer","format":"int32"},"snapshot":{"$ref":"#/components/schemas/MonitorDto"},"changedById":{"type":"integer","format":"int32","nullable":true},"changedVia":{"type":"string","enum":["API","DASHBOARD","CLI","TERRAFORM"]},"changeSummary":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultMonitorVersionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorVersionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseMonitorVersionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorVersionDto"}}},"UptimeDto":{"type":"object","properties":{"uptimePercentage":{"type":"number","description":"Uptime percentage over the requested window; null when no data","format":"double","nullable":true,"example":99.95},"totalChecks":{"type":"integer","description":"Total number of checks executed","format":"int64","example":1440},"passedChecks":{"type":"integer","description":"Number of checks that passed","format":"int64","example":1439},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds; null when no data","format":"double","nullable":true,"example":142.5},"p95LatencyMs":{"type":"number","description":"95th-percentile latency in milliseconds (upper bound across regions); null when no data","format":"double","nullable":true,"example":312.0}},"description":"Uptime statistics aggregated from continuous aggregates"},"SingleValueResponseUptimeDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UptimeDto"}}},"CursorPage":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"type":"object","description":"Items on this page"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"AssertionResultDto":{"type":"object","properties":{"type":{"type":"string","description":"Assertion type","example":"status_code"},"passed":{"type":"boolean","description":"Whether the assertion passed"},"severity":{"type":"string","description":"Assertion severity","enum":["fail","warn"]},"message":{"type":"string","description":"Human-readable result message","nullable":true},"expected":{"type":"string","description":"Expected value","nullable":true,"example":"200"},"actual":{"type":"string","description":"Actual value observed","nullable":true,"example":"503"}},"description":"Result of evaluating a single assertion against a check result"},"CheckResultDetailsDto":{"type":"object","properties":{"statusCode":{"type":"integer","description":"HTTP status code of the response","format":"int32","nullable":true,"example":200},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","description":"HTTP response headers","nullable":true,"items":{"type":"string","description":"HTTP response headers","nullable":true}},"description":"HTTP response headers","nullable":true},"responseBodySnapshot":{"type":"string","description":"Raw response body snapshot (may be HTML, XML, JSON, or plain text)","nullable":true},"assertionResults":{"type":"array","description":"Individual assertion evaluation results","nullable":true,"items":{"$ref":"#/components/schemas/AssertionResultDto"}},"tlsInfo":{"$ref":"#/components/schemas/TlsInfoDto"},"redirectCount":{"type":"integer","description":"Number of HTTP redirects followed","format":"int32","nullable":true,"example":2},"redirectTarget":{"type":"string","description":"Final URL after redirects","nullable":true},"responseSizeBytes":{"type":"integer","description":"Response body size in bytes","format":"int32","nullable":true,"example":4096},"checkDetails":{"oneOf":[{"$ref":"#/components/schemas/Dns"},{"$ref":"#/components/schemas/Http"},{"$ref":"#/components/schemas/Icmp"},{"$ref":"#/components/schemas/McpServer"},{"$ref":"#/components/schemas/Tcp"}]}},"description":"Type-specific details captured during a check execution"},"CheckResultDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the check result","format":"uuid"},"timestamp":{"type":"string","description":"Timestamp when the check was executed (ISO 8601)","format":"date-time"},"region":{"type":"string","description":"Region where the check was executed","example":"us-east"},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds","format":"int32","nullable":true,"example":123},"passed":{"type":"boolean","description":"Whether the check passed","example":true},"failureReason":{"type":"string","description":"Reason for failure when passed=false","nullable":true},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true},"details":{"$ref":"#/components/schemas/CheckResultDetailsDto"}},"description":"A single check result from a monitor run"},"CheckTypeDetailsDto":{"required":["check_type"],"type":"object","properties":{"check_type":{"type":"string"}},"description":"Check-type-specific details — polymorphic by check_type discriminator","discriminator":{"propertyName":"check_type"}},"CursorPageCheckResultDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/CheckResultDto"}},"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"},"Dns":{"type":"object","description":"DNS check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"hostname":{"type":"string","description":"Target hostname","nullable":true},"requestedTypes":{"type":"array","description":"Requested DNS record types","nullable":true,"items":{"type":"string","description":"Requested DNS record types","nullable":true}},"usedResolver":{"type":"string","description":"Resolver used for lookup","nullable":true},"records":{"type":"object","additionalProperties":{"type":"array","description":"Resolved DNS records keyed by record type","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"Resolved DNS records keyed by record type","nullable":true},"description":"Resolved DNS records keyed by record type","nullable":true}},"description":"Resolved DNS records keyed by record type","nullable":true},"attempts":{"type":"array","description":"DNS resolution attempts","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"DNS resolution attempts","nullable":true},"description":"DNS resolution attempts","nullable":true}},"failureKind":{"type":"string","description":"Kind of DNS failure, if any","nullable":true}}}]},"Http":{"type":"object","description":"HTTP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"timing":{"type":"object","additionalProperties":{"type":"object","description":"Request phase timing breakdown","nullable":true},"description":"Request phase timing breakdown","nullable":true},"bodyTruncated":{"type":"boolean","description":"Whether the response body was truncated before storage","nullable":true}}}]},"Icmp":{"type":"object","description":"ICMP (ping) check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"1.1.1.1"},"packetsSent":{"type":"integer","description":"Number of ICMP packets sent","format":"int32","nullable":true},"packetsReceived":{"type":"integer","description":"Number of ICMP packets received","format":"int32","nullable":true},"packetLoss":{"type":"number","description":"Packet loss percentage","format":"double","nullable":true,"example":0.0},"avgRttMs":{"type":"number","description":"Average round-trip time in ms","format":"double","nullable":true},"minRttMs":{"type":"number","description":"Minimum round-trip time in ms","format":"double","nullable":true},"maxRttMs":{"type":"number","description":"Maximum round-trip time in ms","format":"double","nullable":true},"jitterMs":{"type":"number","description":"Jitter in ms","format":"double","nullable":true}}}]},"McpServer":{"type":"object","description":"MCP server check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"url":{"type":"string","description":"MCP server URL","nullable":true},"protocolVersion":{"type":"string","description":"MCP protocol version","nullable":true},"serverInfo":{"type":"object","additionalProperties":{"type":"object","description":"MCP server info (name, version, etc.)","nullable":true},"description":"MCP server info (name, version, etc.)","nullable":true},"toolCount":{"type":"integer","description":"Number of tools exposed","format":"int32","nullable":true},"resourceCount":{"type":"integer","description":"Number of resources exposed","format":"int32","nullable":true},"promptCount":{"type":"integer","description":"Number of prompts exposed","format":"int32","nullable":true}}}]},"Tcp":{"type":"object","description":"TCP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"db.example.com"},"port":{"type":"integer","description":"Target port","format":"int32","example":5432},"connected":{"type":"boolean","description":"Whether a TCP connection was established"}}}]},"TlsInfoDto":{"type":"object","properties":{"subjectCn":{"type":"string","description":"Certificate subject common name","nullable":true,"example":"*.example.com"},"subjectSan":{"type":"array","description":"Subject Alternative Names","nullable":true,"items":{"type":"string","description":"Subject Alternative Names","nullable":true}},"issuerCn":{"type":"string","description":"Issuer common name","nullable":true,"example":"R3"},"issuerOrg":{"type":"string","description":"Issuer organisation","nullable":true,"example":"Let's Encrypt"},"notBefore":{"type":"string","description":"Certificate validity start (ISO 8601 UTC)","nullable":true},"notAfter":{"type":"string","description":"Certificate validity end (ISO 8601 UTC)","nullable":true},"serialNumber":{"type":"string","description":"Certificate serial number","nullable":true},"tlsVersion":{"type":"string","description":"TLS protocol version","nullable":true,"example":"TLSv1.3"},"cipherSuite":{"type":"string","description":"Negotiated cipher suite","nullable":true},"chainValid":{"type":"boolean","description":"Whether the chain validated against the OS trust store","nullable":true}},"description":"TLS/SSL certificate details for HTTPS targets"},"ChartBucketDto":{"type":"object","properties":{"bucket":{"type":"string","description":"Start of the time bucket (ISO 8601)","format":"date-time","example":"2026-03-12T10:00:00Z"},"uptimePercent":{"type":"number","description":"Uptime percentage for this bucket; null when no data","format":"double","nullable":true,"example":100.0},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds for this bucket","format":"double","nullable":true,"example":120.3},"p95LatencyMs":{"type":"number","description":"95th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":250.0},"p99LatencyMs":{"type":"number","description":"99th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":480.0}},"description":"Aggregated metrics for a time bucket"},"RegionStatusDto":{"type":"object","properties":{"region":{"type":"string","description":"Region identifier","example":"us-east"},"passed":{"type":"boolean","description":"Whether the last check in this region passed","example":true},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds for the last check","format":"int32","nullable":true,"example":95},"timestamp":{"type":"string","description":"Timestamp of the last check in this region (ISO 8601)","format":"date-time"},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true}},"description":"Latest check result for a single region"},"ResultSummaryDto":{"type":"object","properties":{"currentStatus":{"type":"string","description":"Derived current status across all regions","enum":["up","degraded","down","unknown"]},"latestPerRegion":{"type":"array","description":"Latest check result per region","items":{"$ref":"#/components/schemas/RegionStatusDto"}},"chartData":{"type":"array","description":"Time-bucketed chart data for the requested window","items":{"$ref":"#/components/schemas/ChartBucketDto"}},"uptime24h":{"type":"number","description":"Uptime percentage over the last 24 hours; null when no data","format":"double","nullable":true,"example":99.95},"uptimeWindow":{"type":"number","description":"Uptime percentage for the selected chart window; null when no data","format":"double","nullable":true,"example":99.8}},"description":"Dashboard summary: current status, per-region latest results, and chart data"},"SingleValueResponseResultSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResultSummaryDto"}}},"TableValueResultMaintenanceWindowDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceWindowDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultInviteDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InviteDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"IntegrationCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationDto"}}}},"IntegrationConfigSchemaDto":{"type":"object","properties":{"connectionFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}},"channelFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}}}},"IntegrationDto":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"logoUrl":{"type":"string"},"authType":{"type":"string"},"tierAvailability":{"type":"string","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"lifecycle":{"type":"string"},"setupGuideUrl":{"type":"string"},"configSchema":{"$ref":"#/components/schemas/IntegrationConfigSchemaDto"}}},"IntegrationFieldDto":{"required":["key","label","required","sensitive","type"],"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"sensitive":{"type":"boolean"},"placeholder":{"type":"string","nullable":true},"helpText":{"type":"string","nullable":true},"options":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"default":{"type":"string","nullable":true}}},"IncidentFilterParams":{"type":"object","properties":{"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"monitorId":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"resourceGroupId":{"type":"string","format":"uuid"},"tagId":{"type":"string","format":"uuid","nullable":true},"environmentId":{"type":"string","format":"uuid","nullable":true},"startedFrom":{"type":"string","format":"date-time","nullable":true},"startedTo":{"type":"string","format":"date-time","nullable":true},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"TableValueResultEnvironmentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DashboardOverviewDto":{"type":"object","properties":{"monitors":{"$ref":"#/components/schemas/MonitorsSummaryDto"},"incidents":{"$ref":"#/components/schemas/IncidentsSummaryDto"}}},"IncidentsSummaryDto":{"type":"object","properties":{"active":{"type":"integer","format":"int64"},"resolvedToday":{"type":"integer","format":"int64"},"mttr30d":{"type":"number","format":"double","nullable":true}}},"MonitorsSummaryDto":{"type":"object","properties":{"total":{"type":"integer","format":"int64"},"up":{"type":"integer","format":"int64"},"down":{"type":"integer","format":"int64"},"degraded":{"type":"integer","format":"int64"},"paused":{"type":"integer","format":"int64"},"avgUptime24h":{"type":"number","format":"double","nullable":true},"avgUptime30d":{"type":"number","format":"double","nullable":true}}},"SingleValueResponseDashboardOverviewDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DashboardOverviewDto"}}},"CategoryDto":{"type":"object","properties":{"category":{"type":"string"},"serviceCount":{"type":"integer","format":"int64"}}},"TableValueResultCategoryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AuditEventDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"actorId":{"type":"integer","format":"int32","nullable":true},"actorEmail":{"type":"string","nullable":true},"action":{"type":"string"},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"resourceName":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"PageResultAuditEventDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEventDto"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"hasNext":{"type":"boolean"}}},"TableValueResultApiKeyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DeliveryAttemptDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deliveryId":{"type":"string","format":"uuid"},"attemptNumber":{"type":"integer","description":"1-based attempt number","format":"int32"},"status":{"type":"string","description":"Outcome: SUCCESS, FAILED, TIMEOUT, ERROR"},"responseStatusCode":{"type":"integer","description":"HTTP response status code from the external service","format":"int32","nullable":true},"requestPayload":{"type":"string","description":"JSON payload sent to the external service","nullable":true},"responseBody":{"type":"string","description":"Response body from the external service (truncated)","nullable":true},"errorMessage":{"type":"string","description":"Error message if the attempt failed","nullable":true},"responseTimeMs":{"type":"integer","description":"Round-trip time in milliseconds","format":"int32","nullable":true},"externalId":{"type":"string","description":"External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID)","nullable":true},"requestHeaders":{"type":"object","additionalProperties":{"type":"string","description":"HTTP request headers sent to the external service","nullable":true},"description":"HTTP request headers sent to the external service","nullable":true},"attemptedAt":{"type":"string","format":"date-time"}},"description":"Single delivery attempt with request/response audit data"},"TableValueResultDeliveryAttemptDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAttemptDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertChannelDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertChannelDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"RemoveMonitorTagsRequest":{"required":["tagIds"],"type":"object","properties":{"tagIds":{"minItems":1,"type":"array","description":"IDs of the tags to detach from the monitor","items":{"type":"string","description":"IDs of the tags to detach from the monitor","format":"uuid"}}},"description":"Request body for removing tags from a monitor"},"DeleteChannelResult":{"type":"object","properties":{"affectedPolicies":{"type":"integer","description":"Number of notification policies whose escalation steps were modified","format":"int32"},"disabledPolicies":{"type":"integer","description":"Number of notification policies disabled because they had no remaining channels","format":"int32"}},"description":"Summary of policies affected by channel deletion"}},"securitySchemes":{"BearerAuth":{"type":"http","description":"API key (dh_live_...) or Auth0 JWT token","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file +openapi: 3.0.1 +info: + title: DevHelm API + description: DevHelm monitoring and incident management API. Create and manage + uptime monitors, incidents, alert channels, notification policies, and more. + version: "1.0" + contact: + name: DevHelm + url: https://devhelm.io + email: support@devhelm.io +servers: + - url: https://api.devhelm.io + description: Production +security: + - BearerAuth: [] +tags: + - name: Alert Channels + description: Alert channel CRUD and connectivity testing + - name: Alert Deliveries + description: "Delivery audit trail: inspect per-attempt details for alert deliveries" + - name: API Auth + description: Identity and quota info for API key authentication + - name: API Keys + description: Organization API key management + - name: Audit Log + description: Organization audit trail + - name: Check Results + description: Query raw check results, uptime statistics, and summary data + - name: Dashboard + description: Overview dashboard aggregates + - name: Deploy Lock + description: Mutex for CLI deploy operations + - name: Environments + description: Variable namespace management for monitors + - name: Heartbeat + description: Public ping endpoint for heartbeat monitors + - name: Incident Policies + description: Manage trigger, confirmation, and recovery rules for monitors + - name: Incidents + description: Incident management and lifecycle + - name: Integrations + description: Static catalog of supported alert channel integrations + - name: Invites + description: Organization invite management + - name: Maintenance Windows + description: Schedule alert-suppression windows for monitors + - name: Members + description: Organization member management + - name: Monitor Alert Channels + description: Manage alert channel mappings for a monitor + - name: Monitor Assertions + description: Manage assertions for a monitor + - name: Monitor Auth + description: Manage authentication configuration for a monitor + - name: Monitors + description: Monitor CRUD and lifecycle management + - name: Notification Dispatches + description: "Dispatch debugging API: inspect which policies matched an incident + and track delivery status" + - name: Notification Policies + description: Org-level notification routing policies with JSONB match rules + - name: Notifications + description: In-app notification center + - name: Organizations + description: Organization management + - name: Resource Groups + description: Resource group CRUD and member management + - name: Secrets + description: Organization environment secret management + - name: Service Subscriptions + description: Manage which services an organization tracks + - name: Status Data + description: Public service status catalog, components, uptime, and incident history + - name: Status Pages + description: Status page management + - name: Tags + description: Org-scoped tag management for monitors + - name: Vault + description: Organization vault management (admin-only) + - name: Webhooks + description: Webhook endpoint management, event catalog, and delivery history + - name: Workspaces + description: Workspace management within an organization +paths: + /api/v1/alert-channels: + get: + tags: + - Alert Channels + summary: List active alert channels for the authenticated org + operationId: list_14 + parameters: + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultAlertChannelDto" + "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: + - Alert Channels + summary: Create a new alert channel with encrypted config + operationId: create_15 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateAlertChannelRequest" + required: true + responses: + "201": + description: Created + 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}: + get: + tags: + - Alert Channels + summary: Get a single alert channel by id + operationId: get_8 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseAlertChannelDto" + "400": + description: Bad request — the payload failed validation + 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: + - Alert Channels + summary: Update an alert channel's name and re-encrypt config + operationId: update_14 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateAlertChannelRequest" + 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" + delete: + tags: + - Alert Channels + summary: Soft-delete an alert channel and return affected policy summary + operationId: delete_10 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/DeleteChannelResult" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/alert-channels/{id}/deliveries: + get: + tags: + - Alert Channels + summary: List delivery history for an alert channel + operationId: listDeliveries_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultAlertDeliveryDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/alert-channels/{id}/test: + post: + tags: + - Alert Channels + summary: Test a saved alert channel's connectivity + operationId: test_2 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + 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" + required: true + 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-deliveries/{id}/attempts: + get: + tags: + - 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 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultDeliveryAttemptDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/alert-deliveries/{id}/retry: + post: + tags: + - Alert Deliveries + 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 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseAlertDeliveryDto" + "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: + get: + tags: + - API Keys + summary: List API keys + operationId: list_13 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultApiKeyDto" + "400": + description: Bad request — the payload failed validation + 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: + - API Keys + summary: Create API key + operationId: create_14 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateApiKeyRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $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_15 + 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" + "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}/regenerate: + post: + tags: + - API Keys + summary: Regenerate API key + operationId: regenerate + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int32 + responses: + "200": + description: OK + content: + "*/*": + schema: + $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}/revoke: + post: + tags: + - API Keys + summary: Revoke API key + operationId: revoke_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int32 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseApiKeyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/audit-log: + get: + tags: + - Audit Log + summary: List audit events for the current organization + operationId: list_19 + parameters: + - name: action + in: query + required: false + schema: + type: string + - name: actorId + in: query + required: false + schema: + type: integer + format: int32 + - name: resourceType + in: query + required: false + schema: + type: string + - name: from + in: query + required: false + schema: + type: string + format: date-time + - name: to + in: query + required: false + schema: + type: string + format: date-time + - name: page + in: query + required: false + schema: + type: integer + format: int32 + default: 0 + - name: size + in: query + required: false + schema: + type: integer + format: int32 + default: 50 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultAuditEventDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/auth/me: + get: + tags: + - API Auth + summary: Get current API key identity + description: Returns the authenticated API key's metadata, organization, billing + plan, entitlements with usage, and current rate-limit quota. Only + available for API key authentication (Bearer dh_live_...). + operationId: me_1 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseAuthMeResponse" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/categories: + get: + tags: + - Status Data + summary: List categories with service counts + operationId: listCategories + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultCategoryDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/dashboard/overview: + get: + tags: + - Dashboard + summary: Dashboard overview + description: Returns monitor status counts, average uptime windows, and incident + aggregates for the authenticated org. Results are cached for 1 minute. + operationId: overview + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseDashboardOverviewDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/deploy/lock: + get: + tags: + - Deploy Lock + summary: Get current deploy lock + description: Returns the active deploy lock for the current workspace, if any. + operationId: current + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseDeployLockDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Deploy Lock + summary: Acquire deploy lock + description: Acquires an exclusive deploy lock for the current workspace. + Returns 409 Conflict if the workspace is already locked by another + session. + operationId: acquire + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AcquireDeployLockRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseDeployLockDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/deploy/lock/{lockId}: + delete: + tags: + - Deploy Lock + summary: Release deploy lock + description: Releases a deploy lock by ID. Only the lock holder should call this. + operationId: release + parameters: + - name: lockId + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/deploy/lock/force: + delete: + tags: + - Deploy Lock + summary: Force-release deploy lock + description: Forcibly removes any deploy lock on the current workspace. Use to + break stale locks. + operationId: forceRelease + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/environments: + get: + tags: + - Environments + summary: List environments + operationId: list_12 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultEnvironmentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Environments + summary: Create environment + operationId: create_13 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateEnvironmentRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseEnvironmentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/environments/{slug}: + get: + tags: + - Environments + summary: Get environment by slug + operationId: get_7 + parameters: + - name: slug + in: path + required: true + schema: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseEnvironmentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Environments + summary: Update environment + operationId: update_13 + parameters: + - name: slug + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateEnvironmentRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseEnvironmentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Environments + summary: Delete environment + operationId: delete_9 + parameters: + - name: slug + in: path + required: true + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/heartbeat/{token}: + get: + tags: + - Heartbeat + summary: Record a heartbeat ping (GET) + description: Called by external systems (cron jobs, scheduled tasks) to signal + liveness. Always returns 200 OK. + operationId: pingGet + parameters: + - name: token + in: path + description: Ping endpoint token for the heartbeat monitor + required: true + schema: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/HeartbeatPingResponse" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Heartbeat + summary: Record a heartbeat ping (POST) + description: Called by external systems to signal liveness with an optional JSON + payload. The payload can be inspected by heartbeat_payload_contains + assertions. Always returns 200 OK. + operationId: pingPost + parameters: + - name: token + in: path + description: Ping endpoint token for the heartbeat monitor + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: string + text/plain: + schema: + type: string + "*/*": + schema: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/HeartbeatPingResponse" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/incidents: + get: + tags: + - Incidents + summary: List incidents for the authenticated org + operationId: list_11 + parameters: + - name: params + in: query + required: true + schema: + $ref: "#/components/schemas/IncidentFilterParams" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultIncidentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Incidents + summary: Create a manual incident + operationId: create_12 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateManualIncidentRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/incidents/{id}: + get: + tags: + - Incidents + summary: Get incident details including update timeline + operationId: get_11 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/incidents/{id}/resolve: + post: + tags: + - Incidents + summary: Resolve an incident + operationId: resolve + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ResolveIncidentRequest" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/incidents/{id}/updates: + post: + tags: + - Incidents + summary: Add an update to an incident (optionally change status) + operationId: addUpdate + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddIncidentUpdateRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/integrations: + get: + tags: + - Integrations + summary: List all supported integration types + description: Returns the full static catalog of supported alert channel + integration types with their metadata and config field schemas. Used by + the frontend to dynamically render the 'Add Alert Channel' form. + operationId: list_18 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultIntegrationDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/invites: + get: + tags: + - Invites + summary: List invites + operationId: list_10 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultInviteDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Invites + summary: Create invite + operationId: create_11 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateInviteRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseInviteDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/invites/{inviteId}/resend: + post: + tags: + - Invites + summary: Resend invite + operationId: resend + parameters: + - name: inviteId + in: path + required: true + schema: + type: integer + format: int32 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseInviteDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/invites/{inviteId}/revoke: + post: + tags: + - Invites + summary: Revoke invite + operationId: revoke + parameters: + - name: inviteId + in: path + required: true + schema: + type: integer + format: int32 + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/maintenance-windows: + get: + tags: + - Maintenance Windows + summary: List maintenance windows for the authenticated org + description: "Returns maintenance windows for the caller's organisation. + Optionally filter by monitor_id, and/or by status: 'active' (currently + in window) or 'upcoming' (starts in the future)." + operationId: list_9 + parameters: + - name: monitorId + in: query + description: Filter by monitor UUID + required: false + schema: + type: string + format: uuid + - name: filter + in: query + description: "Filter by status: 'active' or 'upcoming'" + required: false + schema: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultMaintenanceWindowDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Maintenance Windows + summary: Create a maintenance window + description: Creates a new maintenance window. Set monitorId to null to create + an org-wide window that suppresses alerts for all monitors. + operationId: create_10 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateMaintenanceWindowRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/maintenance-windows/{id}: + get: + tags: + - Maintenance Windows + summary: Get a single maintenance window by ID + operationId: getById_2 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Maintenance Windows + summary: Update a maintenance window + operationId: update_12 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateMaintenanceWindowRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMaintenanceWindowDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Maintenance Windows + summary: Delete a maintenance window + operationId: delete_8 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/members: + get: + tags: + - Members + summary: List organization members + operationId: list_17 + parameters: + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultMemberDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/members/{userId}: + delete: + tags: + - Members + summary: Remove member from organization + operationId: remove_2 + parameters: + - name: userId + in: path + required: true + schema: + type: integer + format: int32 + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/members/{userId}/role: + put: + tags: + - Members + summary: Change member role + operationId: changeRole + parameters: + - name: userId + in: path + required: true + schema: + type: integer + format: int32 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ChangeRoleRequest" + required: true + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/members/{userId}/status: + put: + tags: + - Members + summary: Change member status + operationId: changeStatus + parameters: + - name: userId + in: path + required: true + schema: + type: integer + format: int32 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ChangeStatusRequest" + required: true + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors: + get: + tags: + - Monitors + summary: List monitors for the authenticated org + operationId: list_8 + parameters: + - name: enabled + in: query + description: Filter by enabled state + required: false + schema: + type: boolean + - name: type + in: query + description: Filter by monitor type + required: false + schema: + type: string + enum: + - HTTP + - DNS + - MCP_SERVER + - TCP + - ICMP + - HEARTBEAT + - name: managedBy + in: query + description: Filter by managed-by source + required: false + schema: + type: string + enum: + - DASHBOARD + - CLI + - TERRAFORM + - name: tags + in: query + description: Filter by tag names, comma-separated (e.g. prod,critical) + required: false + schema: + type: string + - name: search + in: query + description: Case-insensitive name search + required: false + schema: + type: string + - name: environmentId + in: query + description: Filter by environment ID + required: false + schema: + type: string + format: uuid + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Monitors + summary: Create a new monitor + operationId: create_9 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateMonitorRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}: + get: + tags: + - Monitors + summary: Get a single monitor by id + operationId: get_6 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Monitors + summary: Update a monitor + operationId: update_11 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateMonitorRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Monitors + summary: Soft-delete a monitor + operationId: delete_7 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/pause: + post: + tags: + - Monitors + summary: Pause a monitor (set enabled=false) + operationId: pause + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/results: + get: + tags: + - Check Results + summary: List raw check results + description: Returns check results for the given monitor with optional + time-range, region, and pass/fail filtering. Uses cursor-based + pagination — pass the returned `cursor` value on subsequent requests to + retrieve the next page. The cursor encodes the original time bounds, so + `from`/`to` are ignored when a cursor is present. + operationId: getResults + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: from + in: query + description: Start of time range (ISO 8601, inclusive); defaults to 24 hours ago + required: false + schema: + type: string + format: date-time + - name: to + in: query + description: End of time range (ISO 8601, inclusive); defaults to now + required: false + schema: + type: string + format: date-time + - name: cursor + in: query + description: Opaque cursor from a previous response for pagination + required: false + schema: + type: string + - name: limit + in: query + description: Maximum results per page (1–200) + required: false + schema: + type: integer + format: int32 + default: 50 + example: 50 + - name: region + in: query + description: Filter by region (e.g. us-east) + required: false + schema: + type: string + - name: passed + in: query + description: Filter by pass/fail status + required: false + schema: + type: boolean + responses: + "200": + description: Paginated check results + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageCheckResultDto" + "400": + description: Invalid query parameters + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageCheckResultDto" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Monitor does not belong to the caller's org + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageCheckResultDto" + "404": + description: Monitor not found + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageCheckResultDto" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/results/summary: + get: + tags: + - Check Results + summary: Get results summary + description: "Returns a dashboard summary for the monitor: current status + derived from the latest result per region, time-bucketed chart data, the + 24-hour uptime percentage, and the selected window's uptime percentage." + operationId: getSummary + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: chartWindow + in: query + description: "Chart window: 24h returns hourly buckets, 7d/30d/90d return daily + buckets" + required: false + schema: + type: string + enum: + - 24h + - 7d + - 30d + - 90d + responses: + "200": + description: Results summary + content: + "*/*": + schema: + $ref: "#/components/schemas/ResultSummaryDto" + "400": + description: Invalid chartWindow parameter + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResultSummaryDto" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Monitor does not belong to the caller's org + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResultSummaryDto" + "404": + description: Monitor not found + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResultSummaryDto" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/resume: + post: + tags: + - Monitors + summary: Resume a monitor (set enabled=true) + operationId: resume + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/rotate-token: + post: + tags: + - Monitors + summary: Rotate the ping token for a heartbeat monitor + description: Generates a new ping token. The old token remains valid for 24 + hours to allow cron jobs to be updated without downtime. Only supported + for HEARTBEAT monitors. + operationId: rotateToken + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/tags: + get: + tags: + - Monitors + summary: Get all tags applied to a monitor + operationId: getMonitorTags + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultTagDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Monitors + summary: Add tags to a monitor; supports existing tag IDs and inline creation of + new tags + operationId: addMonitorTags + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddMonitorTagsRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultTagDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Monitors + summary: Remove tags from a monitor by their IDs + operationId: removeMonitorTags + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RemoveMonitorTagsRequest" + required: true + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/test: + post: + tags: + - Monitors + summary: Test an existing monitor + description: Runs the saved config and assertions of an existing monitor once, + without persisting any result. Runs synchronously and returns the same + shape as the ad-hoc test. + operationId: testExisting + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/uptime: + get: + tags: + - Check Results + summary: Get uptime statistics + description: Returns uptime percentage and latency statistics for the requested + time window, computed from continuous aggregates. Uses hourly aggregates + for 24h/7d windows and daily aggregates for 30d/90d windows. + operationId: getUptime + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: window + in: query + description: Time window for uptime calculation + required: false + schema: + type: string + enum: + - 24h + - 7d + - 30d + - 90d + responses: + "200": + description: Uptime statistics + content: + "*/*": + schema: + $ref: "#/components/schemas/UptimeDto" + "400": + description: Invalid window parameter + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseUptimeDto" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Monitor does not belong to the caller's org + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseUptimeDto" + "404": + description: Monitor not found + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseUptimeDto" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/versions: + get: + tags: + - Monitors + summary: List version history for a monitor + description: Returns a paginated list of mutation snapshots for the monitor, + newest first. Each version captures the full monitor config at the time + of a PUT /monitors/{id} call. + operationId: listVersions + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultMonitorVersionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{id}/versions/{version}: + get: + tags: + - Monitors + summary: Get a specific version snapshot for a monitor + description: Returns the full monitor config snapshot captured at the given + version number. + operationId: getVersion + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: version + in: path + required: true + schema: + type: integer + format: int32 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorVersionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{monitorId}/alert-channels: + put: + tags: + - Monitor Alert Channels + summary: Replace the linked alert channel set for a monitor + operationId: setChannels + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SetAlertChannelsRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseListUUID" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{monitorId}/assertions: + post: + tags: + - Monitor Assertions + summary: Add an assertion to a monitor + operationId: add + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateAssertionRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{monitorId}/assertions/{assertionId}: + put: + tags: + - Monitor Assertions + summary: Update an assertion on a monitor + operationId: update_10 + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + - name: assertionId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateAssertionRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorAssertionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Monitor Assertions + summary: Remove an assertion from a monitor + operationId: remove_1 + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + - name: assertionId + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{monitorId}/auth: + put: + tags: + - Monitor Auth + summary: Update authentication config for a monitor + operationId: update_9 + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateMonitorAuthRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorAuthDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Monitor Auth + summary: Set authentication config for a monitor + operationId: set + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SetMonitorAuthRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorAuthDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Monitor Auth + summary: Remove authentication config from a monitor + operationId: remove + parameters: + - name: monitorId + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/{monitorId}/policy: + get: + tags: + - Incident Policies + summary: Get incident policy for a monitor + description: Returns the trigger rules, confirmation settings, and recovery + settings for the given monitor. + operationId: get_5 + parameters: + - name: monitorId + in: path + description: Monitor UUID + required: true + schema: + type: string + format: uuid + responses: + "200": + description: Policy found + content: + "*/*": + schema: + $ref: "#/components/schemas/IncidentPolicyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Monitor or policy not found + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Incident Policies + summary: Update incident policy for a monitor + description: Replaces the trigger rules, confirmation settings, and recovery + settings. All fields are validated before saving. + operationId: update_8 + parameters: + - name: monitorId + in: path + description: Monitor UUID + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateIncidentPolicyRequest" + required: true + responses: + "200": + description: Policy updated + content: + "*/*": + schema: + $ref: "#/components/schemas/IncidentPolicyDto" + "400": + description: Validation error in JSONB shape + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Monitor or policy not found + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseIncidentPolicyDto" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/bulk: + post: + tags: + - Monitors + summary: Bulk action on monitors + description: Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of + monitors. Returns a partial-success response indicating which monitors + succeeded and which failed. + operationId: bulkAction + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/BulkMonitorActionRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseBulkMonitorActionResult" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/monitors/test: + post: + tags: + - Monitors + summary: Ad-hoc monitor test + description: Executes a one-off check from an inline config without saving the + monitor. Runs synchronously and returns status code, response time, + assertion results, body preview, and headers. + operationId: testAdHoc + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/MonitorTestRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseMonitorTestResultDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-dispatches: + get: + tags: + - Notification Dispatches + summary: List all dispatches for an incident + description: Returns all notification dispatches for the given incident that + belong to the authenticated org's policies. Each dispatch includes + delivery records for all associated channels. + operationId: listByIncident + parameters: + - name: incident_id + in: query + description: UUID of the incident to inspect + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultNotificationDispatchDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-dispatches/{id}: + get: + tags: + - Notification Dispatches + summary: Get a single dispatch with full escalation and delivery history + description: Returns the dispatch state including current escalation step, + acknowledgment info, and all delivery attempts made across every step. + operationId: getById_3 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-dispatches/{id}/acknowledge: + post: + tags: + - Notification Dispatches + summary: Acknowledge a notification dispatch + description: Marks the dispatch as acknowledged. The dispatch must be in + DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy + (actor email), and acknowledgedVia (DASHBOARD). + operationId: acknowledge + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseNotificationDispatchDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-policies: + get: + tags: + - Notification Policies + summary: List all notification policies for the authenticated org + operationId: list_7 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultNotificationPolicyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Notification Policies + summary: Create a notification policy with match rules and escalation chain + operationId: create_8 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateNotificationPolicyRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-policies/{id}: + get: + tags: + - Notification Policies + summary: Get a notification policy by ID + operationId: getById_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Notification Policies + summary: Update a notification policy + operationId: update_7 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateNotificationPolicyRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseNotificationPolicyDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Notification Policies + summary: Delete a notification policy + operationId: delete_6 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-policies/{id}/dispatches: + get: + tags: + - Notification Policies + summary: List all dispatches (firing history) for a notification policy + operationId: listDispatches + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultNotificationDispatchDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notification-policies/{id}/test: + post: + tags: + - Notification Policies + summary: "Dry-run: evaluate a policy's match rules against a supplied incident + context" + operationId: test_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/TestNotificationPolicyRequest" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseTestMatchResult" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notifications: + get: + tags: + - Notifications + summary: List notifications for the current user + operationId: list_16 + parameters: + - name: unreadOnly + in: query + required: false + schema: + type: boolean + default: false + - name: page + in: query + required: false + schema: + type: integer + format: int32 + default: 0 + - name: size + in: query + required: false + schema: + type: integer + format: int32 + default: 20 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultNotificationDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notifications/{id}/read: + put: + tags: + - Notifications + summary: Mark a notification as read + operationId: markRead + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notifications/read-all: + put: + tags: + - Notifications + summary: Mark all notifications as read + operationId: markAllRead + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/notifications/unread-count: + get: + tags: + - Notifications + summary: Get unread notification count + operationId: unreadCount + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseLong" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/org: + get: + tags: + - Organizations + summary: Get the current organization + operationId: get_4 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseOrganizationDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Organizations + summary: Update the current organization + operationId: update_6 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateOrgDetailsRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseOrganizationDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/resource-groups: + get: + tags: + - Resource Groups + summary: List all resource groups for the authenticated org with health summaries + operationId: list_6 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultResourceGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Resource Groups + summary: Create a new resource group + operationId: create_7 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateResourceGroupRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResourceGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/resource-groups/{id}: + get: + tags: + - Resource Groups + summary: Get a resource group by id with member statuses and inherited settings + description: Pass includeMetrics=true to enrich each member with 24h uptime, + chart data, and latency metrics. + operationId: get_3 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: includeMetrics + in: query + required: false + schema: + type: boolean + default: false + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResourceGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + put: + tags: + - Resource Groups + summary: Update a resource group's name, description, alert policy, inherited + settings, and health threshold + operationId: update_5 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateResourceGroupRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResourceGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Resource Groups + summary: Delete a resource group (cascades to member rows) + operationId: delete_5 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/resource-groups/{id}/health: + get: + tags: + - Resource Groups + summary: Get the detailed health breakdown for a resource group + description: Returns member counts, worst-of status, and threshold-based health + evaluation. The thresholdStatus field is populated only when a health + threshold is configured. + operationId: getHealth + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResourceGroupHealthDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/resource-groups/{id}/members: + post: + tags: + - Resource Groups + summary: Add a monitor or service member to a resource group + operationId: addMember_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddResourceGroupMemberRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseResourceGroupMemberDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/resource-groups/{id}/members/{memberId}: + delete: + tags: + - Resource Groups + summary: Remove a member from a resource group + operationId: removeMember_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: memberId + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/secrets: + get: + tags: + - Secrets + summary: List secrets + operationId: list_5 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultSecretDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Secrets + summary: Create secret + operationId: create_6 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateSecretRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseSecretDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/secrets/{key}: + put: + tags: + - Secrets + summary: Update secret + operationId: update_4 + parameters: + - name: key + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateSecretRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseSecretDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Secrets + summary: Delete secret + operationId: delete_4 + parameters: + - name: key + in: path + required: true + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/service-subscriptions: + get: + tags: + - Service Subscriptions + summary: List all service subscriptions for the organization + operationId: list_15 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultServiceSubscriptionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/service-subscriptions/{id}: + get: + tags: + - Service Subscriptions + summary: Get a subscription by its ID + operationId: get_10 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + delete: + tags: + - Service Subscriptions + summary: Remove a subscription by its ID + description: Removes a specific subscription (whole-service or component-level). + No-op if not found. + operationId: unsubscribe_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/service-subscriptions/{id}/alert-sensitivity: + patch: + tags: + - Service Subscriptions + summary: Update alert sensitivity for a subscription + description: "Controls which external incidents trigger alerts: ALL (any status + change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY + (only DOWN-level incidents)." + operationId: updateAlertSensitivity + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateAlertSensitivityRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/service-subscriptions/{slug}: + post: + tags: + - Service Subscriptions + summary: Subscribe to a service or a component of a service + description: "Idempotent — returns the existing subscription if an identical one + exists. Omit the request body or set componentId to null for a + whole-service subscription. Free tier: max 10 subscriptions. Paid tier: + unlimited." + operationId: subscribe_1 + parameters: + - name: slug + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ServiceSubscribeRequest" + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services: + get: + tags: + - Status Data + summary: List all enabled services (cursor-paginated) + operationId: listServices + parameters: + - name: category + in: query + description: Filter by category (exact match) + required: false + schema: + type: string + - name: status + in: query + description: Filter by current overall_status (exact match) + required: false + schema: + type: string + - name: published + in: query + description: Filter by published status for pSEO pages + required: false + schema: + type: boolean + - name: cursor + in: query + description: Opaque cursor from a previous response + required: false + schema: + type: string + - name: limit + in: query + description: Page size (1–100, default 20) + required: false + schema: + type: integer + format: int32 + default: 20 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageServiceCatalogDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}: + get: + tags: + - Status Data + summary: Get a single service by slug or UUID with current status, components, + and recent incidents + description: When ``summary=true``, the inline ``components`` list is trimmed to + groups + showcase leaves + currently-impacted leaves + ungrouped leaves, + and a ``componentsSummary`` block is added with the trimmed counts. + Powers SSR for vendors with hundreds of components (Snowflake, + Cloudflare, DigitalOcean) without OOM-ing the renderer. Default false + for full back-compat. + operationId: getService + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: summary + in: query + description: Return a curated subset of components (groups + showcase + impacted + + ungrouped) and a componentsSummary block; default false + required: false + schema: + type: boolean + default: false + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/components: + get: + tags: + - Status Data + summary: List active components for a service with current status and inline + uptime + 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 + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: groupId + in: query + description: Restrict result to direct children of this group component id + required: false + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultServiceComponentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/components/{componentId}/uptime: + get: + tags: + - Status Data + summary: Get daily uptime data for a component + description: Pass either ``period`` (preset window) or an explicit + ``from``/``to`` calendar window (ISO yyyy-MM-dd, max 730 days, ``to`` + defaults to today). When both are supplied, the explicit window wins. + operationId: getComponentUptime + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: componentId + in: path + required: true + schema: + type: string + format: uuid + - name: period + in: query + description: Preset time window (used when ``from`` is omitted) + required: false + schema: + type: string + enum: + - 7d + - 30d + - 90d + - 1y + - name: from + in: query + description: Explicit window start (ISO date); overrides ``period`` + required: false + schema: + type: string + format: date + - name: to + in: query + description: Explicit window end (ISO date); defaults to today + required: false + schema: + type: string + format: date + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultComponentUptimeDayDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/components/uptime: + get: + tags: + - Status Data + summary: Batch daily uptime data for all leaf components + description: Returns daily uptime for every active non-group component with + uptime data, keyed by component ID. Replaces N individual per-component + uptime calls with a single request. Supports either a preset ``period`` + or an explicit ``from``/``to`` window (ISO yyyy-MM-dd, max 730 days). + The explicit window wins when both are supplied — this is what powers + the sliding 90-day navigator on the public uptime history page. + operationId: getBatchComponentUptime + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: period + in: query + description: Preset time window (used when ``from`` is omitted) + required: false + schema: + type: string + enum: + - 7d + - 30d + - 90d + - 1y + - name: from + in: query + description: Explicit window start (ISO date); overrides ``period`` + required: false + schema: + type: string + format: date + - name: to + in: query + description: Explicit window end (ISO date); defaults to today + required: false + schema: + type: string + format: date + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseBatchComponentUptimeDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/days/{date}: + get: + tags: + - Status Data + summary: "One-day rollup for a service: aggregated uptime, per-component + impacts, and overlapping incidents" + description: Powers the click/hover-to-expand panel under each uptime bar on the + public status page. Single round-trip — components, sums, and + overlapping incidents (with affected component names) are returned in + one response. + operationId: getServiceDayDetail + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: date + in: path + description: UTC calendar day in ISO format (YYYY-MM-DD) + required: true + schema: + type: string + format: date + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceDayDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/incidents: + get: + tags: + - Status Data + summary: List incident history for a service (paginated) + operationId: listIncidents_1 + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: from + in: query + description: Earliest start date (ISO 8601 date) + required: false + schema: + type: string + format: date + - name: status + in: query + description: "Filter: active (unresolved), resolved, or omit for all" + required: false + schema: + type: string + enum: + - active + - resolved + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultServiceIncidentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/incidents/{incidentId}: + 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 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceIncidentDetailDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/live-status: + get: + tags: + - Status Data + summary: Lightweight live-status snapshot for polling + description: Returns only the current overall status, component statuses, and + active incident count. Designed for frequent polling with minimal + payload. + operationId: getServiceLiveStatus + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceLiveStatusDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/maintenances: + get: + tags: + - Status Data + summary: List scheduled maintenances for a service + operationId: getScheduledMaintenances + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: status + in: query + description: Filter by status (e.g. scheduled, in_progress, verifying, completed) + required: false + schema: + type: array + items: + type: string + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultScheduledMaintenanceDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/poll-results: + get: + tags: + - Status Data + summary: List poll results for a service (cursor-paginated) + operationId: listPollResults + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: cursor + in: query + description: ISO 8601 timestamp cursor from a previous response + required: false + schema: + type: string + - name: limit + in: query + description: Page size (1–100, default 50) + required: false + schema: + type: integer + format: int32 + default: 50 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/CursorPageServicePollResultDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/poll-summary: + get: + tags: + - Status Data + summary: Get aggregated poll metrics and chart data for a service + operationId: getPollSummary + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: window + in: query + description: Time window + required: false + schema: + type: string + enum: + - 24h + - 7d + - 30d + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServicePollSummaryDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/{slugOrId}/uptime: + get: + tags: + - Status Data + summary: Get uptime statistics for a service + description: Uptime data aggregated across active non-group components. + operationId: getServiceUptime + parameters: + - name: slugOrId + in: path + required: true + schema: + type: string + - name: period + in: query + description: Time window + required: false + schema: + type: string + enum: + - 24h + - 7d + - 30d + - 90d + - 1y + - 2y + - all + - name: granularity + in: query + description: Bucket granularity + required: false + schema: + type: string + enum: + - hourly + - daily + - monthly + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseServiceUptimeResponse" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + security: + - BearerAuth: [] + /api/v1/services/incidents: + get: + tags: + - Status Data + summary: List vendor incidents across all services (paginated) + description: Cross-service vendor incident feed ordered by start date descending. + operationId: listCrossServiceIncidents + parameters: + - name: from + in: query + description: Earliest start date (ISO 8601 date) + required: false + schema: + type: string + format: date + - name: status + in: query + description: "Filter: active (unresolved), resolved, or omit for all" + required: false + schema: + type: string + enum: + - active + - resolved + - name: category + in: query + description: Filter by service category + required: false + schema: + type: string + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultServiceIncidentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/services/summary: + get: + tags: + - Status Data + summary: Global status summary across all services + description: Returns aggregate counts of services by status and a list of + services currently experiencing issues. + operationId: getGlobalStatusSummary + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseGlobalStatusSummaryDto" + "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: + get: + tags: + - Status Pages + summary: List status pages for the workspace + operationId: list_4 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "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: Create a status page + operationId: create_5 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateStatusPageRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageDto" + "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}: + get: + tags: + - Status Pages + summary: Get a status page + operationId: get_2 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageDto" + "400": + description: Bad request — the payload failed validation + 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 status page + operationId: update_3 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateStatusPageRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageDto" + "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: Delete a status page + operationId: delete_3 + 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/status-pages/{id}/components: + get: + tags: + - Status Pages + summary: List all components + operationId: listComponents + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageComponentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Status Pages + summary: Add a component to the status page + operationId: createComponent + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateStatusPageComponentRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/components/{componentId}: + put: + tags: + - Status Pages + summary: Update a component + operationId: updateComponent + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: componentId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateStatusPageComponentRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageComponentDto" + "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: Remove a component from the status page + operationId: deleteComponent + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: componentId + in: path + required: true + schema: + type: string + format: uuid + responses: + "204": + description: No Content + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/components/{componentId}/uptime: + get: + tags: + - Status Pages + summary: Get component uptime history (daily rollups) + operationId: componentUptime_1 + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: componentId + in: path + required: true + schema: + type: string + format: uuid + - name: days + in: query + required: false + schema: + type: integer + format: int32 + default: 90 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultComponentUptimeDayDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/components/reorder: + put: + tags: + - Status Pages + summary: Batch reorder components (and optionally move between groups) + operationId: reorderComponents + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ReorderComponentsRequest" + 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/status-pages/{id}/domains: + get: + tags: + - Status Pages + summary: List custom domains + operationId: listDomains + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageCustomDomainDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Status Pages + summary: Add a custom domain + operationId: addDomain + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AddCustomDomainRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/domains/{domainId}: + delete: + tags: + - Status Pages + summary: Remove a custom domain + operationId: removeDomain + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: domainId + 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}/domains/{domainId}/primary: + post: + 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 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/domains/{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 + - name: domainId + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageCustomDomainDto" + "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}/groups: + get: + tags: + - Status Pages + summary: List component groups with nested components + operationId: listGroups + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageComponentGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + post: + tags: + - Status Pages + summary: Create a component group + operationId: createGroup + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateStatusPageComponentGroupRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseStatusPageComponentGroupDto" + "400": + description: Bad request — the payload failed validation + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "401": + description: Unauthorized — missing or invalid credentials + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "403": + description: Forbidden — the actor lacks permission for this resource + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "404": + description: Not found — the requested resource does not exist + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "409": + description: Conflict — the request collides with current resource state + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "500": + description: Internal server error — see the message field for details + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "502": + description: Bad gateway — an upstream provider returned an error + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + "503": + description: Service unavailable — try again shortly + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse" + /api/v1/status-pages/{id}/groups/{groupId}: + put: + tags: + - Status Pages + summary: Update a component group + operationId: updateGroup + parameters: + - name: id + in: path + required: true + schema: + 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" + "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: Delete a component group (components become ungrouped) + operationId: deleteGroup + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: groupId + 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}/incidents: + get: + tags: + - Status Pages + summary: List incidents for this status page (filterable by status, 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" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageIncidentDto" + "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: Create a status page incident (manual) + operationId: createIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateStatusPageIncidentRequest" + 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}/incidents/{incidentId}: + get: + tags: + - Status Pages + summary: Get incident details with timeline + operationId: getIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + 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 an incident + operationId: updateIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + in: path + required: true + schema: + type: string + format: uuid + 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: Delete an incident + operationId: deleteIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + 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}/incidents/{incidentId}/dismiss: + post: + tags: + - Status Pages + summary: Dismiss a draft incident (deletes it permanently) + operationId: dismissIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + 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}/incidents/{incidentId}/publish: + post: + tags: + - Status Pages + summary: Publish a draft incident (sets publishedAt, applies component statuses, + notifies subscribers) + operationId: publishIncident + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + in: path + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/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}/incidents/{incidentId}/updates: + post: + tags: + - Status Pages + summary: Post an incident timeline update + operationId: postIncidentUpdate + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: incidentId + 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}/layout/reorder: + put: + tags: + - Status Pages + 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: + 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 confirmed subscribers (paginated) + operationId: listSubscribers + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + - name: pageable + in: query + required: true + schema: + $ref: "#/components/schemas/Pageable" + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/TableValueResultStatusPageSubscriberDto" + "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 (immediately confirmed, skips double opt-in) + 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" + "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: + - Workspaces + summary: Create workspace + operationId: create_2 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CreateWorkspaceRequest" + required: true + responses: + "201": + description: Created + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseWorkspaceDto" + "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/{workspaceId}: + get: + tags: + - Workspaces + summary: Get workspace by ID + operationId: get + parameters: + - name: workspaceId + in: path + required: true + schema: + type: integer + format: int32 + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseWorkspaceDto" + "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: + - Workspaces + summary: Update workspace + operationId: update + parameters: + - name: workspaceId + in: path + required: true + schema: + type: integer + format: int32 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateWorkspaceRequest" + required: true + responses: + "200": + description: OK + content: + "*/*": + schema: + $ref: "#/components/schemas/SingleValueResponseWorkspaceDto" + "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: + - Workspaces + summary: Delete workspace + operationId: delete + parameters: + - name: workspaceId + 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" +components: + schemas: + AcquireDeployLockRequest: + required: + - lockedBy + type: object + properties: + lockedBy: + minLength: 1 + type: string + description: Identity of the lock requester (e.g. hostname, CI job ID) + ttlMinutes: + type: integer + description: "Lock TTL in minutes (default: 30, max: 60)" + format: int32 + nullable: true + example: 30 + description: Request to acquire a deploy lock for the current workspace + AddCustomDomainRequest: + required: + - hostname + type: object + properties: + hostname: + maxLength: 255 + minLength: 0 + pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$ + type: string + description: Custom hostname, e.g. status.acme.com + AddIncidentUpdateRequest: + type: object + properties: + body: + type: string + description: Update message or post-mortem notes + nullable: true + newStatus: + type: string + description: Updated incident status; null to keep current status + nullable: true + enum: + - WATCHING + - TRIGGERED + - CONFIRMED + - RESOLVED + notifySubscribers: + type: boolean + description: Whether to notify subscribers of this update + required: + - notifySubscribers + AddMonitorTagsRequest: + type: object + properties: + tagIds: + type: array + description: IDs of existing org tags to attach + nullable: true + items: + type: string + description: IDs of existing org tags to attach + format: uuid + newTags: + type: array + description: New tags to create (if not already present) and attach + nullable: true + items: + $ref: "#/components/schemas/NewTagRequest" + description: Request body for adding tags to a monitor. Provide existing tag + IDs, inline new tags, or both. + AddResourceGroupMemberRequest: + required: + - memberId + - memberType + type: object + properties: + memberType: + minLength: 1 + pattern: monitor|service + type: string + description: "Type of member: 'monitor' or 'service'" + memberId: + type: string + description: ID of the monitor or service to add + format: uuid + description: Request body for adding a member to a resource group + AdminAddSubscriberRequest: + required: + - email + type: object + properties: + email: + minLength: 1 + type: string + description: Email address to add as a confirmed subscriber + format: email + AffectedComponent: + required: + - componentId + - status + type: object + properties: + componentId: + type: string + description: Status page component ID + format: uuid + status: + type: string + description: Component status during this incident + enum: + - OPERATIONAL + - DEGRADED_PERFORMANCE + - PARTIAL_OUTAGE + - MAJOR_OUTAGE + - UNDER_MAINTENANCE + description: Updated affected components; null preserves current + AlertChannelDisplayConfig: + type: object + properties: + recipients: + type: array + description: Email recipients list (email channels) + nullable: true + items: + type: string + description: Email recipients list (email channels) + region: + type: string + description: "OpsGenie API region: us or eu" + nullable: true + severityOverride: + type: string + description: PagerDuty severity override (critical, error, warning, info) + nullable: true + mentionRoleId: + type: string + description: Discord role ID to mention in notifications + nullable: true + customHeaders: + type: object + additionalProperties: + type: string + description: Custom HTTP headers for webhook requests + nullable: true + description: Custom HTTP headers for webhook requests + nullable: true + description: Non-sensitive alert channel configuration metadata + AlertChannelDto: + required: + - channelType + - createdAt + - id + - name + - updatedAt + type: object + properties: + id: + type: string + description: Unique alert channel identifier + format: uuid + name: + type: string + description: Human-readable channel name + channelType: + type: string + description: Channel integration type (e.g. SLACK, PAGERDUTY, EMAIL) + enum: + - email + - webhook + - slack + - pagerduty + - opsgenie + - teams + - discord + displayConfig: + nullable: true + allOf: + - $ref: "#/components/schemas/AlertChannelDisplayConfig" + createdAt: + type: string + description: Timestamp when the channel was created + format: date-time + updatedAt: + type: string + description: Timestamp when the channel was last updated + format: date-time + configHash: + type: string + description: SHA-256 hash of the channel config; use for change detection + nullable: true + lastDeliveryAt: + type: string + description: Timestamp of the most recent delivery attempt + format: date-time + nullable: true + lastDeliveryStatus: + type: string + description: Outcome of the most recent delivery (SUCCESS, FAILED, etc.) + nullable: true + description: Alert channel with non-sensitive configuration metadata + AlertDeliveryDto: + required: + - channel + - channelId + - channelType + - createdAt + - eventType + - id + - incidentId + - status + - stepNumber + - fireCount + - attemptCount + type: object + properties: + id: + type: string + format: uuid + incidentId: + type: string + description: Incident that triggered this delivery + format: uuid + dispatchId: + type: string + description: Notification dispatch that created this delivery + format: uuid + nullable: true + channelId: + type: string + description: Alert channel ID + format: uuid + channel: + type: string + description: Human-readable channel name + channelType: + type: string + description: Alert channel type (e.g. slack, email, webhook) + status: + type: string + description: Current delivery status + enum: + - PENDING + - DELIVERED + - RETRY_PENDING + - FAILED + - CANCELLED + eventType: + type: string + description: Incident lifecycle event that triggered this delivery + enum: + - INCIDENT_CREATED + - INCIDENT_RESOLVED + - INCIDENT_REOPENED + stepNumber: + type: integer + description: 1-based escalation step this delivery belongs to + format: int32 + fireCount: + type: integer + description: "Fire sequence within the step: 1 = initial, 2+ = repeat re-fires" + format: int32 + 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: Timestamp when the delivery was confirmed (null if not yet delivered) + format: date-time + nullable: true + errorMessage: + type: string + description: Error message from the last failed attempt + nullable: true + createdAt: + type: string + format: date-time + description: Delivery record for a single channel within a notification dispatch + ApiKeyAuthConfig: + required: + - type + - headerName + type: object + properties: + type: + type: string + enum: + - api_key + headerName: + minLength: 1 + pattern: ^[A-Za-z0-9\-_]+$ + type: string + description: HTTP header name that carries the API key + vaultSecretId: + type: string + description: Vault secret ID for the API key value + format: uuid + nullable: true + ApiKeyCreateResponse: + required: + - createdAt + - key + - name + - id + type: object + properties: + id: + type: integer + description: Unique API key identifier + format: int32 + name: + minLength: 1 + type: string + description: Human-readable name for this API key + key: + minLength: 1 + type: string + description: Full API key value in dh_live_* format; store this now + createdAt: + type: string + description: Timestamp when the key was created + format: date-time + expiresAt: + type: string + description: Timestamp when the key expires; null if no expiration + format: date-time + nullable: true + description: Created API key with the full key value — store it now, it won't be + shown again + ApiKeyDto: + required: + - createdAt + - key + - name + - updatedAt + - id + type: object + properties: + id: + type: integer + description: Unique API key identifier + format: int32 + name: + minLength: 1 + type: string + description: Human-readable name for this API key + key: + minLength: 1 + type: string + description: Full API key value in dh_live_* format + createdAt: + type: string + description: Timestamp when the key was created + format: date-time + updatedAt: + type: string + description: Timestamp when the key was last updated + format: date-time + lastUsedAt: + type: string + description: Timestamp of the most recent API call; null if never used + format: date-time + nullable: true + revokedAt: + type: string + description: Timestamp when the key was revoked; null if active + format: date-time + nullable: true + expiresAt: + type: string + description: Timestamp when the key expires; null if no expiration + format: date-time + nullable: true + description: API key for programmatic access to the DevHelm API + AssertionResultDto: + required: + - severity + - type + - passed + type: object + properties: + type: + type: string + description: Assertion type + example: status_code + passed: + type: boolean + description: Whether the assertion passed + severity: + type: string + description: Assertion severity + enum: + - fail + - warn + message: + type: string + description: Human-readable result message + nullable: true + expected: + type: string + description: Expected value + nullable: true + example: "200" + actual: + type: string + description: Actual value observed + nullable: true + example: "503" + description: Result of evaluating a single assertion against a check result + AssertionTestResultDto: + required: + - assertionType + - message + - severity + - passed + type: object + properties: + assertionType: + type: string + description: Assertion type evaluated + enum: + - status_code + - response_time + - body_contains + - json_path + - header_value + - regex_body + - dns_resolves + - dns_response_time + - dns_expected_ips + - dns_expected_cname + - dns_record_contains + - dns_record_equals + - dns_txt_contains + - dns_min_answers + - dns_max_answers + - dns_response_time_warn + - dns_ttl_low + - dns_ttl_high + - mcp_connects + - mcp_response_time + - mcp_has_capability + - mcp_tool_available + - mcp_min_tools + - mcp_protocol_version + - mcp_response_time_warn + - mcp_tool_count_changed + - ssl_expiry + - response_size + - redirect_count + - redirect_target + - response_time_warn + - tcp_connects + - tcp_response_time + - tcp_response_time_warn + - icmp_reachable + - icmp_response_time + - icmp_response_time_warn + - icmp_packet_loss + - heartbeat_received + - heartbeat_max_interval + - heartbeat_interval_drift + - heartbeat_payload_contains + passed: + type: boolean + description: Whether the assertion passed + severity: + type: string + description: "Assertion severity: FAIL or WARN" + enum: + - fail + - warn + message: + type: string + description: Human-readable result description + expected: + type: string + description: Expected value + nullable: true + actual: + type: string + description: Actual value observed during the test + nullable: true + AuditEventDto: + required: + - action + - createdAt + - id + type: object + properties: + id: + type: integer + description: Unique audit event identifier + format: int64 + actorId: + type: integer + description: User ID who performed the action; null for system actions + format: int32 + nullable: true + actorEmail: + type: string + description: Email of the actor; null for system actions + nullable: true + action: + type: string + description: Audit action type (e.g. monitor.created, api_key.revoked) + resourceType: + type: string + description: Type of resource affected (e.g. monitor, api_key) + nullable: true + resourceId: + type: string + description: ID of the affected resource + nullable: true + resourceName: + type: string + description: Human-readable name of the affected resource + nullable: true + metadata: + type: object + additionalProperties: + type: object + description: Additional context about the action + nullable: true + description: Additional context about the action + nullable: true + createdAt: + type: string + description: Timestamp when the action was performed + format: date-time + AuthMeResponse: + required: + - key + - organization + - plan + - rateLimits + type: object + properties: + key: + $ref: "#/components/schemas/KeyInfo" + organization: + $ref: "#/components/schemas/OrgInfo" + plan: + $ref: "#/components/schemas/PlanInfo" + rateLimits: + $ref: "#/components/schemas/RateLimitInfo" + description: Identity, organization, plan, and rate-limit info for the + authenticated API key + BasicAuthConfig: + type: object + properties: + type: + type: string + enum: + - basic + vaultSecretId: + type: string + description: Vault secret ID holding Basic auth username and password + format: uuid + nullable: true + required: + - type + BatchComponentUptimeDto: + required: + - components + type: object + properties: + components: + type: object + additionalProperties: + type: array + description: Map of component ID → list of per-day uptime entries (oldest → + newest) + items: + $ref: "#/components/schemas/ComponentUptimeDayDto" + description: Map of component ID → list of per-day uptime entries (oldest → + newest) + description: Batch daily uptime per component, keyed by component ID + BearerAuthConfig: + type: object + properties: + type: + type: string + enum: + - bearer + vaultSecretId: + type: string + description: Vault secret ID holding the bearer token value + format: uuid + nullable: true + required: + - type + BodyContainsAssertion: + required: + - type + - substring + type: object + properties: + type: + type: string + enum: + - body_contains + substring: + minLength: 1 + type: string + description: Substring that must appear in the response body + BulkMonitorActionRequest: + required: + - action + - monitorIds + type: object + properties: + monitorIds: + maxItems: 200 + minItems: 0 + type: array + description: IDs of monitors to act on (max 200) + items: + type: string + description: IDs of monitors to act on (max 200) + format: uuid + action: + type: string + description: Action to apply to every monitor in the bulk request + enum: + - PAUSE + - RESUME + - DELETE + - ADD_TAG + - REMOVE_TAG + tagIds: + type: array + description: Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG) + nullable: true + items: + type: string + description: Tag IDs to attach or detach (required for ADD_TAG and REMOVE_TAG) + format: uuid + newTags: + type: array + description: New tags to create and attach (only for ADD_TAG) + nullable: true + items: + $ref: "#/components/schemas/NewTagRequest" + description: Request body for performing a bulk action on multiple monitors + BulkMonitorActionResult: + required: + - failed + - succeeded + type: object + properties: + succeeded: + type: array + description: IDs of monitors on which the action succeeded + items: + type: string + description: IDs of monitors on which the action succeeded + format: uuid + failed: + type: array + description: Monitors on which the action failed, with the reason for each failure + items: + $ref: "#/components/schemas/FailureDetail" + description: Result of a bulk monitor action, including partial-success details + CategoryDto: + required: + - category + - serviceCount + type: object + properties: + category: + type: string + description: Category name (e.g. CI/CD, Cloud, Payments) + serviceCount: + type: integer + description: Number of services in this category + format: int64 + description: Service category with its count of catalog entries + ChangeRoleRequest: + required: + - orgRole + type: object + properties: + orgRole: + type: string + description: New role to assign + enum: + - OWNER + - ADMIN + - MEMBER + description: Update an organization member's role + ChangeStatusRequest: + required: + - status + type: object + properties: + status: + type: string + description: New membership status (ACTIVE or SUSPENDED) + enum: + - INVITED + - ACTIVE + - SUSPENDED + - LEFT + - REMOVED + - DECLINED + description: Update an organization member's status + ChartBucketDto: + required: + - bucket + type: object + properties: + bucket: + type: string + description: Start of the time bucket (ISO 8601) + format: date-time + example: 2026-03-12T10:00:00Z + uptimePercent: + type: number + description: Uptime percentage for this bucket; null when no data + format: double + nullable: true + example: 100 + avgLatencyMs: + type: number + description: Weighted average latency in milliseconds for this bucket + format: double + nullable: true + example: 120.3 + p95LatencyMs: + type: number + description: 95th percentile latency in milliseconds (max across regions) + format: double + nullable: true + example: 250 + p99LatencyMs: + type: number + description: 99th percentile latency in milliseconds (max across regions) + format: double + nullable: true + example: 480 + description: Aggregated metrics for a time bucket + CheckResultDetailsDto: + type: object + properties: + statusCode: + type: integer + description: HTTP status code of the response + format: int32 + nullable: true + example: 200 + responseHeaders: + type: object + additionalProperties: + type: array + description: HTTP response headers + nullable: true + items: + type: string + description: HTTP response headers + nullable: true + description: HTTP response headers + nullable: true + responseBodySnapshot: + type: string + description: Raw response body snapshot (may be HTML, XML, JSON, or plain text) + nullable: true + assertionResults: + type: array + description: Individual assertion evaluation results + nullable: true + items: + $ref: "#/components/schemas/AssertionResultDto" + tlsInfo: + nullable: true + allOf: + - $ref: "#/components/schemas/TlsInfoDto" + redirectCount: + type: integer + description: Number of HTTP redirects followed + format: int32 + nullable: true + example: 2 + redirectTarget: + type: string + description: Final URL after redirects + nullable: true + responseSizeBytes: + type: integer + description: Response body size in bytes + format: int32 + nullable: true + example: 4096 + checkDetails: + nullable: true + allOf: + - $ref: "#/components/schemas/CheckTypeDetailsDto" + description: Type-specific details captured during a check execution + CheckResultDto: + required: + - id + - region + - timestamp + - passed + type: object + properties: + id: + type: string + description: Unique identifier of the check result + format: uuid + timestamp: + type: string + description: Timestamp when the check was executed (ISO 8601) + format: date-time + region: + type: string + description: Region where the check was executed + example: us-east + responseTimeMs: + type: integer + description: Response time in milliseconds + format: int32 + nullable: true + example: 123 + passed: + type: boolean + description: Whether the check passed + example: true + failureReason: + type: string + description: Reason for failure when passed=false + nullable: true + severityHint: + type: string + description: "Severity hint: 'down' for hard failures, 'degraded' for warn-only + failures, null when passing" + nullable: true + details: + nullable: true + allOf: + - $ref: "#/components/schemas/CheckResultDetailsDto" + checkId: + type: string + description: Unique execution trace ID for cross-service correlation + format: uuid + nullable: true + description: A single check result from a monitor run + CheckTypeDetailsDto: + description: Check-type-specific details — polymorphic by check_type discriminator + discriminator: + propertyName: check_type + mapping: + http: "#/components/schemas/Http" + tcp: "#/components/schemas/Tcp" + icmp: "#/components/schemas/Icmp" + dns: "#/components/schemas/Dns" + mcp_server: "#/components/schemas/McpServer" + oneOf: + - $ref: "#/components/schemas/Http" + - $ref: "#/components/schemas/Tcp" + - $ref: "#/components/schemas/Icmp" + - $ref: "#/components/schemas/Dns" + - $ref: "#/components/schemas/McpServer" + ComponentImpact: + required: + - componentId + - componentName + - uptimePercentage + - partialOutageSeconds + - majorOutageSeconds + type: object + properties: + componentId: + type: string + description: Status page component UUID + format: uuid + componentName: + type: string + description: Component display name + groupName: + type: string + description: Parent group display name when the component belongs to a group + nullable: true + uptimePercentage: + type: number + description: Computed uptime % for this component on this day + format: double + partialOutageSeconds: + type: integer + description: Seconds of partial outage observed on this day + format: int32 + majorOutageSeconds: + type: integer + description: Seconds of major outage observed on this day + format: int32 + description: One component's uptime contribution for the day + ComponentPosition: + required: + - componentId + - displayOrder + type: object + properties: + componentId: + type: string + description: Component ID + format: uuid + displayOrder: + type: integer + description: New display order (0-based) + format: int32 + groupId: + type: string + description: Target group ID, null for ungrouped + format: uuid + nullable: true + description: A single component position + ComponentsSummaryDto: + required: + - groupComponentCounts + - includedCount + - totalCount + type: object + properties: + totalCount: + type: integer + description: Total active components for this service across all groups + format: int32 + includedCount: + type: integer + description: Number of components actually returned in the inline ``components`` + list + format: int32 + groupComponentCounts: + type: object + additionalProperties: + type: integer + description: Per-group active leaf count, keyed by group component id (UUID + stringified). Empty when the service has no groups; lets the UI + render "show all N" affordances without a second round trip + format: int32 + description: Per-group active leaf count, keyed by group component id (UUID + stringified). Empty when the service has no groups; lets the UI + render "show all N" affordances without a second round trip + ComponentStatusDto: + required: + - id + - name + - status + type: object + properties: + id: + type: string + description: Component UUID + name: + type: string + description: Human-readable component name + status: + type: string + description: Current component status, e.g. operational, degraded_performance + description: Current status of each active component + ComponentUptimeDayDto: + required: + - date + - partialOutageSeconds + - majorOutageSeconds + - degradedSeconds + - uptimePercentage + type: object + properties: + date: + type: string + description: Start-of-day timestamp for this bucket (UTC midnight, ISO 8601) + format: date-time + partialOutageSeconds: + type: integer + description: Seconds of partial outage observed on this day + format: int32 + majorOutageSeconds: + type: integer + description: Seconds of major outage observed on this day + format: int32 + degradedSeconds: + type: integer + description: Seconds the component spent in degraded performance on this day + format: int32 + uptimePercentage: + type: number + description: Computed uptime percentage using the weighted formula (degraded + does not lower it) + format: double + incidents: + type: array + description: Incidents that overlapped this day, in display order + nullable: true + items: + $ref: "#/components/schemas/IncidentRef" + description: Daily uptime data for a component + ComponentUptimeSummaryDto: + required: + - source + type: object + properties: + day: + type: number + description: Uptime percentage over the last 24 hours + format: double + nullable: true + example: 99.95 + week: + type: number + description: Uptime percentage over the last 7 days + format: double + nullable: true + example: 99.98 + month: + type: number + description: Uptime percentage over the last 30 days + format: double + nullable: true + example: 99.92 + source: + type: string + description: "Data source: vendor_reported or incident_derived" + example: vendor_reported + description: Inline uptime percentages for 24h, 7d, 30d + ConfirmationPolicy: + required: + - type + - minRegionsFailing + - maxWaitSeconds + type: object + properties: + type: + type: string + description: How incident confirmation is coordinated across regions + enum: + - multi_region + minRegionsFailing: + type: integer + description: Minimum failing regions required to confirm an incident + format: int32 + maxWaitSeconds: + type: integer + description: Maximum seconds to wait for enough regions to fail after first + trigger + format: int32 + description: Multi-region confirmation settings + CreateAlertChannelRequest: + required: + - config + - name + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Human-readable name for this alert channel + config: + oneOf: + - $ref: "#/components/schemas/DiscordChannelConfig" + - $ref: "#/components/schemas/EmailChannelConfig" + - $ref: "#/components/schemas/OpsGenieChannelConfig" + - $ref: "#/components/schemas/PagerDutyChannelConfig" + - $ref: "#/components/schemas/SlackChannelConfig" + - $ref: "#/components/schemas/TeamsChannelConfig" + - $ref: "#/components/schemas/WebhookChannelConfig" + CreateApiKeyRequest: + required: + - name + type: object + properties: + name: + maxLength: 200 + minLength: 0 + type: string + description: Human-readable name to identify this API key + expiresAt: + type: string + description: Optional expiration timestamp in ISO 8601 format + format: date-time + nullable: true + CreateAssertionRequest: + required: + - config + type: object + properties: + config: + oneOf: + - $ref: "#/components/schemas/BodyContainsAssertion" + - $ref: "#/components/schemas/DnsExpectedCnameAssertion" + - $ref: "#/components/schemas/DnsExpectedIpsAssertion" + - $ref: "#/components/schemas/DnsMaxAnswersAssertion" + - $ref: "#/components/schemas/DnsMinAnswersAssertion" + - $ref: "#/components/schemas/DnsRecordContainsAssertion" + - $ref: "#/components/schemas/DnsRecordEqualsAssertion" + - $ref: "#/components/schemas/DnsResolvesAssertion" + - $ref: "#/components/schemas/DnsResponseTimeAssertion" + - $ref: "#/components/schemas/DnsResponseTimeWarnAssertion" + - $ref: "#/components/schemas/DnsTtlHighAssertion" + - $ref: "#/components/schemas/DnsTtlLowAssertion" + - $ref: "#/components/schemas/DnsTxtContainsAssertion" + - $ref: "#/components/schemas/HeaderValueAssertion" + - $ref: "#/components/schemas/HeartbeatIntervalDriftAssertion" + - $ref: "#/components/schemas/HeartbeatMaxIntervalAssertion" + - $ref: "#/components/schemas/HeartbeatPayloadContainsAssertion" + - $ref: "#/components/schemas/HeartbeatReceivedAssertion" + - $ref: "#/components/schemas/IcmpPacketLossAssertion" + - $ref: "#/components/schemas/IcmpReachableAssertion" + - $ref: "#/components/schemas/IcmpResponseTimeAssertion" + - $ref: "#/components/schemas/IcmpResponseTimeWarnAssertion" + - $ref: "#/components/schemas/JsonPathAssertion" + - $ref: "#/components/schemas/McpConnectsAssertion" + - $ref: "#/components/schemas/McpHasCapabilityAssertion" + - $ref: "#/components/schemas/McpMinToolsAssertion" + - $ref: "#/components/schemas/McpProtocolVersionAssertion" + - $ref: "#/components/schemas/McpResponseTimeAssertion" + - $ref: "#/components/schemas/McpResponseTimeWarnAssertion" + - $ref: "#/components/schemas/McpToolAvailableAssertion" + - $ref: "#/components/schemas/McpToolCountChangedAssertion" + - $ref: "#/components/schemas/RedirectCountAssertion" + - $ref: "#/components/schemas/RedirectTargetAssertion" + - $ref: "#/components/schemas/RegexBodyAssertion" + - $ref: "#/components/schemas/ResponseSizeAssertion" + - $ref: "#/components/schemas/ResponseTimeAssertion" + - $ref: "#/components/schemas/ResponseTimeWarnAssertion" + - $ref: "#/components/schemas/SslExpiryAssertion" + - $ref: "#/components/schemas/StatusCodeAssertion" + - $ref: "#/components/schemas/TcpConnectsAssertion" + - $ref: "#/components/schemas/TcpResponseTimeAssertion" + - $ref: "#/components/schemas/TcpResponseTimeWarnAssertion" + severity: + type: string + description: "Outcome severity: FAIL (fails the check) or WARN (warns without + failing, default: FAIL)" + nullable: true + enum: + - fail + - warn + description: Replace all assertions; null preserves current + CreateEnvironmentRequest: + required: + - name + - slug + type: object + properties: + name: + maxLength: 100 + minLength: 0 + type: string + description: Human-readable environment name + slug: + maxLength: 100 + minLength: 0 + pattern: ^[a-z0-9][a-z0-9_-]*$ + type: string + description: URL-safe identifier (lowercase alphanumeric, hyphens, underscores) + variables: + type: object + additionalProperties: + type: string + description: Initial key-value variable pairs for this environment + nullable: true + description: Initial key-value variable pairs for this environment + nullable: true + isDefault: + type: boolean + description: "Whether this is the default environment for new monitors (default: + false)" + nullable: true + CreateInviteRequest: + required: + - email + - roleOffered + type: object + properties: + email: + minLength: 1 + type: string + description: Email address to invite + format: email + roleOffered: + type: string + description: Role to assign on acceptance + enum: + - OWNER + - ADMIN + - MEMBER + description: Invite a new member to the organization by email + CreateMaintenanceWindowRequest: + required: + - endsAt + - startsAt + type: object + properties: + monitorId: + type: string + description: Monitor to attach this maintenance window to; null for org-wide + format: uuid + nullable: true + startsAt: + type: string + description: Scheduled start of the maintenance window (ISO 8601) + format: date-time + endsAt: + type: string + description: Scheduled end of the maintenance window (ISO 8601) + format: date-time + repeatRule: + maxLength: 100 + minLength: 0 + type: string + description: iCal RRULE for recurring windows (max 100 chars); null for one-time + nullable: true + reason: + type: string + description: Human-readable reason for the maintenance + nullable: true + suppressAlerts: + type: boolean + description: "Whether to suppress alerts during this window (default: true)" + nullable: true + CreateManualIncidentRequest: + required: + - severity + - title + type: object + properties: + title: + minLength: 1 + type: string + description: Short summary of the incident + severity: + type: string + description: "Incident severity: DOWN, DEGRADED, or MAINTENANCE" + enum: + - DOWN + - DEGRADED + - MAINTENANCE + monitorId: + type: string + description: Monitor to associate with this incident + format: uuid + nullable: true + body: + type: string + description: Detailed description or context for the incident + nullable: true + CreateMonitorRequest: + required: + - config + - managedBy + - name + - type + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Human-readable name for this monitor + type: + type: string + description: Monitor protocol type + enum: + - HTTP + - DNS + - MCP_SERVER + - TCP + - ICMP + - HEARTBEAT + config: + oneOf: + - $ref: "#/components/schemas/DnsMonitorConfig" + - $ref: "#/components/schemas/HeartbeatMonitorConfig" + - $ref: "#/components/schemas/HttpMonitorConfig" + - $ref: "#/components/schemas/IcmpMonitorConfig" + - $ref: "#/components/schemas/McpServerMonitorConfig" + - $ref: "#/components/schemas/TcpMonitorConfig" + frequencySeconds: + type: integer + description: Check frequency in seconds (30–86400); null defaults to plan + minimum (60s on most paid plans) + format: int32 + nullable: true + enabled: + type: boolean + description: "Whether the monitor is active (default: true)" + nullable: true + regions: + type: array + description: Probe regions to run checks from, e.g. us-east, eu-west + nullable: true + items: + type: string + description: Probe regions to run checks from, e.g. us-east, eu-west + managedBy: + type: string + description: "Who manages this monitor: DASHBOARD or CLI" + enum: + - DASHBOARD + - CLI + - TERRAFORM + environmentId: + type: string + description: Environment to associate with this monitor + format: uuid + nullable: true + assertions: + type: array + description: Assertions to evaluate against each check result + nullable: true + items: + $ref: "#/components/schemas/CreateAssertionRequest" + auth: + nullable: true + allOf: + - $ref: "#/components/schemas/MonitorAuthConfig" + incidentPolicy: + nullable: true + allOf: + - $ref: "#/components/schemas/UpdateIncidentPolicyRequest" + alertChannelIds: + type: array + description: Alert channels to notify when this monitor triggers + nullable: true + items: + type: string + description: Alert channels to notify when this monitor triggers + format: uuid + tags: + nullable: true + allOf: + - $ref: "#/components/schemas/AddMonitorTagsRequest" + CreateNotificationPolicyRequest: + required: + - escalation + - name + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Human-readable name for this policy + matchRules: + type: array + description: Match rules to evaluate (all must pass; omit or empty for catch-all) + nullable: true + items: + $ref: "#/components/schemas/MatchRule" + escalation: + $ref: "#/components/schemas/EscalationChain" + enabled: + type: boolean + description: Whether this policy is enabled (default true) + nullable: true + default: true + priority: + type: integer + description: Evaluation priority; higher value = evaluated first (default 0) + format: int32 + nullable: true + default: 0 + description: Request body for creating a notification policy + CreateResourceGroupRequest: + required: + - name + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Human-readable name for this group + description: + type: string + description: Optional description + nullable: true + alertPolicyId: + type: string + description: Optional notification policy to apply for this group + format: uuid + nullable: true + defaultFrequency: + maximum: 86400 + minimum: 30 + type: integer + description: Default check frequency in seconds applied to members (30–86400) + format: int32 + nullable: true + defaultRegions: + type: array + description: Default regions applied to member monitors + nullable: true + items: + type: string + description: Default regions applied to member monitors + defaultRetryStrategy: + nullable: true + allOf: + - $ref: "#/components/schemas/RetryStrategy" + defaultAlertChannels: + type: array + description: Default alert channel IDs applied to member monitors + nullable: true + items: + type: string + description: Default alert channel IDs applied to member monitors + format: uuid + defaultEnvironmentId: + type: string + description: Default environment ID applied to member monitors + format: uuid + nullable: true + healthThresholdType: + type: string + description: "Health threshold type: COUNT or PERCENTAGE" + nullable: true + enum: + - COUNT + - PERCENTAGE + healthThresholdValue: + maximum: 100 + exclusiveMaximum: false + minimum: 0 + exclusiveMinimum: false + type: number + description: "Health threshold value: count (0+) or percentage (0–100)" + nullable: true + suppressMemberAlerts: + type: boolean + description: Suppress member-level alert notifications when group manages alerting + nullable: true + confirmationDelaySeconds: + maximum: 600 + minimum: 0 + type: integer + description: Confirmation delay in seconds before group incident creation (0–600) + format: int32 + nullable: true + recoveryCooldownMinutes: + maximum: 60 + minimum: 0 + type: integer + description: Recovery cooldown in minutes after group incident resolves (0–60) + format: int32 + nullable: true + description: Request body for creating a resource group + CreateSecretRequest: + required: + - key + - value + type: object + properties: + key: + maxLength: 255 + minLength: 0 + type: string + description: Unique secret key within the workspace (max 255 chars) + value: + maxLength: 32768 + minLength: 0 + type: string + description: Secret value, stored encrypted (max 32KB) + CreateStatusPageComponentGroupRequest: + required: + - name + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Group display name + description: + maxLength: 500 + minLength: 0 + type: string + description: Optional group description + nullable: true + displayOrder: + type: integer + description: Position in the group list + format: int32 + nullable: true + defaultOpen: + type: boolean + description: "Initial expand/collapse state when a visitor first loads the page; + renderer may auto-expand on active incidents (default: true)" + nullable: true + CreateStatusPageComponentRequest: + required: + - name + - type + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Component display name + description: + maxLength: 500 + minLength: 0 + type: string + description: Optional description shown on expand + nullable: true + type: + type: string + description: "Component type: MONITOR, GROUP, or STATIC" + enum: + - MONITOR + - GROUP + - STATIC + monitorId: + type: string + description: Monitor ID (required when type=MONITOR) + format: uuid + nullable: true + resourceGroupId: + type: string + description: Resource group ID (required when type=GROUP) + format: uuid + nullable: true + groupId: + type: string + description: Component group ID for visual grouping + format: uuid + nullable: true + showUptime: + type: boolean + description: "Whether to show the uptime bar (default: true)" + nullable: true + displayOrder: + type: integer + description: Position in the component list + format: int32 + nullable: true + excludeFromOverall: + type: boolean + description: "Exclude from overall status calculation (default: false, use true + for third-party deps)" + nullable: true + startDate: + type: string + description: 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 + format: date + nullable: true + CreateStatusPageIncidentRequest: + required: + - body + - impact + - title + type: object + properties: + title: + maxLength: 500 + minLength: 0 + type: string + description: Customer-facing incident 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 incident + 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 + scheduledUntil: + type: string + description: Maintenance end time + format: date-time + nullable: true + autoResolve: + type: boolean + description: "Auto-resolve at scheduledUntil (default: false)" + nullable: true + 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)" + nullable: true + affectedComponents: + type: array + description: Updated affected components; null preserves current + nullable: true + items: + $ref: "#/components/schemas/AffectedComponent" + CreateStatusPageRequest: + required: + - name + - slug + type: object + properties: + name: + maxLength: 255 + minLength: 0 + type: string + description: Human-readable name for this status page + slug: + maxLength: 63 + minLength: 3 + pattern: ^[a-z0-9][a-z0-9-]*[a-z0-9]$ + type: string + description: URL slug (lowercase, hyphens, globally unique) + description: + maxLength: 500 + minLength: 0 + type: string + description: Optional description shown below the page header + nullable: true + branding: + nullable: true + allOf: + - $ref: "#/components/schemas/StatusPageBranding" + visibility: + type: string + description: "Page visibility: PUBLIC, PASSWORD, or IP_RESTRICTED (default: + PUBLIC)" + nullable: true + enum: + - PUBLIC + - PASSWORD + - IP_RESTRICTED + enabled: + type: boolean + description: "Whether the page is enabled (default: true)" + nullable: true + incidentMode: + type: string + description: "Incident mode: MANUAL, REVIEW, or AUTOMATIC (default: AUTOMATIC)" + nullable: true + enum: + - MANUAL + - REVIEW + - AUTOMATIC + CreateTagRequest: + required: + - name + type: object + properties: + name: + maxLength: 100 + minLength: 0 + type: string + description: Tag name, unique within the org + color: + pattern: ^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$ + type: string + description: "Hex color code (defaults to #6B7280 if omitted)" + nullable: true + description: Request body for creating a tag + CreateWebhookEndpointRequest: + required: + - subscribedEvents + - url + type: object + properties: + url: + maxLength: 2048 + minLength: 0 + type: string + description: HTTPS endpoint that receives webhook event payloads + description: + maxLength: 255 + minLength: 0 + type: string + description: Optional human-readable description + nullable: true + subscribedEvents: + minItems: 1 + type: array + description: Event types to deliver + items: + minLength: 1 + type: string + enum: + - monitor.created + - monitor.updated + - monitor.deleted + - incident.created + - incident.resolved + - incident.reopened + - service.status_changed + - service.component_changed + - service.incident_created + - service.incident_updated + - service.incident_resolved + CreateWorkspaceRequest: + required: + - name + type: object + properties: + name: + minLength: 1 + type: string + description: Workspace name + description: Create a new workspace within the organization + CursorPageCheckResultDto: + required: + - data + - hasMore + type: object + properties: + data: + type: array + description: Items on this page + items: + $ref: "#/components/schemas/CheckResultDto" + 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 + - hasMore + type: object + properties: + data: + type: array + description: Items on this page + items: + $ref: "#/components/schemas/ServiceCatalogDto" + 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 + CursorPageServicePollResultDto: + required: + - data + - hasMore + type: object + properties: + data: + type: array + description: Items on this page + items: + $ref: "#/components/schemas/ServicePollResultDto" + 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 + - monitors + type: object + properties: + monitors: + $ref: "#/components/schemas/MonitorsSummaryDto" + incidents: + $ref: "#/components/schemas/IncidentsSummaryDto" + description: Combined dashboard overview for monitors and incidents + DayIncident: + required: + - affectedComponentNames + - id + - impact + - status + - title + - scheduled + type: object + properties: + id: + type: string + description: Status page incident UUID + format: uuid + title: + type: string + description: Incident title + status: + type: string + description: Lifecycle status (investigating, identified, monitoring, resolved, …) + enum: + - INVESTIGATING + - IDENTIFIED + - MONITORING + - RESOLVED + impact: + type: string + description: Severity bucket (none, minor, major, critical) + enum: + - NONE + - MINOR + - MAJOR + - CRITICAL + scheduled: + type: boolean + description: True for scheduled maintenances; false for unplanned incidents + startedAt: + type: string + description: Incident start timestamp + format: date-time + nullable: true + resolvedAt: + type: string + description: Incident resolved timestamp; null while still active + format: date-time + nullable: true + affectedComponentNames: + type: array + description: Display names of components affected by this incident (deduplicated) + items: + type: string + description: Display names of components affected by this incident + (deduplicated) + description: Incident that overlapped the day + DekRotationResultDto: + required: + - rotatedAt + - previousDekVersion + - newDekVersion + - secretsReEncrypted + - channelsReEncrypted + type: object + properties: + previousDekVersion: + type: integer + description: DEK version before rotation + format: int32 + newDekVersion: + type: integer + description: DEK version after rotation + format: int32 + secretsReEncrypted: + type: integer + description: Number of secrets re-encrypted with the new DEK + format: int32 + channelsReEncrypted: + type: integer + description: Number of alert channels re-encrypted with the new DEK + format: int32 + rotatedAt: + type: string + description: Timestamp when the rotation was performed + format: date-time + description: Result of a data encryption key rotation operation + DeleteChannelResult: + type: object + properties: + affectedPolicies: + type: integer + description: Number of notification policies whose escalation steps were modified + format: int32 + disabledPolicies: + type: integer + description: Number of notification policies disabled because they had no + remaining channels + format: int32 + description: Summary of policies affected by channel deletion + required: + - affectedPolicies + - disabledPolicies + DeliveryAttemptDto: + required: + - attemptedAt + - deliveryId + - id + - status + - attemptNumber + type: object + properties: + id: + type: string + format: uuid + deliveryId: + type: string + format: uuid + attemptNumber: + type: integer + description: 1-based attempt number + format: int32 + status: + type: string + description: "Outcome: SUCCESS, FAILED, TIMEOUT, ERROR" + responseStatusCode: + type: integer + description: HTTP response status code from the external service + format: int32 + nullable: true + requestPayload: + type: string + description: JSON payload sent to the external service + nullable: true + responseBody: + type: string + description: Response body from the external service (truncated) + nullable: true + errorMessage: + type: string + description: Error message if the attempt failed + nullable: true + responseTimeMs: + type: integer + description: Round-trip time in milliseconds + format: int32 + nullable: true + externalId: + type: string + description: External identifier (e.g. PagerDuty dedup_key, SES MessageId, + webhook delivery UUID) + nullable: true + requestHeaders: + type: object + additionalProperties: + type: string + description: HTTP request headers sent to the external service + nullable: true + description: HTTP request headers sent to the external service + nullable: true + attemptedAt: + type: string + format: date-time + description: Single delivery attempt with request/response audit data + DeployLockDto: + required: + - expiresAt + - id + - lockedAt + - lockedBy + type: object + properties: + id: + type: string + description: Unique lock identifier + format: uuid + lockedBy: + minLength: 1 + type: string + description: Identity of the lock holder (e.g. CLI session ID, username) + lockedAt: + type: string + description: Timestamp when the lock was acquired + format: date-time + expiresAt: + type: string + description: Timestamp when the lock automatically expires + format: date-time + description: Represents an active deploy lock for a workspace + DiscordChannelConfig: + required: + - channelType + - webhookUrl + type: object + properties: + channelType: + type: string + enum: + - discord + webhookUrl: + minLength: 1 + type: string + description: Discord webhook URL + mentionRoleId: + type: string + description: Optional Discord role ID to mention in notifications + nullable: true + Dns: + type: object + description: DNS check-type-specific details + properties: + check_type: + type: string + enum: + - dns + hostname: + type: string + description: Target hostname + nullable: true + requestedTypes: + type: array + description: Requested DNS record types + nullable: true + items: + type: string + description: Requested DNS record types + nullable: true + usedResolver: + type: string + description: Resolver used for lookup + nullable: true + records: + type: object + additionalProperties: + type: array + description: Resolved DNS records keyed by record type + nullable: true + items: + type: object + additionalProperties: + type: object + description: Resolved DNS records keyed by record type + nullable: true + description: Resolved DNS records keyed by record type + nullable: true + description: Resolved DNS records keyed by record type + nullable: true + attempts: + type: array + description: DNS resolution attempts + nullable: true + items: + type: object + additionalProperties: + type: object + description: DNS resolution attempts + nullable: true + description: DNS resolution attempts + nullable: true + failureKind: + type: string + description: Kind of DNS failure, if any + nullable: true + required: + - check_type + DnsExpectedCnameAssertion: + required: + - type + - value + type: object + properties: + type: + type: string + enum: + - dns_expected_cname + value: + minLength: 1 + type: string + description: Expected CNAME target the resolution must include + DnsExpectedIpsAssertion: + required: + - type + - ips + type: object + properties: + type: + type: string + enum: + - dns_expected_ips + ips: + minItems: 1 + type: array + description: Allowed IP addresses; at least one resolved address must match + items: + type: string + description: Allowed IP addresses; at least one resolved address must match + DnsMaxAnswersAssertion: + required: + - type + - recordType + - max + type: object + properties: + type: + type: string + enum: + - dns_max_answers + recordType: + minLength: 1 + type: string + description: DNS record type whose answer count is checked + max: + type: integer + description: Maximum number of answers allowed for that record type + format: int32 + DnsMinAnswersAssertion: + required: + - type + - recordType + - min + type: object + properties: + type: + type: string + enum: + - dns_min_answers + recordType: + minLength: 1 + type: string + description: DNS record type whose answer count is checked + min: + type: integer + description: Minimum number of answers required for that record type + format: int32 + DnsMonitorConfig: + required: + - hostname + type: object + properties: + hostname: + minLength: 1 + type: string + description: Domain name to resolve + recordTypes: + type: array + description: "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, + CAA, PTR" + nullable: true + items: + type: string + description: "DNS record types to query: A, AAAA, CNAME, MX, NS, TXT, SRV, SOA, + CAA, PTR" + nullable: true + enum: + - A + - AAAA + - CNAME + - MX + - NS + - TXT + - SRV + - SOA + - CAA + - PTR + nameservers: + type: array + description: Custom nameservers to query (uses system defaults if omitted) + nullable: true + items: + type: string + description: Custom nameservers to query (uses system defaults if omitted) + nullable: true + timeoutMs: + type: integer + description: Per-query timeout in milliseconds + format: int32 + nullable: true + totalTimeoutMs: + type: integer + description: Total timeout for all queries in milliseconds + format: int32 + nullable: true + DnsRecordContainsAssertion: + required: + - type + - recordType + - substring + type: object + properties: + type: + type: string + enum: + - dns_record_contains + recordType: + minLength: 1 + type: string + description: DNS record type to assert on (A, AAAA, CNAME, MX, TXT) + substring: + minLength: 1 + type: string + description: Substring that must appear in a matching record value + DnsRecordEqualsAssertion: + required: + - type + - recordType + - value + type: object + properties: + type: + type: string + enum: + - dns_record_equals + recordType: + minLength: 1 + type: string + description: DNS record type to assert on (A, AAAA, CNAME, MX, TXT) + value: + minLength: 1 + type: string + description: Expected DNS record value for an exact match + DnsResolvesAssertion: + type: object + properties: + type: + type: string + enum: + - dns_resolves + required: + - type + DnsResponseTimeAssertion: + type: object + properties: + type: + type: string + enum: + - dns_response_time + maxMs: + type: integer + description: Maximum allowed DNS resolution time in milliseconds + format: int32 + required: + - type + - maxMs + DnsResponseTimeWarnAssertion: + type: object + properties: + type: + type: string + enum: + - dns_response_time_warn + warnMs: + type: integer + description: DNS resolution time in milliseconds that triggers a warning only + format: int32 + required: + - type + - warnMs + DnsTtlHighAssertion: + type: object + properties: + type: + type: string + enum: + - dns_ttl_high + maxTtl: + type: integer + description: Maximum TTL in seconds before a high-TTL warning is raised + format: int32 + required: + - type + - maxTtl + DnsTtlLowAssertion: + type: object + properties: + type: + type: string + enum: + - dns_ttl_low + minTtl: + type: integer + description: Minimum acceptable TTL in seconds before a warning is raised + format: int32 + required: + - type + - minTtl + DnsTxtContainsAssertion: + required: + - type + - substring + type: object + properties: + type: + type: string + enum: + - dns_txt_contains + substring: + minLength: 1 + type: string + description: Substring that must appear in at least one TXT record + EmailChannelConfig: + required: + - channelType + - recipients + type: object + properties: + channelType: + type: string + enum: + - email + recipients: + minItems: 1 + type: array + description: Email addresses to send notifications to + items: + type: string + description: Email addresses to send notifications to + format: email + EntitlementDto: + required: + - key + - value + - defaultValue + - overridden + type: object + properties: + key: + type: string + description: Entitlement key + value: + type: integer + description: Effective limit value (overrides applied) + format: int64 + defaultValue: + type: integer + description: Plan-tier default value before overrides + format: int64 + overridden: + type: boolean + description: Whether this entitlement has an org-level override + description: A single resolved entitlement for the organization + EnvironmentDto: + required: + - createdAt + - id + - name + - slug + - updatedAt + - variables + - orgId + - monitorCount + - isDefault + type: object + properties: + id: + type: string + description: Unique environment identifier + format: uuid + orgId: + type: integer + description: Organization this environment belongs to + format: int32 + name: + minLength: 1 + type: string + description: Human-readable environment name + slug: + minLength: 1 + type: string + description: URL-safe identifier + variables: + type: object + additionalProperties: + type: string + description: Key-value variable pairs available for interpolation + description: Key-value variable pairs available for interpolation + createdAt: + type: string + description: Timestamp when the environment was created + format: date-time + updatedAt: + type: string + description: Timestamp when the environment was last updated + format: date-time + monitorCount: + type: integer + description: Number of monitors using this environment + format: int32 + isDefault: + type: boolean + description: Whether this is the default environment for new monitors + description: Environment with variable substitutions for monitor configs + ErrorResponse: + required: + - code + - message + - status + - timestamp + type: object + properties: + status: + type: integer + description: HTTP status code (mirrors the response status line) + format: int32 + example: 404 + code: + type: string + description: Coarse machine-readable error category (e.g. NOT_FOUND, + RATE_LIMITED); stable per status + example: NOT_FOUND + message: + type: string + description: Human-readable error message; safe to surface to end users + example: Monitor not found + timestamp: + type: integer + description: Server time when the error was produced (epoch milliseconds) + format: int64 + example: 1737302400000 + requestId: + type: string + description: Opaque per-request id; same value as the X-Request-Id response + header. Use in support tickets. + nullable: true + example: 5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a + description: Uniform error envelope returned for every non-2xx response + example: + status: 404 + code: NOT_FOUND + message: Monitor not found + timestamp: 1737302400000 + requestId: 5b6f7a8c-1234-4d5e-9f0a-1b2c3d4e5f6a + EscalationChain: + required: + - steps + type: object + properties: + steps: + minItems: 1 + type: array + description: Ordered escalation steps, evaluated in sequence + items: + $ref: "#/components/schemas/EscalationStep" + onResolve: + type: string + description: Action when the incident resolves + nullable: true + onReopen: + type: string + description: Action when a resolved incident reopens + nullable: true + description: Escalation chain defining which channels to notify; null preserves + current + EscalationStep: + required: + - channelIds + - delayMinutes + type: object + properties: + delayMinutes: + minimum: 0 + type: integer + description: Minutes to wait before executing this step (0 = immediate) + format: int32 + channelIds: + minItems: 1 + type: array + description: Alert channel IDs to notify in this step + items: + type: string + description: Alert channel IDs to notify in this step + format: uuid + requireAck: + type: boolean + description: Whether an acknowledgment is required before escalating + nullable: true + repeatIntervalSeconds: + minimum: 1 + type: integer + description: Repeat notification interval in seconds until acknowledged + format: int32 + nullable: true + description: Ordered escalation steps, evaluated in sequence + FailureDetail: + required: + - monitorId + - reason + type: object + properties: + monitorId: + type: string + description: Monitor ID that failed + format: uuid + reason: + type: string + description: Human-readable reason for the failure + description: Details about a single monitor that failed the bulk action + GlobalStatusSummaryDto: + required: + - servicesWithIssues + - totalServices + - operationalCount + - degradedCount + - partialOutageCount + - majorOutageCount + - maintenanceCount + - unknownCount + - activeIncidentCount + type: object + properties: + totalServices: + type: integer + description: Total number of services in the catalog + format: int32 + operationalCount: + type: integer + description: Number of services currently fully operational + format: int32 + degradedCount: + type: integer + description: Number of services with degraded status + format: int32 + partialOutageCount: + type: integer + description: Number of services with partial outage + format: int32 + majorOutageCount: + type: integer + description: Number of services with major outage + format: int32 + maintenanceCount: + type: integer + description: Number of services currently under maintenance + format: int32 + unknownCount: + type: integer + description: Number of services with unknown or null status + format: int32 + activeIncidentCount: + type: integer + description: Total number of active incidents across all services + format: int64 + servicesWithIssues: + type: array + description: Services that are not fully operational + items: + $ref: "#/components/schemas/ServiceCatalogDto" + description: Global status summary across all subscribed vendor services + GroupComponentOrder: + required: + - groupId + - positions + type: object + properties: + groupId: + type: string + description: Group these components belong to + format: uuid + positions: + minItems: 1 + type: array + description: Ordered component IDs with their within-group display order + items: + $ref: "#/components/schemas/ComponentPosition" + description: Component ordering within a single group + HeaderAuthConfig: + required: + - type + - headerName + type: object + properties: + type: + type: string + enum: + - header + headerName: + minLength: 1 + pattern: ^[A-Za-z0-9\-_]+$ + type: string + description: Custom HTTP header name for the secret value + vaultSecretId: + type: string + description: Vault secret ID for the header value + format: uuid + nullable: true + HeaderValueAssertion: + required: + - type + - headerName + - expected + - operator + type: object + properties: + type: + type: string + enum: + - header_value + headerName: + minLength: 1 + type: string + description: HTTP header name to assert on + expected: + minLength: 1 + type: string + description: Expected value to compare against + operator: + type: string + description: Comparison operator (equals, contains, less_than, greater_than, etc.) + enum: + - equals + - contains + - less_than + - greater_than + - matches + - range + HeartbeatIntervalDriftAssertion: + required: + - type + - maxDeviationPercent + type: object + properties: + type: + type: string + enum: + - heartbeat_interval_drift + maxDeviationPercent: + maximum: 100 + minimum: 1 + type: integer + description: Max percent drift from expected ping interval before warning + (non-fatal) + format: int32 + HeartbeatMaxIntervalAssertion: + required: + - type + - maxSeconds + type: object + properties: + type: + type: string + enum: + - heartbeat_max_interval + maxSeconds: + minimum: 1 + type: integer + description: Maximum allowed gap in seconds between consecutive heartbeat pings + format: int32 + HeartbeatMonitorConfig: + required: + - expectedInterval + - gracePeriod + type: object + properties: + expectedInterval: + maximum: 86400 + minimum: 1 + type: integer + description: Expected heartbeat interval in seconds + format: int32 + gracePeriod: + minimum: 1 + type: integer + description: Grace period in seconds before marking as down + format: int32 + HeartbeatPayloadContainsAssertion: + required: + - type + - path + - value + type: object + properties: + type: + type: string + enum: + - heartbeat_payload_contains + path: + minLength: 1 + type: string + description: JSONPath expression into the heartbeat ping JSON payload + value: + type: string + description: Expected value to compare against at that path + HeartbeatPingResponse: + required: + - ok + type: object + properties: + ok: + type: boolean + description: Always true on a 2xx response + example: true + description: Acknowledgement that a heartbeat ping was accepted + HeartbeatReceivedAssertion: + type: object + properties: + type: + type: string + enum: + - heartbeat_received + required: + - type + Http: + type: object + description: HTTP check-type-specific details + properties: + check_type: + type: string + enum: + - http + timing: + type: object + additionalProperties: + type: object + description: Request phase timing breakdown + nullable: true + description: Request phase timing breakdown + nullable: true + bodyTruncated: + type: boolean + description: Whether the response body was truncated before storage + nullable: true + required: + - check_type + HttpMonitorConfig: + required: + - method + - url + type: object + properties: + url: + minLength: 1 + type: string + description: Target URL to send requests to + method: + type: string + description: "HTTP method: GET, POST, PUT, PATCH, DELETE, or HEAD" + enum: + - GET + - POST + - PUT + - PATCH + - DELETE + - HEAD + customHeaders: + type: object + additionalProperties: + type: string + description: Additional HTTP headers to include in requests + nullable: true + description: Additional HTTP headers to include in requests + nullable: true + requestBody: + type: string + description: Request body content for POST/PUT/PATCH methods + nullable: true + contentType: + type: string + description: Content-Type header value for the request body + nullable: true + verifyTls: + type: boolean + description: "Whether to verify TLS certificates (default: true)" + nullable: true + Icmp: + required: + - check_type + - host + type: object + description: ICMP (ping) check-type-specific details + properties: + check_type: + type: string + enum: + - icmp + host: + type: string + description: Target host + example: 1.1.1.1 + packetsSent: + type: integer + description: Number of ICMP packets sent + format: int32 + nullable: true + packetsReceived: + type: integer + description: Number of ICMP packets received + format: int32 + nullable: true + packetLoss: + type: number + description: Packet loss percentage + format: double + nullable: true + example: 0 + avgRttMs: + type: number + description: Average round-trip time in ms + format: double + nullable: true + minRttMs: + type: number + description: Minimum round-trip time in ms + format: double + nullable: true + maxRttMs: + type: number + description: Maximum round-trip time in ms + format: double + nullable: true + jitterMs: + type: number + description: Jitter in ms + format: double + nullable: true + IcmpMonitorConfig: + required: + - host + type: object + properties: + host: + minLength: 1 + type: string + description: Target hostname or IP address to ping + packetCount: + maximum: 20 + minimum: 1 + type: integer + description: Number of ICMP packets to send + format: int32 + nullable: true + timeoutMs: + type: integer + description: Ping timeout in milliseconds + format: int32 + nullable: true + IcmpPacketLossAssertion: + type: object + properties: + type: + type: string + enum: + - icmp_packet_loss + maxPercent: + maximum: 100 + exclusiveMaximum: false + minimum: 0 + exclusiveMinimum: false + type: number + description: Maximum allowed packet loss percentage before the check fails (0–100) + format: double + required: + - type + - maxPercent + IcmpReachableAssertion: + type: object + properties: + type: + type: string + enum: + - icmp_reachable + required: + - type + IcmpResponseTimeAssertion: + type: object + properties: + type: + type: string + enum: + - icmp_response_time + maxMs: + type: integer + description: Maximum average ICMP round-trip time in milliseconds + format: int32 + required: + - type + - maxMs + IcmpResponseTimeWarnAssertion: + type: object + properties: + type: + type: string + enum: + - icmp_response_time_warn + warnMs: + type: integer + description: ICMP round-trip time in milliseconds that triggers a warning only + format: int32 + required: + - type + - warnMs + IncidentDetailDto: + required: + - incident + - updates + type: object + properties: + incident: + $ref: "#/components/schemas/IncidentDto" + updates: + type: array + items: + $ref: "#/components/schemas/IncidentUpdateDto" + statusPageIncidents: + type: array + nullable: true + items: + $ref: "#/components/schemas/LinkedStatusPageIncidentDto" + IncidentDto: + required: + - affectedRegions + - createdAt + - id + - severity + - source + - status + - updatedAt + - organizationId + - reopenCount + - statusPageVisible + type: object + properties: + id: + type: string + description: Unique incident identifier + format: uuid + monitorId: + type: string + description: Monitor that triggered the incident; null for service or manual + incidents + format: uuid + nullable: true + organizationId: + type: integer + description: Organization this incident belongs to + format: int32 + source: + type: string + description: "Incident origin: MONITOR, SERVICE, or MANUAL" + enum: + - AUTOMATIC + - MANUAL + - MONITORS + - STATUS_DATA + - RESOURCE_GROUP + status: + type: string + description: Current lifecycle status (OPEN, RESOLVED, etc.) + enum: + - WATCHING + - TRIGGERED + - CONFIRMED + - RESOLVED + severity: + type: string + description: "Severity level: DOWN, DEGRADED, or MAINTENANCE" + enum: + - DOWN + - DEGRADED + - MAINTENANCE + title: + type: string + description: Short summary of the incident; null for auto-generated incidents + nullable: true + triggeredByRule: + type: string + description: Human-readable description of the trigger rule that fired + nullable: true + affectedRegions: + type: array + description: Probe regions that observed the failure + items: + type: string + description: Probe regions that observed the failure + reopenCount: + type: integer + description: Number of times this incident has been reopened + format: int32 + createdByUserId: + type: integer + description: User who created the incident (manual incidents only) + format: int32 + nullable: true + statusPageVisible: + type: boolean + description: Whether this incident is visible on the status page + serviceIncidentId: + type: string + description: Linked vendor service incident ID; null for monitor incidents + format: uuid + nullable: true + serviceId: + type: string + description: Linked service catalog ID; null for monitor incidents + format: uuid + nullable: true + externalRef: + type: string + description: External reference ID (e.g. PagerDuty incident ID) + nullable: true + affectedComponents: + type: array + description: Service components affected by this incident + nullable: true + items: + type: string + description: Service components affected by this incident + shortlink: + type: string + description: Short URL linking to the incident details + nullable: true + resolutionReason: + type: string + description: How the incident was resolved (AUTO_RECOVERED, MANUAL, etc.) + nullable: true + enum: + - MANUAL + - AUTO_RECOVERED + - AUTO_RESOLVED + startedAt: + type: string + description: Timestamp when the incident was detected or created + format: date-time + nullable: true + confirmedAt: + type: string + description: Timestamp when the incident was confirmed (multi-region confirmation) + format: date-time + nullable: true + resolvedAt: + type: string + description: Timestamp when the incident was resolved + format: date-time + nullable: true + cooldownUntil: + type: string + description: Cooldown window end; new incidents suppressed until this time + format: date-time + nullable: true + createdAt: + type: string + description: Timestamp when the incident record was created + format: date-time + updatedAt: + type: string + description: Timestamp when the incident was last updated + format: date-time + monitorName: + type: string + description: Name of the associated monitor; populated on list responses. + Omitted from JSON (undefined to SDKs) on detail responses, treat + missing as null. + nullable: true + serviceName: + type: string + description: Name of the associated service; populated on list responses. + Omitted from JSON (undefined to SDKs) on detail responses, treat + missing as null. + nullable: true + serviceSlug: + type: string + description: Slug of the associated service; populated on list responses. + Omitted from JSON (undefined to SDKs) on detail responses, treat + missing as null. + nullable: true + monitorType: + type: string + description: Type of the associated monitor; populated on list responses. + Omitted from JSON (undefined to SDKs) on detail responses, treat + missing as null. + nullable: true + resourceGroupId: + type: string + description: Resource group that owns this incident; null when not group-managed + format: uuid + nullable: true + resourceGroupName: + type: string + description: Name of the resource group; populated on list responses. Omitted + from JSON (undefined to SDKs) on detail responses, treat missing as + null. + nullable: true + description: Incident triggered by a monitor check failure or manual creation + IncidentFilterParams: + type: object + properties: + status: + type: string + description: Filter by incident lifecycle status; null returns every status + nullable: true + enum: + - WATCHING + - TRIGGERED + - CONFIRMED + - RESOLVED + severity: + type: string + description: Filter by severity; null returns every severity + nullable: true + enum: + - DOWN + - DEGRADED + - MAINTENANCE + source: + type: string + description: Filter by where the incident originated (auto, manual, third-party) + nullable: true + enum: + - AUTOMATIC + - MANUAL + - MONITORS + - STATUS_DATA + - RESOURCE_GROUP + monitorId: + type: string + description: Only return incidents tied to this monitor ID + format: uuid + nullable: true + serviceId: + type: string + description: Only return incidents tied to this service ID (third-party services) + format: uuid + nullable: true + resourceGroupId: + type: string + description: Only return incidents whose monitor belongs to this resource group + format: uuid + nullable: true + tagId: + type: string + description: Only return incidents whose monitor carries this tag + format: uuid + nullable: true + environmentId: + type: string + description: Only return incidents whose monitor lives in this environment + format: uuid + nullable: true + startedFrom: + type: string + description: Earliest startedAt to include (inclusive, ISO 8601) + format: date-time + nullable: true + startedTo: + type: string + description: Latest startedAt to include (inclusive, ISO 8601) + format: date-time + nullable: true + page: + minimum: 0 + type: integer + description: "Zero-based page index (default: 0)" + format: int32 + example: 0 + size: + maximum: 200 + minimum: 1 + type: integer + description: "Number of incidents per page (1–200, default: 10)" + format: int32 + example: 10 + required: + - page + - size + IncidentPolicyDto: + required: + - confirmation + - createdAt + - id + - monitorId + - recovery + - triggerRules + - updatedAt + type: object + properties: + id: + type: string + description: Unique incident policy identifier + format: uuid + monitorId: + type: string + description: Monitor this policy is attached to + format: uuid + triggerRules: + type: array + description: Array of trigger rules defining when an incident should be raised + items: + $ref: "#/components/schemas/TriggerRule" + confirmation: + $ref: "#/components/schemas/ConfirmationPolicy" + recovery: + $ref: "#/components/schemas/RecoveryPolicy" + createdAt: + type: string + description: Timestamp when the policy was created + format: date-time + updatedAt: + type: string + description: Timestamp when the policy was last updated + format: date-time + monitorRegionCount: + type: integer + description: Number of regions configured on the monitor (only set in internal + API responses) + format: int32 + nullable: true + checkFrequencySeconds: + type: integer + description: Monitor check frequency in seconds (only set in internal API + responses) + format: int32 + nullable: true + description: Incident detection, confirmation, and recovery policy for a monitor + IncidentRef: + required: + - id + - impact + - title + type: object + properties: + id: + type: string + description: Internal incident ID — UUID for status-page incidents, service + incident UUID for catalog + format: uuid + title: + type: string + description: Incident title at the time of the overlap + impact: + type: string + description: Incident impact level (e.g. minor, major, critical for catalog; + NONE/MINOR/MAJOR/CRITICAL for status pages) + description: Lightweight reference to an incident overlapping a given uptime day + IncidentsSummaryDto: + type: object + properties: + active: + type: integer + format: int64 + resolvedToday: + type: integer + format: int64 + mttr30d: + type: number + format: double + nullable: true + description: Incident summary counters + required: + - active + - resolvedToday + IncidentUpdateDto: + required: + - createdAt + - id + - incidentId + - notifySubscribers + type: object + properties: + id: + type: string + format: uuid + incidentId: + type: string + format: uuid + oldStatus: + type: string + nullable: true + enum: + - WATCHING + - TRIGGERED + - CONFIRMED + - RESOLVED + newStatus: + type: string + nullable: true + enum: + - WATCHING + - TRIGGERED + - CONFIRMED + - RESOLVED + body: + type: string + nullable: true + createdBy: + type: string + nullable: true + enum: + - SYSTEM + - USER + notifySubscribers: + type: boolean + createdAt: + type: string + format: date-time + IntegrationConfigSchemaDto: + required: + - channelFields + - connectionFields + type: object + properties: + connectionFields: + type: array + items: + $ref: "#/components/schemas/IntegrationFieldDto" + channelFields: + type: array + items: + $ref: "#/components/schemas/IntegrationFieldDto" + IntegrationDto: + required: + - authType + - configSchema + - description + - lifecycle + - logoUrl + - name + - setupGuideUrl + - tierAvailability + - type + type: object + properties: + type: + type: string + name: + type: string + description: + type: string + logoUrl: + type: string + authType: + type: string + tierAvailability: + type: string + enum: + - FREE + - STARTER + - PRO + - TEAM + - BUSINESS + - ENTERPRISE + lifecycle: + type: string + setupGuideUrl: + type: string + configSchema: + $ref: "#/components/schemas/IntegrationConfigSchemaDto" + IntegrationFieldDto: + required: + - key + - label + - required + - sensitive + - type + type: object + properties: + key: + type: string + label: + type: string + type: + type: string + required: + type: boolean + sensitive: + type: boolean + placeholder: + type: string + nullable: true + helpText: + type: string + nullable: true + options: + type: array + nullable: true + items: + type: string + default: + type: string + nullable: true + InviteDto: + required: + - email + - expiresAt + - roleOffered + - inviteId + type: object + properties: + inviteId: + type: integer + description: Unique invite identifier + format: int32 + email: + type: string + description: Email address the invite was sent to + roleOffered: + type: string + description: Role that will be assigned to the invitee on acceptance + enum: + - OWNER + - ADMIN + - MEMBER + expiresAt: + type: string + description: Timestamp when the invite expires + format: date-time + consumedAt: + type: string + description: Timestamp when the invite was accepted; null if not yet used + format: date-time + nullable: true + revokedAt: + type: string + description: Timestamp when the invite was revoked; null if active + format: date-time + nullable: true + description: Organization invite sent to an email address + JsonPathAssertion: + required: + - type + - path + - expected + - operator + type: object + properties: + type: + type: string + enum: + - json_path + path: + minLength: 1 + type: string + description: JSONPath expression to extract a value from the response body + expected: + minLength: 1 + type: string + description: Expected value to compare against + operator: + type: string + description: Comparison operator (equals, contains, less_than, greater_than, etc.) + enum: + - equals + - contains + - less_than + - greater_than + - matches + - range + KeyInfo: + required: + - createdAt + - name + - id + type: object + properties: + id: + type: integer + description: Key ID + format: int32 + name: + type: string + description: Human-readable key name + createdAt: + type: string + description: When the key was created + format: date-time + expiresAt: + type: string + description: When the key expires (null = never) + format: date-time + nullable: true + lastUsedAt: + type: string + description: Last time the key was used + format: date-time + nullable: true + description: API key metadata + LinkedStatusPageIncidentDto: + required: + - id + - impact + - status + - statusPageId + - statusPageName + - statusPageSlug + - title + - scheduled + type: object + properties: + id: + type: string + format: uuid + statusPageId: + type: string + format: uuid + statusPageName: + type: string + statusPageSlug: + type: string + title: + type: string + status: + type: string + enum: + - INVESTIGATING + - IDENTIFIED + - MONITORING + - RESOLVED + impact: + type: string + enum: + - NONE + - MINOR + - MAJOR + - CRITICAL + scheduled: + type: boolean + publishedAt: + type: string + format: date-time + nullable: true + MaintenanceComponentRef: + required: + - id + - name + - status + type: object + properties: + id: + type: string + description: Component identifier + format: uuid + name: + type: string + description: Component name + status: + type: string + description: Component status at the time of the maintenance update + description: A component affected by a scheduled maintenance window + MaintenanceUpdateDto: + required: + - id + - status + type: object + properties: + id: + type: string + description: Unique update identifier + format: uuid + status: + type: string + description: Status at the time of this update + body: + type: string + description: Update message from the vendor + nullable: true + displayAt: + type: string + description: Timestamp when this update was posted + format: date-time + nullable: true + description: A status update within a scheduled maintenance lifecycle + MaintenanceWindowDto: + required: + - createdAt + - endsAt + - id + - startsAt + - organizationId + - suppressAlerts + type: object + properties: + id: + type: string + description: Unique maintenance window identifier + format: uuid + monitorId: + type: string + description: Monitor this window applies to; null for org-wide windows + format: uuid + nullable: true + organizationId: + type: integer + description: Organization this maintenance window belongs to + format: int32 + startsAt: + type: string + description: Scheduled start of the maintenance window + format: date-time + endsAt: + type: string + description: Scheduled end of the maintenance window + format: date-time + repeatRule: + type: string + description: iCal RRULE for recurring windows; null for one-time + nullable: true + reason: + type: string + description: Human-readable reason for the maintenance + nullable: true + suppressAlerts: + type: boolean + description: Whether alerts are suppressed during this window + createdAt: + type: string + description: Timestamp when the window was created + format: date-time + description: Scheduled maintenance window for a monitor + MatchRule: + required: + - type + type: object + properties: + type: + type: string + description: Rule type used to evaluate incidents and status events + enum: + - severity_gte + - monitor_id_in + - region_in + - incident_status + - monitor_type_in + - service_id_in + - resource_group_id_in + - component_name_in + - monitor_tag_in + value: + type: string + description: Comparison value for single-value rules like severity_gte + nullable: true + monitorIds: + type: array + description: Monitor UUIDs to match for monitor_id_in rules + nullable: true + items: + type: string + description: Monitor UUIDs to match for monitor_id_in rules + format: uuid + regions: + type: array + description: Region codes to match for region_in rules + nullable: true + items: + type: string + description: Region codes to match for region_in rules + values: + type: array + description: Values list for multi-value rules like monitor_type_in + nullable: true + items: + type: string + description: Values list for multi-value rules like monitor_type_in + description: Match rules to evaluate (all must pass; omit or empty for catch-all) + McpConnectsAssertion: + type: object + properties: + type: + type: string + enum: + - mcp_connects + required: + - type + McpHasCapabilityAssertion: + required: + - type + - capability + type: object + properties: + type: + type: string + enum: + - mcp_has_capability + capability: + minLength: 1 + type: string + description: Capability name the server must advertise, e.g. tools or resources + McpMinToolsAssertion: + type: object + properties: + type: + type: string + enum: + - mcp_min_tools + min: + type: integer + description: Minimum number of tools the server must expose + format: int32 + required: + - type + - min + McpProtocolVersionAssertion: + required: + - type + - version + type: object + properties: + type: + type: string + enum: + - mcp_protocol_version + version: + minLength: 1 + type: string + description: Expected MCP protocol version string from the server handshake + McpResponseTimeAssertion: + type: object + properties: + type: + type: string + enum: + - mcp_response_time + maxMs: + type: integer + description: Maximum allowed MCP check duration in milliseconds + format: int32 + required: + - type + - maxMs + McpResponseTimeWarnAssertion: + type: object + properties: + type: + type: string + enum: + - mcp_response_time_warn + warnMs: + type: integer + description: MCP check duration in milliseconds that triggers a warning only + format: int32 + required: + - type + - warnMs + McpServer: + type: object + description: MCP server check-type-specific details + properties: + check_type: + type: string + enum: + - mcp_server + url: + type: string + description: MCP server URL + nullable: true + protocolVersion: + type: string + description: MCP protocol version + nullable: true + serverInfo: + type: object + additionalProperties: + type: object + description: MCP server info (name, version, etc.) + nullable: true + description: MCP server info (name, version, etc.) + nullable: true + toolCount: + type: integer + description: Number of tools exposed + format: int32 + nullable: true + resourceCount: + type: integer + description: Number of resources exposed + format: int32 + nullable: true + promptCount: + type: integer + description: Number of prompts exposed + format: int32 + nullable: true + required: + - check_type + McpServerMonitorConfig: + required: + - command + type: object + properties: + command: + minLength: 1 + type: string + description: Command to execute to start the MCP server + args: + type: array + description: Command-line arguments for the MCP server process + nullable: true + items: + type: string + description: Command-line arguments for the MCP server process + nullable: true + env: + type: object + additionalProperties: + type: string + description: Environment variables to pass to the MCP server process + nullable: true + description: Environment variables to pass to the MCP server process + nullable: true + McpToolAvailableAssertion: + required: + - type + - toolName + type: object + properties: + type: + type: string + enum: + - mcp_tool_available + toolName: + minLength: 1 + type: string + description: MCP tool name that must appear in the server's tool list + McpToolCountChangedAssertion: + type: object + properties: + type: + type: string + enum: + - mcp_tool_count_changed + expectedCount: + type: integer + description: Expected tool count; warns when the live count differs + format: int32 + required: + - type + - expectedCount + MemberDto: + required: + - createdAt + - email + - orgRole + - status + - userId + type: object + properties: + userId: + type: integer + description: User identifier of the member + format: int32 + email: + type: string + description: Member email address + name: + type: string + description: Member display name; null if not set + nullable: true + orgRole: + type: string + description: Member role within this organization (OWNER, ADMIN, MEMBER) + enum: + - OWNER + - ADMIN + - MEMBER + status: + type: string + description: Membership status (ACTIVE, PENDING, SUSPENDED) + enum: + - INVITED + - ACTIVE + - SUSPENDED + - LEFT + - REMOVED + - DECLINED + createdAt: + type: string + description: Timestamp when the member was added to the organization + format: date-time + description: Organization member with role and status + MonitorAssertionDto: + required: + - assertionType + - config + - id + - monitorId + - severity + type: object + properties: + id: + type: string + format: uuid + monitorId: + type: string + format: uuid + assertionType: + type: string + enum: + - status_code + - response_time + - body_contains + - json_path + - header_value + - regex_body + - dns_resolves + - dns_response_time + - dns_expected_ips + - dns_expected_cname + - dns_record_contains + - dns_record_equals + - dns_txt_contains + - dns_min_answers + - dns_max_answers + - dns_response_time_warn + - dns_ttl_low + - dns_ttl_high + - mcp_connects + - mcp_response_time + - mcp_has_capability + - mcp_tool_available + - mcp_min_tools + - mcp_protocol_version + - mcp_response_time_warn + - mcp_tool_count_changed + - ssl_expiry + - response_size + - redirect_count + - redirect_target + - response_time_warn + - tcp_connects + - tcp_response_time + - tcp_response_time_warn + - icmp_reachable + - icmp_response_time + - icmp_response_time_warn + - icmp_packet_loss + - heartbeat_received + - heartbeat_max_interval + - heartbeat_interval_drift + - heartbeat_payload_contains + config: + oneOf: + - $ref: "#/components/schemas/BodyContainsAssertion" + - $ref: "#/components/schemas/DnsExpectedCnameAssertion" + - $ref: "#/components/schemas/DnsExpectedIpsAssertion" + - $ref: "#/components/schemas/DnsMaxAnswersAssertion" + - $ref: "#/components/schemas/DnsMinAnswersAssertion" + - $ref: "#/components/schemas/DnsRecordContainsAssertion" + - $ref: "#/components/schemas/DnsRecordEqualsAssertion" + - $ref: "#/components/schemas/DnsResolvesAssertion" + - $ref: "#/components/schemas/DnsResponseTimeAssertion" + - $ref: "#/components/schemas/DnsResponseTimeWarnAssertion" + - $ref: "#/components/schemas/DnsTtlHighAssertion" + - $ref: "#/components/schemas/DnsTtlLowAssertion" + - $ref: "#/components/schemas/DnsTxtContainsAssertion" + - $ref: "#/components/schemas/HeaderValueAssertion" + - $ref: "#/components/schemas/HeartbeatIntervalDriftAssertion" + - $ref: "#/components/schemas/HeartbeatMaxIntervalAssertion" + - $ref: "#/components/schemas/HeartbeatPayloadContainsAssertion" + - $ref: "#/components/schemas/HeartbeatReceivedAssertion" + - $ref: "#/components/schemas/IcmpPacketLossAssertion" + - $ref: "#/components/schemas/IcmpReachableAssertion" + - $ref: "#/components/schemas/IcmpResponseTimeAssertion" + - $ref: "#/components/schemas/IcmpResponseTimeWarnAssertion" + - $ref: "#/components/schemas/JsonPathAssertion" + - $ref: "#/components/schemas/McpConnectsAssertion" + - $ref: "#/components/schemas/McpHasCapabilityAssertion" + - $ref: "#/components/schemas/McpMinToolsAssertion" + - $ref: "#/components/schemas/McpProtocolVersionAssertion" + - $ref: "#/components/schemas/McpResponseTimeAssertion" + - $ref: "#/components/schemas/McpResponseTimeWarnAssertion" + - $ref: "#/components/schemas/McpToolAvailableAssertion" + - $ref: "#/components/schemas/McpToolCountChangedAssertion" + - $ref: "#/components/schemas/RedirectCountAssertion" + - $ref: "#/components/schemas/RedirectTargetAssertion" + - $ref: "#/components/schemas/RegexBodyAssertion" + - $ref: "#/components/schemas/ResponseSizeAssertion" + - $ref: "#/components/schemas/ResponseTimeAssertion" + - $ref: "#/components/schemas/ResponseTimeWarnAssertion" + - $ref: "#/components/schemas/SslExpiryAssertion" + - $ref: "#/components/schemas/StatusCodeAssertion" + - $ref: "#/components/schemas/TcpConnectsAssertion" + - $ref: "#/components/schemas/TcpResponseTimeAssertion" + - $ref: "#/components/schemas/TcpResponseTimeWarnAssertion" + severity: + type: string + enum: + - fail + - warn + MonitorAuthConfig: + description: New authentication configuration (full replacement) + discriminator: + propertyName: type + mapping: + bearer: "#/components/schemas/BearerAuthConfig" + basic: "#/components/schemas/BasicAuthConfig" + header: "#/components/schemas/HeaderAuthConfig" + api_key: "#/components/schemas/ApiKeyAuthConfig" + oneOf: + - $ref: "#/components/schemas/BearerAuthConfig" + - $ref: "#/components/schemas/BasicAuthConfig" + - $ref: "#/components/schemas/HeaderAuthConfig" + - $ref: "#/components/schemas/ApiKeyAuthConfig" + MonitorAuthDto: + required: + - authType + - config + - id + - monitorId + type: object + properties: + id: + type: string + format: uuid + monitorId: + type: string + format: uuid + authType: + type: string + enum: + - bearer + - basic + - header + - api_key + config: + oneOf: + - $ref: "#/components/schemas/ApiKeyAuthConfig" + - $ref: "#/components/schemas/BasicAuthConfig" + - $ref: "#/components/schemas/BearerAuthConfig" + - $ref: "#/components/schemas/HeaderAuthConfig" + MonitorDto: + required: + - config + - createdAt + - id + - managedBy + - name + - regions + - type + - updatedAt + - organizationId + - frequencySeconds + - enabled + type: object + properties: + id: + type: string + description: Unique monitor identifier + format: uuid + organizationId: + type: integer + description: Organization this monitor belongs to + format: int32 + name: + minLength: 1 + type: string + description: Human-readable name for this monitor + type: + type: string + enum: + - HTTP + - DNS + - MCP_SERVER + - TCP + - ICMP + - HEARTBEAT + config: + oneOf: + - $ref: "#/components/schemas/DnsMonitorConfig" + - $ref: "#/components/schemas/HeartbeatMonitorConfig" + - $ref: "#/components/schemas/HttpMonitorConfig" + - $ref: "#/components/schemas/IcmpMonitorConfig" + - $ref: "#/components/schemas/McpServerMonitorConfig" + - $ref: "#/components/schemas/TcpMonitorConfig" + frequencySeconds: + type: integer + description: Check frequency in seconds (30–86400) + format: int32 + enabled: + type: boolean + description: Whether the monitor is active + regions: + type: array + description: Probe regions where checks are executed + items: + type: string + description: Probe regions where checks are executed + managedBy: + type: string + description: "Management source: DASHBOARD or CLI" + enum: + - DASHBOARD + - CLI + - TERRAFORM + createdAt: + type: string + description: Timestamp when the monitor was created + format: date-time + updatedAt: + type: string + description: Timestamp when the monitor was last updated + format: date-time + assertions: + type: array + description: Assertions evaluated against each check result; null on list + responses + nullable: true + items: + $ref: "#/components/schemas/MonitorAssertionDto" + tags: + type: array + description: Tags applied to this monitor + nullable: true + items: + $ref: "#/components/schemas/TagDto" + pingUrl: + type: string + description: Heartbeat ping URL; populated for HEARTBEAT monitors only + nullable: true + environment: + nullable: true + allOf: + - $ref: "#/components/schemas/Summary" + auth: + nullable: true + allOf: + - $ref: "#/components/schemas/MonitorAuthConfig" + incidentPolicy: + nullable: true + allOf: + - $ref: "#/components/schemas/IncidentPolicyDto" + alertChannelIds: + type: array + description: Alert channel IDs linked to this monitor; populated on + single-monitor responses + nullable: true + items: + type: string + description: Alert channel IDs linked to this monitor; populated on + single-monitor responses + format: uuid + description: Full monitor representation + MonitorReference: + required: + - id + - name + type: object + properties: + id: + type: string + description: Monitor identifier + format: uuid + name: + type: string + description: Monitor name + description: Monitors that reference this secret; null on create/update responses + MonitorsSummaryDto: + type: object + properties: + total: + type: integer + description: Total number of monitors in the organization + format: int64 + up: + type: integer + description: Number of monitors currently passing + format: int64 + down: + type: integer + description: Number of monitors currently failing (DOWN severity) + format: int64 + degraded: + type: integer + description: Number of monitors with degraded status + format: int64 + paused: + type: integer + description: Number of disabled monitors + format: int64 + avgUptime24h: + type: number + description: Average uptime percentage across all monitors over last 24h + format: double + nullable: true + avgUptime30d: + type: number + description: Average uptime percentage across all monitors over last 30 days + format: double + nullable: true + description: Dashboard summary counters for monitors + required: + - total + - up + - down + - degraded + - paused + MonitorTestRequest: + required: + - config + - type + type: object + properties: + type: + type: string + description: Monitor protocol type to test + enum: + - HTTP + - DNS + - MCP_SERVER + - TCP + - ICMP + - HEARTBEAT + config: + oneOf: + - $ref: "#/components/schemas/DnsMonitorConfig" + - $ref: "#/components/schemas/HeartbeatMonitorConfig" + - $ref: "#/components/schemas/HttpMonitorConfig" + - $ref: "#/components/schemas/IcmpMonitorConfig" + - $ref: "#/components/schemas/McpServerMonitorConfig" + - $ref: "#/components/schemas/TcpMonitorConfig" + assertions: + type: array + description: Optional assertions to evaluate against the test result + nullable: true + items: + $ref: "#/components/schemas/CreateAssertionRequest" + MonitorTestResultDto: + required: + - assertionResults + - passed + type: object + properties: + passed: + type: boolean + error: + type: string + nullable: true + statusCode: + type: integer + format: int32 + nullable: true + responseTimeMs: + type: integer + format: int64 + nullable: true + responseHeaders: + type: object + additionalProperties: + type: array + nullable: true + items: + type: string + nullable: true + nullable: true + bodyPreview: + type: string + nullable: true + responseSizeBytes: + type: integer + format: int64 + nullable: true + redirectCount: + type: integer + format: int32 + nullable: true + finalUrl: + type: string + nullable: true + assertionResults: + type: array + items: + $ref: "#/components/schemas/AssertionTestResultDto" + warnings: + type: array + nullable: true + items: + type: string + MonitorVersionDto: + required: + - changedVia + - createdAt + - id + - monitorId + - snapshot + - version + type: object + properties: + id: + type: string + description: Unique version record identifier + format: uuid + monitorId: + type: string + description: Monitor this version belongs to + format: uuid + version: + type: integer + description: Monotonically increasing version number + format: int32 + snapshot: + $ref: "#/components/schemas/MonitorDto" + changedById: + type: integer + description: User ID who made the change; null for automated changes + format: int32 + nullable: true + changedVia: + type: string + description: Change source (DASHBOARD, CLI, API) + enum: + - API + - DASHBOARD + - CLI + - TERRAFORM + changeSummary: + type: string + description: Human-readable description of what changed + nullable: true + createdAt: + type: string + description: Timestamp when this version was recorded + format: date-time + description: A point-in-time version snapshot of a monitor configuration + NewTagRequest: + required: + - name + type: object + properties: + name: + maxLength: 100 + minLength: 0 + type: string + description: Tag name + color: + pattern: ^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$ + type: string + description: "Hex color code (defaults to #6B7280 if omitted)" + nullable: true + description: Inline tag creation — creates the tag if it does not already exist + NotificationDispatchDto: + required: + - createdAt + - deliveries + - id + - incidentId + - policyId + - status + - updatedAt + - currentStep + type: object + properties: + id: + type: string + description: Unique dispatch record identifier + format: uuid + incidentId: + type: string + description: Incident this dispatch is for + format: uuid + policyId: + type: string + description: Notification policy that matched this incident + format: uuid + policyName: + type: string + description: Human-readable name of the matched policy (null if policy has been + deleted) + nullable: true + status: + type: string + description: Current dispatch state + enum: + - PENDING + - DISPATCHING + - DELIVERED + - ESCALATING + - ACKNOWLEDGED + - COMPLETED + completionReason: + type: string + description: "Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no + ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). + Null for non-terminal states." + nullable: true + enum: + - EXHAUSTED + - RESOLVED + - NO_STEPS + currentStep: + type: integer + description: 1-based index of the currently active escalation step + format: int32 + totalSteps: + type: integer + description: Total number of escalation steps in the policy (null if policy has + been deleted) + format: int32 + nullable: true + acknowledgedAt: + type: string + description: Timestamp when this dispatch was acknowledged (null if not + acknowledged) + format: date-time + nullable: true + nextEscalationAt: + type: string + description: Timestamp when the next escalation step will fire (null if not + scheduled) + format: date-time + nullable: true + lastNotifiedAt: + type: string + description: Timestamp of the most recent notification delivery + format: date-time + nullable: true + deliveries: + type: array + description: Delivery records for all channels associated with this dispatch + items: + $ref: "#/components/schemas/AlertDeliveryDto" + createdAt: + type: string + description: Timestamp when the dispatch was created + format: date-time + updatedAt: + type: string + description: Timestamp when the dispatch was last updated + format: date-time + description: Dispatch state for a single (incident, notification policy) pair, + with delivery history + NotificationDto: + required: + - createdAt + - title + - type + - id + - read + type: object + properties: + id: + type: integer + description: Unique notification identifier + format: int64 + type: + type: string + description: Notification category (e.g. incident, monitor, team) + title: + type: string + description: Short notification title + body: + type: string + description: Full notification body; null for title-only notifications + nullable: true + resourceType: + type: string + description: Type of the resource this notification is about + nullable: true + resourceId: + type: string + description: ID of the resource this notification is about + nullable: true + read: + type: boolean + description: Whether the notification has been read + createdAt: + type: string + description: Timestamp when the notification was created + format: date-time + description: In-app notification for the current user + NotificationPolicyDto: + required: + - createdAt + - escalation + - id + - matchRules + - name + - updatedAt + - organizationId + - enabled + - priority + type: object + properties: + id: + type: string + description: Unique notification policy identifier + format: uuid + organizationId: + type: integer + description: Organization this policy belongs to + format: int32 + name: + minLength: 1 + type: string + description: Human-readable name for this policy + matchRules: + type: array + description: Match rules (all must pass; empty = catch-all) + items: + $ref: "#/components/schemas/MatchRule" + escalation: + $ref: "#/components/schemas/EscalationChain" + enabled: + type: boolean + description: Whether this policy is active + priority: + type: integer + description: Evaluation order; higher value = evaluated first + format: int32 + createdAt: + type: string + description: Timestamp when the policy was created + format: date-time + updatedAt: + type: string + description: Timestamp when the policy was last updated + format: date-time + description: Org-level notification policy with match rules and escalation chain + OpsGenieChannelConfig: + required: + - channelType + - apiKey + type: object + properties: + channelType: + type: string + enum: + - opsgenie + apiKey: + minLength: 1 + type: string + description: OpsGenie API key for alert creation + region: + type: string + description: "OpsGenie API region: us or eu" + nullable: true + OrganizationDto: + required: + - email + - name + - id + type: object + properties: + id: + type: integer + description: Unique organization identifier + format: int32 + name: + type: string + description: Organization name + email: + type: string + description: Billing and contact email + nullable: true + size: + type: string + description: Team size range (e.g. 1-10, 11-50) + nullable: true + industry: + type: string + description: Industry vertical (e.g. SaaS, Fintech) + nullable: true + websiteUrl: + type: string + description: Organization website URL + nullable: true + description: Organization account details + OrgInfo: + required: + - name + - id + type: object + properties: + id: + type: integer + description: Organization ID + format: int32 + name: + type: string + description: Organization name + description: Organization the key belongs to + Pageable: + type: object + properties: + page: + minimum: 0 + type: integer + format: int32 + size: + minimum: 1 + type: integer + format: int32 + sort: + type: array + items: + type: string + required: + - page + - size + - sort + PagerDutyChannelConfig: + required: + - channelType + - routingKey + type: object + properties: + channelType: + type: string + enum: + - pagerduty + routingKey: + minLength: 1 + type: string + description: PagerDuty Events API v2 routing (integration) key + severityOverride: + type: string + description: Override PagerDuty severity mapping + nullable: true + PageSection: + type: object + properties: + groupId: + type: string + description: Group ID when this section is a group + format: uuid + nullable: true + componentId: + type: string + description: Component ID when this section is an ungrouped component + format: uuid + nullable: true + pageOrder: + type: integer + description: Position on the page (0-based) + format: int32 + description: A top-level page section (either a group or an ungrouped component) + required: + - pageOrder + PlanInfo: + required: + - entitlements + - tier + - usage + - trialActive + type: object + properties: + tier: + type: string + description: Resolved plan tier + enum: + - FREE + - STARTER + - PRO + - TEAM + - BUSINESS + - ENTERPRISE + subscriptionStatus: + type: string + description: Subscription status (null if no subscription) + nullable: true + trialActive: + type: boolean + description: Whether the org is on a trial + trialExpiresAt: + type: string + description: Trial expiry (null if not trialing) + format: date-time + nullable: true + entitlements: + type: object + additionalProperties: + $ref: "#/components/schemas/EntitlementDto" + description: Entitlement limits keyed by entitlement name + usage: + type: object + additionalProperties: + type: integer + description: Current usage counters keyed by entitlement name + format: int64 + description: Current usage counters keyed by entitlement name + description: Billing plan and entitlement state + PollChartBucketDto: + required: + - bucket + - totalPolls + type: object + properties: + bucket: + type: string + description: Start of the time bucket (ISO 8601) + format: date-time + uptimePercent: + type: number + description: Uptime percentage for this bucket; null when no data + format: double + nullable: true + example: 100 + avgResponseTimeMs: + type: number + description: Average response time in milliseconds for this bucket + format: double + nullable: true + example: 245.3 + totalPolls: + type: integer + description: Total polls in this bucket + format: int64 + example: 60 + description: Aggregated poll metrics for a time bucket + PublishStatusPageIncidentRequest: + type: object + properties: + title: + maxLength: 500 + minLength: 0 + type: string + description: Customer-facing title; null keeps draft value + nullable: true + impact: + type: string + description: Impact level; null keeps draft value + nullable: true + enum: + - NONE + - MINOR + - MAJOR + - CRITICAL + status: + type: string + description: Incident status; null keeps draft value (must be an active status) + nullable: true + enum: + - INVESTIGATING + - IDENTIFIED + - MONITORING + - RESOLVED + body: + type: string + description: Initial update body; null keeps draft value + nullable: true + affectedComponents: + type: array + description: Affected components; null keeps draft value + nullable: true + items: + $ref: "#/components/schemas/AffectedComponent" + notifySubscribers: + type: boolean + description: "Whether to notify subscribers (default: true)" + nullable: true + RateLimitInfo: + type: object + properties: + requestsPerMinute: + type: integer + description: Maximum requests allowed per window + format: int64 + remaining: + type: integer + description: Requests remaining in the current window + format: int64 + windowMs: + type: integer + description: Sliding window size in milliseconds + format: int64 + description: Rate-limit quota for the current sliding window + required: + - requestsPerMinute + - remaining + - windowMs + RecoveryPolicy: + type: object + properties: + consecutiveSuccesses: + type: integer + description: Consecutive passing checks required to auto-resolve the incident + format: int32 + minRegionsPassing: + type: integer + description: Minimum regions that must be passing before recovery can complete + format: int32 + cooldownMinutes: + type: integer + description: Minutes after resolve before a new incident may open on the same + monitor + format: int32 + description: Auto-recovery settings + required: + - consecutiveSuccesses + - minRegionsPassing + - cooldownMinutes + RedirectCountAssertion: + type: object + properties: + type: + type: string + enum: + - redirect_count + maxCount: + type: integer + description: Maximum number of HTTP redirects allowed before the check fails + format: int32 + required: + - type + - maxCount + RedirectTargetAssertion: + required: + - type + - expected + - operator + type: object + properties: + type: + type: string + enum: + - redirect_target + expected: + minLength: 1 + type: string + description: Expected final URL after following redirects + operator: + type: string + description: Comparison operator (equals, contains, less_than, greater_than, etc.) + enum: + - equals + - contains + - less_than + - greater_than + - matches + - range + RegexBodyAssertion: + required: + - type + - pattern + type: object + properties: + type: + type: string + enum: + - regex_body + pattern: + minLength: 1 + type: string + description: Regular expression the response body must match + RegionStatusDto: + required: + - region + - timestamp + - passed + type: object + properties: + region: + type: string + description: Region identifier + example: us-east + passed: + type: boolean + description: Whether the last check in this region passed + example: true + responseTimeMs: + type: integer + description: Response time in milliseconds for the last check + format: int32 + nullable: true + example: 95 + timestamp: + type: string + description: Timestamp of the last check in this region (ISO 8601) + format: date-time + severityHint: + type: string + description: "Severity hint: 'down' for hard failures, 'degraded' for warn-only + failures, null when passing" + nullable: true + description: Latest check result for a single region + RemoveMonitorTagsRequest: + required: + - tagIds + type: object + properties: + tagIds: + minItems: 1 + type: array + description: IDs of the tags to detach from the monitor + items: + type: string + description: IDs of the tags to detach from the monitor + format: uuid + description: Request body for removing tags from a monitor + ReorderComponentsRequest: + required: + - positions + type: object + properties: + positions: + minItems: 1 + type: array + description: Ordered list of component IDs with their new positions + items: + $ref: "#/components/schemas/ComponentPosition" + description: Batch component reorder request + ReorderPageLayoutRequest: + required: + - sections + type: object + properties: + sections: + minItems: 1 + type: array + description: Top-level sections in their new order + items: + $ref: "#/components/schemas/PageSection" + groupOrders: + type: array + description: Within-group component ordering; only needed for groups whose + internal order changed + nullable: true + items: + $ref: "#/components/schemas/GroupComponentOrder" + description: "Reorder page-level layout: groups and ungrouped components share + one ordering" + ResolveIncidentRequest: + type: object + properties: + body: + type: string + description: Optional resolution message or post-mortem notes + nullable: true + ResourceGroupDto: + required: + - createdAt + - health + - id + - name + - slug + - updatedAt + - organizationId + - suppressMemberAlerts + type: object + properties: + id: + type: string + description: Unique resource group identifier + format: uuid + organizationId: + type: integer + description: Organization this group belongs to + format: int32 + name: + minLength: 1 + type: string + description: Human-readable group name + slug: + minLength: 1 + type: string + description: URL-safe group identifier + description: + type: string + description: Optional group description + nullable: true + alertPolicyId: + type: string + description: Notification policy applied to this group + format: uuid + nullable: true + defaultFrequency: + type: integer + description: Default check frequency in seconds for member monitors + format: int32 + nullable: true + defaultRegions: + type: array + description: Default regions for member monitors + nullable: true + items: + type: string + description: Default regions for member monitors + defaultRetryStrategy: + nullable: true + allOf: + - $ref: "#/components/schemas/RetryStrategy" + defaultAlertChannels: + type: array + description: Default alert channel IDs for member monitors + nullable: true + items: + type: string + description: Default alert channel IDs for member monitors + format: uuid + defaultEnvironmentId: + type: string + description: Default environment ID for member monitors + format: uuid + nullable: true + healthThresholdType: + type: string + description: "Health threshold type: COUNT or PERCENTAGE" + nullable: true + enum: + - COUNT + - PERCENTAGE + healthThresholdValue: + type: number + description: Health threshold value + nullable: true + suppressMemberAlerts: + type: boolean + description: When true, member-level incidents skip notification dispatch; only + group alerts fire + confirmationDelaySeconds: + type: integer + description: Seconds to wait after health threshold breach before creating group + incident + format: int32 + nullable: true + recoveryCooldownMinutes: + type: integer + description: Cooldown minutes after group incident resolves before a new one can + open + format: int32 + nullable: true + health: + $ref: "#/components/schemas/ResourceGroupHealthDto" + members: + type: array + description: Member list with individual statuses; populated on detail GET only + nullable: true + items: + $ref: "#/components/schemas/ResourceGroupMemberDto" + createdAt: + type: string + description: Timestamp when the group was created + format: date-time + updatedAt: + type: string + description: Timestamp when the group was last updated + format: date-time + description: Resource group with health summary and optional member details + ResourceGroupHealthDto: + required: + - status + - totalMembers + - operationalCount + - activeIncidents + type: object + properties: + status: + type: string + description: Worst-of health status across all members + enum: + - operational + - maintenance + - degraded + - down + totalMembers: + type: integer + description: Total number of members in the group + format: int32 + operationalCount: + type: integer + description: Number of members currently in operational status + format: int32 + activeIncidents: + type: integer + description: Number of members with an active incident or non-operational status + format: int32 + thresholdStatus: + type: string + description: "Computed group health status based on threshold: 'healthy', + 'degraded', or 'down'. Null when no health threshold is configured." + nullable: true + enum: + - healthy + - degraded + - down + failingCount: + type: integer + description: Number of failing members at time of last evaluation + format: int32 + nullable: true + description: Aggregated health summary for a resource group + ResourceGroupMemberDto: + required: + - createdAt + - groupId + - id + - memberType + - status + type: object + properties: + id: + type: string + description: Unique group member record identifier + format: uuid + groupId: + type: string + description: Resource group this member belongs to + format: uuid + memberType: + type: string + description: "Type of member: 'monitor' or 'service'" + monitorId: + type: string + description: Monitor ID; set when memberType is 'monitor' + format: uuid + nullable: true + serviceId: + type: string + description: Service ID; set when memberType is 'service' + format: uuid + nullable: true + name: + type: string + description: Display name of the referenced monitor or service + nullable: true + slug: + type: string + description: Slug identifier for the service (services only); used for icons and + uptime API calls + nullable: true + subscriptionId: + type: string + description: Subscription ID for the service (services only); used to link to + the dependency detail page + format: uuid + nullable: true + status: + type: string + description: Computed health status for this member + enum: + - operational + - maintenance + - degraded + - down + effectiveFrequency: + type: string + description: Effective check frequency label showing the group default when the + monitor inherits it; null for services or when no group default is + configured + nullable: true + createdAt: + type: string + description: Timestamp when the member was added to the group + format: date-time + uptime24h: + type: number + description: 24h uptime percentage; populated when includeMetrics=true + format: double + nullable: true + chartData: + type: array + description: Uptime tick values (0-100) for last-24h mini chart; populated when + includeMetrics=true + nullable: true + items: + type: number + description: Uptime tick values (0-100) for last-24h mini chart; populated when + includeMetrics=true + format: double + avgLatencyMs: + type: number + description: Average latency in ms (monitors only); populated when + includeMetrics=true + format: double + nullable: true + p95LatencyMs: + type: number + description: P95 latency in ms (monitors only); populated when includeMetrics=true + format: double + nullable: true + lastCheckedAt: + type: string + description: Timestamp of the most recent health check; populated when + includeMetrics=true + format: date-time + nullable: true + monitorType: + type: string + description: Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only + nullable: true + environmentName: + type: string + description: Environment name; monitors only + nullable: true + description: A single member of a resource group with its computed health status + ResponseSizeAssertion: + type: object + properties: + type: + type: string + enum: + - response_size + maxBytes: + type: integer + description: Maximum response body size in bytes before the check fails + format: int32 + required: + - type + - maxBytes + ResponseTimeAssertion: + type: object + properties: + type: + type: string + enum: + - response_time + thresholdMs: + type: integer + description: Maximum allowed response time in milliseconds before the check fails + format: int32 + required: + - type + - thresholdMs + ResponseTimeWarnAssertion: + type: object + properties: + type: + type: string + enum: + - response_time_warn + warnMs: + type: integer + description: HTTP response time in milliseconds that triggers a warning only + format: int32 + required: + - type + - warnMs + ResultSummaryDto: + required: + - chartData + - currentStatus + - latestPerRegion + type: object + properties: + currentStatus: + type: string + description: Derived current status across all regions + enum: + - up + - degraded + - down + - unknown + latestPerRegion: + type: array + description: Latest check result per region + items: + $ref: "#/components/schemas/RegionStatusDto" + chartData: + type: array + description: Time-bucketed chart data for the requested window + items: + $ref: "#/components/schemas/ChartBucketDto" + uptime24h: + type: number + description: Uptime percentage over the last 24 hours; null when no data + format: double + nullable: true + example: 99.95 + uptimeWindow: + type: number + description: Uptime percentage for the selected chart window; null when no data + format: double + nullable: true + example: 99.8 + description: "Dashboard summary: current status, per-region latest results, and + chart data" + RetryStrategy: + required: + - type + - maxRetries + - interval + type: object + properties: + type: + type: string + description: Retry strategy kind, e.g. fixed interval between attempts + maxRetries: + type: integer + description: Maximum number of retries after a failed check + format: int32 + interval: + type: integer + description: Delay between retry attempts in seconds + format: int32 + description: Default retry strategy for member monitors; null clears + ScheduledMaintenanceDto: + required: + - affectedComponents + - externalId + - id + - status + - title + - updates + type: object + properties: + id: + type: string + description: Unique maintenance record identifier + format: uuid + externalId: + type: string + description: Vendor-assigned maintenance identifier + title: + type: string + description: Maintenance title as reported by the vendor + status: + type: string + description: Current maintenance status (scheduled, in_progress, completed) + impact: + type: string + description: Reported impact level + nullable: true + shortlink: + type: string + description: Vendor-provided short URL to the maintenance page + nullable: true + scheduledFor: + type: string + description: Timestamp when the maintenance is scheduled to begin + format: date-time + nullable: true + scheduledUntil: + type: string + description: Timestamp when the maintenance is scheduled to end + format: date-time + nullable: true + startedAt: + type: string + description: Timestamp when the maintenance actually started + format: date-time + nullable: true + completedAt: + type: string + description: Timestamp when the maintenance was completed + format: date-time + nullable: true + affectedComponents: + type: array + description: Components affected by this maintenance + items: + $ref: "#/components/schemas/MaintenanceComponentRef" + updates: + type: array + description: Status updates posted during the maintenance lifecycle + items: + $ref: "#/components/schemas/MaintenanceUpdateDto" + description: A scheduled maintenance window from a vendor status page + SecretDto: + required: + - createdAt + - id + - key + - updatedAt + - valueHash + - dekVersion + type: object + properties: + id: + type: string + description: Unique secret identifier + format: uuid + key: + type: string + description: Secret key name, unique within the workspace + dekVersion: + type: integer + description: DEK version at the time of last encryption + format: int32 + valueHash: + type: string + description: SHA-256 hex digest of the current plaintext; use for change detection + createdAt: + type: string + description: Timestamp when the secret was created + format: date-time + updatedAt: + type: string + description: Timestamp when the secret was last updated + format: date-time + usedByMonitors: + type: array + description: Monitors that reference this secret; null on create/update responses + nullable: true + items: + $ref: "#/components/schemas/MonitorReference" + description: Secret with change-detection hash; plaintext value is never returned + SeoMetadataDto: + type: object + properties: + shortDescription: + type: string + description: Short description for meta tags (max 160 chars) + nullable: true + description: + type: string + description: Full description for the service page + nullable: true + about: + type: string + description: Long-form about text for the About section on pSEO pages + nullable: true + description: Admin-editable SEO metadata for pSEO pages + ServiceCatalogDto: + required: + - adapterType + - createdAt + - dataCompleteness + - id + - name + - slug + - updatedAt + - pollingIntervalSeconds + - enabled + - published + - componentCount + - activeIncidentCount + type: object + properties: + id: + type: string + format: uuid + slug: + type: string + name: + type: string + category: + type: string + nullable: true + officialStatusUrl: + type: string + nullable: true + developerContext: + type: string + nullable: true + logoUrl: + type: string + nullable: true + adapterType: + type: string + pollingIntervalSeconds: + type: integer + format: int32 + enabled: + type: boolean + published: + type: boolean + overallStatus: + type: string + nullable: true + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + componentCount: + type: integer + format: int64 + activeIncidentCount: + type: integer + format: int64 + dataCompleteness: + type: string + uptime30d: + type: number + description: Aggregated 30-day uptime percentage across all components + format: double + nullable: true + description: Related services + ServiceComponentDto: + required: + - dataType + - externalId + - firstSeenAt + - id + - lastSeenAt + - lifecycleStatus + - name + - status + - showcase + - onlyShowIfDegraded + - hasUptime + - displayAggregatedUptime + - isGroup + type: object + properties: + id: + type: string + format: uuid + externalId: + type: string + name: + type: string + status: + type: string + description: + type: string + nullable: true + groupId: + type: string + format: uuid + nullable: true + position: + type: integer + format: int32 + nullable: true + showcase: + type: boolean + onlyShowIfDegraded: + type: boolean + startDate: + type: string + format: date-time + nullable: true + vendorCreatedAt: + type: string + format: date-time + nullable: true + lifecycleStatus: + type: string + dataType: + type: string + description: "Data classification: full, status_only, or metric_only" + example: full + hasUptime: + type: boolean + description: Whether uptime data is available for this component + region: + type: string + description: Geographic region for regional components (AWS, GCP, Azure) + nullable: true + groupName: + type: string + description: Display name of the parent group + nullable: true + displayAggregatedUptime: + type: boolean + description: "Group-only: render an aggregated uptime bar above this group's + children" + childCount: + type: integer + description: Group-only count of visible leaf children; null for leaves + format: int32 + nullable: true + uptime: + nullable: true + allOf: + - $ref: "#/components/schemas/ComponentUptimeSummaryDto" + statusChangedAt: + type: string + format: date-time + nullable: true + firstSeenAt: + type: string + format: date-time + lastSeenAt: + type: string + format: date-time + isGroup: + type: boolean + description: A first-class service component with lifecycle and uptime data + ServiceDayDetailDto: + required: + - components + - date + - incidents + - totalPartialOutageSeconds + - totalMajorOutageSeconds + - totalDegradedSeconds + type: object + properties: + date: + type: string + description: UTC calendar day this rollup covers + format: date + overallUptimePercentage: + type: number + description: Average uptime % across leaf components with uptime data; null if + no data + format: double + nullable: true + totalPartialOutageSeconds: + type: integer + description: Sum of partial outage seconds across all leaf components + format: int64 + totalMajorOutageSeconds: + type: integer + description: Sum of major outage seconds across all leaf components + format: int64 + totalDegradedSeconds: + type: integer + description: Sum of degraded performance seconds across all leaf components + format: int64 + components: + type: array + description: Per-component impact rows for the day (only components with uptime + data) + items: + $ref: "#/components/schemas/ComponentImpact" + incidents: + type: array + description: Incidents that were active at any point during this day (started + before day end, resolved after day start) + items: + $ref: "#/components/schemas/DayIncident" + description: "One-day rollup for a public service status page: aggregated + uptime, per-component impact, and incidents that overlapped the day. + Powers the click/hover-to-expand panel under each uptime bar." + ServiceDetailDto: + required: + - activeMaintenances + - adapterType + - components + - createdAt + - dataCompleteness + - id + - name + - recentIncidents + - slug + - updatedAt + - pollingIntervalSeconds + - enabled + type: object + properties: + id: + type: string + format: uuid + slug: + type: string + name: + type: string + category: + type: string + nullable: true + officialStatusUrl: + type: string + nullable: true + developerContext: + type: string + nullable: true + logoUrl: + type: string + nullable: true + adapterType: + type: string + pollingIntervalSeconds: + type: integer + format: int32 + enabled: + type: boolean + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + currentStatus: + nullable: true + allOf: + - $ref: "#/components/schemas/ServiceStatusDto" + recentIncidents: + type: array + items: + $ref: "#/components/schemas/ServiceIncidentDto" + components: + type: array + items: + $ref: "#/components/schemas/ServiceComponentDto" + componentsSummary: + nullable: true + allOf: + - $ref: "#/components/schemas/ComponentsSummaryDto" + uptime: + nullable: true + allOf: + - $ref: "#/components/schemas/ComponentUptimeSummaryDto" + activeMaintenances: + type: array + items: + $ref: "#/components/schemas/ScheduledMaintenanceDto" + dataCompleteness: + type: string + seoMetadata: + nullable: true + allOf: + - $ref: "#/components/schemas/SeoMetadataDto" + relatedServices: + type: array + nullable: true + items: + $ref: "#/components/schemas/ServiceCatalogDto" + ServiceIncidentDetailDto: + required: + - id + - status + - title + - updates + type: object + properties: + id: + type: string + format: uuid + title: + type: string + status: + type: string + impact: + type: string + nullable: true + startedAt: + type: string + format: date-time + nullable: true + resolvedAt: + type: string + format: date-time + nullable: true + detectedAt: + type: string + format: date-time + nullable: true + shortlink: + type: string + nullable: true + affectedComponents: + type: array + nullable: true + items: + type: string + updates: + type: array + items: + $ref: "#/components/schemas/ServiceIncidentUpdateDto" + ServiceIncidentDto: + required: + - id + - serviceId + - status + - title + type: object + properties: + id: + type: string + format: uuid + serviceId: + type: string + format: uuid + serviceSlug: + type: string + nullable: true + serviceName: + type: string + nullable: true + externalId: + type: string + nullable: true + title: + type: string + status: + type: string + impact: + type: string + nullable: true + startedAt: + type: string + format: date-time + nullable: true + resolvedAt: + type: string + format: date-time + nullable: true + updatedAt: + type: string + format: date-time + nullable: true + shortlink: + type: string + nullable: true + detectedAt: + type: string + format: date-time + nullable: true + vendorCreatedAt: + type: string + format: date-time + nullable: true + ServiceIncidentUpdateDto: + required: + - status + type: object + properties: + status: + type: string + body: + type: string + nullable: true + displayAt: + type: string + format: date-time + nullable: true + ServiceLiveStatusDto: + required: + - componentStatuses + - activeIncidentCount + type: object + properties: + overallStatus: + type: string + description: Current overall status of the service, e.g. operational, + degraded_performance + nullable: true + componentStatuses: + type: array + description: Current status of each active component + items: + $ref: "#/components/schemas/ComponentStatusDto" + activeIncidentCount: + type: integer + description: Number of currently unresolved incidents + format: int32 + lastPolledAt: + type: string + description: ISO 8601 timestamp of the last status poll + nullable: true + ServicePollResultDto: + required: + - serviceId + - timestamp + - passed + - componentCount + - degradedCount + type: object + properties: + serviceId: + type: string + description: Service ID + format: uuid + timestamp: + type: string + description: Timestamp when the poll was executed (ISO 8601) + format: date-time + overallStatus: + type: string + description: Overall status of the service at time of poll + nullable: true + example: operational + responseTimeMs: + type: integer + description: Response time of the poll in milliseconds + format: int32 + nullable: true + example: 245 + httpStatusCode: + type: integer + description: HTTP status code from the upstream status page + format: int32 + nullable: true + example: 200 + passed: + type: boolean + description: Whether the poll succeeded + example: true + failureReason: + type: string + description: Reason for failure when passed=false + nullable: true + componentCount: + type: integer + description: Number of components reported by the service + format: int32 + example: 12 + degradedCount: + type: integer + description: Number of degraded or non-operational components + format: int32 + example: 1 + description: A single poll result from the status poller + ServicePollSummaryDto: + required: + - chartData + - window + - totalPolls + - passedPolls + type: object + properties: + uptimePercentage: + type: number + description: Uptime percentage over the requested window; null when no data + format: double + nullable: true + example: 99.95 + totalPolls: + type: integer + description: Total number of polls executed + format: int64 + example: 4320 + passedPolls: + type: integer + description: Number of polls that succeeded + format: int64 + example: 4318 + avgResponseTimeMs: + type: number + description: Average response time in milliseconds; null when no data + format: double + nullable: true + example: 312.5 + p95ResponseTimeMs: + type: number + description: 95th-percentile response time in milliseconds; null when no data + format: double + nullable: true + example: 580 + window: + type: string + description: Time window used for the summary + example: 30d + chartData: + type: array + description: Time-bucketed chart data for response time and uptime + items: + $ref: "#/components/schemas/PollChartBucketDto" + description: Aggregated poll metrics and chart data for a service + ServiceStatusDto: + required: + - overallStatus + type: object + properties: + overallStatus: + type: string + lastPolledAt: + type: string + format: date-time + nullable: true + ServiceSubscribeRequest: + type: object + properties: + componentId: + type: string + description: ID of the component to subscribe to. Omit or null for whole-service + subscription. + format: uuid + nullable: true + alertSensitivity: + type: string + description: Alert sensitivity level. Defaults to INCIDENTS_ONLY when not + provided. + nullable: true + description: Optional body for subscribing to a specific component of a service + ServiceSubscriptionDto: + required: + - adapterType + - alertSensitivity + - name + - serviceId + - slug + - subscribedAt + - subscriptionId + - pollingIntervalSeconds + - enabled + type: object + properties: + subscriptionId: + type: string + description: Unique subscription identifier + format: uuid + serviceId: + type: string + description: Service identifier + format: uuid + slug: + minLength: 1 + type: string + name: + minLength: 1 + type: string + category: + type: string + nullable: true + officialStatusUrl: + type: string + nullable: true + adapterType: + minLength: 1 + type: string + pollingIntervalSeconds: + type: integer + format: int32 + enabled: + type: boolean + logoUrl: + type: string + description: Logo URL from the service catalog + nullable: true + overallStatus: + type: string + description: Current overall status; null when the service has never been polled + nullable: true + componentId: + type: string + description: Subscribed component id; null for whole-service subscription + format: uuid + nullable: true + component: + nullable: true + allOf: + - $ref: "#/components/schemas/ServiceComponentDto" + alertSensitivity: + minLength: 1 + type: string + description: "Alert sensitivity: ALL (synthetic + real incidents), + INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (real + + DOWN severity)" + enum: + - ALL + - INCIDENTS_ONLY + - MAJOR_ONLY + subscribedAt: + type: string + description: When the organization subscribed to this service + format: date-time + description: An org-level service subscription with current status information + ServiceUptimeResponse: + required: + - buckets + - granularity + - period + type: object + properties: + overallUptimePct: + type: number + description: Overall uptime percentage across the entire period; null when no + polling data exists + format: double + nullable: true + example: 99.95 + period: + type: string + description: Requested period + example: 7d + granularity: + type: string + description: Requested granularity + example: hourly + buckets: + type: array + description: Per-bucket breakdown ordered by time ascending + items: + $ref: "#/components/schemas/UptimeBucketDto" + source: + type: string + description: "Data source: vendor_reported, incident_derived, or poll_derived" + nullable: true + example: vendor_reported + description: Uptime response with per-bucket breakdown and overall percentage + for the period + SetAlertChannelsRequest: + required: + - channelIds + type: object + properties: + channelIds: + type: array + description: IDs of alert channels to link (replaces current list) + items: + type: string + description: IDs of alert channels to link (replaces current list) + format: uuid + description: Replace the alert channels linked to a monitor + SetMonitorAuthRequest: + required: + - config + type: object + properties: + config: + oneOf: + - $ref: "#/components/schemas/ApiKeyAuthConfig" + - $ref: "#/components/schemas/BasicAuthConfig" + - $ref: "#/components/schemas/BearerAuthConfig" + - $ref: "#/components/schemas/HeaderAuthConfig" + SingleValueResponseAlertChannelDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/AlertChannelDto" + SingleValueResponseAlertDeliveryDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/AlertDeliveryDto" + SingleValueResponseApiKeyCreateResponse: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ApiKeyCreateResponse" + SingleValueResponseApiKeyDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ApiKeyDto" + SingleValueResponseAuthMeResponse: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/AuthMeResponse" + SingleValueResponseBatchComponentUptimeDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/BatchComponentUptimeDto" + SingleValueResponseBulkMonitorActionResult: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/BulkMonitorActionResult" + SingleValueResponseDashboardOverviewDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/DashboardOverviewDto" + SingleValueResponseDekRotationResultDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/DekRotationResultDto" + SingleValueResponseDeployLockDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/DeployLockDto" + SingleValueResponseEnvironmentDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/EnvironmentDto" + SingleValueResponseGlobalStatusSummaryDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/GlobalStatusSummaryDto" + SingleValueResponseIncidentDetailDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/IncidentDetailDto" + SingleValueResponseIncidentPolicyDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/IncidentPolicyDto" + SingleValueResponseInviteDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/InviteDto" + SingleValueResponseListUUID: + required: + - data + type: object + properties: + data: + type: array + items: + type: string + format: uuid + SingleValueResponseLong: + required: + - data + type: object + properties: + data: + type: integer + format: int64 + SingleValueResponseMaintenanceWindowDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MaintenanceWindowDto" + SingleValueResponseMonitorAssertionDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MonitorAssertionDto" + SingleValueResponseMonitorAuthDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MonitorAuthDto" + SingleValueResponseMonitorDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MonitorDto" + SingleValueResponseMonitorTestResultDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MonitorTestResultDto" + SingleValueResponseMonitorVersionDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/MonitorVersionDto" + SingleValueResponseNotificationDispatchDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/NotificationDispatchDto" + SingleValueResponseNotificationPolicyDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/NotificationPolicyDto" + SingleValueResponseOrganizationDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/OrganizationDto" + SingleValueResponseResourceGroupDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ResourceGroupDto" + SingleValueResponseResourceGroupHealthDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ResourceGroupHealthDto" + SingleValueResponseResourceGroupMemberDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ResourceGroupMemberDto" + SingleValueResponseResultSummaryDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ResultSummaryDto" + SingleValueResponseSecretDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/SecretDto" + SingleValueResponseServiceDayDetailDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceDayDetailDto" + SingleValueResponseServiceDetailDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceDetailDto" + SingleValueResponseServiceIncidentDetailDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceIncidentDetailDto" + SingleValueResponseServiceLiveStatusDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceLiveStatusDto" + SingleValueResponseServicePollSummaryDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServicePollSummaryDto" + SingleValueResponseServiceSubscriptionDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceSubscriptionDto" + SingleValueResponseServiceUptimeResponse: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/ServiceUptimeResponse" + SingleValueResponseStatusPageComponentDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageComponentDto" + SingleValueResponseStatusPageComponentGroupDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageComponentGroupDto" + SingleValueResponseStatusPageCustomDomainDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageCustomDomainDto" + SingleValueResponseStatusPageDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageDto" + SingleValueResponseStatusPageIncidentDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageIncidentDto" + SingleValueResponseStatusPageSubscriberDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/StatusPageSubscriberDto" + SingleValueResponseString: + required: + - data + type: object + properties: + data: + type: string + SingleValueResponseTagDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/TagDto" + SingleValueResponseTestChannelResult: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/TestChannelResult" + SingleValueResponseTestMatchResult: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/TestMatchResult" + SingleValueResponseUptimeDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/UptimeDto" + SingleValueResponseWebhookEndpointDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/WebhookEndpointDto" + SingleValueResponseWebhookSigningSecretDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/WebhookSigningSecretDto" + SingleValueResponseWebhookTestResult: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/WebhookTestResult" + SingleValueResponseWorkspaceDto: + required: + - data + type: object + properties: + data: + $ref: "#/components/schemas/WorkspaceDto" + SlackChannelConfig: + required: + - channelType + - webhookUrl + type: object + properties: + channelType: + type: string + enum: + - slack + webhookUrl: + minLength: 1 + type: string + description: Slack incoming webhook URL + mentionText: + type: string + description: Optional mention text included in notifications, e.g. @channel + nullable: true + SslExpiryAssertion: + type: object + properties: + type: + type: string + enum: + - ssl_expiry + minDaysRemaining: + type: integer + description: Minimum days before TLS certificate expiry; fails or warns below + this threshold + format: int32 + required: + - type + - minDaysRemaining + StatusCodeAssertion: + required: + - type + - expected + - operator + type: object + properties: + type: + type: string + enum: + - status_code + expected: + minLength: 1 + type: string + description: Expected status code, range pattern, or wildcard such as 2xx + operator: + type: string + description: Comparison operator (equals, contains, less_than, greater_than, etc.) + enum: + - equals + - contains + - less_than + - greater_than + - matches + - range + StatusPageBranding: + type: object + properties: + logoUrl: + maxLength: 2048 + minLength: 0 + pattern: ^https?://.* + type: string + description: URL for the logo image displayed in the header + nullable: true + faviconUrl: + maxLength: 2048 + minLength: 0 + pattern: ^https?://.* + type: string + description: URL for the browser tab favicon + nullable: true + brandColor: + maxLength: 30 + minLength: 0 + pattern: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ + type: string + description: "Primary brand color as hex, e.g. #4F46E5; drives + accent/links/buttons" + nullable: true + pageBackground: + maxLength: 30 + minLength: 0 + pattern: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ + type: string + description: "Page body background color as hex, e.g. #FAFAFA" + nullable: true + cardBackground: + maxLength: 30 + minLength: 0 + pattern: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ + type: string + description: "Card/surface background color as hex, e.g. #FFFFFF" + nullable: true + textColor: + maxLength: 30 + minLength: 0 + pattern: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ + type: string + description: "Primary text color as hex, e.g. #09090B" + nullable: true + borderColor: + maxLength: 30 + minLength: 0 + pattern: ^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ + type: string + description: "Card border color as hex, e.g. #E4E4E7" + nullable: true + headerStyle: + maxLength: 50 + minLength: 0 + type: string + description: Header layout style (reserved for future use) + nullable: true + theme: + maxLength: 50 + minLength: 0 + type: string + description: "Color theme: light or dark (default: light)" + nullable: true + reportUrl: + maxLength: 2048 + minLength: 0 + pattern: ^https?://.* + type: string + description: URL where visitors can report a problem + nullable: true + hidePoweredBy: + type: boolean + description: "Whether to hide the 'Powered by DevHelm' footer badge (default: + false)" + default: false + customCss: + maxLength: 50000 + minLength: 0 + type: string + description: Custom CSS injected via