diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index 0a78680..595946f 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -1 +1,18425 @@ -{"openapi":"3.0.1","info":{"title":"DevHelm API","description":"DevHelm platform and public API","version":"1.0"},"servers":[{"url":"http://localhost:8080","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":"API Auth","description":"Identity and quota info for API key authentication"},{"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":"Deploy Lock","description":"Mutex for CLI deploy operations"},{"name":"Billing","description":"Billing plans and pricing"}],"paths":{"/platform/orgs/{orgId}/subscriptions/{subscriptionId}":{"put":{"tags":["Subscriptions"],"summary":"Update subscription","operationId":"updateSubscription","parameters":[{"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":"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","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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user profile","operationId":"updateProfile","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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user's notification preferences","operationId":"updateNotificationPreferences","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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/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"}}}}}},"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"}}}}}},"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"}}}},"/api/v1/secrets/{key}":{"put":{"tags":["Secrets"],"summary":"Update secret","operationId":"update_3","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"}}}}}},"delete":{"tags":["Secrets"],"summary":"Delete secret","operationId":"delete_3","parameters":[{"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":"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":"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":"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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}},"put":{"tags":["Organizations"],"summary":"Update the current organization","operationId":"update_5","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":"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","responses":{"204":{"description":"No Content"}}}},"/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"}}}}}},"put":{"tags":["Notification Policies"],"summary":"Update a notification policy","operationId":"update_6","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"}}}}}},"delete":{"tags":["Notification Policies"],"summary":"Delete a notification policy","operationId":"delete_5","parameters":[{"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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_2","parameters":[{"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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","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","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","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","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":"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":"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":"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":"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":"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":"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","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":"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","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":"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","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","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":"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","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":"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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSecretDto"}}}}}},"post":{"tags":["Secrets"],"summary":"Create secret","operationId":"create_5","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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultResourceGroupDto"}}}}}},"post":{"tags":["Resource Groups"],"summary":"Create a new resource group","operationId":"create_6","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":"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","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","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":"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":"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":"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","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":"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":"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":"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":"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":"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":"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":"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":"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","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","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":"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","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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultInviteDto"}}}}}},"post":{"tags":["Invites"],"summary":"Create invite","operationId":"create_10","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":"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":"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":"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","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":"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":"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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultEnvironmentDto"}}}}}},"post":{"tags":["Environments"],"summary":"Create environment","operationId":"create_12","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEnvironmentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}}},"/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","parameters":[{"name":"x-phelm-workspace-id","in":"header","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDeployLockDto"}}}}}},"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","parameters":[{"name":"x-phelm-workspace-id","in":"header","description":"Target workspace ID (defaults to 1)","required":false,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcquireDeployLockRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDeployLockDto"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"List API keys","operationId":"list_12","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultApiKeyDto"}}}}}},"post":{"tags":["API Keys"],"summary":"Create API key","operationId":"create_13","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":"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":"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":"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":"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","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":"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","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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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","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","responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}}}},"/platform/admin/users":{"get":{"tags":["admin-controller"],"operationId":"listUsers","parameters":[{"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","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdminStatsDto"}}}}}}},"/platform/admin/orgs":{"get":{"tags":["admin-controller"],"operationId":"listOrgs","parameters":[{"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","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":"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","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","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":"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":"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":"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":"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","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":"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":"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_3","parameters":[{"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":"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":"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":"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":"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":"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":"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":"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","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/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"}}}}}}},"/api/v1/audit-log":{"get":{"tags":["Audit Log"],"summary":"List audit events for the current organization","operationId":"list_18","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/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":"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":"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":"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":"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":"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":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/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"}},{"name":"x-phelm-workspace-id","in":"header","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/deploy/lock/force":{"delete":{"tags":["Deploy Lock"],"summary":"Force-release deploy lock","description":"Forcibly removes any deploy lock on the current workspace. Use to break stale locks.","operationId":"forceRelease","parameters":[{"name":"x-phelm-workspace-id","in":"header","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}}},"components":{"schemas":{"CreateSubscriptionRequest":{"type":"object","properties":{"priceId":{"minimum":1,"type":"integer","format":"int32"}}},"BillingPlanDto":{"type":"object","properties":{"id":{"type":"integer","description":"Unique billing plan identifier","format":"int32"},"paddleId":{"type":"string","description":"Paddle product identifier"},"name":{"type":"string","description":"Billing plan display name"},"description":{"type":"string","description":"Plan description","nullable":true},"prices":{"type":"array","description":"Available prices for this plan; null when not requested","nullable":true,"items":{"$ref":"#/components/schemas/BillingPriceDto"}}},"description":"Associated billing plan; null when not requested","nullable":true},"BillingPriceDto":{"type":"object","properties":{"id":{"type":"integer","description":"Unique billing price identifier","format":"int32"},"paddleId":{"type":"string","description":"Paddle price identifier"},"amount":{"type":"integer","description":"Price amount in smallest currency unit (e.g. cents)","format":"int32"},"interval":{"type":"string","description":"Billing interval (MONTH or YEAR)","enum":["DAY","WEEK","MONTH","YEAR"]},"intervalCount":{"type":"integer","description":"Number of intervals between billing cycles","format":"int32"},"description":{"type":"string","description":"Price description","nullable":true},"billingPlan":{"$ref":"#/components/schemas/BillingPlanDto"}},"description":"Price details for this line item"},"ItemDto":{"type":"object","properties":{"billingPrice":{"$ref":"#/components/schemas/BillingPriceDto"},"quantity":{"type":"integer","description":"Quantity of this price","format":"int32"},"amount":{"type":"integer","description":"Line item total in smallest currency unit","format":"int32"}},"description":"Line items included in this subscription"},"SingleValueResponseSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SubscriptionDto"}}},"SubscriptionDto":{"type":"object","properties":{"id":{"type":"integer","description":"Internal subscription identifier","format":"int32"},"paddleId":{"type":"string","description":"Paddle subscription identifier"},"createdAt":{"type":"string","description":"Timestamp when the subscription was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the subscription was last updated","format":"date-time"},"organizationId":{"type":"integer","description":"Organization this subscription belongs to","format":"int32"},"status":{"type":"string","description":"Current subscription status","enum":["ACTIVE","CANCELED","PAST_DUE","PAUSED","TRIALING"]},"nextBilledAt":{"type":"string","description":"Next billing date; null when cancelled or expired","format":"date-time","nullable":true},"willCancelAt":{"type":"string","description":"Scheduled cancellation date; null if no cancellation pending","format":"date-time","nullable":true},"items":{"type":"array","description":"Line items included in this subscription","items":{"$ref":"#/components/schemas/ItemDto"}}},"description":"Current billing subscription details"},"UpdateOrgDetailsRequest":{"required":["email","name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string","description":"New organization name (max 200 chars)"},"email":{"minLength":1,"type":"string","description":"New billing and contact email address","format":"email"},"size":{"maxLength":50,"minLength":0,"type":"string","description":"Team size range (e.g. 1-10, 11-50)"},"industry":{"maxLength":100,"minLength":0,"type":"string","description":"Industry vertical (e.g. SaaS, Fintech)"},"websiteUrl":{"maxLength":255,"minLength":0,"type":"string","description":"Organization website URL (max 255 chars)"}}},"OrganizationDto":{"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"},"SingleValueResponseOrganizationDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationDto"}}},"UpdateOnboardingStageRequest":{"required":["stage"],"type":"object","properties":{"stage":{"type":"string","description":"New onboarding stage","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]}},"description":"Advance the user's onboarding stage"},"SingleValueResponseUserDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UserDto"}}},"UserDto":{"type":"object","properties":{"id":{"type":"integer","description":"Unique user identifier","format":"int32"},"email":{"type":"string","description":"User email address"},"emailVerified":{"type":"boolean","description":"Whether the email address has been verified"},"name":{"type":"string","description":"Display name; null if not set","nullable":true},"userRole":{"type":"string","description":"Platform role: USER or SUPERADMIN","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","description":"Current onboarding progress stage; null when completed","nullable":true,"enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"type":"string","description":"Profile image URL; null if not set","nullable":true},"createdAt":{"type":"string","description":"Timestamp when the account was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the account was last updated","format":"date-time"}},"description":"User account details"},"UpdateProfileRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string","description":"New display name (max 200 chars)"}}},"UpdateNotificationPreferencesRequest":{"required":["preferences"],"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean","description":"Map of category keys to enabled/disabled flags"},"description":"Map of category keys to enabled/disabled flags"}},"description":"Replace notification preferences for the current user"},"NotificationPreferencesDto":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean","description":"Map of category keys to enabled/disabled flags"},"description":"Map of category keys to enabled/disabled flags"},"updatedAt":{"type":"string","description":"Timestamp when preferences were last updated","format":"date-time"}},"description":"User notification preferences keyed by notification category"},"SingleValueResponseNotificationPreferencesDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPreferencesDto"}}},"UpdateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string","description":"New workspace name"}},"description":"Update workspace details"},"SingleValueResponseWorkspaceDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkspaceDto"}}},"WorkspaceDto":{"type":"object","properties":{"id":{"type":"integer","description":"Unique workspace identifier","format":"int32"},"createdAt":{"type":"string","description":"Timestamp when the workspace was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the workspace was last updated","format":"date-time"},"name":{"type":"string","description":"Workspace name"},"orgId":{"type":"integer","description":"Organization this workspace belongs to","format":"int32"}},"description":"Workspace within an organization"},"UpdateUserRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string","description":"New display name (max 200 chars)"},"email":{"type":"string","description":"New email address","format":"email"},"userRole":{"type":"string","description":"New platform role","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","description":"New onboarding stage","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"maxLength":500,"minLength":0,"type":"string","description":"New profile image URL (max 500 chars)"}}},"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"},"UpdateWebhookEndpointRequest":{"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","description":"New webhook URL; null preserves current","nullable":true},"description":{"maxLength":255,"minLength":0,"type":"string","description":"New description; null preserves current","nullable":true},"subscribedEvents":{"type":"array","description":"Replace subscribed events; null preserves current","nullable":true,"items":{"type":"string","description":"Replace subscribed events; null preserves current","nullable":true}},"enabled":{"type":"boolean","description":"Enable or disable delivery; null preserves current","nullable":true}}},"SingleValueResponseWebhookEndpointDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointDto"}}},"WebhookEndpointDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique webhook endpoint identifier","format":"uuid"},"url":{"type":"string","description":"HTTPS endpoint URL that receives event payloads"},"description":{"type":"string","description":"Human-readable description of this endpoint","nullable":true},"subscribedEvents":{"type":"array","description":"Event types this endpoint is subscribed to","items":{"type":"string","description":"Event types this endpoint is subscribed to"}},"enabled":{"type":"boolean","description":"Whether delivery is enabled for this endpoint"},"consecutiveFailures":{"type":"integer","description":"Number of consecutive delivery failures","format":"int32"},"disabledReason":{"type":"string","description":"Reason the endpoint was auto-disabled","nullable":true},"disabledAt":{"type":"string","description":"Timestamp when the endpoint was auto-disabled","format":"date-time","nullable":true},"createdAt":{"type":"string","description":"Timestamp when the endpoint was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the endpoint was last updated","format":"date-time"}},"description":"Webhook endpoint that receives event delivery payloads"},"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","description":"Unique tag identifier","format":"uuid"},"organizationId":{"type":"integer","description":"Organization this tag belongs to","format":"int32"},"name":{"type":"string","description":"Tag name, unique within the org"},"color":{"type":"string","description":"Hex color code for display (e.g. #6B7280)"},"createdAt":{"type":"string","description":"Timestamp when the tag was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the tag was last updated","format":"date-time"}},"description":"Tag for organizing and filtering monitors"},"UpdateSecretRequest":{"required":["value"],"type":"object","properties":{"value":{"maxLength":32768,"minLength":0,"type":"string","description":"New secret value, stored encrypted (max 32KB)"}}},"MonitorReference":{"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"},"SecretDto":{"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"},"SingleValueResponseSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SecretDto"}}},"RetryStrategy":{"required":["type"],"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"},"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","description":"Unique resource group identifier","format":"uuid"},"organizationId":{"type":"integer","description":"Organization this group belongs to","format":"int32"},"name":{"type":"string","description":"Human-readable group name"},"slug":{"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","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","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":{"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","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","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","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"],"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"},"MatchRule":{"required":["type"],"type":"object","properties":{"type":{"type":"string","description":"Rule type, e.g. severity_gte, monitor_id_in, region_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","nullable":true}},"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","nullable":true}},"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","nullable":true}}},"description":"Match rules to evaluate (all must pass; omit or empty for catch-all)"},"UpdateNotificationPolicyRequest":{"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this policy; null preserves current"},"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; null preserves current"},"priority":{"type":"integer","description":"Evaluation priority; higher value = evaluated first; null preserves current","format":"int32"}},"description":"Request body for updating a notification policy (null fields are preserved)"},"NotificationPolicyDto":{"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":{"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"},"SingleValueResponseNotificationPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPolicyDto"}}},"ConfirmationPolicy":{"required":["type"],"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"},"IncidentPolicyDto":{"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"},"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"},"TriggerRule":{"required":["scope","severity","type"],"type":"object","properties":{"type":{"type":"string","description":"Condition that opens or escalates an incident from check results","enum":["consecutive_failures","failures_in_window","response_time"]},"count":{"type":"integer","description":"Failure count for consecutive or windowed failure rules","format":"int32","nullable":true},"windowMinutes":{"type":"integer","description":"Window length in minutes for failures-in-window rules","format":"int32","nullable":true},"scope":{"type":"string","description":"Whether the rule applies per region or across regions","nullable":true,"enum":["per_region","any_region"]},"thresholdMs":{"type":"integer","description":"Response time threshold in milliseconds for response-time rules","format":"int32","nullable":true},"severity":{"type":"string","description":"Incident severity when this rule fires","enum":["down","degraded"]},"aggregationType":{"type":"string","description":"How response times are aggregated for response-time rules","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","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}}}]},"BasicAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","description":"Vault secret ID holding Basic auth username and password","format":"uuid","nullable":true}}}]},"BearerAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","description":"Vault secret ID holding the bearer token value","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","description":"Custom HTTP header name for the secret value"},"vaultSecretId":{"type":"string","description":"Vault secret ID for the header value","format":"uuid","nullable":true}}}]},"MonitorAuthConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"description":"New authentication configuration (full replacement)","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"}},"description":"New assertion configuration (full replacement)","discriminator":{"propertyName":"type"}},"BodyContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string","description":"Substring that must appear in the response body"}}}]},"DnsExpectedCnameAssertion":{"required":["value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"value":{"minLength":1,"type":"string","description":"Expected CNAME target the resolution must include"}}}]},"DnsExpectedIpsAssertion":{"required":["ips"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"ips":{"minItems":1,"type":"array","description":"Allowed IP addresses; at least one resolved address must match","items":{"type":"string","description":"Allowed IP addresses; at least one resolved address must match"}}}}]},"DnsMaxAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string","description":"DNS record type whose answer count is checked"},"max":{"type":"integer","description":"Maximum number of answers allowed for that record type","format":"int32"}}}]},"DnsMinAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string","description":"DNS record type whose answer count is checked"},"min":{"type":"integer","description":"Minimum number of answers required for that record type","format":"int32"}}}]},"DnsRecordContainsAssertion":{"required":["recordType","substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string","description":"DNS record type to assert on (A, AAAA, CNAME, MX, TXT)"},"substring":{"minLength":1,"type":"string","description":"Substring that must appear in a matching record value"}}}]},"DnsRecordEqualsAssertion":{"required":["recordType","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string","description":"DNS record type to assert on (A, AAAA, CNAME, MX, TXT)"},"value":{"minLength":1,"type":"string","description":"Expected DNS record value for an exact match"}}}]},"DnsResolvesAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"DnsResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","description":"Maximum allowed DNS resolution time in milliseconds","format":"int32"}}}]},"DnsResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","description":"DNS resolution time in milliseconds that triggers a warning only","format":"int32"}}}]},"DnsTtlHighAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxTtl":{"type":"integer","description":"Maximum TTL in seconds before a high-TTL warning is raised","format":"int32"}}}]},"DnsTtlLowAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minTtl":{"type":"integer","description":"Minimum acceptable TTL in seconds before a warning is raised","format":"int32"}}}]},"DnsTxtContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string","description":"Substring that must appear in at least one TXT record"}}}]},"HeaderValueAssertion":{"required":["expected","headerName","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"type":"string","description":"HTTP header name to assert on"},"expected":{"minLength":1,"type":"string","description":"Expected value to compare against"},"operator":{"type":"string","description":"Comparison operator (equals, contains, less_than, greater_than, etc.)","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"HeartbeatIntervalDriftAssertion":{"required":["maxDeviationPercent"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxDeviationPercent":{"maximum":100,"minimum":1,"type":"integer","description":"Max percent drift from expected ping interval before warning (non-fatal)","format":"int32"}}}]},"HeartbeatMaxIntervalAssertion":{"required":["maxSeconds"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxSeconds":{"minimum":1,"type":"integer","description":"Maximum allowed gap in seconds between consecutive heartbeat pings","format":"int32"}}}]},"HeartbeatPayloadContainsAssertion":{"required":["path","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string","description":"JSONPath expression into the heartbeat ping JSON payload"},"value":{"type":"string","description":"Expected value to compare against at that path"}}}]},"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","description":"Maximum allowed packet loss percentage before the check fails (0–100)","format":"double"}}}]},"IcmpReachableAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","description":"Maximum average ICMP round-trip time in milliseconds","format":"int32"}}}]},"IcmpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","description":"ICMP round-trip time in milliseconds that triggers a warning only","format":"int32"}}}]},"JsonPathAssertion":{"required":["expected","operator","path"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string","description":"JSONPath expression to extract a value from the response body"},"expected":{"minLength":1,"type":"string","description":"Expected value to compare against"},"operator":{"type":"string","description":"Comparison operator (equals, contains, less_than, greater_than, etc.)","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"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","description":"Capability name the server must advertise, e.g. tools or resources"}}}]},"McpMinToolsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"min":{"type":"integer","description":"Minimum number of tools the server must expose","format":"int32"}}}]},"McpProtocolVersionAssertion":{"required":["version"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"version":{"minLength":1,"type":"string","description":"Expected MCP protocol version string from the server handshake"}}}]},"McpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","description":"Maximum allowed MCP check duration in milliseconds","format":"int32"}}}]},"McpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","description":"MCP check duration in milliseconds that triggers a warning only","format":"int32"}}}]},"McpToolAvailableAssertion":{"required":["toolName"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"toolName":{"minLength":1,"type":"string","description":"MCP tool name that must appear in the server's tool list"}}}]},"McpToolCountChangedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expectedCount":{"type":"integer","description":"Expected tool count; warns when the live count differs","format":"int32"}}}]},"RedirectCountAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxCount":{"type":"integer","description":"Maximum number of HTTP redirects allowed before the check fails","format":"int32"}}}]},"RedirectTargetAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string","description":"Expected final URL after following redirects"},"operator":{"type":"string","description":"Comparison operator (equals, contains, less_than, greater_than, etc.)","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"RegexBodyAssertion":{"required":["pattern"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"pattern":{"minLength":1,"type":"string","description":"Regular expression the response body must match"}}}]},"ResponseSizeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxBytes":{"type":"integer","description":"Maximum response body size in bytes before the check fails","format":"int32"}}}]},"ResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"thresholdMs":{"type":"integer","description":"Maximum allowed response time in milliseconds before the check fails","format":"int32"}}}]},"ResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","description":"HTTP response time in milliseconds that triggers a warning only","format":"int32"}}}]},"SslExpiryAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minDaysRemaining":{"type":"integer","description":"Minimum days before TLS certificate expiry; fails or warns below this threshold","format":"int32"}}}]},"StatusCodeAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string","description":"Expected status code, range pattern, or wildcard such as 2xx"},"operator":{"type":"string","description":"Comparison operator (equals, contains, less_than, greater_than, etc.)","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"TcpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"TcpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","description":"Maximum TCP connect time in milliseconds before the check fails","format":"int32"}}}]},"TcpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","description":"TCP connect time in milliseconds that triggers a warning only","format":"int32"}}}]},"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","description":"New outcome severity: FAIL or WARN","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","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"},"SingleValueResponseListUUID":{"type":"object","properties":{"data":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}}}},"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","description":"Outcome severity: FAIL (fails the check) or WARN (warns without failing)","enum":["fail","warn"]}},"description":"Replace all assertions; null preserves current"},"DnsMonitorConfig":{"required":["hostname"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"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}}}]},"HeartbeatMonitorConfig":{"required":["expectedInterval","gracePeriod"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"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"}}}]},"HttpMonitorConfig":{"required":["method","url"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"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}}}]},"IcmpMonitorConfig":{"required":["host"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"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}}}]},"McpServerMonitorConfig":{"required":["command"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorConfig"},{"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}}}]},"MonitorConfig":{"type":"object","description":"Updated protocol-specific configuration; null preserves current"},"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","description":"Target hostname or IP address"},"port":{"maximum":65535,"minimum":1,"type":"integer","description":"TCP port to connect to","format":"int32"},"timeoutMs":{"type":"integer","description":"Connection timeout in milliseconds","format":"int32","nullable":true}}}]},"UpdateMonitorRequest":{"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"New monitor name; null preserves current","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","description":"New check frequency in seconds (30–86400); null preserves current","format":"int32","nullable":true},"enabled":{"type":"boolean","description":"Enable or disable the monitor; null preserves current","nullable":true},"regions":{"type":"array","description":"New probe regions; null preserves current","nullable":true,"items":{"type":"string","description":"New probe regions; null preserves current","nullable":true}},"managedBy":{"type":"string","description":"New management source; null preserves current","nullable":true,"enum":["DASHBOARD","CLI"]},"environmentId":{"type":"string","description":"New environment ID; null preserves current (use clearEnvironmentId to unset)","format":"uuid","nullable":true},"clearEnvironmentId":{"type":"boolean","description":"Set to true to remove the environment association","nullable":true},"assertions":{"type":"array","description":"Replace all assertions; null preserves current","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","description":"Set to true to remove authentication","nullable":true},"incidentPolicy":{"$ref":"#/components/schemas/UpdateIncidentPolicyRequest"},"alertChannelIds":{"type":"array","description":"Replace alert channel list; null preserves current","nullable":true,"items":{"type":"string","description":"Replace alert channel list; null preserves current","format":"uuid","nullable":true}},"tags":{"$ref":"#/components/schemas/AddMonitorTagsRequest"}}},"MonitorDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique monitor identifier","format":"uuid"},"organizationId":{"type":"integer","description":"Organization this monitor belongs to","format":"int32"},"name":{"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"]},"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":{"$ref":"#/components/schemas/Summary"},"auth":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]},"incidentPolicy":{"$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","nullable":true}}},"description":"Full monitor representation"},"SingleValueResponseMonitorDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorDto"}}},"Summary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"}},"description":"Environment associated with this monitor; null when unassigned"},"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"},"UpdateMaintenanceWindowRequest":{"required":["endsAt","startsAt"],"type":"object","properties":{"monitorId":{"type":"string","description":"Monitor to attach this maintenance window to; null preserves current","format":"uuid"},"startsAt":{"type":"string","description":"Updated start time (ISO 8601)","format":"date-time"},"endsAt":{"type":"string","description":"Updated end time (ISO 8601)","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string","description":"Updated iCal RRULE; null clears the repeat rule"},"reason":{"type":"string","description":"Updated reason; null clears the existing reason"},"suppressAlerts":{"type":"boolean","description":"Whether to suppress alerts; null preserves current"}}},"MaintenanceWindowDto":{"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"},"SingleValueResponseMaintenanceWindowDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MaintenanceWindowDto"}}},"UpdateEnvironmentRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"New environment name; null preserves current","nullable":true},"variables":{"type":"object","additionalProperties":{"type":"string","description":"Replace all variables; null preserves current","nullable":true},"description":"Replace all variables; null preserves current","nullable":true},"isDefault":{"type":"boolean","description":"Whether this is the default environment; null preserves current","nullable":true}}},"EnvironmentDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique environment identifier","format":"uuid"},"orgId":{"type":"integer","description":"Organization this environment belongs to","format":"int32"},"name":{"type":"string","description":"Human-readable environment name"},"slug":{"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"},"SingleValueResponseEnvironmentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EnvironmentDto"}}},"ChannelConfig":{"required":["channelType"],"type":"object","properties":{"channelType":{"type":"string"}},"description":"New channel configuration (full replacement, not partial update)","discriminator":{"propertyName":"channelType"}},"DiscordChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string","description":"Discord webhook URL"},"mentionRoleId":{"type":"string","description":"Optional Discord role ID to mention in notifications","nullable":true}}}]},"EmailChannelConfig":{"required":["recipients"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"recipients":{"minItems":1,"type":"array","description":"Email addresses to send notifications to","items":{"type":"string","description":"Email addresses to send notifications to","format":"email"}}}}]},"OpsGenieChannelConfig":{"required":["apiKey"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"apiKey":{"minLength":1,"type":"string","description":"OpsGenie API key for alert creation"},"region":{"type":"string","description":"OpsGenie API region: us or eu","nullable":true}}}]},"PagerDutyChannelConfig":{"required":["routingKey"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"routingKey":{"minLength":1,"type":"string","description":"PagerDuty Events API v2 routing (integration) key"},"severityOverride":{"type":"string","description":"Override PagerDuty severity mapping","nullable":true}}}]},"SlackChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string","description":"Slack incoming webhook URL"},"mentionText":{"type":"string","description":"Optional mention text included in notifications, e.g. @channel","nullable":true}}}]},"TeamsChannelConfig":{"required":["webhookUrl"],"type":"object","allOf":[{"$ref":"#/components/schemas/ChannelConfig"},{"type":"object","properties":{"webhookUrl":{"minLength":1,"type":"string","description":"Microsoft Teams incoming webhook URL"}}}]},"UpdateAlertChannelRequest":{"required":["config","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"New channel name (full replacement, not partial update)"},"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","description":"Webhook endpoint URL that receives alert payloads"},"signingSecret":{"type":"string","description":"Optional HMAC signing secret for payload verification","nullable":true},"customHeaders":{"type":"object","additionalProperties":{"type":"string","description":"Additional HTTP headers to include in webhook requests","nullable":true},"description":"Additional HTTP headers to include in webhook requests","nullable":true}}}]},"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":{"type":"object","additionalProperties":{"type":"object","description":"Non-sensitive display metadata; null for older channels","nullable":true},"description":"Non-sensitive display metadata; null for older channels","nullable":true},"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"},"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","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","nullable":true}},"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","nullable":true},"serviceName":{"type":"string","description":"Name of the associated service; populated on list responses","nullable":true},"serviceSlug":{"type":"string","description":"Slug of the associated service; populated on list responses","nullable":true},"monitorType":{"type":"string","description":"Type of the associated monitor; populated on list responses","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","nullable":true}},"description":"Incident triggered by a monitor check failure or manual creation"},"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","nullable":true}}},"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","description":"Service this health record belongs to","format":"uuid"},"serviceSlug":{"type":"string","description":"URL-safe service identifier"},"serviceName":{"type":"string","description":"Service name"},"adapterType":{"type":"string","description":"Data source adapter type","nullable":true},"lastSuccessAt":{"type":"string","description":"Timestamp of the last successful poll","format":"date-time","nullable":true},"lastFailureAt":{"type":"string","description":"Timestamp of the last failed poll","format":"date-time","nullable":true},"consecutiveFailures":{"type":"integer","description":"Number of consecutive poll failures","format":"int32"},"lastErrorMessage":{"type":"string","description":"Error message from the most recent failure","nullable":true},"disabledByHealth":{"type":"boolean","description":"Whether the adapter is disabled due to repeated failures"},"updatedAt":{"type":"string","description":"Timestamp when this health record was last updated","format":"date-time"}}},"SingleValueResponseAdapterHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdapterHealthDto"}}},"CreateOrgRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string","description":"Organization name"},"email":{"type":"string","description":"Billing and contact email address","format":"email","nullable":true}},"description":"Create a new organization"},"SingleValueResponseTransactionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionDto"}}},"TransactionDto":{"type":"object","properties":{"id":{"type":"string","description":"Paddle transaction identifier"},"status":{"type":"string","description":"Transaction status (e.g. completed, pending)","nullable":true},"currencyCode":{"type":"string","description":"ISO 4217 currency code","nullable":true},"invoiceNumber":{"type":"string","description":"Invoice number; null if not invoiced","nullable":true},"billedAt":{"type":"string","description":"Timestamp when the transaction was billed","format":"date-time","nullable":true},"createdAt":{"type":"string","description":"Timestamp when the transaction was created","format":"date-time"},"updatedAt":{"type":"string","description":"Timestamp when the transaction was last updated","format":"date-time"},"total":{"type":"string","description":"Total amount as a decimal string (including tax)","nullable":true},"subtotal":{"type":"string","description":"Subtotal before tax as a decimal string","nullable":true},"tax":{"type":"string","description":"Tax amount as a decimal string","nullable":true}},"description":"A billing transaction from Paddle"},"QuickMonitorRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string","description":"Target URL to monitor"},"name":{"type":"string","description":"Human-readable monitor name; defaults to the hostname if omitted","nullable":true},"frequencySeconds":{"type":"integer","description":"Check frequency in seconds (30–86400); defaults to 60","format":"int32","nullable":true}},"description":"Minimal request for creating an HTTP monitor quickly"},"OnboardingSetupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string","description":"Organization or team name (max 200 chars)"},"role":{"maxLength":50,"minLength":0,"type":"string","description":"User's role or job title","nullable":true},"teamSize":{"maxLength":50,"minLength":0,"type":"string","description":"Team size range (e.g. 1-10, 11-50)","nullable":true}}},"AnalyzeUrlRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string","description":"Target URL to analyze (must be a valid HTTP/HTTPS URL)"}},"description":"URL to analyze for monitor setup suggestions"},"AnalyzeUrlResponse":{"type":"object","properties":{"reachable":{"type":"boolean","description":"Whether the URL responded during analysis"},"responseTimeMs":{"type":"integer","description":"Response time observed during analysis in milliseconds","format":"int64"},"statusCode":{"type":"integer","description":"HTTP status code from the analysis request","format":"int32"},"tlsExpiry":{"type":"string","description":"TLS certificate expiry date; null for non-HTTPS or unavailable","format":"date-time","nullable":true},"tlsDaysRemaining":{"type":"integer","description":"Days until TLS certificate expires; null if not applicable","format":"int32","nullable":true},"contentType":{"type":"string","description":"Response Content-Type header value","nullable":true},"suggestedName":{"type":"string","description":"Suggested monitor name derived from the URL hostname"},"suggestedAssertions":{"type":"array","description":"Recommended assertions based on the URL response","items":{"$ref":"#/components/schemas/SuggestedAssertion"}},"suggestedFrequencySeconds":{"type":"integer","description":"Suggested check frequency in seconds based on the URL","format":"int32"}},"description":"Analysis of a URL with monitor setup suggestions"},"SingleValueResponseAnalyzeUrlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnalyzeUrlResponse"}}},"SuggestedAssertion":{"type":"object","properties":{"type":{"type":"string","description":"Assertion type (e.g. status_code, response_time)"},"operator":{"type":"string","description":"Comparison operator (e.g. equals, less_than)"},"value":{"type":"string","description":"Expected value to compare against"}},"description":"Recommended assertions based on the URL response"},"AcceptInviteRequest":{"required":["token"],"type":"object","properties":{"token":{"minLength":1,"type":"string","description":"Invite token from the invitation email"}},"description":"Accept an organization invite using the invite token"},"AcceptInviteDto":{"type":"object","properties":{"orgId":{"type":"integer","description":"Organization the user joined","format":"int32"},"userId":{"type":"integer","description":"User who accepted the invite","format":"int32"},"orgRole":{"type":"string","description":"Role assigned to the new member","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","description":"Initial membership status after joining","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}},"description":"Result of accepting an organization invite"},"SingleValueResponseAcceptInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AcceptInviteDto"}}},"RegisterUserRequest":{"type":"object","properties":{"nickname":{"type":"string","description":"User nickname from the identity provider","nullable":true},"name":{"type":"string","description":"User display name from the identity provider","nullable":true},"picture":{"type":"string","description":"Profile picture URL from the identity provider","nullable":true}}},"CreateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string","description":"Workspace name"}},"description":"Create a new workspace within the organization"},"AddMemberRequest":{"required":["orgRole","userId"],"type":"object","properties":{"userId":{"type":"integer","description":"ID of the user to add","format":"int32"},"orgRole":{"type":"string","description":"Role to assign to the new member","enum":["OWNER","ADMIN","MEMBER"]}},"description":"Add an existing user as a member of the organization"},"MemberDto":{"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"},"SingleValueResponseMemberDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MemberDto"}}},"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"},"subscribedEvents":{"minItems":1,"type":"array","description":"Event types to deliver, e.g. monitor.created, incident.resolved","items":{"minLength":1,"type":"string","description":"Event types to deliver, e.g. monitor.created, incident.resolved"}}}},"TestWebhookEndpointRequest":{"type":"object","properties":{"eventType":{"type":"string","description":"Event type to simulate (e.g. monitor.created); null uses a default","nullable":true}},"description":"Event type to use for a test webhook delivery"},"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","nullable":true}}},"DekRotationResultDto":{"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"},"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","description":"Unique secret key within the workspace (max 255 chars)"},"value":{"maxLength":32768,"minLength":0,"type":"string","description":"Secret value, stored encrypted (max 32KB)"}}},"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","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"},"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","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, default: 60)","format":"int32"},"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","nullable":true}},"managedBy":{"type":"string","description":"Who manages this monitor: DASHBOARD or CLI","enum":["DASHBOARD","CLI"]},"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":{"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","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","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","description":"Assertion type evaluated","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","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}}},"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","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"}}}},"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","description":"Monitor to attach this maintenance window to; null for org-wide","format":"uuid"},"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"},"reason":{"type":"string","description":"Human-readable reason for the maintenance"},"suppressAlerts":{"type":"boolean","description":"Whether to suppress alerts during this window (default: 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"},"InviteDto":{"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"},"SingleValueResponseInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InviteDto"}}},"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}}},"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","description":"Update message or post-mortem notes"},"newStatus":{"type":"string","description":"Updated incident status; null to keep current status","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"notifySubscribers":{"type":"boolean","description":"Whether to notify subscribers of this update"}}},"ResolveIncidentRequest":{"type":"object","properties":{"body":{"type":"string","description":"Optional resolution message or post-mortem notes"}}},"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"}}},"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"},"DeployLockDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique lock identifier","format":"uuid"},"lockedBy":{"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"},"SingleValueResponseDeployLockDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeployLockDto"}}},"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}}},"ApiKeyCreateResponse":{"type":"object","properties":{"id":{"type":"integer","description":"Unique API key identifier","format":"int32"},"name":{"type":"string","description":"Human-readable name for this API key"},"key":{"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"},"SingleValueResponseApiKeyCreateResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}},"ApiKeyDto":{"type":"object","properties":{"id":{"type":"integer","description":"Unique API key identifier","format":"int32"},"name":{"type":"string","description":"Human-readable name for this API key"},"key":{"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"},"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","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"}]}}},"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"}]}},"description":"Alert channel configuration to test without saving"},"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","description":"New name for this API key"}}},"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","nullable":true},"nullable":true}}},"SingleValueResponseListMonitorAssertionDto":{"type":"object","properties":{"data":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorAssertionDto"}}}},"SchedulableMonitorDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique monitor identifier","format":"uuid"},"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","format":"int32"},"regions":{"type":"array","description":"Probe regions to execute checks from","items":{"type":"string","description":"Probe regions to execute checks from"}},"organizationId":{"type":"integer","description":"Organization this monitor belongs to","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","nullable":true,"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","description":"Type of subscription action being previewed","enum":["UPGRADE","DOWNGRADE","NOOP"]},"immediateAmount":{"type":"integer","description":"Amount due immediately (proration) in smallest currency unit","format":"int32"},"nextBillingAmount":{"type":"integer","description":"Amount that will be charged on the next billing cycle","format":"int32"},"nextBillingDate":{"type":"string","description":"Date of the next billing cycle; null if cancelling","format":"date-time","nullable":true}},"description":"Preview of upcoming subscription charge after a plan change"},"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","description":"Numeric identifier","format":"int32"},"value":{"type":"string","description":"Display label or value"}},"description":"Generic id/value pair for select options and autocomplete"},"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","description":"Organization identifier","format":"int32"},"orgName":{"type":"string","description":"Organization name"},"orgRole":{"type":"string","description":"Member role within this organization","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","description":"Membership status","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}},"description":"Membership summary for an organization the user belongs to"},"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"}},"description":"List of all available webhook event types"},"WebhookEventCatalogResponse":{"type":"object","properties":{"data":{"type":"array","description":"List of all available webhook event types","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","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":{"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"},"ScheduledMaintenanceDto":{"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"},"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","description":"Date of the daily bucket (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"},"uptimePercentage":{"type":"number","description":"Computed uptime percentage for the day","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"}},"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","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"},"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"},"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","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"},"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","nullable":true}}},"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","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"},"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"}},"description":"Combined dashboard overview for monitors and incidents"},"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"},"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"},"SingleValueResponseDashboardOverviewDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DashboardOverviewDto"}}},"CategoryDto":{"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"},"TableValueResultCategoryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AuthMeResponse":{"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"},"KeyInfo":{"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"},"OrgInfo":{"type":"object","properties":{"id":{"type":"integer","description":"Organization ID","format":"int32"},"name":{"type":"string","description":"Organization name"}},"description":"Organization the key belongs to"},"PlanInfo":{"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"},"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"},"SingleValueResponseAuthMeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AuthMeResponse"}}},"AuditEventDto":{"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"}}},"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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/api/v1/alert-channels/{id}": { + "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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/api/v1/deploy/lock/force": { + "delete": { + "tags": [ + "Deploy Lock" + ], + "summary": "Force-release deploy lock", + "description": "Forcibly removes any deploy lock on the current workspace. Use to break stale locks.", + "operationId": "forceRelease", + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v1/environments": { + "get": { + "tags": [ + "Environments" + ], + "summary": "List environments", + "operationId": "list_12", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultEnvironmentDto" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Environments" + ], + "summary": "Delete environment", + "operationId": "delete_9", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v1/heartbeat/{token}": { + "get": { + "tags": [ + "Heartbeat" + ], + "summary": "Record a heartbeat ping (GET)", + "description": "Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.", + "operationId": "pingGet", + "parameters": [ + { + "name": "token", + "in": "path", + "description": "Ping endpoint token for the heartbeat monitor", + "required": true, + "schema": { + "type": "string" + } + } + ], + "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/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/api/v1/incidents/{id}": { + "get": { + "tags": [ + "Incidents" + ], + "summary": "Get incident details including update timeline", + "operationId": "get_10", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentDetailDto" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/api/v1/invites": { + "get": { + "tags": [ + "Invites" + ], + "summary": "List invites", + "operationId": "list_10", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultInviteDto" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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/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": "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/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "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}/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + }, + "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_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" + } + } + } + }, + "404": { + "description": "Monitor or policy not found", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseIncidentPolicyDto" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/api/v1/notification-policies/{id}/test": { + "post": { + "tags": [ + "Notification Policies" + ], + "summary": "Dry-run: evaluate a policy's match rules against a supplied incident context", + "operationId": "test_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestNotificationPolicyRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseTestMatchResult" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/api/v1/notifications/read-all": { + "put": { + "tags": [ + "Notifications" + ], + "summary": "Mark all notifications as read", + "operationId": "markAllRead", + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v1/notifications/unread-count": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "Get unread notification count", + "operationId": "unreadCount", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseLong" + } + } + } + } + } + } + }, + "/api/v1/org": { + "get": { + "tags": [ + "Organizations" + ], + "summary": "Get the current organization", + "operationId": "get_4", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseOrganizationDto" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/api/v1/secrets": { + "get": { + "tags": [ + "Secrets" + ], + "summary": "List secrets", + "operationId": "list_5", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultSecretDto" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Secrets" + ], + "summary": "Delete secret", + "operationId": "delete_4", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v1/service-subscriptions": { + "get": { + "tags": [ + "Service Subscriptions" + ], + "summary": "List all service subscriptions for the organization", + "operationId": "list_15", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/TableValueResultServiceSubscriptionDto" + } + } + } + } + } + } + }, + "/api/v1/service-subscriptions/{id}": { + "get": { + "tags": [ + "Service Subscriptions" + ], + "summary": "Get a subscription by its ID", + "operationId": "get_9", + "parameters": [ + { + "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_1", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + } + } + } + }, + "/api/v1/service-subscriptions/{id}/alert-sensitivity": { + "patch": { + "tags": [ + "Service Subscriptions" + ], + "summary": "Update alert sensitivity for a subscription", + "description": "Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents).", + "operationId": "updateAlertSensitivity", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAlertSensitivityRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/SingleValueResponseServiceSubscriptionDto" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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}/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/{slugOrId}/components/uptime": { + "get": { + "tags": [ + "Status Data" + ], + "summary": "Batch daily uptime data for all leaf components", + "description": "Returns daily uptime for every active non-group component with uptime data, keyed by component ID. Replaces N individual per-component uptime calls with a single request.", + "operationId": "getBatchComponentUptime", + "parameters": [ + { + "name": "slugOrId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "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/SingleValueResponseMapStringListComponentUptimeDayDto" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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}/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/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/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/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + }, + "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" + } + } + } + } + } + }, + "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" + } + } + } + } + }, + "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" + }, + "newStatus": { + "type": "string", + "description": "Updated incident status; null to keep current status", + "enum": [ + "WATCHING", + "TRIGGERED", + "CONFIRMED", + "RESOLVED" + ] + }, + "notifySubscribers": { + "type": "boolean", + "description": "Whether to notify subscribers of this update" + } + }, + "required": [ + "body", + "newStatus", + "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", + "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.", + "required": [ + "tagIds", + "newTags" + ] + }, + "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" + }, + "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": { + "type": "object", + "additionalProperties": { + "type": "object", + "description": "Non-sensitive display metadata; null for older channels", + "nullable": true + }, + "description": "Non-sensitive display metadata; null for older channels", + "nullable": true + }, + "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": { + "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", + "required": [ + "id", + "incidentId", + "dispatchId", + "channelId", + "channel", + "channelType", + "status", + "eventType", + "stepNumber", + "fireCount", + "attemptCount", + "lastAttemptAt", + "nextRetryAt", + "deliveredAt", + "errorMessage", + "createdAt" + ] + }, + "ApiKeyAuthConfig": { + "required": [ + "headerName" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + }, + { + "type": "object", + "properties": { + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "HTTP header name that carries the API key" + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the API key value", + "format": "uuid", + "nullable": true + } + } + } + ] + }, + "ApiKeyCreateResponse": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Unique API key identifier", + "format": "int32" + }, + "name": { + "type": "string", + "description": "Human-readable name for this API key" + }, + "key": { + "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", + "required": [ + "id", + "name", + "key", + "createdAt", + "expiresAt" + ] + }, + "ApiKeyDto": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Unique API key identifier", + "format": "int32" + }, + "name": { + "type": "string", + "description": "Human-readable name for this API key" + }, + "key": { + "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", + "required": [ + "id", + "name", + "key", + "createdAt", + "updatedAt", + "lastUsedAt", + "revokedAt", + "expiresAt" + ] + }, + "AssertionConfig": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "New assertion configuration (full replacement)", + "discriminator": { + "propertyName": "type" + } + }, + "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", + "required": [ + "type", + "passed", + "severity", + "message", + "expected", + "actual" + ] + }, + "AssertionTestResultDto": { + "type": "object", + "properties": { + "assertionType": { + "type": "string", + "description": "Assertion type evaluated", + "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", + "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 + } + }, + "required": [ + "assertionType", + "passed", + "severity", + "message", + "expected", + "actual" + ] + }, + "AuditEventDto": { + "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" + } + }, + "required": [ + "id", + "actorId", + "actorEmail", + "action", + "resourceType", + "resourceId", + "resourceName", + "metadata", + "createdAt" + ] + }, + "AuthMeResponse": { + "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", + "required": [ + "key", + "organization", + "plan", + "rateLimits" + ] + }, + "BasicAuthConfig": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + }, + { + "type": "object", + "properties": { + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding Basic auth username and password", + "format": "uuid", + "nullable": true + } + } + } + ] + }, + "BearerAuthConfig": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + }, + { + "type": "object", + "properties": { + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID holding the bearer token value", + "format": "uuid", + "nullable": true + } + } + } + ] + }, + "BodyContainsAssertion": { + "required": [ + "substring" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in the response body" + } + } + } + ] + }, + "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", + "required": [ + "succeeded", + "failed" + ] + }, + "CategoryDto": { + "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", + "required": [ + "category", + "serviceCount" + ] + }, + "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" + }, + "ChannelConfig": { + "required": [ + "channelType" + ], + "type": "object", + "properties": { + "channelType": { + "type": "string" + } + }, + "description": "New channel configuration (full replacement, not partial update)", + "discriminator": { + "propertyName": "channelType" + } + }, + "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 + }, + "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", + "required": [ + "bucket", + "uptimePercent", + "avgLatencyMs", + "p95LatencyMs", + "p99LatencyMs" + ] + }, + "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", + "required": [ + "statusCode", + "responseHeaders", + "responseBodySnapshot", + "assertionResults", + "tlsInfo", + "redirectCount", + "redirectTarget", + "responseSizeBytes" + ] + }, + "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" + }, + "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", + "required": [ + "id", + "timestamp", + "region", + "responseTimeMs", + "passed", + "failureReason", + "severityHint", + "details", + "checkId" + ] + }, + "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" + } + }, + "ComponentPosition": { + "required": [ + "componentId" + ], + "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" + } + }, + "description": "A single component position" + }, + "ComponentStatusDto": { + "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", + "required": [ + "id", + "name", + "status" + ] + }, + "ComponentUptimeDayDto": { + "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", + "required": [ + "date", + "partialOutageSeconds", + "majorOutageSeconds", + "uptimePercentage", + "incidents" + ] + }, + "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", + "required": [ + "day", + "week", + "month", + "source" + ] + }, + "ConfirmationPolicy": { + "required": [ + "type" + ], + "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)", + "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" + } + } + }, + "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" + }, + "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" + }, + "reason": { + "type": "string", + "description": "Human-readable reason for the maintenance" + }, + "suppressAlerts": { + "type": "boolean", + "description": "Whether to suppress alerts during this window (default: 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, default: 60)", + "format": "int32" + }, + "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", + "nullable": true + } + }, + "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": { + "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", + "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", + "nullable": true + } + }, + "tags": { + "$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)", + "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" + }, + "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" + }, + "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 + }, + "collapsed": { + "type": "boolean", + "description": "Whether the group is collapsed by default (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 data", + "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": { + "$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" + }, + "subscribedEvents": { + "minItems": 1, + "type": "array", + "description": "Event types to deliver, e.g. monitor.created, incident.resolved", + "items": { + "minLength": 1, + "type": "string", + "description": "Event types to deliver, e.g. monitor.created, incident.resolved" + } + } + } + }, + "CreateWorkspaceRequest": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "minLength": 1, + "type": "string", + "description": "Workspace name" + } + }, + "description": "Create a new workspace within the organization" + }, + "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", + "required": [ + "data", + "nextCursor", + "hasMore" + ] + }, + "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", + "required": [ + "data", + "nextCursor", + "hasMore" + ] + }, + "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", + "required": [ + "data", + "nextCursor", + "hasMore" + ] + }, + "DashboardOverviewDto": { + "type": "object", + "properties": { + "monitors": { + "$ref": "#/components/schemas/MonitorsSummaryDto" + }, + "incidents": { + "$ref": "#/components/schemas/IncidentsSummaryDto" + } + }, + "description": "Combined dashboard overview for monitors and incidents", + "required": [ + "monitors", + "incidents" + ] + }, + "DekRotationResultDto": { + "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", + "required": [ + "previousDekVersion", + "newDekVersion", + "secretsReEncrypted", + "channelsReEncrypted", + "rotatedAt" + ] + }, + "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": { + "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", + "required": [ + "id", + "deliveryId", + "attemptNumber", + "status", + "responseStatusCode", + "requestPayload", + "responseBody", + "errorMessage", + "responseTimeMs", + "externalId", + "requestHeaders", + "attemptedAt" + ] + }, + "DeployLockDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique lock identifier", + "format": "uuid" + }, + "lockedBy": { + "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", + "required": [ + "id", + "lockedBy", + "lockedAt", + "expiresAt" + ] + }, + "DiscordChannelConfig": { + "required": [ + "webhookUrl" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelConfig" + }, + { + "type": "object", + "properties": { + "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", + "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 + } + } + } + ] + }, + "DnsExpectedCnameAssertion": { + "required": [ + "value" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "value": { + "minLength": 1, + "type": "string", + "description": "Expected CNAME target the resolution must include" + } + } + } + ] + }, + "DnsExpectedIpsAssertion": { + "required": [ + "ips" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "ips": { + "minItems": 1, + "type": "array", + "description": "Allowed IP addresses; at least one resolved address must match", + "items": { + "type": "string", + "description": "Allowed IP addresses; at least one resolved address must match" + } + } + } + } + ] + }, + "DnsMaxAnswersAssertion": { + "required": [ + "recordType" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type whose answer count is checked" + }, + "max": { + "type": "integer", + "description": "Maximum number of answers allowed for that record type", + "format": "int32" + } + } + } + ] + }, + "DnsMinAnswersAssertion": { + "required": [ + "recordType" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type whose answer count is checked" + }, + "min": { + "type": "integer", + "description": "Minimum number of answers required for that record type", + "format": "int32" + } + } + } + ] + }, + "DnsMonitorConfig": { + "required": [ + "hostname" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorConfig" + }, + { + "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": [ + "recordType", + "substring" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in a matching record value" + } + } + } + ] + }, + "DnsRecordEqualsAssertion": { + "required": [ + "recordType", + "value" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "recordType": { + "minLength": 1, + "type": "string", + "description": "DNS record type to assert on (A, AAAA, CNAME, MX, TXT)" + }, + "value": { + "minLength": 1, + "type": "string", + "description": "Expected DNS record value for an exact match" + } + } + } + ] + }, + "DnsResolvesAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + } + ] + }, + "DnsResponseTimeAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxMs": { + "type": "integer", + "description": "Maximum allowed DNS resolution time in milliseconds", + "format": "int32" + } + } + } + ] + }, + "DnsResponseTimeWarnAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "warnMs": { + "type": "integer", + "description": "DNS resolution time in milliseconds that triggers a warning only", + "format": "int32" + } + } + } + ] + }, + "DnsTtlHighAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxTtl": { + "type": "integer", + "description": "Maximum TTL in seconds before a high-TTL warning is raised", + "format": "int32" + } + } + } + ] + }, + "DnsTtlLowAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "minTtl": { + "type": "integer", + "description": "Minimum acceptable TTL in seconds before a warning is raised", + "format": "int32" + } + } + } + ] + }, + "DnsTxtContainsAssertion": { + "required": [ + "substring" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "substring": { + "minLength": 1, + "type": "string", + "description": "Substring that must appear in at least one TXT record" + } + } + } + ] + }, + "EmailChannelConfig": { + "required": [ + "recipients" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelConfig" + }, + { + "type": "object", + "properties": { + "recipients": { + "minItems": 1, + "type": "array", + "description": "Email addresses to send notifications to", + "items": { + "type": "string", + "description": "Email addresses to send notifications to", + "format": "email" + } + } + } + } + ] + }, + "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", + "required": [ + "key", + "value", + "defaultValue", + "overridden" + ] + }, + "EnvironmentDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique environment identifier", + "format": "uuid" + }, + "orgId": { + "type": "integer", + "description": "Organization this environment belongs to", + "format": "int32" + }, + "name": { + "type": "string", + "description": "Human-readable environment name" + }, + "slug": { + "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", + "required": [ + "id", + "orgId", + "name", + "slug", + "variables", + "createdAt", + "updatedAt", + "monitorCount", + "isDefault" + ] + }, + "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" + ], + "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": { + "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", + "required": [ + "monitorId", + "reason" + ] + }, + "GlobalStatusSummaryDto": { + "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", + "required": [ + "totalServices", + "operationalCount", + "degradedCount", + "partialOutageCount", + "majorOutageCount", + "maintenanceCount", + "unknownCount", + "activeIncidentCount", + "servicesWithIssues" + ] + }, + "GroupComponentOrder": { + "required": [ + "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": [ + "headerName" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorAuthConfig" + }, + { + "type": "object", + "properties": { + "headerName": { + "minLength": 1, + "pattern": "^[A-Za-z0-9\\-_]+$", + "type": "string", + "description": "Custom HTTP header name for the secret value" + }, + "vaultSecretId": { + "type": "string", + "description": "Vault secret ID for the header value", + "format": "uuid", + "nullable": true + } + } + } + ] + }, + "HeaderValueAssertion": { + "required": [ + "expected", + "headerName", + "operator" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "headerName": { + "minLength": 1, + "type": "string", + "description": "HTTP header name to assert on" + }, + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected value to compare against" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] + } + } + } + ] + }, + "HeartbeatIntervalDriftAssertion": { + "required": [ + "maxDeviationPercent" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxDeviationPercent": { + "maximum": 100, + "minimum": 1, + "type": "integer", + "description": "Max percent drift from expected ping interval before warning (non-fatal)", + "format": "int32" + } + } + } + ] + }, + "HeartbeatMaxIntervalAssertion": { + "required": [ + "maxSeconds" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxSeconds": { + "minimum": 1, + "type": "integer", + "description": "Maximum allowed gap in seconds between consecutive heartbeat pings", + "format": "int32" + } + } + } + ] + }, + "HeartbeatMonitorConfig": { + "required": [ + "expectedInterval", + "gracePeriod" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorConfig" + }, + { + "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": [ + "path", + "value" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "path": { + "minLength": 1, + "type": "string", + "description": "JSONPath expression into the heartbeat ping JSON payload" + }, + "value": { + "type": "string", + "description": "Expected value to compare against at that path" + } + } + } + ] + }, + "HeartbeatReceivedAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + } + ] + }, + "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 + } + } + } + ] + }, + "HttpMonitorConfig": { + "required": [ + "method", + "url" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorConfig" + }, + { + "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": { + "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 + }, + "avgRttMs": { + "type": "number", + "description": "Average round-trip time in ms", + "format": "double", + "nullable": true + }, + "minRttMs": { + "type": "number", + "description": "Minimum round-trip time in ms", + "format": "double", + "nullable": true + }, + "maxRttMs": { + "type": "number", + "description": "Maximum round-trip time in ms", + "format": "double", + "nullable": true + }, + "jitterMs": { + "type": "number", + "description": "Jitter in ms", + "format": "double", + "nullable": true + } + } + } + ] + }, + "IcmpMonitorConfig": { + "required": [ + "host" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorConfig" + }, + { + "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", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxPercent": { + "maximum": 100, + "exclusiveMaximum": false, + "minimum": 0, + "exclusiveMinimum": false, + "type": "number", + "description": "Maximum allowed packet loss percentage before the check fails (0–100)", + "format": "double" + } + } + } + ] + }, + "IcmpReachableAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + } + ] + }, + "IcmpResponseTimeAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxMs": { + "type": "integer", + "description": "Maximum average ICMP round-trip time in milliseconds", + "format": "int32" + } + } + } + ] + }, + "IcmpResponseTimeWarnAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "warnMs": { + "type": "integer", + "description": "ICMP round-trip time in milliseconds that triggers a warning only", + "format": "int32" + } + } + } + ] + }, + "IncidentDetailDto": { + "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" + } + } + }, + "required": [ + "incident", + "updates", + "statusPageIncidents" + ] + }, + "IncidentDto": { + "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", + "nullable": true + } + }, + "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", + "nullable": true + }, + "serviceName": { + "type": "string", + "description": "Name of the associated service; populated on list responses", + "nullable": true + }, + "serviceSlug": { + "type": "string", + "description": "Slug of the associated service; populated on list responses", + "nullable": true + }, + "monitorType": { + "type": "string", + "description": "Type of the associated monitor; populated on list responses", + "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", + "nullable": true + } + }, + "description": "Incident triggered by a monitor check failure or manual creation", + "required": [ + "id", + "monitorId", + "organizationId", + "source", + "status", + "severity", + "title", + "triggeredByRule", + "affectedRegions", + "reopenCount", + "createdByUserId", + "statusPageVisible", + "serviceIncidentId", + "serviceId", + "externalRef", + "affectedComponents", + "shortlink", + "resolutionReason", + "startedAt", + "confirmedAt", + "resolvedAt", + "cooldownUntil", + "createdAt", + "updatedAt", + "monitorName", + "serviceName", + "serviceSlug", + "monitorType", + "resourceGroupId", + "resourceGroupName" + ] + }, + "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" + } + }, + "required": [ + "status", + "severity", + "source", + "monitorId", + "serviceId", + "resourceGroupId", + "tagId", + "environmentId", + "startedFrom", + "startedTo", + "page", + "size" + ] + }, + "IncidentPolicyDto": { + "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", + "required": [ + "id", + "monitorId", + "triggerRules", + "confirmation", + "recovery", + "createdAt", + "updatedAt", + "monitorRegionCount", + "checkFrequencySeconds" + ] + }, + "IncidentRef": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Status page incident ID", + "format": "uuid" + }, + "title": { + "type": "string", + "description": "Incident title" + }, + "impact": { + "type": "string", + "description": "Incident impact level" + } + }, + "description": "Lightweight reference to an incident overlapping this day", + "required": [ + "id", + "title", + "impact" + ] + }, + "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", + "mttr30d" + ] + }, + "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" + } + }, + "required": [ + "id", + "incidentId", + "oldStatus", + "newStatus", + "body", + "createdBy", + "notifySubscribers", + "createdAt" + ] + }, + "IntegrationConfigSchemaDto": { + "type": "object", + "properties": { + "connectionFields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationFieldDto" + } + }, + "channelFields": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationFieldDto" + } + } + }, + "required": [ + "connectionFields", + "channelFields" + ] + }, + "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" + } + }, + "required": [ + "type", + "name", + "description", + "logoUrl", + "authType", + "tierAvailability", + "lifecycle", + "setupGuideUrl", + "configSchema" + ] + }, + "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 + } + } + }, + "InviteDto": { + "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", + "required": [ + "inviteId", + "email", + "roleOffered", + "expiresAt", + "consumedAt", + "revokedAt" + ] + }, + "JsonPathAssertion": { + "required": [ + "expected", + "operator", + "path" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "path": { + "minLength": 1, + "type": "string", + "description": "JSONPath expression to extract a value from the response body" + }, + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected value to compare against" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] + } + } + } + ] + }, + "KeyInfo": { + "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", + "required": [ + "id", + "name", + "createdAt", + "expiresAt", + "lastUsedAt" + ] + }, + "LinkedStatusPageIncidentDto": { + "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 + } + }, + "required": [ + "id", + "statusPageId", + "statusPageName", + "statusPageSlug", + "title", + "status", + "impact", + "scheduled", + "publishedAt" + ] + }, + "MaintenanceComponentRef": { + "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", + "required": [ + "id", + "name", + "status" + ] + }, + "MaintenanceUpdateDto": { + "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", + "required": [ + "id", + "status", + "body", + "displayAt" + ] + }, + "MaintenanceWindowDto": { + "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", + "required": [ + "id", + "monitorId", + "organizationId", + "startsAt", + "endsAt", + "repeatRule", + "reason", + "suppressAlerts", + "createdAt" + ] + }, + "MatchRule": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Rule type, e.g. severity_gte, monitor_id_in, region_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", + "nullable": true + } + }, + "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", + "nullable": true + } + }, + "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", + "nullable": true + } + } + }, + "description": "Match rules to evaluate (all must pass; omit or empty for catch-all)" + }, + "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", + "description": "Capability name the server must advertise, e.g. tools or resources" + } + } + } + ] + }, + "McpMinToolsAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "min": { + "type": "integer", + "description": "Minimum number of tools the server must expose", + "format": "int32" + } + } + } + ] + }, + "McpProtocolVersionAssertion": { + "required": [ + "version" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "version": { + "minLength": 1, + "type": "string", + "description": "Expected MCP protocol version string from the server handshake" + } + } + } + ] + }, + "McpResponseTimeAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxMs": { + "type": "integer", + "description": "Maximum allowed MCP check duration in milliseconds", + "format": "int32" + } + } + } + ] + }, + "McpResponseTimeWarnAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "warnMs": { + "type": "integer", + "description": "MCP check duration in milliseconds that triggers a warning only", + "format": "int32" + } + } + } + ] + }, + "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 + } + } + } + ] + }, + "McpServerMonitorConfig": { + "required": [ + "command" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/MonitorConfig" + }, + { + "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": [ + "toolName" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "toolName": { + "minLength": 1, + "type": "string", + "description": "MCP tool name that must appear in the server's tool list" + } + } + } + ] + }, + "McpToolCountChangedAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "expectedCount": { + "type": "integer", + "description": "Expected tool count; warns when the live count differs", + "format": "int32" + } + } + } + ] + }, + "MemberDto": { + "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", + "required": [ + "userId", + "email", + "name", + "orgRole", + "status", + "createdAt" + ] + }, + "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" + ] + } + }, + "required": [ + "id", + "monitorId", + "assertionType", + "severity" + ] + }, + "MonitorAuthConfig": { + "required": [ + "type" + ], + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "description": "New authentication configuration (full replacement)", + "discriminator": { + "propertyName": "type" + } + }, + "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" + } + ] + } + }, + "required": [ + "id", + "monitorId", + "authType" + ] + }, + "MonitorConfig": { + "type": "object", + "description": "Updated protocol-specific configuration; null preserves current" + }, + "MonitorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique monitor identifier", + "format": "uuid" + }, + "organizationId": { + "type": "integer", + "description": "Organization this monitor belongs to", + "format": "int32" + }, + "name": { + "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": { + "$ref": "#/components/schemas/Summary" + }, + "auth": { + "oneOf": [ + { + "$ref": "#/components/schemas/ApiKeyAuthConfig" + }, + { + "$ref": "#/components/schemas/BasicAuthConfig" + }, + { + "$ref": "#/components/schemas/BearerAuthConfig" + }, + { + "$ref": "#/components/schemas/HeaderAuthConfig" + } + ] + }, + "incidentPolicy": { + "$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", + "nullable": true + } + } + }, + "description": "Full monitor representation", + "required": [ + "id", + "organizationId", + "name", + "type", + "frequencySeconds", + "enabled", + "regions", + "managedBy", + "createdAt", + "updatedAt", + "assertions", + "tags", + "pingUrl", + "environment", + "incidentPolicy", + "alertChannelIds" + ] + }, + "MonitorReference": { + "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", + "required": [ + "id", + "name" + ] + }, + "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", + "avgUptime24h", + "avgUptime30d" + ] + }, + "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": { + "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 + } + } + }, + "required": [ + "passed", + "error", + "statusCode", + "responseTimeMs", + "responseHeaders", + "bodyPreview", + "responseSizeBytes", + "redirectCount", + "finalUrl", + "assertionResults", + "warnings" + ] + }, + "MonitorVersionDto": { + "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", + "required": [ + "id", + "monitorId", + "version", + "snapshot", + "changedById", + "changedVia", + "changeSummary", + "createdAt" + ] + }, + "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": { + "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", + "required": [ + "id", + "incidentId", + "policyId", + "policyName", + "status", + "completionReason", + "currentStep", + "totalSteps", + "acknowledgedAt", + "nextEscalationAt", + "lastNotifiedAt", + "deliveries", + "createdAt", + "updatedAt" + ] + }, + "NotificationDto": { + "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", + "required": [ + "id", + "type", + "title", + "body", + "resourceType", + "resourceId", + "read", + "createdAt" + ] + }, + "NotificationPolicyDto": { + "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": { + "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", + "required": [ + "id", + "organizationId", + "name", + "matchRules", + "escalation", + "enabled", + "priority", + "createdAt", + "updatedAt" + ] + }, + "OpsGenieChannelConfig": { + "required": [ + "apiKey" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelConfig" + }, + { + "type": "object", + "properties": { + "apiKey": { + "minLength": 1, + "type": "string", + "description": "OpsGenie API key for alert creation" + }, + "region": { + "type": "string", + "description": "OpsGenie API region: us or eu", + "nullable": true + } + } + } + ] + }, + "OrganizationDto": { + "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", + "required": [ + "id", + "name", + "email", + "size", + "industry", + "websiteUrl" + ] + }, + "OrgInfo": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "Organization ID", + "format": "int32" + }, + "name": { + "type": "string", + "description": "Organization name" + } + }, + "description": "Organization the key belongs to", + "required": [ + "id", + "name" + ] + }, + "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": [ + "routingKey" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelConfig" + }, + { + "type": "object", + "properties": { + "routingKey": { + "minLength": 1, + "type": "string", + "description": "PagerDuty Events API v2 routing (integration) key" + }, + "severityOverride": { + "type": "string", + "description": "Override PagerDuty severity mapping", + "nullable": true + } + } + } + ] + }, + "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": [ + "groupId", + "componentId", + "pageOrder" + ] + }, + "PlanInfo": { + "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", + "required": [ + "tier", + "subscriptionStatus", + "trialActive", + "trialExpiresAt", + "entitlements", + "usage" + ] + }, + "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 + } + }, + "required": [ + "title", + "impact", + "status", + "body", + "affectedComponents", + "notifySubscribers" + ] + }, + "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", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxCount": { + "type": "integer", + "description": "Maximum number of HTTP redirects allowed before the check fails", + "format": "int32" + } + } + } + ] + }, + "RedirectTargetAssertion": { + "required": [ + "expected", + "operator" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected final URL after following redirects" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] + } + } + } + ] + }, + "RegexBodyAssertion": { + "required": [ + "pattern" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "pattern": { + "minLength": 1, + "type": "string", + "description": "Regular expression the response body must match" + } + } + } + ] + }, + "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", + "required": [ + "region", + "passed", + "responseTimeMs", + "timestamp", + "severityHint" + ] + }, + "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" + } + }, + "required": [ + "body" + ] + }, + "ResourceGroupDto": { + "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": { + "type": "string", + "description": "Human-readable group name" + }, + "slug": { + "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", + "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", + "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", + "required": [ + "id", + "organizationId", + "name", + "slug", + "description", + "alertPolicyId", + "defaultFrequency", + "defaultRegions", + "defaultRetryStrategy", + "defaultAlertChannels", + "defaultEnvironmentId", + "healthThresholdType", + "healthThresholdValue", + "suppressMemberAlerts", + "confirmationDelaySeconds", + "recoveryCooldownMinutes", + "health", + "members", + "createdAt", + "updatedAt" + ] + }, + "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", + "required": [ + "status", + "totalMembers", + "operationalCount", + "activeIncidents", + "thresholdStatus", + "failingCount" + ] + }, + "ResourceGroupMemberDto": { + "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", + "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", + "required": [ + "id", + "groupId", + "memberType", + "monitorId", + "serviceId", + "name", + "slug", + "subscriptionId", + "status", + "effectiveFrequency", + "createdAt", + "uptime24h", + "chartData", + "avgLatencyMs", + "p95LatencyMs", + "lastCheckedAt", + "monitorType", + "environmentName" + ] + }, + "ResponseSizeAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "maxBytes": { + "type": "integer", + "description": "Maximum response body size in bytes before the check fails", + "format": "int32" + } + } + } + ] + }, + "ResponseTimeAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "thresholdMs": { + "type": "integer", + "description": "Maximum allowed response time in milliseconds before the check fails", + "format": "int32" + } + } + } + ] + }, + "ResponseTimeWarnAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "warnMs": { + "type": "integer", + "description": "HTTP response time in milliseconds that triggers a warning only", + "format": "int32" + } + } + } + ] + }, + "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", + "required": [ + "currentStatus", + "latestPerRegion", + "chartData", + "uptime24h", + "uptimeWindow" + ] + }, + "RetryStrategy": { + "required": [ + "type" + ], + "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": { + "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", + "required": [ + "id", + "externalId", + "title", + "status", + "impact", + "shortlink", + "scheduledFor", + "scheduledUntil", + "startedAt", + "completedAt", + "affectedComponents", + "updates" + ] + }, + "SecretDto": { + "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", + "required": [ + "id", + "key", + "dekVersion", + "valueHash", + "createdAt", + "updatedAt", + "usedByMonitors" + ] + }, + "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", + "required": [ + "shortDescription", + "description", + "about" + ] + }, + "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" + }, + "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", + "required": [ + "id", + "slug", + "name", + "category", + "officialStatusUrl", + "developerContext", + "logoUrl", + "adapterType", + "pollingIntervalSeconds", + "enabled", + "published", + "overallStatus", + "createdAt", + "updatedAt", + "componentCount", + "activeIncidentCount", + "dataCompleteness", + "uptime30d" + ] + }, + "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", + "required": [ + "id", + "externalId", + "name", + "status", + "description", + "groupId", + "position", + "showcase", + "onlyShowIfDegraded", + "startDate", + "vendorCreatedAt", + "lifecycleStatus", + "dataType", + "hasUptime", + "region", + "groupName", + "uptime", + "statusChangedAt", + "firstSeenAt", + "lastSeenAt", + "group" + ] + }, + "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" + }, + "seoMetadata": { + "$ref": "#/components/schemas/SeoMetadataDto" + }, + "relatedServices": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ServiceCatalogDto" + } + } + }, + "required": [ + "id", + "slug", + "name", + "category", + "officialStatusUrl", + "developerContext", + "logoUrl", + "adapterType", + "pollingIntervalSeconds", + "enabled", + "createdAt", + "updatedAt", + "currentStatus", + "recentIncidents", + "components", + "uptime", + "activeMaintenances", + "dataCompleteness", + "seoMetadata", + "relatedServices" + ] + }, + "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" + } + } + }, + "required": [ + "id", + "title", + "status", + "impact", + "startedAt", + "resolvedAt", + "detectedAt", + "shortlink", + "affectedComponents", + "updates" + ] + }, + "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 + } + }, + "required": [ + "id", + "serviceId", + "serviceSlug", + "serviceName", + "externalId", + "title", + "status", + "impact", + "startedAt", + "resolvedAt", + "updatedAt", + "shortlink", + "detectedAt", + "vendorCreatedAt" + ] + }, + "ServiceIncidentUpdateDto": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "body": { + "type": "string", + "nullable": true + }, + "displayAt": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "required": [ + "status", + "body", + "displayAt" + ] + }, + "ServiceLiveStatusDto": { + "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 + } + }, + "required": [ + "overallStatus", + "componentStatuses", + "activeIncidentCount", + "lastPolledAt" + ] + }, + "ServiceStatusDto": { + "type": "object", + "properties": { + "overallStatus": { + "type": "string" + }, + "lastPolledAt": { + "type": "string", + "format": "date-time", + "nullable": true + } + }, + "required": [ + "overallStatus", + "lastPolledAt" + ] + }, + "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", + "required": [ + "componentId", + "alertSensitivity" + ] + }, + "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", + "required": [ + "subscriptionId", + "serviceId", + "slug", + "name", + "category", + "officialStatusUrl", + "adapterType", + "pollingIntervalSeconds", + "enabled", + "logoUrl", + "overallStatus", + "componentId", + "component", + "alertSensitivity", + "subscribedAt" + ] + }, + "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", + "required": [ + "overallUptimePct", + "period", + "granularity", + "buckets", + "source" + ] + }, + "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": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/AlertChannelDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseAlertDeliveryDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/AlertDeliveryDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseApiKeyCreateResponse": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiKeyCreateResponse" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseApiKeyDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiKeyDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseAuthMeResponse": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/AuthMeResponse" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseBulkMonitorActionResult": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/BulkMonitorActionResult" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseDashboardOverviewDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DashboardOverviewDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseDekRotationResultDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DekRotationResultDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseDeployLockDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DeployLockDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseEnvironmentDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseGlobalStatusSummaryDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/GlobalStatusSummaryDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseIncidentDetailDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/IncidentDetailDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseIncidentPolicyDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/IncidentPolicyDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseInviteDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/InviteDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseListUUID": { + "type": "object", + "properties": { + "data": { + "type": "array", + "nullable": true, + "items": { + "type": "string", + "format": "uuid", + "nullable": true + } + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseLong": { + "type": "object", + "properties": { + "data": { + "type": "integer", + "format": "int64", + "nullable": true + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMaintenanceWindowDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MaintenanceWindowDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMapStringListComponentUptimeDayDto": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/ComponentUptimeDayDto" + } + }, + "nullable": true + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMonitorAssertionDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorAssertionDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMonitorAuthDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorAuthDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMonitorDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMonitorTestResultDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorTestResultDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseMonitorVersionDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/MonitorVersionDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseNotificationDispatchDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationDispatchDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseNotificationPolicyDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationPolicyDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseOrganizationDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/OrganizationDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseResourceGroupDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ResourceGroupDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseResourceGroupHealthDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ResourceGroupHealthDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseResourceGroupMemberDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ResourceGroupMemberDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseResultSummaryDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ResultSummaryDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseSecretDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SecretDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseServiceDetailDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ServiceDetailDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseServiceIncidentDetailDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ServiceIncidentDetailDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseServiceLiveStatusDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ServiceLiveStatusDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseServiceSubscriptionDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ServiceSubscriptionDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseServiceUptimeResponse": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ServiceUptimeResponse" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageComponentDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageComponentDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageComponentGroupDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageComponentGroupDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageCustomDomainDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageCustomDomainDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageIncidentDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageIncidentDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseStatusPageSubscriberDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/StatusPageSubscriberDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseString": { + "type": "object", + "properties": { + "data": { + "type": "string", + "nullable": true + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseTagDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TagDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseTestChannelResult": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TestChannelResult" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseTestMatchResult": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/TestMatchResult" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseUptimeDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/UptimeDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseWebhookEndpointDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/WebhookEndpointDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseWebhookSigningSecretDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/WebhookSigningSecretDto" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseWebhookTestResult": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/WebhookTestResult" + } + }, + "required": [ + "data" + ] + }, + "SingleValueResponseWorkspaceDto": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/WorkspaceDto" + } + }, + "required": [ + "data" + ] + }, + "SlackChannelConfig": { + "required": [ + "webhookUrl" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelConfig" + }, + { + "type": "object", + "properties": { + "webhookUrl": { + "minLength": 1, + "type": "string", + "description": "Slack incoming webhook URL" + }, + "mentionText": { + "type": "string", + "description": "Optional mention text included in notifications, e.g. @channel", + "nullable": true + } + } + } + ] + }, + "SslExpiryAssertion": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "minDaysRemaining": { + "type": "integer", + "description": "Minimum days before TLS certificate expiry; fails or warns below this threshold", + "format": "int32" + } + } + } + ] + }, + "StatusCodeAssertion": { + "required": [ + "expected", + "operator" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/AssertionConfig" + }, + { + "type": "object", + "properties": { + "expected": { + "minLength": 1, + "type": "string", + "description": "Expected status code, range pattern, or wildcard such as 2xx" + }, + "operator": { + "type": "string", + "description": "Comparison operator (equals, contains, less_than, greater_than, etc.)", + "enum": [ + "equals", + "contains", + "less_than", + "greater_than", + "matches", + "range" + ] + } + } + } + ] + }, + "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" + }, + "customCss": { + "maxLength": 50000, + "minLength": 0, + "type": "string", + "description": "Custom CSS injected via