From d4e011219ff535be89fcadbf400f72d3bb106c2c Mon Sep 17 00:00:00 2001 From: caballeto Date: Fri, 10 Apr 2026 15:29:52 +0200 Subject: [PATCH] fix: type safety overhaul, bug fixes, and hardening MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type safety: - Regenerate api.generated.ts from latest spec (actor param removed, /auth/me added) - Remove all `as any` from standalone commands — full typed paths and responses - Confine remaining `as any` to CRUD factory (crud-commands.ts) with documented rationale Bug fixes: - Notification policy update: only send explicitly passed fields (was sending "undefined") - Alert channel --config: wrap JSON.parse in try/catch with user-friendly error - Corrupt contexts.json: graceful fallback instead of crash - Remove default org/workspace ID '1' fallback — only send when explicitly set - Wire up handleApiError for structured AuthError/DevhelmError with proper exit codes - Add MCP_SERVER to validate.ts VALID_TYPES - Fix monitors/results field names to match DTO (responseTimeMs, timestamp, passed) - Fix data/services path param {slug} → {slugOrId} - Fix api-keys/revoke path param type (string → number) Hardening: - auth context create: validate token before saving (--skip-validation to bypass) - File permissions: contexts.json 0o600, .devhelm/ dir 0o700 - Init template: interval → frequency to match CLI flags - Fix environment color flag description (was pulling from wrong schema) - Consistent token prefix examples (dh_live_...) - data/services/uptime: period and granularity options match spec enums CI: - spec-check.yml: add JSON validation step, include descriptions.generated.ts in auto-PR Made-with: Cursor --- .github/workflows/spec-check.yml | 7 +- docs/openapi/monitoring-api.json | 2 +- src/commands/alert-channels/test.ts | 10 +- src/commands/api-keys/revoke.ts | 3 +- src/commands/auth/context/create.ts | 20 +- src/commands/auth/login.ts | 17 +- src/commands/auth/me.ts | 12 +- src/commands/data/services/status.ts | 9 +- src/commands/data/services/uptime.ts | 23 +- src/commands/dependencies/track.ts | 10 +- src/commands/incidents/resolve.ts | 13 +- src/commands/init.ts | 8 +- src/commands/monitors/pause.ts | 8 +- src/commands/monitors/results.ts | 23 +- src/commands/monitors/resume.ts | 8 +- src/commands/monitors/test.ts | 9 +- src/commands/notification-policies/test.ts | 6 +- src/commands/status.ts | 12 +- src/commands/validate.ts | 8 +- src/commands/webhooks/test.ts | 10 +- src/lib/api-client.ts | 56 +- src/lib/api.generated.ts | 742 ++++++++------------- src/lib/auth.ts | 10 +- src/lib/crud-commands.ts | 48 +- src/lib/errors.ts | 26 +- src/lib/resources.ts | 25 +- 26 files changed, 477 insertions(+), 648 deletions(-) diff --git a/.github/workflows/spec-check.yml b/.github/workflows/spec-check.yml index 88e66d1..223b29b 100644 --- a/.github/workflows/spec-check.yml +++ b/.github/workflows/spec-check.yml @@ -27,6 +27,9 @@ jobs: env: GH_TOKEN: ${{ secrets.MONOREPO_DISPATCH_TOKEN }} + - name: Validate spec is valid JSON + run: python3 -c "import json; json.load(open('docs/openapi/monitoring-api.json'))" + - run: npm ci - run: npm run build - run: npm test @@ -34,7 +37,7 @@ jobs: - name: Check for type changes id: diff run: | - if git diff --quiet src/lib/api.generated.ts docs/openapi/monitoring-api.json; then + if git diff --quiet src/lib/api.generated.ts src/lib/descriptions.generated.ts docs/openapi/monitoring-api.json; then echo "changed=false" >> "$GITHUB_OUTPUT" else echo "changed=true" >> "$GITHUB_OUTPUT" @@ -47,7 +50,7 @@ jobs: git config user.email "github-actions[bot]@users.noreply.github.com" branch="chore/update-api-types-$(date +%Y%m%d%H%M%S)" git checkout -b "$branch" - git add src/lib/api.generated.ts docs/openapi/monitoring-api.json + git add src/lib/api.generated.ts src/lib/descriptions.generated.ts docs/openapi/monitoring-api.json git commit -m "chore: update generated API types from latest spec" git push -u origin "$branch" gh pr create \ diff --git a/docs/openapi/monitoring-api.json b/docs/openapi/monitoring-api.json index b35ca5d..17c32e6 100644 --- a/docs/openapi/monitoring-api.json +++ b/docs/openapi/monitoring-api.json @@ -1 +1 @@ -{"openapi":"3.0.1","info":{"title":"DevHelm API","description":"DevHelm platform and public API","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Generated server url"}],"tags":[{"name":"Heartbeat","description":"Public ping endpoint for heartbeat monitors"},{"name":"Invites","description":"Organization invite management"},{"name":"Onboarding","description":"User onboarding flow"},{"name":"Members","description":"Organization member management"},{"name":"Me","description":"Current user profile and organizations"},{"name":"Incidents","description":"Incident management and lifecycle"},{"name":"Maintenance Windows","description":"Schedule alert-suppression windows for monitors"},{"name":"Organizations","description":"Organization management"},{"name":"Integrations","description":"Static catalog of supported alert channel integrations"},{"name":"Incident Policies","description":"Manage trigger, confirmation, and recovery rules for monitors"},{"name":"Entitlements","description":"Plan entitlements and usage limits"},{"name":"Vault","description":"Organization vault management (admin-only)"},{"name":"Secrets","description":"Organization environment secret management"},{"name":"Transactions","description":"Subscription transaction history"},{"name":"Monitors","description":"Monitor CRUD and lifecycle management"},{"name":"Webhooks","description":"Webhook endpoint management, event catalog, and delivery history"},{"name":"Events","description":"Real-time event stream"},{"name":"Workspaces","description":"Workspace management within an organization"},{"name":"Notifications","description":"In-app notification center"},{"name":"Alert Channels","description":"Alert channel CRUD and connectivity testing"},{"name":"Subscriptions","description":"Organization subscription management"},{"name":"Service Subscriptions","description":"Manage which services an organization tracks"},{"name":"Tags","description":"Org-scoped tag management for monitors"},{"name":"Status Data","description":"Public service status catalog, components, uptime, and incident history"},{"name":"Check Results","description":"Query raw check results, uptime statistics, and summary data"},{"name":"API Keys","description":"Organization API key management"},{"name":"Dashboard","description":"Overview dashboard aggregates"},{"name":"Auth","description":"User registration"},{"name":"Monitor Auth","description":"Manage authentication configuration for a monitor"},{"name":"Audit Log","description":"Organization audit trail"},{"name":"Monitor Alert Channels","description":"Manage alert channel mappings for a monitor"},{"name":"Alert Deliveries","description":"Delivery audit trail: inspect per-attempt details for alert deliveries"},{"name":"Resource Groups","description":"Resource group CRUD and member management"},{"name":"Notification Policies","description":"Org-level notification routing policies with JSONB match rules"},{"name":"Notification Dispatches","description":"Dispatch debugging API: inspect which policies matched an incident and track delivery status"},{"name":"Environments","description":"Variable namespace management for monitors"},{"name":"Monitor Assertions","description":"Manage assertions for a monitor"},{"name":"Billing","description":"Billing plans and pricing"}],"paths":{"/platform/orgs/{orgId}/subscriptions/{subscriptionId}":{"put":{"tags":["Subscriptions"],"summary":"Update subscription","operationId":"updateSubscription","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"subscriptionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSubscriptionDto"}}}}}}},"/platform/onboarding/orgs/{orgId}/details":{"put":{"tags":["Onboarding"],"summary":"Update organization details","operationId":"updateOrgDetails","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/onboarding/advance":{"put":{"tags":["Onboarding"],"summary":"Advance onboarding stage forward","operationId":"advanceStage","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOnboardingStageRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me":{"get":{"tags":["Me"],"summary":"Get current user","operationId":"me","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user profile","operationId":"updateProfile","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me/notification-preferences":{"get":{"tags":["Me"],"summary":"Get current user's notification preferences","operationId":"getNotificationPreferences","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user's notification preferences","operationId":"updateNotificationPreferences","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationPreferencesRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}}},"/platform/admin/workspaces/{workspaceId}":{"get":{"tags":["admin-workspace-controller"],"operationId":"getWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"put":{"tags":["admin-workspace-controller"],"operationId":"updateWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"delete":{"tags":["admin-workspace-controller"],"operationId":"deleteWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/admin/users/{userId}":{"put":{"tags":["admin-controller"],"operationId":"updateUser","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/admin/orgs/{orgId}":{"put":{"tags":["admin-controller"],"operationId":"updateOrganization","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/admin/orgs/{orgId}/members/{userId}/role":{"put":{"tags":["admin-member-controller"],"operationId":"updateMemberRole","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/workspaces/{workspaceId}":{"get":{"tags":["Workspaces"],"summary":"Get workspace by ID","operationId":"get","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"put":{"tags":["Workspaces"],"summary":"Update workspace","operationId":"update","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}},"delete":{"tags":["Workspaces"],"summary":"Delete workspace","operationId":"delete","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"workspaceId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Get a single webhook endpoint","operationId":"get_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookEndpointDto"}}}}}},"put":{"tags":["Webhooks"],"summary":"Update a webhook endpoint","operationId":"update_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookEndpointDto"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook endpoint","operationId":"delete_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/tags/{id}":{"put":{"tags":["Tags"],"summary":"Update a tag's name and/or color","operationId":"update_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTagRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTagDto"}}}}}},"delete":{"tags":["Tags"],"summary":"Delete a tag (cascades to all monitor associations)","operationId":"delete_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/secrets/{key}":{"put":{"tags":["Secrets"],"summary":"Update secret","operationId":"update_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSecretDto"}}}}}},"delete":{"tags":["Secrets"],"summary":"Delete secret","operationId":"delete_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}":{"get":{"tags":["Resource Groups"],"summary":"Get a resource group by id with member statuses and inherited settings","description":"Pass includeMetrics=true to enrich each member with 24h uptime, chart data, and latency metrics.","operationId":"get_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"includeMetrics","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}},"put":{"tags":["Resource Groups"],"summary":"Update a resource group's name, description, alert policy, inherited settings, and health threshold","operationId":"update_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateResourceGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}},"delete":{"tags":["Resource Groups"],"summary":"Delete a resource group (cascades to member rows)","operationId":"delete_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/org":{"get":{"tags":["Organizations"],"summary":"Get the current organization","operationId":"get_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}},"put":{"tags":["Organizations"],"summary":"Update the current organization","operationId":"update_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgDetailsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/api/v1/notifications/{id}/read":{"put":{"tags":["Notifications"],"summary":"Mark a notification as read","operationId":"markRead","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/notifications/read-all":{"put":{"tags":["Notifications"],"summary":"Mark all notifications as read","operationId":"markAllRead","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/notification-policies/{id}":{"get":{"tags":["Notification Policies"],"summary":"Get a notification policy by ID","operationId":"getById","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}},"put":{"tags":["Notification Policies"],"summary":"Update a notification policy","operationId":"update_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationPolicyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}},"delete":{"tags":["Notification Policies"],"summary":"Delete a notification policy","operationId":"delete_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/policy":{"get":{"tags":["Incident Policies"],"summary":"Get incident policy for a monitor","description":"Returns the trigger rules, confirmation settings, and recovery settings for the given monitor.","operationId":"get_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","description":"Monitor UUID","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Policy found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IncidentPolicyDto"}}}},"404":{"description":"Monitor or policy not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}},"put":{"tags":["Incident Policies"],"summary":"Update incident policy for a monitor","description":"Replaces the trigger rules, confirmation settings, and recovery settings. All fields are validated before saving.","operationId":"update_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","description":"Monitor UUID","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIncidentPolicyRequest"}}},"required":true},"responses":{"200":{"description":"Policy updated","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IncidentPolicyDto"}}}},"400":{"description":"Validation error in JSONB shape","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}},"404":{"description":"Monitor or policy not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}}},"/api/v1/monitors/{monitorId}/auth":{"put":{"tags":["Monitor Auth"],"summary":"Update authentication config for a monitor","operationId":"update_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorAuthRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}},"post":{"tags":["Monitor Auth"],"summary":"Set authentication config for a monitor","operationId":"set","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMonitorAuthRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}},"delete":{"tags":["Monitor Auth"],"summary":"Remove authentication config from a monitor","operationId":"remove","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/assertions/{assertionId}":{"put":{"tags":["Monitor Assertions"],"summary":"Update an assertion on a monitor","operationId":"update_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"assertionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssertionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAssertionDto"}}}}}},"delete":{"tags":["Monitor Assertions"],"summary":"Remove an assertion from a monitor","operationId":"remove_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"assertionId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{monitorId}/alert-channels":{"put":{"tags":["Monitor Alert Channels"],"summary":"Replace the linked alert channel set for a monitor","operationId":"setChannels","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAlertChannelsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListUUID"}}}}}}},"/api/v1/monitors/{id}":{"get":{"tags":["Monitors"],"summary":"Get a single monitor by id","operationId":"get_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}},"put":{"tags":["Monitors"],"summary":"Update a monitor","operationId":"update_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}},"delete":{"tags":["Monitors"],"summary":"Soft-delete a monitor","operationId":"delete_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}/status":{"put":{"tags":["Members"],"summary":"Change member status","operationId":"changeStatus","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeStatusRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}/role":{"put":{"tags":["Members"],"summary":"Change member role","operationId":"changeRole","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/maintenance-windows/{id}":{"get":{"tags":["Maintenance Windows"],"summary":"Get a single maintenance window by ID","operationId":"getById_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}},"put":{"tags":["Maintenance Windows"],"summary":"Update a maintenance window","operationId":"update_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMaintenanceWindowRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}},"delete":{"tags":["Maintenance Windows"],"summary":"Delete a maintenance window","operationId":"delete_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/environments/{slug}":{"get":{"tags":["Environments"],"summary":"Get environment by slug","operationId":"get_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}},"put":{"tags":["Environments"],"summary":"Update environment","operationId":"update_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEnvironmentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}},"delete":{"tags":["Environments"],"summary":"Delete environment","operationId":"delete_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/alert-channels/{id}":{"put":{"tags":["Alert Channels"],"summary":"Update an alert channel's name and re-encrypt config","operationId":"update_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertChannelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertChannelDto"}}}}}},"delete":{"tags":["Alert Channels"],"summary":"Soft-delete an alert channel and return affected policy summary","operationId":"delete_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DeleteChannelResult"}}}}}}},"/v1/webhooks/paddle":{"post":{"tags":["paddle-webhook-controller"],"operationId":"handleWebhook","parameters":[{"name":"paddle-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}}},"required":true},"responses":{"200":{"description":"OK"}}}},"/v1/internal/workspaces":{"post":{"tags":["workspaces-controller"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceCreateParams"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/v1/internal/service-incidents":{"post":{"tags":["service-incident-internal-controller"],"operationId":"createOrResolve","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceIncidentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}}},"/v1/internal/resource-groups/services/{serviceId}/re-evaluate-health":{"post":{"tags":["resource-groups-internal-controller"],"operationId":"reEvaluateGroupHealthForService","parameters":[{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/resource-groups/monitors/{monitorId}/re-evaluate-health":{"post":{"tags":["resource-groups-internal-controller"],"operationId":"reEvaluateGroupHealthForMonitor","parameters":[{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/incidents":{"post":{"tags":["incidents-internal-controller"],"operationId":"createAutoIncident","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAutoIncidentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/incidents/{id}/resolve":{"post":{"tags":["incidents-internal-controller"],"operationId":"resolveAutoIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/incidents/{id}/reopen":{"post":{"tags":["incidents-internal-controller"],"operationId":"reopenAutoIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReopenAutoIncidentRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/escalation-tick":{"post":{"tags":["escalation-internal-controller"],"operationId":"runEscalationTick","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/billing/sync":{"post":{"tags":["admin-billing-controller"],"operationId":"syncFromPaddle","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInteger"}}}}}}},"/v1/internal/adapters/health":{"get":{"tags":["adapter-health-internal-controller"],"operationId":"getAllHealth","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAdapterHealthDto"}}}}}},"post":{"tags":["adapter-health-internal-controller"],"operationId":"reportOutcome","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdapterHealthReportRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdapterHealthDto"}}}}}}},"/platform/orgs":{"post":{"tags":["Organizations"],"summary":"Create organization","operationId":"create_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"ifNotExists","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}}},"/platform/orgs/{orgId}/transactions":{"get":{"tags":["Transactions"],"summary":"List transactions","operationId":"list","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"limit","in":"query","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTransactionDto"}}}}}},"post":{"tags":["Transactions"],"summary":"Create subscription transaction","operationId":"createSubscriptionTransaction","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTransactionDto"}}}}}}},"/platform/onboarding/quick-monitor":{"post":{"tags":["Onboarding"],"summary":"Create a monitor with smart defaults from URL analysis","operationId":"quickMonitor","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickMonitorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/platform/onboarding/complete-setup":{"post":{"tags":["Onboarding"],"summary":"Complete onboarding setup (creates org + workspace, advances to FIRST_MONITOR)","operationId":"completeSetup","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSetupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/onboarding/analyze-url":{"post":{"tags":["Onboarding"],"summary":"Analyze a URL and return suggested monitor configuration","operationId":"analyzeUrl","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeUrlRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAnalyzeUrlResponse"}}}}}}},"/platform/invites/accept":{"post":{"tags":["Invites"],"summary":"Accept invite","operationId":"accept","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAcceptInviteDto"}}}}}}},"/platform/auth/register":{"post":{"tags":["Auth"],"summary":"Register user","operationId":"register","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterUserRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/admin/orgs/{orgId}/workspaces":{"get":{"tags":["admin-workspace-controller"],"operationId":"listWorkspaces","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}},"post":{"tags":["admin-workspace-controller"],"operationId":"createWorkspace","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/platform/admin/orgs/{orgId}/members":{"get":{"tags":["admin-member-controller"],"operationId":"listMembers","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMemberDto"}}}}}},"post":{"tags":["admin-member-controller"],"operationId":"addMember","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMemberDto"}}}}}}},"/platform/admin/adapters/{serviceId}/enable":{"post":{"tags":["admin-adapter-health-controller"],"operationId":"reEnableAdapter","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdapterHealthDto"}}}}}}},"/api/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"List workspaces","operationId":"list_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}},"post":{"tags":["Workspaces"],"summary":"Create workspace","operationId":"create_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints for the authenticated org","operationId":"list_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWebhookEndpointDto"}}}}}},"post":{"tags":["Webhooks"],"summary":"Register a new webhook endpoint","operationId":"create_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookEndpointDto"}}}}}}},"/api/v1/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test delivery to a webhook endpoint","operationId":"test","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookEndpointRequest"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookTestResult"}}}}}}},"/api/v1/webhooks/signing-secret/rotate":{"post":{"tags":["Webhooks"],"summary":"Generate or rotate the organization webhook signing secret","operationId":"rotateSigningSecret","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseString"}}}}}}},"/api/v1/vaults/rotate":{"post":{"tags":["Vault"],"summary":"Rotate DEK","description":"Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.","operationId":"rotateDek","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDekRotationResultDto"}}}}}}},"/api/v1/tags":{"get":{"tags":["Tags"],"summary":"List tags for the authenticated organization","operationId":"list_3","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"post":{"tags":["Tags"],"summary":"Create a new tag","operationId":"create_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTagRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTagDto"}}}}}}},"/api/v1/service-subscriptions/{slug}":{"post":{"tags":["Service Subscriptions"],"summary":"Subscribe to a service or a component of a service","description":"Idempotent — returns the existing subscription if an identical one exists. Omit the request body or set componentId to null for a whole-service subscription. Free tier: max 10 subscriptions. Paid tier: unlimited.","operationId":"subscribe","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceSubscribeRequest"}}}},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}}},"/api/v1/secrets":{"get":{"tags":["Secrets"],"summary":"List secrets","operationId":"list_4","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSecretDto"}}}}}},"post":{"tags":["Secrets"],"summary":"Create secret","operationId":"create_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSecretDto"}}}}}}},"/api/v1/resource-groups":{"get":{"tags":["Resource Groups"],"summary":"List all resource groups for the authenticated org with health summaries","operationId":"list_5","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultResourceGroupDto"}}}}}},"post":{"tags":["Resource Groups"],"summary":"Create a new resource group","operationId":"create_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateResourceGroupRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupDto"}}}}}}},"/api/v1/resource-groups/{id}/members":{"post":{"tags":["Resource Groups"],"summary":"Add a monitor or service member to a resource group","operationId":"addMember_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddResourceGroupMemberRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupMemberDto"}}}}}}},"/api/v1/notification-policies":{"get":{"tags":["Notification Policies"],"summary":"List all notification policies for the authenticated org","operationId":"list_6","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationPolicyDto"}}}}}},"post":{"tags":["Notification Policies"],"summary":"Create a notification policy with match rules and escalation chain","operationId":"create_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNotificationPolicyRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPolicyDto"}}}}}}},"/api/v1/notification-policies/{id}/test":{"post":{"tags":["Notification Policies"],"summary":"Dry-run: evaluate a policy's match rules against a supplied incident context","operationId":"test_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestNotificationPolicyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestMatchResult"}}}}}}},"/api/v1/notification-dispatches/{id}/acknowledge":{"post":{"tags":["Notification Dispatches"],"summary":"Acknowledge a notification dispatch","description":"Marks the dispatch as acknowledged. The dispatch must be in DELIVERED or ESCALATING state. Sets acknowledgedAt, acknowledgedBy (actor email), and acknowledgedVia (DASHBOARD).","operationId":"acknowledge","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationDispatchDto"}}}}}}},"/api/v1/monitors":{"get":{"tags":["Monitors"],"summary":"List monitors for the authenticated org","operationId":"list_7","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"enabled","in":"query","description":"Filter by enabled state","required":false,"schema":{"type":"boolean"}},{"name":"type","in":"query","description":"Filter by monitor type","required":false,"schema":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]}},{"name":"managedBy","in":"query","description":"Filter by managed-by source","required":false,"schema":{"type":"string","enum":["DASHBOARD","CLI"]}},{"name":"tags","in":"query","description":"Filter by tag names, comma-separated (e.g. prod,critical)","required":false,"schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive name search","required":false,"schema":{"type":"string"}},{"name":"environmentId","in":"query","description":"Filter by environment ID","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMonitorDto"}}}}}},"post":{"tags":["Monitors"],"summary":"Create a new monitor","operationId":"create_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMonitorRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{monitorId}/assertions":{"post":{"tags":["Monitor Assertions"],"summary":"Add an assertion to a monitor","operationId":"add","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssertionRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAssertionDto"}}}}}}},"/api/v1/monitors/{id}/test":{"post":{"tags":["Monitors"],"summary":"Test an existing monitor","description":"Runs the saved config and assertions of an existing monitor once, without persisting any result. Runs synchronously and returns the same shape as the ad-hoc test.","operationId":"testExisting","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorTestResultDto"}}}}}}},"/api/v1/monitors/{id}/tags":{"get":{"tags":["Monitors"],"summary":"Get all tags applied to a monitor","operationId":"getMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"post":{"tags":["Monitors"],"summary":"Add tags to a monitor; supports existing tag IDs and inline creation of new tags","operationId":"addMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMonitorTagsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultTagDto"}}}}}},"delete":{"tags":["Monitors"],"summary":"Remove tags from a monitor by their IDs","operationId":"removeMonitorTags","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveMonitorTagsRequest"}}},"required":true},"responses":{"204":{"description":"No Content"}}}},"/api/v1/monitors/{id}/rotate-token":{"post":{"tags":["Monitors"],"summary":"Rotate the ping token for a heartbeat monitor","description":"Generates a new ping token. The old token remains valid for 24 hours to allow cron jobs to be updated without downtime. Only supported for HEARTBEAT monitors.","operationId":"rotateToken","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume a monitor (set enabled=true)","operationId":"resume","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/{id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause a monitor (set enabled=false)","operationId":"pause","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/api/v1/monitors/test":{"post":{"tags":["Monitors"],"summary":"Ad-hoc monitor test","description":"Executes a one-off check from an inline config without saving the monitor. Runs synchronously and returns status code, response time, assertion results, body preview, and headers.","operationId":"testAdHoc","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorTestRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorTestResultDto"}}}}}}},"/api/v1/monitors/bulk":{"post":{"tags":["Monitors"],"summary":"Bulk action on monitors","description":"Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.","operationId":"bulkAction","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorActionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseBulkMonitorActionResult"}}}}}}},"/api/v1/maintenance-windows":{"get":{"tags":["Maintenance Windows"],"summary":"List maintenance windows for the authenticated org","description":"Returns maintenance windows for the caller's organisation. Optionally filter by monitor_id, and/or by status: 'active' (currently in window) or 'upcoming' (starts in the future).","operationId":"list_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"monitorId","in":"query","description":"Filter by monitor UUID","required":false,"schema":{"type":"string","format":"uuid"}},{"name":"filter","in":"query","description":"Filter by status: 'active' or 'upcoming'","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMaintenanceWindowDto"}}}}}},"post":{"tags":["Maintenance Windows"],"summary":"Create a maintenance window","description":"Creates a new maintenance window. Set monitorId to null to create an org-wide window that suppresses alerts for all monitors.","operationId":"create_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMaintenanceWindowRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}}},"/api/v1/invites":{"get":{"tags":["Invites"],"summary":"List invites","operationId":"list_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultInviteDto"}}}}}},"post":{"tags":["Invites"],"summary":"Create invite","operationId":"create_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInviteRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInviteDto"}}}}}}},"/api/v1/invites/{inviteId}/revoke":{"post":{"tags":["Invites"],"summary":"Revoke invite","operationId":"revoke","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"inviteId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/invites/{inviteId}/resend":{"post":{"tags":["Invites"],"summary":"Resend invite","operationId":"resend","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"inviteId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseInviteDto"}}}}}}},"/api/v1/incidents":{"get":{"tags":["Incidents"],"summary":"List incidents for the authenticated org","operationId":"list_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"params","in":"query","required":true,"schema":{"$ref":"#/components/schemas/IncidentFilterParams"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}},"post":{"tags":["Incidents"],"summary":"Create a manual incident","operationId":"create_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateManualIncidentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/incidents/{id}/updates":{"post":{"tags":["Incidents"],"summary":"Add an update to an incident (optionally change status)","operationId":"addUpdate","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddIncidentUpdateRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/incidents/{id}/resolve":{"post":{"tags":["Incidents"],"summary":"Resolve an incident","operationId":"resolve","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveIncidentRequest"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/heartbeat/{token}":{"get":{"tags":["Heartbeat"],"summary":"Record a heartbeat ping (GET)","description":"Called by external systems (cron jobs, scheduled tasks) to signal liveness. Always returns 200 OK.","operationId":"pingGet","parameters":[{"name":"token","in":"path","description":"Ping endpoint token for the heartbeat monitor","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}}}},"post":{"tags":["Heartbeat"],"summary":"Record a heartbeat ping (POST)","description":"Called by external systems to signal liveness with an optional JSON payload. The payload can be inspected by heartbeat_payload_contains assertions. Always returns 200 OK.","operationId":"pingPost","parameters":[{"name":"token","in":"path","description":"Ping endpoint token for the heartbeat monitor","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}},"*/*":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"boolean"}}}}}}}},"/api/v1/environments":{"get":{"tags":["Environments"],"summary":"List environments","operationId":"list_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultEnvironmentDto"}}}}}},"post":{"tags":["Environments"],"summary":"Create environment","operationId":"create_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEnvironmentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"List API keys","operationId":"list_12","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultApiKeyDto"}}}}}},"post":{"tags":["API Keys"],"summary":"Create API key","operationId":"create_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyCreateResponse"}}}}}}},"/api/v1/api-keys/{id}/revoke":{"post":{"tags":["API Keys"],"summary":"Revoke API key","operationId":"revoke_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyDto"}}}}}}},"/api/v1/api-keys/{id}/regenerate":{"post":{"tags":["API Keys"],"summary":"Regenerate API key","operationId":"regenerate","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyCreateResponse"}}}}}}},"/api/v1/alert-deliveries/{id}/retry":{"post":{"tags":["Alert Deliveries"],"summary":"Retry a failed delivery","description":"Resets a FAILED delivery to RETRY_PENDING so the delivery worker re-attempts it.","operationId":"retry","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertDeliveryDto"}}}}}}},"/api/v1/alert-channels":{"get":{"tags":["Alert Channels"],"summary":"List active alert channels for the authenticated org","operationId":"list_13","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAlertChannelDto"}}}}}},"post":{"tags":["Alert Channels"],"summary":"Create a new alert channel with encrypted config","operationId":"create_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlertChannelRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAlertChannelDto"}}}}}}},"/api/v1/alert-channels/{id}/test":{"post":{"tags":["Alert Channels"],"summary":"Test a saved alert channel's connectivity","operationId":"test_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestChannelResult"}}}}}}},"/api/v1/alert-channels/test":{"post":{"tags":["Alert Channels"],"summary":"Test alert channel connectivity using raw config (no saved channel required)","operationId":"testConfig","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestAlertChannelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseTestChannelResult"}}}}}}},"/v1/internal/service-incidents/by-ref/{serviceId}/{externalRef}/components":{"patch":{"tags":["service-incident-internal-controller"],"operationId":"addComponents","parameters":[{"name":"serviceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"externalRef","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIncidentDto"}}}}}}},"/api/v1/service-subscriptions/{id}/alert-sensitivity":{"patch":{"tags":["Service Subscriptions"],"summary":"Update alert sensitivity for a subscription","description":"Controls which external incidents trigger alerts: ALL (any status change), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (only DOWN-level incidents).","operationId":"updateAlertSensitivity","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertSensitivityRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}}},"/api/v1/api-keys/{id}":{"delete":{"tags":["API Keys"],"summary":"Delete API key","operationId":"delete_10","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}},"patch":{"tags":["API Keys"],"summary":"Update API key","operationId":"update_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseApiKeyDto"}}}}}}},"/v1/internal/workspaces/{id}":{"get":{"tags":["workspaces-controller"],"operationId":"get_7","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWorkspaceDto"}}}}}}},"/v1/internal/orgs/{id}/workspaces":{"get":{"tags":["orgs-controller"],"operationId":"listWorkspaces_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWorkspaceDto"}}}}}}},"/v1/internal/monitors/{id}/policy":{"get":{"tags":["monitors-internal-controller"],"operationId":"policy","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentPolicyDto"}}}}}}},"/v1/internal/monitors/{id}/env-variables":{"get":{"tags":["monitors-internal-controller"],"operationId":"getEnvVariables","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMapStringString"}}}}}}},"/v1/internal/monitors/{id}/auth":{"get":{"tags":["monitors-internal-controller"],"operationId":"auth","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorAuthDto"}}}}}}},"/v1/internal/monitors/{id}/assertions":{"get":{"tags":["monitors-internal-controller"],"operationId":"getAssertions","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListMonitorAssertionDto"}}}}}}},"/v1/internal/monitors/{id}/active-incident":{"get":{"tags":["monitors-internal-controller"],"operationId":"activeIncident","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDto"}}}}}}},"/v1/internal/monitors/schedulable":{"get":{"tags":["monitors-internal-controller"],"operationId":"schedulable","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SchedulableMonitorDto"}}}}}}}},"/platform/plans":{"get":{"tags":["Billing"],"summary":"List public billing plans","operationId":"getPublicPlans","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseListBillingPlanDto"}}}}}}},"/platform/orgs/{orgId}/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List active subscriptions","operationId":"listActive","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSubscriptionDto"}}}}}},"delete":{"tags":["Subscriptions"],"operationId":"cancel","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/orgs/{orgId}/subscriptions/upcoming-charge":{"get":{"tags":["Subscriptions"],"summary":"Get upcoming charge","operationId":"getUpcomingCharge","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"priceId","in":"query","required":true,"schema":{"minimum":1,"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUpcomingChargeResponse"}}}}}}},"/platform/orgs/{orgId}/subscriptions/management-urls":{"get":{"tags":["Subscriptions"],"summary":"Get subscription management URLs","operationId":"getManagementUrls","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMapStringString"}}}}}}},"/platform/orgs/{orgId}/subscriptions/customer-auth-token":{"get":{"tags":["Subscriptions"],"summary":"Get customer auth token","operationId":"getCustomerAuthToken","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseString"}}}}}}},"/platform/orgs/{orgId}/entitlements":{"get":{"tags":["Entitlements"],"summary":"Get resolved entitlements and current usage for the organization","operationId":"getEntitlements","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEntitlementResponse"}}}}}}},"/platform/orgs/search":{"get":{"tags":["Organizations"],"summary":"Search organizations","operationId":"searchOrganizations","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"query","in":"query","required":true,"schema":{"type":"string"}},{"name":"paginationParams","in":"query","required":true,"schema":{"$ref":"#/components/schemas/PaginationParams"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultIdValuePair"}}}}}}},"/platform/me/orgs":{"get":{"tags":["Me"],"summary":"Get current user's organizations","operationId":"myOrgs","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMyOrgItemDto"}}}}}}},"/platform/events/stream":{"get":{"tags":["Events"],"summary":"Subscribe to real-time platform events via SSE","operationId":"stream","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}}}},"/platform/admin/users":{"get":{"tags":["admin-controller"],"operationId":"listUsers","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultUserDto"}}}}}}},"/platform/admin/stats":{"get":{"tags":["admin-controller"],"operationId":"getStats","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAdminStatsDto"}}}}}}},"/platform/admin/orgs":{"get":{"tags":["admin-controller"],"operationId":"listOrgs","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultOrganizationDto"}}}}}}},"/platform/admin/adapters/health":{"get":{"tags":["admin-adapter-health-controller"],"operationId":"getAdapterHealth","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAdapterHealthDto"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"List recent deliveries for a webhook endpoint","operationId":"listDeliveries","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultWebhookDeliveryDto"}}}}}}},"/api/v1/webhooks/signing-secret":{"get":{"tags":["Webhooks"],"summary":"Get signing secret metadata for the authenticated org","operationId":"getSigningSecretInfo","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookSigningSecretDto"}}}}}}},"/api/v1/webhooks/events":{"get":{"tags":["Webhooks"],"summary":"List all available webhook event types","description":"Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.","operationId":"listEvents","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookEventCatalogResponse"}}}}}}},"/api/v1/services":{"get":{"tags":["Status Data"],"summary":"List all enabled services (cursor-paginated)","operationId":"listServices","parameters":[{"name":"category","in":"query","description":"Filter by category (exact match)","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by current overall_status (exact match)","required":false,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–100, default 20)","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageServiceCatalogDto"}}}}}}},"/api/v1/services/{slugOrId}":{"get":{"tags":["Status Data"],"summary":"Get a single service by slug or UUID with current status, components, and recent incidents","operationId":"getService","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get uptime statistics for a service","description":"Uptime data aggregated across active non-group components.","operationId":"getServiceUptime","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","description":"Time window","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d","1y","2y","all"]}},{"name":"granularity","in":"query","description":"Bucket granularity","required":false,"schema":{"type":"string","enum":["hourly","daily","monthly"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceUptimeResponse"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/services/{slugOrId}/maintenances":{"get":{"tags":["Status Data"],"summary":"List scheduled maintenances for a service","operationId":"getScheduledMaintenances","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status (e.g. scheduled, in_progress, verifying, completed)","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultScheduledMaintenanceDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents":{"get":{"tags":["Status Data"],"summary":"List incident history for a service (paginated)","operationId":"listIncidents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents/{incidentId}":{"get":{"tags":["Status Data"],"summary":"Get incident detail with full update timeline","operationId":"getIncident","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"incidentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceIncidentDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/components":{"get":{"tags":["Status Data"],"summary":"List active components for a service with current status and inline uptime","operationId":"getComponents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceComponentDto"}}}}}}},"/api/v1/services/{slugOrId}/components/{componentId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get daily uptime data for a component","operationId":"getComponentUptime","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"componentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"period","in":"query","description":"Time window","required":false,"schema":{"type":"string","enum":["7d","30d","90d","1y"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultComponentUptimeDayDto"}}}}}}},"/api/v1/services/summary":{"get":{"tags":["Status Data"],"summary":"Global status summary across all services","description":"Returns aggregate counts of services by status and a list of services currently experiencing issues.","operationId":"getGlobalStatusSummary","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseGlobalStatusSummaryDto"}}}}}}},"/api/v1/services/incidents":{"get":{"tags":["Status Data"],"summary":"List vendor incidents across all services (paginated)","description":"Cross-service vendor incident feed ordered by start date descending.","operationId":"listCrossServiceIncidents","parameters":[{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"category","in":"query","description":"Filter by service category","required":false,"schema":{"type":"string"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/service-subscriptions":{"get":{"tags":["Service Subscriptions"],"summary":"List all service subscriptions for the organization","operationId":"list_14","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceSubscriptionDto"}}}}}}},"/api/v1/service-subscriptions/{id}":{"get":{"tags":["Service Subscriptions"],"summary":"Get a subscription by its ID","operationId":"get_8","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceSubscriptionDto"}}}}}},"delete":{"tags":["Service Subscriptions"],"summary":"Remove a subscription by its ID","description":"Removes a specific subscription (whole-service or component-level). No-op if not found.","operationId":"unsubscribe","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}/health":{"get":{"tags":["Resource Groups"],"summary":"Get the detailed health breakdown for a resource group","description":"Returns member counts, worst-of status, and threshold-based health evaluation. The thresholdStatus field is populated only when a health threshold is configured.","operationId":"getHealth","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResourceGroupHealthDto"}}}}}}},"/api/v1/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications for the current user","operationId":"list_15","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"unreadOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDto"}}}}}}},"/api/v1/notifications/unread-count":{"get":{"tags":["Notifications"],"summary":"Get unread notification count","operationId":"unreadCount","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseLong"}}}}}}},"/api/v1/notification-policies/{id}/dispatches":{"get":{"tags":["Notification Policies"],"summary":"List all dispatches (firing history) for a notification policy","operationId":"listDispatches","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDispatchDto"}}}}}}},"/api/v1/notification-dispatches":{"get":{"tags":["Notification Dispatches"],"summary":"List all dispatches for an incident","description":"Returns all notification dispatches for the given incident that belong to the authenticated org's policies. Each dispatch includes delivery records for all associated channels.","operationId":"listByIncident","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"incident_id","in":"query","description":"UUID of the incident to inspect","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationDispatchDto"}}}}}}},"/api/v1/notification-dispatches/{id}":{"get":{"tags":["Notification Dispatches"],"summary":"Get a single dispatch with full escalation and delivery history","description":"Returns the dispatch state including current escalation step, acknowledgment info, and all delivery attempts made across every step.","operationId":"getById_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationDispatchDto"}}}}}}},"/api/v1/monitors/{id}/versions":{"get":{"tags":["Monitors"],"summary":"List version history for a monitor","description":"Returns a paginated list of mutation snapshots for the monitor, newest first. Each version captures the full monitor config at the time of a PUT /monitors/{id} call.","operationId":"listVersions","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMonitorVersionDto"}}}}}}},"/api/v1/monitors/{id}/versions/{version}":{"get":{"tags":["Monitors"],"summary":"Get a specific version snapshot for a monitor","description":"Returns the full monitor config snapshot captured at the given version number.","operationId":"getVersion","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorVersionDto"}}}}}}},"/api/v1/monitors/{id}/uptime":{"get":{"tags":["Check Results"],"summary":"Get uptime statistics","description":"Returns uptime percentage and latency statistics for the requested time window, computed from continuous aggregates. Uses hourly aggregates for 24h/7d windows and daily aggregates for 30d/90d windows.","operationId":"getUptime","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"window","in":"query","description":"Time window for uptime calculation","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d"]}}],"responses":{"200":{"description":"Uptime statistics","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UptimeDto"}}}},"400":{"description":"Invalid window parameter","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUptimeDto"}}}},"403":{"description":"Monitor does not belong to the caller's org","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUptimeDto"}}}},"404":{"description":"Monitor not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUptimeDto"}}}}}}},"/api/v1/monitors/{id}/results":{"get":{"tags":["Check Results"],"summary":"List raw check results","description":"Returns check results for the given monitor with optional time-range, region, and pass/fail filtering. Uses cursor-based pagination — pass the returned `cursor` value on subsequent requests to retrieve the next page. The cursor encodes the original time bounds, so `from`/`to` are ignored when a cursor is present.","operationId":"getResults","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"from","in":"query","description":"Start of time range (ISO 8601, inclusive); defaults to 24 hours ago","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"End of time range (ISO 8601, inclusive); defaults to now","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response for pagination","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum results per page (1–200)","required":false,"schema":{"type":"integer","format":"int32","default":50},"example":50},{"name":"region","in":"query","description":"Filter by region (e.g. us-east)","required":false,"schema":{"type":"string"}},{"name":"passed","in":"query","description":"Filter by pass/fail status","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Paginated check results","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPage"}}}},"400":{"description":"Invalid query parameters","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}},"403":{"description":"Monitor does not belong to the caller's org","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}},"404":{"description":"Monitor not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageCheckResultDto"}}}}}}},"/api/v1/monitors/{id}/results/summary":{"get":{"tags":["Check Results"],"summary":"Get results summary","description":"Returns a dashboard summary for the monitor: current status derived from the latest result per region, time-bucketed chart data, the 24-hour uptime percentage, and the selected window's uptime percentage.","operationId":"getSummary","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"chartWindow","in":"query","description":"Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d"]}}],"responses":{"200":{"description":"Results summary","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ResultSummaryDto"}}}},"400":{"description":"Invalid chartWindow parameter","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}},"403":{"description":"Monitor does not belong to the caller's org","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}},"404":{"description":"Monitor not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseResultSummaryDto"}}}}}}},"/api/v1/members":{"get":{"tags":["Members"],"summary":"List organization members","operationId":"list_16","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMemberDto"}}}}}}},"/api/v1/integrations":{"get":{"tags":["Integrations"],"summary":"List all supported integration types","description":"Returns the full static catalog of supported alert channel integration types with their metadata and config field schemas. Used by the frontend to dynamically render the 'Add Alert Channel' form.","operationId":"list_17","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/IntegrationCatalogResponse"}}}}}}},"/api/v1/incidents/{id}":{"get":{"tags":["Incidents"],"summary":"Get incident details including update timeline","operationId":"get_9","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseIncidentDetailDto"}}}}}}},"/api/v1/dashboard/overview":{"get":{"tags":["Dashboard"],"summary":"Dashboard overview","description":"Returns monitor status counts, average uptime windows, and incident aggregates for the authenticated org. Results are cached for 1 minute.","operationId":"overview","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseDashboardOverviewDto"}}}}}}},"/api/v1/categories":{"get":{"tags":["Status Data"],"summary":"List categories with service counts","operationId":"listCategories","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultCategoryDto"}}}}}}},"/api/v1/audit-log":{"get":{"tags":["Audit Log"],"summary":"List audit events for the current organization","operationId":"list_18","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"action","in":"query","required":false,"schema":{"type":"string"}},{"name":"actorId","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"resourceType","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageResultAuditEventDto"}}}}}}},"/api/v1/alert-deliveries/{id}/attempts":{"get":{"tags":["Alert Deliveries"],"summary":"List delivery attempts for a specific alert delivery","description":"Returns the ordered list of delivery attempts (request/response audit data) for the given delivery ID.","operationId":"listAttempts","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultDeliveryAttemptDto"}}}}}}},"/api/v1/alert-channels/{id}/deliveries":{"get":{"tags":["Alert Channels"],"summary":"List delivery history for an alert channel","operationId":"listDeliveries_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultAlertDeliveryDto"}}}}}}},"/platform/orgs/{orgId}":{"delete":{"tags":["Organizations"],"summary":"Delete organization","operationId":"delete_11","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/platform/admin/orgs/{orgId}/members/{userId}":{"delete":{"tags":["admin-member-controller"],"operationId":"removeMember","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"orgId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/resource-groups/{id}/members/{memberId}":{"delete":{"tags":["Resource Groups"],"summary":"Remove a member from a resource group","operationId":"removeMember_1","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"memberId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"No Content"}}}},"/api/v1/members/{userId}":{"delete":{"tags":["Members"],"summary":"Remove member from organization","operationId":"remove_2","parameters":[{"name":"actor","in":"query","required":true,"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiKey"},{"$ref":"#/components/schemas/Internal"},{"$ref":"#/components/schemas/UI"}]}},{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"No Content"}}}}},"components":{"schemas":{"Actor":{"type":"object"},"ApiKey":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"},{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"keyId":{"type":"integer","format":"int32"}}}]},"Internal":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"}]},"OrgContext":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"role":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"UI":{"type":"object","allOf":[{"$ref":"#/components/schemas/Actor"},{"type":"object","properties":{"userContext":{"$ref":"#/components/schemas/UserContext"},"orgContext":{"$ref":"#/components/schemas/OrgContext"},"workspaceId":{"type":"integer","format":"int32","nullable":true}}}]},"UserContext":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"role":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]}}},"CreateSubscriptionRequest":{"type":"object","properties":{"priceId":{"minimum":1,"type":"integer","format":"int32"}}},"BillingPlanDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"prices":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/BillingPriceDto"}}},"nullable":true},"BillingPriceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"amount":{"type":"integer","format":"int32"},"interval":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]},"intervalCount":{"type":"integer","format":"int32"},"description":{"type":"string","nullable":true},"billingPlan":{"$ref":"#/components/schemas/BillingPlanDto"}}},"ItemDto":{"type":"object","properties":{"billingPrice":{"$ref":"#/components/schemas/BillingPriceDto"},"quantity":{"type":"integer","format":"int32"},"amount":{"type":"integer","format":"int32"}}},"SingleValueResponseSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SubscriptionDto"}}},"SubscriptionDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"organizationId":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ACTIVE","CANCELED","PAST_DUE","PAUSED","TRIALING"]},"nextBilledAt":{"type":"string","format":"date-time","nullable":true},"willCancelAt":{"type":"string","format":"date-time","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}}}},"UpdateOrgDetailsRequest":{"required":["email","name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"minLength":1,"type":"string","format":"email"},"size":{"maxLength":50,"minLength":0,"type":"string"},"industry":{"maxLength":100,"minLength":0,"type":"string"},"websiteUrl":{"maxLength":255,"minLength":0,"type":"string"}}},"OrganizationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"size":{"type":"string","nullable":true},"industry":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true}}},"SingleValueResponseOrganizationDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationDto"}}},"UpdateOnboardingStageRequest":{"required":["stage"],"type":"object","properties":{"stage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]}}},"SingleValueResponseUserDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UserDto"}}},"UserDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"name":{"type":"string","nullable":true},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","nullable":true,"enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateProfileRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"UpdateNotificationPreferencesRequest":{"required":["preferences"],"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}}}},"NotificationPreferencesDto":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseNotificationPreferencesDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPreferencesDto"}}},"UpdateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"SingleValueResponseWorkspaceDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkspaceDto"}}},"WorkspaceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"name":{"type":"string"},"orgId":{"type":"integer","format":"int32"}}},"UpdateUserRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"type":"string","format":"email"},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"maxLength":500,"minLength":0,"type":"string"}}},"ChangeRoleRequest":{"required":["orgRole"],"type":"object","properties":{"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"UpdateWebhookEndpointRequest":{"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","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","format":"uuid"},"url":{"type":"string"},"description":{"type":"string","nullable":true},"subscribedEvents":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"consecutiveFailures":{"type":"integer","format":"int32"},"disabledReason":{"type":"string","nullable":true},"disabledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateTagRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"New tag name","nullable":true},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"New hex color code","nullable":true}},"description":"Request body for updating a tag; null fields are left unchanged"},"SingleValueResponseTagDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TagDto"}}},"TagDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"color":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateSecretRequest":{"required":["value"],"type":"object","properties":{"value":{"maxLength":32768,"minLength":0,"type":"string","description":"New secret value, stored encrypted (max 32KB)"}}},"MonitorReference":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"SecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"dekVersion":{"type":"integer","format":"int32"},"valueHash":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usedByMonitors":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorReference"}}}},"SingleValueResponseSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SecretDto"}}},"RetryStrategy":{"required":["type"],"type":"object","properties":{"type":{"type":"string"},"maxRetries":{"type":"integer","format":"int32"},"interval":{"type":"integer","format":"int32"}},"description":"Default retry strategy for member monitors; null clears"},"UpdateResourceGroupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this group"},"description":{"type":"string","description":"Optional description; null clears the existing value","nullable":true},"alertPolicyId":{"type":"string","description":"Optional notification policy to apply for this group; null clears the existing value","format":"uuid","nullable":true},"defaultFrequency":{"maximum":86400,"minimum":30,"type":"integer","description":"Default check frequency in seconds for members (30–86400); null clears","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default regions for member monitors; null clears","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors; null clears","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors; null clears","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE; null disables threshold","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"maximum":100,"exclusiveMaximum":false,"minimum":0,"exclusiveMinimum":false,"type":"number","description":"Health threshold value; null disables threshold","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"Suppress member-level alert notifications; null preserves current value","nullable":true},"confirmationDelaySeconds":{"maximum":600,"minimum":0,"type":"integer","description":"Confirmation delay in seconds; null clears","format":"int32","nullable":true},"recoveryCooldownMinutes":{"maximum":60,"minimum":0,"type":"integer","description":"Recovery cooldown in minutes; null clears","format":"int32","nullable":true}},"description":"Request body for updating a resource group"},"ResourceGroupDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"alertPolicyId":{"type":"string","description":"Notification policy applied to this group","format":"uuid","nullable":true},"defaultFrequency":{"type":"integer","description":"Default check frequency in seconds for member monitors","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors","nullable":true,"items":{"type":"string","description":"Default regions for member monitors","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"type":"number","description":"Health threshold value","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"When true, member-level incidents skip notification dispatch; only group alerts fire"},"confirmationDelaySeconds":{"type":"integer","description":"Seconds to wait after health threshold breach before creating group incident","format":"int32","nullable":true},"recoveryCooldownMinutes":{"type":"integer","description":"Cooldown minutes after group incident resolves before a new one can open","format":"int32","nullable":true},"health":{"$ref":"#/components/schemas/ResourceGroupHealthDto"},"members":{"type":"array","description":"Member list with individual statuses; populated on detail GET only","nullable":true,"items":{"$ref":"#/components/schemas/ResourceGroupMemberDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Resource group with health summary and optional member details"},"ResourceGroupHealthDto":{"type":"object","properties":{"status":{"type":"string","description":"Worst-of health status across all members","enum":["operational","maintenance","degraded","down"]},"totalMembers":{"type":"integer","description":"Total number of members in the group","format":"int32"},"operationalCount":{"type":"integer","description":"Number of members currently in operational status","format":"int32"},"activeIncidents":{"type":"integer","description":"Number of members with an active incident or non-operational status","format":"int32"},"thresholdStatus":{"type":"string","description":"Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured.","nullable":true,"enum":["healthy","degraded","down"]},"failingCount":{"type":"integer","description":"Number of failing members at time of last evaluation","format":"int32","nullable":true}},"description":"Aggregated health summary for a resource group"},"ResourceGroupMemberDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"memberType":{"type":"string","description":"Type of member: 'monitor' or 'service'"},"monitorId":{"type":"string","description":"Monitor ID; set when memberType is 'monitor'","format":"uuid","nullable":true},"serviceId":{"type":"string","description":"Service ID; set when memberType is 'service'","format":"uuid","nullable":true},"name":{"type":"string","description":"Display name of the referenced monitor or service","nullable":true},"slug":{"type":"string","description":"Slug identifier for the service (services only); used for icons and uptime API calls","nullable":true},"subscriptionId":{"type":"string","description":"Subscription ID for the service (services only); used to link to the dependency detail page","format":"uuid","nullable":true},"status":{"type":"string","description":"Computed health status for this member","enum":["operational","maintenance","degraded","down"]},"effectiveFrequency":{"type":"string","description":"Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured","nullable":true},"createdAt":{"type":"string","format":"date-time"},"uptime24h":{"type":"number","description":"24h uptime percentage; populated when includeMetrics=true","format":"double","nullable":true},"chartData":{"type":"array","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","nullable":true,"items":{"type":"number","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","format":"double","nullable":true}},"avgLatencyMs":{"type":"number","description":"Average latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"p95LatencyMs":{"type":"number","description":"P95 latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"lastCheckedAt":{"type":"string","description":"Timestamp of the most recent health check; populated when includeMetrics=true","format":"date-time","nullable":true},"monitorType":{"type":"string","description":"Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only","nullable":true},"environmentName":{"type":"string","description":"Environment name; monitors only","nullable":true}},"description":"A single member of a resource group with its computed health status"},"SingleValueResponseResourceGroupDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupDto"}}},"EscalationChain":{"required":["steps"],"type":"object","properties":{"steps":{"minItems":1,"type":"array","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"},"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":{"required":["enabled","escalation","name","priority"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules to evaluate (all must pass; omit or empty for catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is enabled"},"priority":{"type":"integer","description":"Evaluation priority; higher value = evaluated first","format":"int32"}},"description":"Request body for updating a notification policy"},"NotificationPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules (all must pass; empty = catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is active"},"priority":{"type":"integer","description":"Evaluation order; higher value = evaluated first","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Org-level notification policy with match rules and escalation chain"},"SingleValueResponseNotificationPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPolicyDto"}}},"ConfirmationPolicy":{"required":["type"],"type":"object","properties":{"type":{"type":"string","enum":["multi_region"]},"minRegionsFailing":{"type":"integer","format":"int32"},"maxWaitSeconds":{"type":"integer","format":"int32"}},"description":"Multi-region confirmation settings"},"IncidentPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"triggerRules":{"type":"array","description":"Array of trigger rules defining when an incident should be raised","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorRegionCount":{"type":"integer","description":"Number of regions configured on the monitor (only set in internal API responses)","format":"int32","nullable":true},"checkFrequencySeconds":{"type":"integer","description":"Monitor check frequency in seconds (only set in internal API responses)","format":"int32","nullable":true}},"description":"Incident detection, confirmation, and recovery policy for a monitor"},"RecoveryPolicy":{"type":"object","properties":{"consecutiveSuccesses":{"type":"integer","format":"int32"},"minRegionsPassing":{"type":"integer","format":"int32"},"cooldownMinutes":{"type":"integer","format":"int32"}},"description":"Auto-recovery settings"},"TriggerRule":{"required":["scope","severity","type"],"type":"object","properties":{"type":{"type":"string","enum":["consecutive_failures","failures_in_window","response_time"]},"count":{"type":"integer","format":"int32","nullable":true},"windowMinutes":{"type":"integer","format":"int32","nullable":true},"scope":{"type":"string","nullable":true,"enum":["per_region","any_region"]},"thresholdMs":{"type":"integer","format":"int32","nullable":true},"severity":{"type":"string","enum":["down","degraded"]},"aggregationType":{"type":"string","nullable":true,"enum":["all_exceed","average","p95","max"]}},"description":"Array of trigger rules defining when an incident should be raised"},"UpdateIncidentPolicyRequest":{"required":["confirmation","recovery","triggerRules"],"type":"object","properties":{"triggerRules":{"minItems":1,"type":"array","description":"Array of trigger rules; at least one required","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"}},"description":"Request body for updating an incident policy"},"SingleValueResponseIncidentPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentPolicyDto"}}},"ApiKeyAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BasicAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BearerAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"HeaderAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"MonitorAuthConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"UpdateMonitorAuthRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"MonitorAuthDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"authType":{"type":"string","enum":["bearer","basic","header","api_key"]},"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"SingleValueResponseMonitorAuthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAuthDto"}}},"AssertionConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"BodyContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"DnsExpectedCnameAssertion":{"required":["value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"value":{"minLength":1,"type":"string"}}}]},"DnsExpectedIpsAssertion":{"required":["ips"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"ips":{"minItems":1,"type":"array","items":{"type":"string"}}}}]},"DnsMaxAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"max":{"type":"integer","format":"int32"}}}]},"DnsMinAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"min":{"type":"integer","format":"int32"}}}]},"DnsRecordContainsAssertion":{"required":["recordType","substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"substring":{"minLength":1,"type":"string"}}}]},"DnsRecordEqualsAssertion":{"required":["recordType","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"value":{"minLength":1,"type":"string"}}}]},"DnsResolvesAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"DnsResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"DnsResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"DnsTtlHighAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxTtl":{"type":"integer","format":"int32"}}}]},"DnsTtlLowAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minTtl":{"type":"integer","format":"int32"}}}]},"DnsTxtContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"HeaderValueAssertion":{"required":["expected","headerName","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"HeartbeatIntervalDriftAssertion":{"required":["maxDeviationPercent"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxDeviationPercent":{"maximum":100,"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatMaxIntervalAssertion":{"required":["maxSeconds"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxSeconds":{"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatPayloadContainsAssertion":{"required":["path","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"value":{"type":"string"}}}]},"HeartbeatReceivedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpPacketLossAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxPercent":{"maximum":100.0,"exclusiveMaximum":false,"minimum":0.0,"exclusiveMinimum":false,"type":"number","format":"double"}}}]},"IcmpReachableAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"IcmpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"JsonPathAssertion":{"required":["expected","operator","path"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"McpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"McpHasCapabilityAssertion":{"required":["capability"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"capability":{"minLength":1,"type":"string"}}}]},"McpMinToolsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"min":{"type":"integer","format":"int32"}}}]},"McpProtocolVersionAssertion":{"required":["version"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"version":{"minLength":1,"type":"string"}}}]},"McpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"McpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"McpToolAvailableAssertion":{"required":["toolName"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"toolName":{"minLength":1,"type":"string"}}}]},"McpToolCountChangedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expectedCount":{"type":"integer","format":"int32"}}}]},"RedirectCountAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxCount":{"type":"integer","format":"int32"}}}]},"RedirectTargetAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"RegexBodyAssertion":{"required":["pattern"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"pattern":{"minLength":1,"type":"string"}}}]},"ResponseSizeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxBytes":{"type":"integer","format":"int32"}}}]},"ResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"thresholdMs":{"type":"integer","format":"int32"}}}]},"ResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"SslExpiryAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minDaysRemaining":{"type":"integer","format":"int32"}}}]},"StatusCodeAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"TcpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"TcpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"TcpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"UpdateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"MonitorAssertionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"assertionType":{"type":"string","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"SingleValueResponseMonitorAssertionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAssertionDto"}}},"SetAlertChannelsRequest":{"required":["channelIds"],"type":"object","properties":{"channelIds":{"type":"array","items":{"type":"string","format":"uuid"}}}},"SingleValueResponseListUUID":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid"}}}},"AddMonitorTagsRequest":{"type":"object","properties":{"tagIds":{"type":"array","description":"IDs of existing org tags to attach","nullable":true,"items":{"type":"string","description":"IDs of existing org tags to attach","format":"uuid","nullable":true}},"newTags":{"type":"array","description":"New tags to create (if not already present) and attach","nullable":true,"items":{"$ref":"#/components/schemas/NewTagRequest"}}},"description":"Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both."},"CreateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}},"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","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"regions":{"type":"array","items":{"type":"string"}},"managedBy":{"type":"string","enum":["DASHBOARD","CLI"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorAssertionDto"}},"tags":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/TagDto"}},"pingUrl":{"type":"string","nullable":true},"environment":{"$ref":"#/components/schemas/Summary"},"auth":{"$ref":"#/components/schemas/MonitorAuthDto"},"incidentPolicy":{"$ref":"#/components/schemas/IncidentPolicyDto"},"alertChannelIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}}}},"SingleValueResponseMonitorDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorDto"}}},"Summary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"}}},"ChangeStatusRequest":{"required":["status"],"type":"object","properties":{"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"UpdateMaintenanceWindowRequest":{"required":["endsAt","startsAt"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"MaintenanceWindowDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true},"suppressAlerts":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMaintenanceWindowDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MaintenanceWindowDto"}}},"UpdateEnvironmentRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","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","format":"uuid"},"orgId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"variables":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorCount":{"type":"integer","format":"int32"},"isDefault":{"type":"boolean"}}},"SingleValueResponseEnvironmentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EnvironmentDto"}}},"ChannelConfig":{"required":["channelType"],"type":"object","properties":{"channelType":{"type":"string"}},"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","format":"uuid"},"name":{"type":"string"},"channelType":{"type":"string","enum":["email","webhook","slack","pagerduty","opsgenie","teams","discord"]},"displayConfig":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastDeliveryAt":{"type":"string","format":"date-time","nullable":true},"lastDeliveryStatus":{"type":"string","nullable":true}}},"SingleValueResponseAlertChannelDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertChannelDto"}}},"WorkspaceCreateParams":{"required":["name"],"type":"object","properties":{"organizationId":{"type":"integer","format":"int32"},"name":{"minLength":1,"type":"string"}}},"ServiceIncidentRequest":{"required":["action","externalRef","serviceId","title"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"externalRef":{"minLength":1,"type":"string"},"severity":{"type":"string","nullable":true},"title":{"minLength":1,"type":"string"},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"action":{"minLength":1,"type":"string"},"statusText":{"type":"string","nullable":true}}},"IncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"title":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","items":{"type":"string"}},"reopenCount":{"type":"integer","format":"int32"},"createdByUserId":{"type":"integer","format":"int32","nullable":true},"statusPageVisible":{"type":"boolean"},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"serviceId":{"type":"string","format":"uuid","nullable":true},"externalRef":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"shortlink":{"type":"string","nullable":true},"resolutionReason":{"type":"string","nullable":true,"enum":["MANUAL","AUTO_RECOVERED","AUTO_RESOLVED"]},"startedAt":{"type":"string","format":"date-time","nullable":true},"confirmedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"cooldownUntil":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorName":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"serviceSlug":{"type":"string","nullable":true},"monitorType":{"type":"string","nullable":true},"resourceGroupId":{"type":"string","format":"uuid","nullable":true},"resourceGroupName":{"type":"string","nullable":true}}},"TableValueResultIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseInteger":{"type":"object","properties":{"data":{"type":"integer","format":"int32"}}},"CreateAutoIncidentRequest":{"required":["monitorId"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"severity":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"startedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseIncidentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentDto"}}},"ReopenAutoIncidentRequest":{"type":"object","properties":{"affectedRegions":{"type":"array","items":{"type":"string"}},"severity":{"type":"string","nullable":true}}},"AdapterHealthReportRequest":{"required":["serviceId","success"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"success":{"type":"boolean"},"errorMessage":{"type":"string","nullable":true}}},"AdapterHealthDto":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string"},"serviceName":{"type":"string"},"adapterType":{"type":"string","nullable":true},"lastSuccessAt":{"type":"string","format":"date-time","nullable":true},"lastFailureAt":{"type":"string","format":"date-time","nullable":true},"consecutiveFailures":{"type":"integer","format":"int32"},"lastErrorMessage":{"type":"string","nullable":true},"disabledByHealth":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseAdapterHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdapterHealthDto"}}},"CreateOrgRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"},"email":{"type":"string","format":"email","nullable":true}}},"SingleValueResponseTransactionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionDto"}}},"TransactionDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","nullable":true},"currencyCode":{"type":"string","nullable":true},"invoiceNumber":{"type":"string","nullable":true},"billedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"total":{"type":"string","nullable":true},"subtotal":{"type":"string","nullable":true},"tax":{"type":"string","nullable":true}}},"QuickMonitorRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"},"name":{"type":"string","nullable":true},"frequencySeconds":{"type":"integer","format":"int32","nullable":true}}},"OnboardingSetupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"role":{"maxLength":50,"minLength":0,"type":"string","nullable":true},"teamSize":{"maxLength":50,"minLength":0,"type":"string","nullable":true}}},"AnalyzeUrlRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"}}},"AnalyzeUrlResponse":{"type":"object","properties":{"reachable":{"type":"boolean"},"responseTimeMs":{"type":"integer","format":"int64"},"statusCode":{"type":"integer","format":"int32"},"tlsExpiry":{"type":"string","format":"date-time","nullable":true},"tlsDaysRemaining":{"type":"integer","format":"int32","nullable":true},"contentType":{"type":"string","nullable":true},"suggestedName":{"type":"string"},"suggestedAssertions":{"type":"array","items":{"$ref":"#/components/schemas/SuggestedAssertion"}},"suggestedFrequencySeconds":{"type":"integer","format":"int32"}}},"SingleValueResponseAnalyzeUrlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnalyzeUrlResponse"}}},"SuggestedAssertion":{"type":"object","properties":{"type":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}}},"AcceptInviteRequest":{"required":["token"],"type":"object","properties":{"token":{"minLength":1,"type":"string"}}},"AcceptInviteDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"SingleValueResponseAcceptInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AcceptInviteDto"}}},"RegisterUserRequest":{"type":"object","properties":{"nickname":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"picture":{"type":"string","nullable":true}}},"CreateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"}}},"AddMemberRequest":{"required":["orgRole","userId"],"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"MemberDto":{"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMemberDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MemberDto"}}},"CreateWebhookEndpointRequest":{"required":["subscribedEvents","url"],"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","description":"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","nullable":true}}},"SingleValueResponseWebhookTestResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookTestResult"}}},"WebhookTestResult":{"type":"object","properties":{"success":{"type":"boolean"},"statusCode":{"type":"integer","format":"int32","nullable":true},"message":{"type":"string"},"durationMs":{"type":"integer","format":"int64","nullable":true}}},"SingleValueResponseString":{"type":"object","properties":{"data":{"type":"string"}}},"DekRotationResultDto":{"type":"object","properties":{"previousDekVersion":{"type":"integer","format":"int32"},"newDekVersion":{"type":"integer","format":"int32"},"secretsReEncrypted":{"type":"integer","format":"int32"},"channelsReEncrypted":{"type":"integer","format":"int32"},"rotatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseDekRotationResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DekRotationResultDto"}}},"CreateTagRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"Tag name, unique within the org"},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"Hex color code (defaults to #6B7280 if omitted)","nullable":true}},"description":"Request body for creating a tag"},"ServiceSubscribeRequest":{"type":"object","properties":{"componentId":{"type":"string","description":"ID of the component to subscribe to. Omit or null for whole-service subscription.","format":"uuid","nullable":true},"alertSensitivity":{"type":"string","description":"Alert sensitivity level. Defaults to INCIDENTS_ONLY when not provided.","nullable":true}},"description":"Optional body for subscribing to a specific component of a service"},"ComponentUptimeSummaryDto":{"type":"object","properties":{"day":{"type":"number","description":"Uptime percentage over the last 24 hours","format":"double","nullable":true,"example":99.95},"week":{"type":"number","description":"Uptime percentage over the last 7 days","format":"double","nullable":true,"example":99.98},"month":{"type":"number","description":"Uptime percentage over the last 30 days","format":"double","nullable":true,"example":99.92},"source":{"type":"string","description":"Data source: vendor_reported or incident_derived","example":"vendor_reported"}},"description":"Inline uptime percentages for 24h, 7d, 30d"},"ServiceComponentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"description":{"type":"string","nullable":true},"groupId":{"type":"string","format":"uuid","nullable":true},"position":{"type":"integer","format":"int32","nullable":true},"showcase":{"type":"boolean"},"onlyShowIfDegraded":{"type":"boolean"},"startDate":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true},"lifecycleStatus":{"type":"string"},"dataType":{"type":"string","description":"Data classification: full, status_only, or metric_only","example":"full"},"hasUptime":{"type":"boolean","description":"Whether uptime data is available for this component"},"region":{"type":"string","description":"Geographic region for regional components (AWS, GCP, Azure)","nullable":true},"groupName":{"type":"string","description":"Display name of the parent group","nullable":true},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"statusChangedAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"group":{"type":"boolean"}},"description":"A first-class service component with lifecycle and uptime data"},"ServiceSubscriptionDto":{"type":"object","properties":{"subscriptionId":{"type":"string","description":"Unique subscription identifier","format":"uuid"},"serviceId":{"type":"string","description":"Service identifier","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"logoUrl":{"type":"string","description":"Logo URL from the service catalog","nullable":true},"overallStatus":{"type":"string","description":"Current overall status; null when the service has never been polled","nullable":true},"componentId":{"type":"string","description":"Subscribed component id; null for whole-service subscription","format":"uuid","nullable":true},"component":{"$ref":"#/components/schemas/ServiceComponentDto"},"alertSensitivity":{"type":"string","description":"Alert sensitivity: ALL (synthetic + real incidents), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (real + DOWN severity)","enum":["ALL","INCIDENTS_ONLY","MAJOR_ONLY"]},"subscribedAt":{"type":"string","description":"When the organization subscribed to this service","format":"date-time"}},"description":"An org-level service subscription with current status information"},"SingleValueResponseServiceSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}}},"CreateSecretRequest":{"required":["key","value"],"type":"object","properties":{"key":{"maxLength":255,"minLength":0,"type":"string","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","format":"uuid"},"incidentId":{"type":"string","format":"uuid"},"policyId":{"type":"string","format":"uuid"},"policyName":{"type":"string","description":"Human-readable name of the matched policy (null if policy has been deleted)","nullable":true},"status":{"type":"string","description":"Current dispatch state","enum":["PENDING","DISPATCHING","DELIVERED","ESCALATING","ACKNOWLEDGED","COMPLETED"]},"completionReason":{"type":"string","description":"Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states.","nullable":true,"enum":["EXHAUSTED","RESOLVED","NO_STEPS"]},"currentStep":{"type":"integer","description":"1-based index of the currently active escalation step","format":"int32"},"totalSteps":{"type":"integer","description":"Total number of escalation steps in the policy (null if policy has been deleted)","format":"int32","nullable":true},"acknowledgedAt":{"type":"string","description":"Timestamp when this dispatch was acknowledged (null if not acknowledged)","format":"date-time","nullable":true},"nextEscalationAt":{"type":"string","description":"Timestamp when the next escalation step will fire (null if not scheduled)","format":"date-time","nullable":true},"lastNotifiedAt":{"type":"string","description":"Timestamp of the most recent notification delivery","format":"date-time","nullable":true},"deliveries":{"type":"array","description":"Delivery records for all channels associated with this dispatch","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Dispatch state for a single (incident, notification policy) pair, with delivery history"},"SingleValueResponseNotificationDispatchDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationDispatchDto"}}},"CreateMonitorRequest":{"required":["config","managedBy","name","type"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","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","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"passed":{"type":"boolean"},"severity":{"type":"string","enum":["fail","warn"]},"message":{"type":"string"},"expected":{"type":"string","nullable":true},"actual":{"type":"string","nullable":true}}},"MonitorTestResultDto":{"type":"object","properties":{"passed":{"type":"boolean"},"error":{"type":"string","nullable":true},"statusCode":{"type":"integer","format":"int32","nullable":true},"responseTimeMs":{"type":"integer","format":"int64","nullable":true},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"nullable":true},"bodyPreview":{"type":"string","nullable":true},"responseSizeBytes":{"type":"integer","format":"int64","nullable":true},"redirectCount":{"type":"integer","format":"int32","nullable":true},"finalUrl":{"type":"string","nullable":true},"assertionResults":{"type":"array","items":{"$ref":"#/components/schemas/AssertionTestResultDto"}},"warnings":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}}}},"SingleValueResponseMonitorTestResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorTestResultDto"}}},"TableValueResultTagDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TagDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorTestRequest":{"required":["config","type"],"type":"object","properties":{"type":{"type":"string","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","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"CreateInviteRequest":{"required":["email","roleOffered"],"type":"object","properties":{"email":{"minLength":1,"type":"string","format":"email"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"InviteDto":{"type":"object","properties":{"inviteId":{"type":"integer","format":"int32"},"email":{"type":"string"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"expiresAt":{"type":"string","format":"date-time"},"consumedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InviteDto"}}},"CreateManualIncidentRequest":{"required":["severity","title"],"type":"object","properties":{"title":{"minLength":1,"type":"string","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"},"newStatus":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"notifySubscribers":{"type":"boolean"}}},"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"}}},"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","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyCreateResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}},"ApiKeyDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyDto"}}},"SingleValueResponseAlertDeliveryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertDeliveryDto"}}},"CreateAlertChannelRequest":{"required":["config","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","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"}]}}},"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"}}}},"SingleValueResponseListMonitorAssertionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorAssertionDto"}}}},"SchedulableMonitorDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"regions":{"type":"array","items":{"type":"string"}},"organizationId":{"type":"integer","format":"int32"}}},"TableValueResultAdapterHealthDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AdapterHealthDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseListBillingPlanDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BillingPlanDto"}}}},"TableValueResultTransactionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransactionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseUpcomingChargeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UpcomingChargeResponse"}}},"UpcomingChargeResponse":{"type":"object","properties":{"action":{"type":"string","enum":["UPGRADE","DOWNGRADE","NOOP"]},"immediateAmount":{"type":"integer","format":"int32"},"nextBillingAmount":{"type":"integer","format":"int32"},"nextBillingDate":{"type":"string","format":"date-time","nullable":true}}},"EntitlementDto":{"type":"object","properties":{"key":{"type":"string","description":"Entitlement key"},"value":{"type":"integer","description":"Effective limit value (overrides applied)","format":"int64"},"defaultValue":{"type":"integer","description":"Plan-tier default value before overrides","format":"int64"},"overridden":{"type":"boolean","description":"Whether this entitlement has an org-level override"}},"description":"A single resolved entitlement for the organization"},"EntitlementResponse":{"type":"object","properties":{"tier":{"type":"string","description":"Resolved billing plan tier","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"entitlements":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EntitlementDto"},"description":"All entitlements keyed by entitlement key"},"usage":{"type":"object","additionalProperties":{"type":"integer","description":"Current usage counters keyed by entitlement key (only for countable resources)","format":"int64"},"description":"Current usage counters keyed by entitlement key (only for countable resources)"},"trialActive":{"type":"boolean","description":"Whether the org is currently on a trial"},"trialExpiresAt":{"type":"string","description":"Trial expiry date (null if not trialing)","format":"date-time","nullable":true},"subscriptionStatus":{"type":"string","description":"Current subscription status (null if no subscription)","nullable":true}},"description":"Full entitlement state for an organization: resolved limits, usage, and trial info"},"SingleValueResponseEntitlementResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EntitlementResponse"}}},"PaginationParams":{"required":["sortBy","sortOrder"],"type":"object","properties":{"sortBy":{"type":"string"},"sortOrder":{"type":"string","enum":["ASC","DESC"]},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"IdValuePair":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"value":{"type":"string"}}},"TableValueResultIdValuePair":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IdValuePair"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MyOrgItemDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"orgName":{"type":"string"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"TableValueResultMyOrgItemDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MyOrgItemDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64","nullable":true}}},"Pageable":{"type":"object","properties":{"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"minimum":1,"type":"integer","format":"int32"},"sort":{"type":"array","items":{"type":"string"}}}},"TableValueResultUserDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AdminStatsDto":{"type":"object","properties":{"userCount":{"type":"integer","format":"int64"},"orgCount":{"type":"integer","format":"int64"},"memberCount":{"type":"integer","format":"int64"}}},"SingleValueResponseAdminStatsDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdminStatsDto"}}},"TableValueResultOrganizationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMemberDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookEndpointDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"WebhookDeliveryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpointId":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"eventType":{"type":"string"},"status":{"type":"string"},"attemptCount":{"type":"integer","format":"int32"},"maxAttempts":{"type":"integer","format":"int32"},"responseStatus":{"type":"integer","format":"int32","nullable":true},"responseLatencyMs":{"type":"integer","format":"int32","nullable":true},"errorMessage":{"type":"string","nullable":true},"deliveredAt":{"type":"string","format":"date-time","nullable":true},"failedAt":{"type":"string","format":"date-time","nullable":true},"nextRetryAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseWebhookSigningSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSigningSecretDto"}}},"WebhookSigningSecretDto":{"type":"object","properties":{"configured":{"type":"boolean"},"maskedSecret":{"type":"string","nullable":true}}},"WebhookEventCatalogEntry":{"type":"object","properties":{"type":{"type":"string","description":"Dot-notation event type identifier, e.g. \"monitor.created\""},"surface":{"type":"string","description":"Product surface this event belongs to, e.g. \"monitoring\" or \"status_data\""},"description":{"type":"string","description":"Human-readable description of when this event fires"}}},"WebhookEventCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalogEntry"}}}},"CursorPageServiceCatalogDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"ServiceCatalogDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"overallStatus":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"componentCount":{"type":"integer","format":"int64"},"activeIncidentCount":{"type":"integer","format":"int64"},"dataCompleteness":{"type":"string"}},"description":"Items on this page"},"MaintenanceComponentRef":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string"}}},"MaintenanceUpdateDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}},"description":"A status update within a scheduled maintenance lifecycle"},"ScheduledMaintenanceDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"shortlink":{"type":"string","nullable":true},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"scheduledUntil":{"type":"string","format":"date-time","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"affectedComponents":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceComponentRef"}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceUpdateDto"}}},"description":"A scheduled maintenance window from a vendor status page"},"ServiceDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"currentStatus":{"$ref":"#/components/schemas/ServiceStatusDto"},"recentIncidents":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"components":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"activeMaintenances":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"dataCompleteness":{"type":"string"}}},"ServiceIncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true}}},"ServiceStatusDto":{"type":"object","properties":{"overallStatus":{"type":"string"},"lastPolledAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceDetailDto"}}},"ServiceUptimeResponse":{"type":"object","properties":{"overallUptimePct":{"type":"number","description":"Overall uptime percentage across the entire period; null when no polling data exists","format":"double","nullable":true,"example":99.95},"period":{"type":"string","description":"Requested period","example":"7d"},"granularity":{"type":"string","description":"Requested granularity","example":"hourly"},"buckets":{"type":"array","description":"Per-bucket breakdown ordered by time ascending","items":{"$ref":"#/components/schemas/UptimeBucketDto"}},"source":{"type":"string","description":"Data source: vendor_reported, incident_derived, or poll_derived","nullable":true,"example":"vendor_reported"}},"description":"Uptime response with per-bucket breakdown and overall percentage for the period"},"SingleValueResponseServiceUptimeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceUptimeResponse"}}},"UptimeBucketDto":{"type":"object","properties":{"timestamp":{"type":"string","description":"Start of the bucket interval (ISO 8601)","format":"date-time","example":"2024-01-01T00:00:00Z"},"uptimePct":{"type":"number","description":"Uptime percentage for this bucket; null when no polls occurred","format":"double","nullable":true,"example":100.0},"totalPolls":{"type":"integer","description":"Total number of polls recorded in this bucket","format":"int64","example":12}},"description":"Uptime statistics for a single time bucket"},"TableValueResultScheduledMaintenanceDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultServiceIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ServiceIncidentDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentUpdateDto"}}}},"ServiceIncidentUpdateDto":{"type":"object","properties":{"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceIncidentDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceIncidentDetailDto"}}},"TableValueResultServiceComponentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ComponentUptimeDayDto":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"partialOutageSeconds":{"type":"integer","format":"int32"},"majorOutageSeconds":{"type":"integer","format":"int32"},"uptimePercentage":{"type":"number","format":"double"},"eventsJson":{"type":"string","description":"Incident event references for this day as raw JSON","nullable":true},"source":{"type":"string"}},"description":"Daily uptime data for a component"},"TableValueResultComponentUptimeDayDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ComponentUptimeDayDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"GlobalStatusSummaryDto":{"type":"object","properties":{"totalServices":{"type":"integer","format":"int32"},"operationalCount":{"type":"integer","format":"int32"},"degradedCount":{"type":"integer","format":"int32"},"partialOutageCount":{"type":"integer","format":"int32"},"majorOutageCount":{"type":"integer","format":"int32"},"maintenanceCount":{"type":"integer","format":"int32"},"activeIncidentCount":{"type":"integer","format":"int64"},"servicesWithIssues":{"type":"array","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}}}},"SingleValueResponseGlobalStatusSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/GlobalStatusSummaryDto"}}},"TableValueResultServiceSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSecretDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SecretDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultResourceGroupDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ResourceGroupDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseResourceGroupHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupHealthDto"}}},"NotificationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"type":{"type":"string"},"title":{"type":"string"},"body":{"type":"string","nullable":true},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultNotificationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseLong":{"type":"object","properties":{"data":{"type":"integer","format":"int64"}}},"TableValueResultNotificationPolicyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationPolicyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultNotificationDispatchDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDispatchDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMonitorDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorVersionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"version":{"type":"integer","format":"int32"},"snapshot":{"$ref":"#/components/schemas/MonitorDto"},"changedById":{"type":"integer","format":"int32","nullable":true},"changedVia":{"type":"string","enum":["API","DASHBOARD","CLI","TERRAFORM"]},"changeSummary":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultMonitorVersionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorVersionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseMonitorVersionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorVersionDto"}}},"UptimeDto":{"type":"object","properties":{"uptimePercentage":{"type":"number","description":"Uptime percentage over the requested window; null when no data","format":"double","nullable":true,"example":99.95},"totalChecks":{"type":"integer","description":"Total number of checks executed","format":"int64","example":1440},"passedChecks":{"type":"integer","description":"Number of checks that passed","format":"int64","example":1439},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds; null when no data","format":"double","nullable":true,"example":142.5},"p95LatencyMs":{"type":"number","description":"95th-percentile latency in milliseconds (upper bound across regions); null when no data","format":"double","nullable":true,"example":312.0}},"description":"Uptime statistics aggregated from continuous aggregates"},"SingleValueResponseUptimeDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UptimeDto"}}},"CursorPage":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"type":"object","description":"Items on this page"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"AssertionResultDto":{"type":"object","properties":{"type":{"type":"string","description":"Assertion type","example":"status_code"},"passed":{"type":"boolean","description":"Whether the assertion passed"},"severity":{"type":"string","description":"Assertion severity","enum":["fail","warn"]},"message":{"type":"string","description":"Human-readable result message","nullable":true},"expected":{"type":"string","description":"Expected value","nullable":true,"example":"200"},"actual":{"type":"string","description":"Actual value observed","nullable":true,"example":"503"}},"description":"Result of evaluating a single assertion against a check result"},"CheckResultDetailsDto":{"type":"object","properties":{"statusCode":{"type":"integer","description":"HTTP status code of the response","format":"int32","nullable":true,"example":200},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","description":"HTTP response headers","nullable":true,"items":{"type":"string","description":"HTTP response headers","nullable":true}},"description":"HTTP response headers","nullable":true},"responseBodySnapshot":{"type":"string","description":"Raw response body snapshot (may be HTML, XML, JSON, or plain text)","nullable":true},"assertionResults":{"type":"array","description":"Individual assertion evaluation results","nullable":true,"items":{"$ref":"#/components/schemas/AssertionResultDto"}},"tlsInfo":{"$ref":"#/components/schemas/TlsInfoDto"},"redirectCount":{"type":"integer","description":"Number of HTTP redirects followed","format":"int32","nullable":true,"example":2},"redirectTarget":{"type":"string","description":"Final URL after redirects","nullable":true},"responseSizeBytes":{"type":"integer","description":"Response body size in bytes","format":"int32","nullable":true,"example":4096},"checkDetails":{"oneOf":[{"$ref":"#/components/schemas/Dns"},{"$ref":"#/components/schemas/Http"},{"$ref":"#/components/schemas/Icmp"},{"$ref":"#/components/schemas/McpServer"},{"$ref":"#/components/schemas/Tcp"}]}},"description":"Type-specific details captured during a check execution"},"CheckResultDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the check result","format":"uuid"},"timestamp":{"type":"string","description":"Timestamp when the check was executed (ISO 8601)","format":"date-time"},"region":{"type":"string","description":"Region where the check was executed","example":"us-east"},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds","format":"int32","nullable":true,"example":123},"passed":{"type":"boolean","description":"Whether the check passed","example":true},"failureReason":{"type":"string","description":"Reason for failure when passed=false","nullable":true},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true},"details":{"$ref":"#/components/schemas/CheckResultDetailsDto"}},"description":"A single check result from a monitor run"},"CheckTypeDetailsDto":{"required":["check_type"],"type":"object","properties":{"check_type":{"type":"string"}},"description":"Check-type-specific details — polymorphic by check_type discriminator","discriminator":{"propertyName":"check_type"}},"CursorPageCheckResultDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/CheckResultDto"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"Dns":{"type":"object","description":"DNS check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"hostname":{"type":"string","description":"Target hostname","nullable":true},"requestedTypes":{"type":"array","description":"Requested DNS record types","nullable":true,"items":{"type":"string","description":"Requested DNS record types","nullable":true}},"usedResolver":{"type":"string","description":"Resolver used for lookup","nullable":true},"records":{"type":"object","additionalProperties":{"type":"array","description":"Resolved DNS records keyed by record type","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"Resolved DNS records keyed by record type","nullable":true},"description":"Resolved DNS records keyed by record type","nullable":true}},"description":"Resolved DNS records keyed by record type","nullable":true},"attempts":{"type":"array","description":"DNS resolution attempts","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"DNS resolution attempts","nullable":true},"description":"DNS resolution attempts","nullable":true}},"failureKind":{"type":"string","description":"Kind of DNS failure, if any","nullable":true}}}]},"Http":{"type":"object","description":"HTTP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"timing":{"type":"object","additionalProperties":{"type":"object","description":"Request phase timing breakdown","nullable":true},"description":"Request phase timing breakdown","nullable":true},"bodyTruncated":{"type":"boolean","description":"Whether the response body was truncated before storage","nullable":true}}}]},"Icmp":{"type":"object","description":"ICMP (ping) check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"1.1.1.1"},"packetsSent":{"type":"integer","description":"Number of ICMP packets sent","format":"int32","nullable":true},"packetsReceived":{"type":"integer","description":"Number of ICMP packets received","format":"int32","nullable":true},"packetLoss":{"type":"number","description":"Packet loss percentage","format":"double","nullable":true,"example":0.0},"avgRttMs":{"type":"number","description":"Average round-trip time in ms","format":"double","nullable":true},"minRttMs":{"type":"number","description":"Minimum round-trip time in ms","format":"double","nullable":true},"maxRttMs":{"type":"number","description":"Maximum round-trip time in ms","format":"double","nullable":true},"jitterMs":{"type":"number","description":"Jitter in ms","format":"double","nullable":true}}}]},"McpServer":{"type":"object","description":"MCP server check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"url":{"type":"string","description":"MCP server URL","nullable":true},"protocolVersion":{"type":"string","description":"MCP protocol version","nullable":true},"serverInfo":{"type":"object","additionalProperties":{"type":"object","description":"MCP server info (name, version, etc.)","nullable":true},"description":"MCP server info (name, version, etc.)","nullable":true},"toolCount":{"type":"integer","description":"Number of tools exposed","format":"int32","nullable":true},"resourceCount":{"type":"integer","description":"Number of resources exposed","format":"int32","nullable":true},"promptCount":{"type":"integer","description":"Number of prompts exposed","format":"int32","nullable":true}}}]},"Tcp":{"type":"object","description":"TCP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"db.example.com"},"port":{"type":"integer","description":"Target port","format":"int32","example":5432},"connected":{"type":"boolean","description":"Whether a TCP connection was established"}}}]},"TlsInfoDto":{"type":"object","properties":{"subjectCn":{"type":"string","description":"Certificate subject common name","nullable":true,"example":"*.example.com"},"subjectSan":{"type":"array","description":"Subject Alternative Names","nullable":true,"items":{"type":"string","description":"Subject Alternative Names","nullable":true}},"issuerCn":{"type":"string","description":"Issuer common name","nullable":true,"example":"R3"},"issuerOrg":{"type":"string","description":"Issuer organisation","nullable":true,"example":"Let's Encrypt"},"notBefore":{"type":"string","description":"Certificate validity start (ISO 8601 UTC)","nullable":true},"notAfter":{"type":"string","description":"Certificate validity end (ISO 8601 UTC)","nullable":true},"serialNumber":{"type":"string","description":"Certificate serial number","nullable":true},"tlsVersion":{"type":"string","description":"TLS protocol version","nullable":true,"example":"TLSv1.3"},"cipherSuite":{"type":"string","description":"Negotiated cipher suite","nullable":true},"chainValid":{"type":"boolean","description":"Whether the chain validated against the OS trust store","nullable":true}},"description":"TLS/SSL certificate details for HTTPS targets"},"ChartBucketDto":{"type":"object","properties":{"bucket":{"type":"string","description":"Start of the time bucket (ISO 8601)","format":"date-time","example":"2026-03-12T10:00:00Z"},"uptimePercent":{"type":"number","description":"Uptime percentage for this bucket; null when no data","format":"double","nullable":true,"example":100.0},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds for this bucket","format":"double","nullable":true,"example":120.3},"p95LatencyMs":{"type":"number","description":"95th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":250.0},"p99LatencyMs":{"type":"number","description":"99th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":480.0}},"description":"Aggregated metrics for a time bucket"},"RegionStatusDto":{"type":"object","properties":{"region":{"type":"string","description":"Region identifier","example":"us-east"},"passed":{"type":"boolean","description":"Whether the last check in this region passed","example":true},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds for the last check","format":"int32","nullable":true,"example":95},"timestamp":{"type":"string","description":"Timestamp of the last check in this region (ISO 8601)","format":"date-time"},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true}},"description":"Latest check result for a single region"},"ResultSummaryDto":{"type":"object","properties":{"currentStatus":{"type":"string","description":"Derived current status across all regions","enum":["up","degraded","down","unknown"]},"latestPerRegion":{"type":"array","description":"Latest check result per region","items":{"$ref":"#/components/schemas/RegionStatusDto"}},"chartData":{"type":"array","description":"Time-bucketed chart data for the requested window","items":{"$ref":"#/components/schemas/ChartBucketDto"}},"uptime24h":{"type":"number","description":"Uptime percentage over the last 24 hours; null when no data","format":"double","nullable":true,"example":99.95},"uptimeWindow":{"type":"number","description":"Uptime percentage for the selected chart window; null when no data","format":"double","nullable":true,"example":99.8}},"description":"Dashboard summary: current status, per-region latest results, and chart data"},"SingleValueResponseResultSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResultSummaryDto"}}},"TableValueResultMaintenanceWindowDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceWindowDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultInviteDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InviteDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"IntegrationCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationDto"}}}},"IntegrationConfigSchemaDto":{"type":"object","properties":{"connectionFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}},"channelFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}}}},"IntegrationDto":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"logoUrl":{"type":"string"},"authType":{"type":"string"},"tierAvailability":{"type":"string","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"lifecycle":{"type":"string"},"setupGuideUrl":{"type":"string"},"configSchema":{"$ref":"#/components/schemas/IntegrationConfigSchemaDto"}}},"IntegrationFieldDto":{"required":["key","label","required","sensitive","type"],"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"sensitive":{"type":"boolean"},"placeholder":{"type":"string","nullable":true},"helpText":{"type":"string","nullable":true},"options":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"default":{"type":"string","nullable":true}}},"IncidentFilterParams":{"type":"object","properties":{"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"monitorId":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"resourceGroupId":{"type":"string","format":"uuid"},"tagId":{"type":"string","format":"uuid","nullable":true},"environmentId":{"type":"string","format":"uuid","nullable":true},"startedFrom":{"type":"string","format":"date-time","nullable":true},"startedTo":{"type":"string","format":"date-time","nullable":true},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"TableValueResultEnvironmentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DashboardOverviewDto":{"type":"object","properties":{"monitors":{"$ref":"#/components/schemas/MonitorsSummaryDto"},"incidents":{"$ref":"#/components/schemas/IncidentsSummaryDto"}}},"IncidentsSummaryDto":{"type":"object","properties":{"active":{"type":"integer","format":"int64"},"resolvedToday":{"type":"integer","format":"int64"},"mttr30d":{"type":"number","format":"double","nullable":true}}},"MonitorsSummaryDto":{"type":"object","properties":{"total":{"type":"integer","format":"int64"},"up":{"type":"integer","format":"int64"},"down":{"type":"integer","format":"int64"},"degraded":{"type":"integer","format":"int64"},"paused":{"type":"integer","format":"int64"},"avgUptime24h":{"type":"number","format":"double","nullable":true},"avgUptime30d":{"type":"number","format":"double","nullable":true}}},"SingleValueResponseDashboardOverviewDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DashboardOverviewDto"}}},"CategoryDto":{"type":"object","properties":{"category":{"type":"string"},"serviceCount":{"type":"integer","format":"int64"}}},"TableValueResultCategoryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AuditEventDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"actorId":{"type":"integer","format":"int32","nullable":true},"actorEmail":{"type":"string","nullable":true},"action":{"type":"string"},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"resourceName":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"PageResultAuditEventDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEventDto"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"hasNext":{"type":"boolean"}}},"TableValueResultApiKeyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DeliveryAttemptDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deliveryId":{"type":"string","format":"uuid"},"attemptNumber":{"type":"integer","description":"1-based attempt number","format":"int32"},"status":{"type":"string","description":"Outcome: SUCCESS, FAILED, TIMEOUT, ERROR"},"responseStatusCode":{"type":"integer","description":"HTTP response status code from the external service","format":"int32","nullable":true},"requestPayload":{"type":"string","description":"JSON payload sent to the external service","nullable":true},"responseBody":{"type":"string","description":"Response body from the external service (truncated)","nullable":true},"errorMessage":{"type":"string","description":"Error message if the attempt failed","nullable":true},"responseTimeMs":{"type":"integer","description":"Round-trip time in milliseconds","format":"int32","nullable":true},"externalId":{"type":"string","description":"External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID)","nullable":true},"requestHeaders":{"type":"object","additionalProperties":{"type":"string","description":"HTTP request headers sent to the external service","nullable":true},"description":"HTTP request headers sent to the external service","nullable":true},"attemptedAt":{"type":"string","format":"date-time"}},"description":"Single delivery attempt with request/response audit data"},"TableValueResultDeliveryAttemptDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAttemptDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertChannelDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertChannelDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"RemoveMonitorTagsRequest":{"required":["tagIds"],"type":"object","properties":{"tagIds":{"minItems":1,"type":"array","description":"IDs of the tags to detach from the monitor","items":{"type":"string","description":"IDs of the tags to detach from the monitor","format":"uuid"}}},"description":"Request body for removing tags from a monitor"},"DeleteChannelResult":{"type":"object","properties":{"affectedPolicies":{"type":"integer","description":"Number of notification policies whose escalation steps were modified","format":"int32"},"disabledPolicies":{"type":"integer","description":"Number of notification policies disabled because they had no remaining channels","format":"int32"}},"description":"Summary of policies affected by channel deletion"}},"securitySchemes":{"BearerAuth":{"type":"http","description":"API key (dh_live_...) or Auth0 JWT token","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file +{"openapi":"3.0.1","info":{"title":"DevHelm API","description":"DevHelm platform and public API","version":"1.0"},"servers":[{"url":"http://localhost:8081","description":"Generated server url"}],"tags":[{"name":"Heartbeat","description":"Public ping endpoint for heartbeat monitors"},{"name":"Invites","description":"Organization invite management"},{"name":"Onboarding","description":"User onboarding flow"},{"name":"Members","description":"Organization member management"},{"name":"Me","description":"Current user profile and organizations"},{"name":"Incidents","description":"Incident management and lifecycle"},{"name":"Maintenance Windows","description":"Schedule alert-suppression windows for monitors"},{"name":"Organizations","description":"Organization management"},{"name":"Integrations","description":"Static catalog of supported alert channel integrations"},{"name":"Incident Policies","description":"Manage trigger, confirmation, and recovery rules for monitors"},{"name":"Entitlements","description":"Plan entitlements and usage limits"},{"name":"Vault","description":"Organization vault management (admin-only)"},{"name":"Secrets","description":"Organization environment secret management"},{"name":"Transactions","description":"Subscription transaction history"},{"name":"Monitors","description":"Monitor CRUD and lifecycle management"},{"name":"Webhooks","description":"Webhook endpoint management, event catalog, and delivery history"},{"name":"Events","description":"Real-time event stream"},{"name":"Workspaces","description":"Workspace management within an organization"},{"name":"Notifications","description":"In-app notification center"},{"name":"Alert Channels","description":"Alert channel CRUD and connectivity testing"},{"name":"Subscriptions","description":"Organization subscription management"},{"name":"Service Subscriptions","description":"Manage which services an organization tracks"},{"name":"Tags","description":"Org-scoped tag management for monitors"},{"name":"Status Data","description":"Public service status catalog, components, uptime, and incident history"},{"name":"Check Results","description":"Query raw check results, uptime statistics, and summary data"},{"name":"API Keys","description":"Organization API key management"},{"name":"Dashboard","description":"Overview dashboard aggregates"},{"name":"Auth","description":"User registration"},{"name":"Monitor Auth","description":"Manage authentication configuration for a monitor"},{"name":"Audit Log","description":"Organization audit trail"},{"name":"Monitor Alert Channels","description":"Manage alert channel mappings for a monitor"},{"name":"Alert Deliveries","description":"Delivery audit trail: inspect per-attempt details for alert deliveries"},{"name":"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":"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","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOnboardingStageRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me":{"get":{"tags":["Me"],"summary":"Get current user","operationId":"me","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user profile","operationId":"updateProfile","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/me/notification-preferences":{"get":{"tags":["Me"],"summary":"Get current user's notification preferences","operationId":"getNotificationPreferences","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseNotificationPreferencesDto"}}}}}},"put":{"tags":["Me"],"summary":"Update current user's notification preferences","operationId":"updateNotificationPreferences","parameters":[],"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}":{"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseOrganizationDto"}}}}}},"put":{"tags":["Organizations"],"summary":"Update the current organization","operationId":"update_5","parameters":[],"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","parameters":[],"responses":{"204":{"description":"No Content"}}}},"/api/v1/notification-policies/{id}":{"get":{"tags":["Notification Policies"],"summary":"Get a notification policy by ID","operationId":"getById","parameters":[{"name":"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_1","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","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickMonitorRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorDto"}}}}}}},"/platform/onboarding/complete-setup":{"post":{"tags":["Onboarding"],"summary":"Complete onboarding setup (creates org + workspace, advances to FIRST_MONITOR)","operationId":"completeSetup","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSetupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseUserDto"}}}}}}},"/platform/onboarding/analyze-url":{"post":{"tags":["Onboarding"],"summary":"Analyze a URL and return suggested monitor configuration","operationId":"analyzeUrl","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeUrlRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseAnalyzeUrlResponse"}}}}}}},"/platform/invites/accept":{"post":{"tags":["Invites"],"summary":"Accept invite","operationId":"accept","parameters":[],"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","parameters":[],"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","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseString"}}}}}}},"/api/v1/vaults/rotate":{"post":{"tags":["Vault"],"summary":"Rotate DEK","description":"Generates a new Data Encryption Key, re-encrypts all secrets and alert-channel configs, and bumps the vault version. Admin-only. Pipeline DEK caches expire within ~10 minutes.","operationId":"rotateDek","parameters":[],"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","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultSecretDto"}}}}}},"post":{"tags":["Secrets"],"summary":"Create secret","operationId":"create_5","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseSecretDto"}}}}}}},"/api/v1/resource-groups":{"get":{"tags":["Resource Groups"],"summary":"List all resource groups for the authenticated org with health summaries","operationId":"list_5","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultResourceGroupDto"}}}}}},"post":{"tags":["Resource Groups"],"summary":"Create a new resource group","operationId":"create_6","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultNotificationPolicyDto"}}}}}},"post":{"tags":["Notification Policies"],"summary":"Create a notification policy with match rules and escalation chain","operationId":"create_7","parameters":[],"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","parameters":[],"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","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorTestRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMonitorTestResultDto"}}}}}}},"/api/v1/monitors/bulk":{"post":{"tags":["Monitors"],"summary":"Bulk action on monitors","description":"Applies PAUSE, RESUME, DELETE, ADD_TAG, or REMOVE_TAG to a list of monitors. Returns a partial-success response indicating which monitors succeeded and which failed.","operationId":"bulkAction","parameters":[],"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","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMaintenanceWindowRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseMaintenanceWindowDto"}}}}}}},"/api/v1/invites":{"get":{"tags":["Invites"],"summary":"List invites","operationId":"list_9","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultInviteDto"}}}}}},"post":{"tags":["Invites"],"summary":"Create invite","operationId":"create_10","parameters":[],"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","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultEnvironmentDto"}}}}}},"post":{"tags":["Environments"],"summary":"Create environment","operationId":"create_12","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEnvironmentRequest"}}},"required":true},"responses":{"201":{"description":"Created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseEnvironmentDto"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"List API keys","operationId":"list_12","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultApiKeyDto"}}}}}},"post":{"tags":["API Keys"],"summary":"Create API key","operationId":"create_13","parameters":[],"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","parameters":[],"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","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultMyOrgItemDto"}}}}}}},"/platform/events/stream":{"get":{"tags":["Events"],"summary":"Subscribe to real-time platform events via SSE","operationId":"stream","parameters":[],"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","parameters":[],"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","parameters":[],"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","parameters":[],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseWebhookSigningSecretDto"}}}}}}},"/api/v1/webhooks/events":{"get":{"tags":["Webhooks"],"summary":"List all available webhook event types","description":"Returns the full catalog of supported outbound webhook event types with their surface grouping and human-readable descriptions. Use this to populate subscription checkboxes when creating or updating a webhook endpoint.","operationId":"listEvents","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookEventCatalogResponse"}}}}}}},"/api/v1/services":{"get":{"tags":["Status Data"],"summary":"List all enabled services (cursor-paginated)","operationId":"listServices","parameters":[{"name":"category","in":"query","description":"Filter by category (exact match)","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by current overall_status (exact match)","required":false,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–100, default 20)","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CursorPageServiceCatalogDto"}}}}}}},"/api/v1/services/{slugOrId}":{"get":{"tags":["Status Data"],"summary":"Get a single service by slug or UUID with current status, components, and recent incidents","operationId":"getService","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get uptime statistics for a service","description":"Uptime data aggregated across active non-group components.","operationId":"getServiceUptime","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"period","in":"query","description":"Time window","required":false,"schema":{"type":"string","enum":["24h","7d","30d","90d","1y","2y","all"]}},{"name":"granularity","in":"query","description":"Bucket granularity","required":false,"schema":{"type":"string","enum":["hourly","daily","monthly"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceUptimeResponse"}}}}},"security":[{"BearerAuth":[]}]}},"/api/v1/services/{slugOrId}/maintenances":{"get":{"tags":["Status Data"],"summary":"List scheduled maintenances for a service","operationId":"getScheduledMaintenances","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status (e.g. scheduled, in_progress, verifying, completed)","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultScheduledMaintenanceDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents":{"get":{"tags":["Status Data"],"summary":"List incident history for a service (paginated)","operationId":"listIncidents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/services/{slugOrId}/incidents/{incidentId}":{"get":{"tags":["Status Data"],"summary":"Get incident detail with full update timeline","operationId":"getIncident","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"incidentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseServiceIncidentDetailDto"}}}}}}},"/api/v1/services/{slugOrId}/components":{"get":{"tags":["Status Data"],"summary":"List active components for a service with current status and inline uptime","operationId":"getComponents","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceComponentDto"}}}}}}},"/api/v1/services/{slugOrId}/components/{componentId}/uptime":{"get":{"tags":["Status Data"],"summary":"Get daily uptime data for a component","operationId":"getComponentUptime","parameters":[{"name":"slugOrId","in":"path","required":true,"schema":{"type":"string"}},{"name":"componentId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"period","in":"query","description":"Time window","required":false,"schema":{"type":"string","enum":["7d","30d","90d","1y"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultComponentUptimeDayDto"}}}}}}},"/api/v1/services/summary":{"get":{"tags":["Status Data"],"summary":"Global status summary across all services","description":"Returns aggregate counts of services by status and a list of services currently experiencing issues.","operationId":"getGlobalStatusSummary","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SingleValueResponseGlobalStatusSummaryDto"}}}}}}},"/api/v1/services/incidents":{"get":{"tags":["Status Data"],"summary":"List vendor incidents across all services (paginated)","description":"Cross-service vendor incident feed ordered by start date descending.","operationId":"listCrossServiceIncidents","parameters":[{"name":"from","in":"query","description":"Earliest start date (ISO 8601 date)","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","description":"Filter: active (unresolved), resolved, or omit for all","required":false,"schema":{"type":"string","enum":["active","resolved"]}},{"name":"category","in":"query","description":"Filter by service category","required":false,"schema":{"type":"string"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TableValueResultServiceIncidentDto"}}}}}}},"/api/v1/service-subscriptions":{"get":{"tags":["Service Subscriptions"],"summary":"List all service subscriptions for the organization","operationId":"list_14","parameters":[],"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","parameters":[],"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_2","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","parameters":[],"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","parameters":[],"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"}}}}},"components":{"schemas":{"CreateSubscriptionRequest":{"type":"object","properties":{"priceId":{"minimum":1,"type":"integer","format":"int32"}}},"BillingPlanDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"prices":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/BillingPriceDto"}}},"nullable":true},"BillingPriceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"amount":{"type":"integer","format":"int32"},"interval":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]},"intervalCount":{"type":"integer","format":"int32"},"description":{"type":"string","nullable":true},"billingPlan":{"$ref":"#/components/schemas/BillingPlanDto"}}},"ItemDto":{"type":"object","properties":{"billingPrice":{"$ref":"#/components/schemas/BillingPriceDto"},"quantity":{"type":"integer","format":"int32"},"amount":{"type":"integer","format":"int32"}}},"SingleValueResponseSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SubscriptionDto"}}},"SubscriptionDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"paddleId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"organizationId":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ACTIVE","CANCELED","PAST_DUE","PAUSED","TRIALING"]},"nextBilledAt":{"type":"string","format":"date-time","nullable":true},"willCancelAt":{"type":"string","format":"date-time","nullable":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}}}},"UpdateOrgDetailsRequest":{"required":["email","name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"minLength":1,"type":"string","format":"email"},"size":{"maxLength":50,"minLength":0,"type":"string"},"industry":{"maxLength":100,"minLength":0,"type":"string"},"websiteUrl":{"maxLength":255,"minLength":0,"type":"string"}}},"OrganizationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"email":{"type":"string","nullable":true},"size":{"type":"string","nullable":true},"industry":{"type":"string","nullable":true},"websiteUrl":{"type":"string","nullable":true}}},"SingleValueResponseOrganizationDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/OrganizationDto"}}},"UpdateOnboardingStageRequest":{"required":["stage"],"type":"object","properties":{"stage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]}}},"SingleValueResponseUserDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UserDto"}}},"UserDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"email":{"type":"string"},"emailVerified":{"type":"boolean"},"name":{"type":"string","nullable":true},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","nullable":true,"enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateProfileRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"UpdateNotificationPreferencesRequest":{"required":["preferences"],"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}}}},"NotificationPreferencesDto":{"type":"object","properties":{"preferences":{"type":"object","additionalProperties":{"type":"boolean"}},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseNotificationPreferencesDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPreferencesDto"}}},"UpdateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"}}},"SingleValueResponseWorkspaceDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WorkspaceDto"}}},"WorkspaceDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"name":{"type":"string"},"orgId":{"type":"integer","format":"int32"}}},"UpdateUserRequest":{"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"email":{"type":"string","format":"email"},"userRole":{"type":"string","enum":["SUPERADMIN","ADMIN","USER"]},"onboardingStage":{"type":"string","enum":["WELCOME","FIRST_MONITOR","SETUP_COMPLETE","COMPLETED"]},"imageUrl":{"maxLength":500,"minLength":0,"type":"string"}}},"ChangeRoleRequest":{"required":["orgRole"],"type":"object","properties":{"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"UpdateWebhookEndpointRequest":{"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","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","format":"uuid"},"url":{"type":"string"},"description":{"type":"string","nullable":true},"subscribedEvents":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"consecutiveFailures":{"type":"integer","format":"int32"},"disabledReason":{"type":"string","nullable":true},"disabledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateTagRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"New tag name","nullable":true},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"New hex color code","nullable":true}},"description":"Request body for updating a tag; null fields are left unchanged"},"SingleValueResponseTagDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TagDto"}}},"TagDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"color":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateSecretRequest":{"required":["value"],"type":"object","properties":{"value":{"maxLength":32768,"minLength":0,"type":"string","description":"New secret value, stored encrypted (max 32KB)"}}},"MonitorReference":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"SecretDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"key":{"type":"string"},"dekVersion":{"type":"integer","format":"int32"},"valueHash":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usedByMonitors":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorReference"}}}},"SingleValueResponseSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SecretDto"}}},"RetryStrategy":{"required":["type"],"type":"object","properties":{"type":{"type":"string"},"maxRetries":{"type":"integer","format":"int32"},"interval":{"type":"integer","format":"int32"}},"description":"Default retry strategy for member monitors; null clears"},"UpdateResourceGroupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this group"},"description":{"type":"string","description":"Optional description; null clears the existing value","nullable":true},"alertPolicyId":{"type":"string","description":"Optional notification policy to apply for this group; null clears the existing value","format":"uuid","nullable":true},"defaultFrequency":{"maximum":86400,"minimum":30,"type":"integer","description":"Default check frequency in seconds for members (30–86400); null clears","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default regions for member monitors; null clears","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors; null clears","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors; null clears","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors; null clears","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE; null disables threshold","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"maximum":100,"exclusiveMaximum":false,"minimum":0,"exclusiveMinimum":false,"type":"number","description":"Health threshold value; null disables threshold","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"Suppress member-level alert notifications; null preserves current value","nullable":true},"confirmationDelaySeconds":{"maximum":600,"minimum":0,"type":"integer","description":"Confirmation delay in seconds; null clears","format":"int32","nullable":true},"recoveryCooldownMinutes":{"maximum":60,"minimum":0,"type":"integer","description":"Recovery cooldown in minutes; null clears","format":"int32","nullable":true}},"description":"Request body for updating a resource group"},"ResourceGroupDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"alertPolicyId":{"type":"string","description":"Notification policy applied to this group","format":"uuid","nullable":true},"defaultFrequency":{"type":"integer","description":"Default check frequency in seconds for member monitors","format":"int32","nullable":true},"defaultRegions":{"type":"array","description":"Default regions for member monitors","nullable":true,"items":{"type":"string","description":"Default regions for member monitors","nullable":true}},"defaultRetryStrategy":{"$ref":"#/components/schemas/RetryStrategy"},"defaultAlertChannels":{"type":"array","description":"Default alert channel IDs for member monitors","nullable":true,"items":{"type":"string","description":"Default alert channel IDs for member monitors","format":"uuid","nullable":true}},"defaultEnvironmentId":{"type":"string","description":"Default environment ID for member monitors","format":"uuid","nullable":true},"healthThresholdType":{"type":"string","description":"Health threshold type: COUNT or PERCENTAGE","nullable":true,"enum":["COUNT","PERCENTAGE"]},"healthThresholdValue":{"type":"number","description":"Health threshold value","nullable":true},"suppressMemberAlerts":{"type":"boolean","description":"When true, member-level incidents skip notification dispatch; only group alerts fire"},"confirmationDelaySeconds":{"type":"integer","description":"Seconds to wait after health threshold breach before creating group incident","format":"int32","nullable":true},"recoveryCooldownMinutes":{"type":"integer","description":"Cooldown minutes after group incident resolves before a new one can open","format":"int32","nullable":true},"health":{"$ref":"#/components/schemas/ResourceGroupHealthDto"},"members":{"type":"array","description":"Member list with individual statuses; populated on detail GET only","nullable":true,"items":{"$ref":"#/components/schemas/ResourceGroupMemberDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Resource group with health summary and optional member details"},"ResourceGroupHealthDto":{"type":"object","properties":{"status":{"type":"string","description":"Worst-of health status across all members","enum":["operational","maintenance","degraded","down"]},"totalMembers":{"type":"integer","description":"Total number of members in the group","format":"int32"},"operationalCount":{"type":"integer","description":"Number of members currently in operational status","format":"int32"},"activeIncidents":{"type":"integer","description":"Number of members with an active incident or non-operational status","format":"int32"},"thresholdStatus":{"type":"string","description":"Computed group health status based on threshold: 'healthy', 'degraded', or 'down'. Null when no health threshold is configured.","nullable":true,"enum":["healthy","degraded","down"]},"failingCount":{"type":"integer","description":"Number of failing members at time of last evaluation","format":"int32","nullable":true}},"description":"Aggregated health summary for a resource group"},"ResourceGroupMemberDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"memberType":{"type":"string","description":"Type of member: 'monitor' or 'service'"},"monitorId":{"type":"string","description":"Monitor ID; set when memberType is 'monitor'","format":"uuid","nullable":true},"serviceId":{"type":"string","description":"Service ID; set when memberType is 'service'","format":"uuid","nullable":true},"name":{"type":"string","description":"Display name of the referenced monitor or service","nullable":true},"slug":{"type":"string","description":"Slug identifier for the service (services only); used for icons and uptime API calls","nullable":true},"subscriptionId":{"type":"string","description":"Subscription ID for the service (services only); used to link to the dependency detail page","format":"uuid","nullable":true},"status":{"type":"string","description":"Computed health status for this member","enum":["operational","maintenance","degraded","down"]},"effectiveFrequency":{"type":"string","description":"Effective check frequency label showing the group default when the monitor inherits it; null for services or when no group default is configured","nullable":true},"createdAt":{"type":"string","format":"date-time"},"uptime24h":{"type":"number","description":"24h uptime percentage; populated when includeMetrics=true","format":"double","nullable":true},"chartData":{"type":"array","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","nullable":true,"items":{"type":"number","description":"Uptime tick values (0-100) for last-24h mini chart; populated when includeMetrics=true","format":"double","nullable":true}},"avgLatencyMs":{"type":"number","description":"Average latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"p95LatencyMs":{"type":"number","description":"P95 latency in ms (monitors only); populated when includeMetrics=true","format":"double","nullable":true},"lastCheckedAt":{"type":"string","description":"Timestamp of the most recent health check; populated when includeMetrics=true","format":"date-time","nullable":true},"monitorType":{"type":"string","description":"Monitor type (HTTP, DNS, TCP, ICMP, HEARTBEAT, MCP); monitors only","nullable":true},"environmentName":{"type":"string","description":"Environment name; monitors only","nullable":true}},"description":"A single member of a resource group with its computed health status"},"SingleValueResponseResourceGroupDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupDto"}}},"EscalationChain":{"required":["steps"],"type":"object","properties":{"steps":{"minItems":1,"type":"array","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"},"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":{"required":["enabled","escalation","name","priority"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules to evaluate (all must pass; omit or empty for catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is enabled"},"priority":{"type":"integer","description":"Evaluation priority; higher value = evaluated first","format":"int32"}},"description":"Request body for updating a notification policy"},"NotificationPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string","description":"Human-readable name for this policy"},"matchRules":{"type":"array","description":"Match rules (all must pass; empty = catch-all)","items":{"$ref":"#/components/schemas/MatchRule"}},"escalation":{"$ref":"#/components/schemas/EscalationChain"},"enabled":{"type":"boolean","description":"Whether this policy is active"},"priority":{"type":"integer","description":"Evaluation order; higher value = evaluated first","format":"int32"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Org-level notification policy with match rules and escalation chain"},"SingleValueResponseNotificationPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationPolicyDto"}}},"ConfirmationPolicy":{"required":["type"],"type":"object","properties":{"type":{"type":"string","enum":["multi_region"]},"minRegionsFailing":{"type":"integer","format":"int32"},"maxWaitSeconds":{"type":"integer","format":"int32"}},"description":"Multi-region confirmation settings"},"IncidentPolicyDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"triggerRules":{"type":"array","description":"Array of trigger rules defining when an incident should be raised","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorRegionCount":{"type":"integer","description":"Number of regions configured on the monitor (only set in internal API responses)","format":"int32","nullable":true},"checkFrequencySeconds":{"type":"integer","description":"Monitor check frequency in seconds (only set in internal API responses)","format":"int32","nullable":true}},"description":"Incident detection, confirmation, and recovery policy for a monitor"},"RecoveryPolicy":{"type":"object","properties":{"consecutiveSuccesses":{"type":"integer","format":"int32"},"minRegionsPassing":{"type":"integer","format":"int32"},"cooldownMinutes":{"type":"integer","format":"int32"}},"description":"Auto-recovery settings"},"TriggerRule":{"required":["scope","severity","type"],"type":"object","properties":{"type":{"type":"string","enum":["consecutive_failures","failures_in_window","response_time"]},"count":{"type":"integer","format":"int32","nullable":true},"windowMinutes":{"type":"integer","format":"int32","nullable":true},"scope":{"type":"string","nullable":true,"enum":["per_region","any_region"]},"thresholdMs":{"type":"integer","format":"int32","nullable":true},"severity":{"type":"string","enum":["down","degraded"]},"aggregationType":{"type":"string","nullable":true,"enum":["all_exceed","average","p95","max"]}},"description":"Array of trigger rules defining when an incident should be raised"},"UpdateIncidentPolicyRequest":{"required":["confirmation","recovery","triggerRules"],"type":"object","properties":{"triggerRules":{"minItems":1,"type":"array","description":"Array of trigger rules; at least one required","items":{"$ref":"#/components/schemas/TriggerRule"}},"confirmation":{"$ref":"#/components/schemas/ConfirmationPolicy"},"recovery":{"$ref":"#/components/schemas/RecoveryPolicy"}},"description":"Request body for updating an incident policy"},"SingleValueResponseIncidentPolicyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentPolicyDto"}}},"ApiKeyAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BasicAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"BearerAuthConfig":{"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"HeaderAuthConfig":{"required":["headerName"],"type":"object","allOf":[{"$ref":"#/components/schemas/MonitorAuthConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"pattern":"^[A-Za-z0-9\\-_]+$","type":"string"},"vaultSecretId":{"type":"string","format":"uuid","nullable":true}}}]},"MonitorAuthConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"UpdateMonitorAuthRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"MonitorAuthDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"authType":{"type":"string","enum":["bearer","basic","header","api_key"]},"config":{"oneOf":[{"$ref":"#/components/schemas/ApiKeyAuthConfig"},{"$ref":"#/components/schemas/BasicAuthConfig"},{"$ref":"#/components/schemas/BearerAuthConfig"},{"$ref":"#/components/schemas/HeaderAuthConfig"}]}}},"SingleValueResponseMonitorAuthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAuthDto"}}},"AssertionConfig":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"BodyContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"DnsExpectedCnameAssertion":{"required":["value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"value":{"minLength":1,"type":"string"}}}]},"DnsExpectedIpsAssertion":{"required":["ips"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"ips":{"minItems":1,"type":"array","items":{"type":"string"}}}}]},"DnsMaxAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"max":{"type":"integer","format":"int32"}}}]},"DnsMinAnswersAssertion":{"required":["recordType"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"min":{"type":"integer","format":"int32"}}}]},"DnsRecordContainsAssertion":{"required":["recordType","substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"substring":{"minLength":1,"type":"string"}}}]},"DnsRecordEqualsAssertion":{"required":["recordType","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"recordType":{"minLength":1,"type":"string"},"value":{"minLength":1,"type":"string"}}}]},"DnsResolvesAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"DnsResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"DnsResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"DnsTtlHighAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxTtl":{"type":"integer","format":"int32"}}}]},"DnsTtlLowAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minTtl":{"type":"integer","format":"int32"}}}]},"DnsTxtContainsAssertion":{"required":["substring"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"substring":{"minLength":1,"type":"string"}}}]},"HeaderValueAssertion":{"required":["expected","headerName","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"headerName":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"HeartbeatIntervalDriftAssertion":{"required":["maxDeviationPercent"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxDeviationPercent":{"maximum":100,"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatMaxIntervalAssertion":{"required":["maxSeconds"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxSeconds":{"minimum":1,"type":"integer","format":"int32"}}}]},"HeartbeatPayloadContainsAssertion":{"required":["path","value"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"value":{"type":"string"}}}]},"HeartbeatReceivedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpPacketLossAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxPercent":{"maximum":100.0,"exclusiveMaximum":false,"minimum":0.0,"exclusiveMinimum":false,"type":"number","format":"double"}}}]},"IcmpReachableAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"IcmpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"IcmpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"JsonPathAssertion":{"required":["expected","operator","path"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"path":{"minLength":1,"type":"string"},"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"McpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"McpHasCapabilityAssertion":{"required":["capability"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"capability":{"minLength":1,"type":"string"}}}]},"McpMinToolsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"min":{"type":"integer","format":"int32"}}}]},"McpProtocolVersionAssertion":{"required":["version"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"version":{"minLength":1,"type":"string"}}}]},"McpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"McpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"McpToolAvailableAssertion":{"required":["toolName"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"toolName":{"minLength":1,"type":"string"}}}]},"McpToolCountChangedAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expectedCount":{"type":"integer","format":"int32"}}}]},"RedirectCountAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxCount":{"type":"integer","format":"int32"}}}]},"RedirectTargetAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"RegexBodyAssertion":{"required":["pattern"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"pattern":{"minLength":1,"type":"string"}}}]},"ResponseSizeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxBytes":{"type":"integer","format":"int32"}}}]},"ResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"thresholdMs":{"type":"integer","format":"int32"}}}]},"ResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"SslExpiryAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"minDaysRemaining":{"type":"integer","format":"int32"}}}]},"StatusCodeAssertion":{"required":["expected","operator"],"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"expected":{"minLength":1,"type":"string"},"operator":{"type":"string","enum":["equals","contains","less_than","greater_than","matches","range"]}}}]},"TcpConnectsAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"}]},"TcpResponseTimeAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"maxMs":{"type":"integer","format":"int32"}}}]},"TcpResponseTimeWarnAssertion":{"type":"object","allOf":[{"$ref":"#/components/schemas/AssertionConfig"},{"type":"object","properties":{"warnMs":{"type":"integer","format":"int32"}}}]},"UpdateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"MonitorAssertionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"assertionType":{"type":"string","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}}},"SingleValueResponseMonitorAssertionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorAssertionDto"}}},"SetAlertChannelsRequest":{"required":["channelIds"],"type":"object","properties":{"channelIds":{"type":"array","items":{"type":"string","format":"uuid"}}}},"SingleValueResponseListUUID":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string","format":"uuid"}}}},"AddMonitorTagsRequest":{"type":"object","properties":{"tagIds":{"type":"array","description":"IDs of existing org tags to attach","nullable":true,"items":{"type":"string","description":"IDs of existing org tags to attach","format":"uuid","nullable":true}},"newTags":{"type":"array","description":"New tags to create (if not already present) and attach","nullable":true,"items":{"$ref":"#/components/schemas/NewTagRequest"}}},"description":"Request body for adding tags to a monitor. Provide existing tag IDs, inline new tags, or both."},"CreateAssertionRequest":{"required":["config"],"type":"object","properties":{"config":{"oneOf":[{"$ref":"#/components/schemas/BodyContainsAssertion"},{"$ref":"#/components/schemas/DnsExpectedCnameAssertion"},{"$ref":"#/components/schemas/DnsExpectedIpsAssertion"},{"$ref":"#/components/schemas/DnsMaxAnswersAssertion"},{"$ref":"#/components/schemas/DnsMinAnswersAssertion"},{"$ref":"#/components/schemas/DnsRecordContainsAssertion"},{"$ref":"#/components/schemas/DnsRecordEqualsAssertion"},{"$ref":"#/components/schemas/DnsResolvesAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeAssertion"},{"$ref":"#/components/schemas/DnsResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/DnsTtlHighAssertion"},{"$ref":"#/components/schemas/DnsTtlLowAssertion"},{"$ref":"#/components/schemas/DnsTxtContainsAssertion"},{"$ref":"#/components/schemas/HeaderValueAssertion"},{"$ref":"#/components/schemas/HeartbeatIntervalDriftAssertion"},{"$ref":"#/components/schemas/HeartbeatMaxIntervalAssertion"},{"$ref":"#/components/schemas/HeartbeatPayloadContainsAssertion"},{"$ref":"#/components/schemas/HeartbeatReceivedAssertion"},{"$ref":"#/components/schemas/IcmpPacketLossAssertion"},{"$ref":"#/components/schemas/IcmpReachableAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeAssertion"},{"$ref":"#/components/schemas/IcmpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/JsonPathAssertion"},{"$ref":"#/components/schemas/McpConnectsAssertion"},{"$ref":"#/components/schemas/McpHasCapabilityAssertion"},{"$ref":"#/components/schemas/McpMinToolsAssertion"},{"$ref":"#/components/schemas/McpProtocolVersionAssertion"},{"$ref":"#/components/schemas/McpResponseTimeAssertion"},{"$ref":"#/components/schemas/McpResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/McpToolAvailableAssertion"},{"$ref":"#/components/schemas/McpToolCountChangedAssertion"},{"$ref":"#/components/schemas/RedirectCountAssertion"},{"$ref":"#/components/schemas/RedirectTargetAssertion"},{"$ref":"#/components/schemas/RegexBodyAssertion"},{"$ref":"#/components/schemas/ResponseSizeAssertion"},{"$ref":"#/components/schemas/ResponseTimeAssertion"},{"$ref":"#/components/schemas/ResponseTimeWarnAssertion"},{"$ref":"#/components/schemas/SslExpiryAssertion"},{"$ref":"#/components/schemas/StatusCodeAssertion"},{"$ref":"#/components/schemas/TcpConnectsAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeAssertion"},{"$ref":"#/components/schemas/TcpResponseTimeWarnAssertion"}]},"severity":{"type":"string","enum":["fail","warn"]}},"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","format":"uuid"},"organizationId":{"type":"integer","format":"int32"},"name":{"type":"string"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"regions":{"type":"array","items":{"type":"string"}},"managedBy":{"type":"string","enum":["DASHBOARD","CLI"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assertions":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/MonitorAssertionDto"}},"tags":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/TagDto"}},"pingUrl":{"type":"string","nullable":true},"environment":{"$ref":"#/components/schemas/Summary"},"auth":{"$ref":"#/components/schemas/MonitorAuthDto"},"incidentPolicy":{"$ref":"#/components/schemas/IncidentPolicyDto"},"alertChannelIds":{"type":"array","nullable":true,"items":{"type":"string","format":"uuid","nullable":true}}}},"SingleValueResponseMonitorDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorDto"}}},"Summary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"}}},"ChangeStatusRequest":{"required":["status"],"type":"object","properties":{"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"UpdateMaintenanceWindowRequest":{"required":["endsAt","startsAt"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"MaintenanceWindowDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"type":"string","nullable":true},"reason":{"type":"string","nullable":true},"suppressAlerts":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMaintenanceWindowDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MaintenanceWindowDto"}}},"UpdateEnvironmentRequest":{"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","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","format":"uuid"},"orgId":{"type":"integer","format":"int32"},"name":{"type":"string"},"slug":{"type":"string"},"variables":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorCount":{"type":"integer","format":"int32"},"isDefault":{"type":"boolean"}}},"SingleValueResponseEnvironmentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EnvironmentDto"}}},"ChannelConfig":{"required":["channelType"],"type":"object","properties":{"channelType":{"type":"string"}},"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","format":"uuid"},"name":{"type":"string"},"channelType":{"type":"string","enum":["email","webhook","slack","pagerduty","opsgenie","teams","discord"]},"displayConfig":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastDeliveryAt":{"type":"string","format":"date-time","nullable":true},"lastDeliveryStatus":{"type":"string","nullable":true}}},"SingleValueResponseAlertChannelDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertChannelDto"}}},"WorkspaceCreateParams":{"required":["name"],"type":"object","properties":{"organizationId":{"type":"integer","format":"int32"},"name":{"minLength":1,"type":"string"}}},"ServiceIncidentRequest":{"required":["action","externalRef","serviceId","title"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"externalRef":{"minLength":1,"type":"string"},"severity":{"type":"string","nullable":true},"title":{"minLength":1,"type":"string"},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"action":{"minLength":1,"type":"string"},"statusText":{"type":"string","nullable":true}}},"IncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid","nullable":true},"organizationId":{"type":"integer","format":"int32"},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"title":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","items":{"type":"string"}},"reopenCount":{"type":"integer","format":"int32"},"createdByUserId":{"type":"integer","format":"int32","nullable":true},"statusPageVisible":{"type":"boolean"},"serviceIncidentId":{"type":"string","format":"uuid","nullable":true},"serviceId":{"type":"string","format":"uuid","nullable":true},"externalRef":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"shortlink":{"type":"string","nullable":true},"resolutionReason":{"type":"string","nullable":true,"enum":["MANUAL","AUTO_RECOVERED","AUTO_RESOLVED"]},"startedAt":{"type":"string","format":"date-time","nullable":true},"confirmedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"cooldownUntil":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"monitorName":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"serviceSlug":{"type":"string","nullable":true},"monitorType":{"type":"string","nullable":true},"resourceGroupId":{"type":"string","format":"uuid","nullable":true},"resourceGroupName":{"type":"string","nullable":true}}},"TableValueResultIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseInteger":{"type":"object","properties":{"data":{"type":"integer","format":"int32"}}},"CreateAutoIncidentRequest":{"required":["monitorId"],"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"severity":{"type":"string","nullable":true},"triggeredByRule":{"type":"string","nullable":true},"affectedRegions":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"startedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseIncidentDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/IncidentDto"}}},"ReopenAutoIncidentRequest":{"type":"object","properties":{"affectedRegions":{"type":"array","items":{"type":"string"}},"severity":{"type":"string","nullable":true}}},"AdapterHealthReportRequest":{"required":["serviceId","success"],"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"success":{"type":"boolean"},"errorMessage":{"type":"string","nullable":true}}},"AdapterHealthDto":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string"},"serviceName":{"type":"string"},"adapterType":{"type":"string","nullable":true},"lastSuccessAt":{"type":"string","format":"date-time","nullable":true},"lastFailureAt":{"type":"string","format":"date-time","nullable":true},"consecutiveFailures":{"type":"integer","format":"int32"},"lastErrorMessage":{"type":"string","nullable":true},"disabledByHealth":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseAdapterHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdapterHealthDto"}}},"CreateOrgRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"},"email":{"type":"string","format":"email","nullable":true}}},"SingleValueResponseTransactionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionDto"}}},"TransactionDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","nullable":true},"currencyCode":{"type":"string","nullable":true},"invoiceNumber":{"type":"string","nullable":true},"billedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"total":{"type":"string","nullable":true},"subtotal":{"type":"string","nullable":true},"tax":{"type":"string","nullable":true}}},"QuickMonitorRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"},"name":{"type":"string","nullable":true},"frequencySeconds":{"type":"integer","format":"int32","nullable":true}}},"OnboardingSetupRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":200,"minLength":0,"type":"string"},"role":{"maxLength":50,"minLength":0,"type":"string","nullable":true},"teamSize":{"maxLength":50,"minLength":0,"type":"string","nullable":true}}},"AnalyzeUrlRequest":{"required":["url"],"type":"object","properties":{"url":{"minLength":1,"type":"string"}}},"AnalyzeUrlResponse":{"type":"object","properties":{"reachable":{"type":"boolean"},"responseTimeMs":{"type":"integer","format":"int64"},"statusCode":{"type":"integer","format":"int32"},"tlsExpiry":{"type":"string","format":"date-time","nullable":true},"tlsDaysRemaining":{"type":"integer","format":"int32","nullable":true},"contentType":{"type":"string","nullable":true},"suggestedName":{"type":"string"},"suggestedAssertions":{"type":"array","items":{"$ref":"#/components/schemas/SuggestedAssertion"}},"suggestedFrequencySeconds":{"type":"integer","format":"int32"}}},"SingleValueResponseAnalyzeUrlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnalyzeUrlResponse"}}},"SuggestedAssertion":{"type":"object","properties":{"type":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}}},"AcceptInviteRequest":{"required":["token"],"type":"object","properties":{"token":{"minLength":1,"type":"string"}}},"AcceptInviteDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"SingleValueResponseAcceptInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AcceptInviteDto"}}},"RegisterUserRequest":{"type":"object","properties":{"nickname":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"picture":{"type":"string","nullable":true}}},"CreateWorkspaceRequest":{"required":["name"],"type":"object","properties":{"name":{"minLength":1,"type":"string"}}},"AddMemberRequest":{"required":["orgRole","userId"],"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"MemberDto":{"type":"object","properties":{"userId":{"type":"integer","format":"int32"},"email":{"type":"string"},"name":{"type":"string","nullable":true},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseMemberDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MemberDto"}}},"CreateWebhookEndpointRequest":{"required":["subscribedEvents","url"],"type":"object","properties":{"url":{"maxLength":2048,"minLength":0,"type":"string","description":"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","nullable":true}}},"SingleValueResponseWebhookTestResult":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookTestResult"}}},"WebhookTestResult":{"type":"object","properties":{"success":{"type":"boolean"},"statusCode":{"type":"integer","format":"int32","nullable":true},"message":{"type":"string"},"durationMs":{"type":"integer","format":"int64","nullable":true}}},"SingleValueResponseString":{"type":"object","properties":{"data":{"type":"string"}}},"DekRotationResultDto":{"type":"object","properties":{"previousDekVersion":{"type":"integer","format":"int32"},"newDekVersion":{"type":"integer","format":"int32"},"secretsReEncrypted":{"type":"integer","format":"int32"},"channelsReEncrypted":{"type":"integer","format":"int32"},"rotatedAt":{"type":"string","format":"date-time"}}},"SingleValueResponseDekRotationResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DekRotationResultDto"}}},"CreateTagRequest":{"required":["name"],"type":"object","properties":{"name":{"maxLength":100,"minLength":0,"type":"string","description":"Tag name, unique within the org"},"color":{"pattern":"^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$","type":"string","description":"Hex color code (defaults to #6B7280 if omitted)","nullable":true}},"description":"Request body for creating a tag"},"ServiceSubscribeRequest":{"type":"object","properties":{"componentId":{"type":"string","description":"ID of the component to subscribe to. Omit or null for whole-service subscription.","format":"uuid","nullable":true},"alertSensitivity":{"type":"string","description":"Alert sensitivity level. Defaults to INCIDENTS_ONLY when not provided.","nullable":true}},"description":"Optional body for subscribing to a specific component of a service"},"ComponentUptimeSummaryDto":{"type":"object","properties":{"day":{"type":"number","description":"Uptime percentage over the last 24 hours","format":"double","nullable":true,"example":99.95},"week":{"type":"number","description":"Uptime percentage over the last 7 days","format":"double","nullable":true,"example":99.98},"month":{"type":"number","description":"Uptime percentage over the last 30 days","format":"double","nullable":true,"example":99.92},"source":{"type":"string","description":"Data source: vendor_reported or incident_derived","example":"vendor_reported"}},"description":"Inline uptime percentages for 24h, 7d, 30d"},"ServiceComponentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"description":{"type":"string","nullable":true},"groupId":{"type":"string","format":"uuid","nullable":true},"position":{"type":"integer","format":"int32","nullable":true},"showcase":{"type":"boolean"},"onlyShowIfDegraded":{"type":"boolean"},"startDate":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true},"lifecycleStatus":{"type":"string"},"dataType":{"type":"string","description":"Data classification: full, status_only, or metric_only","example":"full"},"hasUptime":{"type":"boolean","description":"Whether uptime data is available for this component"},"region":{"type":"string","description":"Geographic region for regional components (AWS, GCP, Azure)","nullable":true},"groupName":{"type":"string","description":"Display name of the parent group","nullable":true},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"statusChangedAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"group":{"type":"boolean"}},"description":"A first-class service component with lifecycle and uptime data"},"ServiceSubscriptionDto":{"type":"object","properties":{"subscriptionId":{"type":"string","description":"Unique subscription identifier","format":"uuid"},"serviceId":{"type":"string","description":"Service identifier","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"logoUrl":{"type":"string","description":"Logo URL from the service catalog","nullable":true},"overallStatus":{"type":"string","description":"Current overall status; null when the service has never been polled","nullable":true},"componentId":{"type":"string","description":"Subscribed component id; null for whole-service subscription","format":"uuid","nullable":true},"component":{"$ref":"#/components/schemas/ServiceComponentDto"},"alertSensitivity":{"type":"string","description":"Alert sensitivity: ALL (synthetic + real incidents), INCIDENTS_ONLY (real vendor incidents, default), MAJOR_ONLY (real + DOWN severity)","enum":["ALL","INCIDENTS_ONLY","MAJOR_ONLY"]},"subscribedAt":{"type":"string","description":"When the organization subscribed to this service","format":"date-time"}},"description":"An org-level service subscription with current status information"},"SingleValueResponseServiceSubscriptionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}}},"CreateSecretRequest":{"required":["key","value"],"type":"object","properties":{"key":{"maxLength":255,"minLength":0,"type":"string","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","format":"uuid"},"incidentId":{"type":"string","format":"uuid"},"policyId":{"type":"string","format":"uuid"},"policyName":{"type":"string","description":"Human-readable name of the matched policy (null if policy has been deleted)","nullable":true},"status":{"type":"string","description":"Current dispatch state","enum":["PENDING","DISPATCHING","DELIVERED","ESCALATING","ACKNOWLEDGED","COMPLETED"]},"completionReason":{"type":"string","description":"Why the dispatch reached COMPLETED: EXHAUSTED (all steps ran, no ack), RESOLVED (incident resolved), NO_STEPS (policy had no steps). Null for non-terminal states.","nullable":true,"enum":["EXHAUSTED","RESOLVED","NO_STEPS"]},"currentStep":{"type":"integer","description":"1-based index of the currently active escalation step","format":"int32"},"totalSteps":{"type":"integer","description":"Total number of escalation steps in the policy (null if policy has been deleted)","format":"int32","nullable":true},"acknowledgedAt":{"type":"string","description":"Timestamp when this dispatch was acknowledged (null if not acknowledged)","format":"date-time","nullable":true},"nextEscalationAt":{"type":"string","description":"Timestamp when the next escalation step will fire (null if not scheduled)","format":"date-time","nullable":true},"lastNotifiedAt":{"type":"string","description":"Timestamp of the most recent notification delivery","format":"date-time","nullable":true},"deliveries":{"type":"array","description":"Delivery records for all channels associated with this dispatch","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"description":"Dispatch state for a single (incident, notification policy) pair, with delivery history"},"SingleValueResponseNotificationDispatchDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationDispatchDto"}}},"CreateMonitorRequest":{"required":["config","managedBy","name","type"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","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","enum":["status_code","response_time","body_contains","json_path","header","regex","dns_resolves","dns_response_time","dns_expected_ips","dns_expected_cname","dns_record_contains","dns_record_equals","dns_txt_contains","dns_min_answers","dns_max_answers","dns_response_time_warn","dns_ttl_low","dns_ttl_high","mcp_connects","mcp_response_time","mcp_has_capability","mcp_tool_available","mcp_min_tools","mcp_protocol_version","mcp_response_time_warn","mcp_tool_count_changed","ssl_expiry","response_size","redirect_count","redirect_target","response_time_warn","tcp_connects","tcp_response_time","tcp_response_time_warn","icmp_reachable","icmp_response_time","icmp_response_time_warn","icmp_packet_loss","heartbeat_received","heartbeat_max_interval","heartbeat_interval_drift","heartbeat_payload_contains"]},"passed":{"type":"boolean"},"severity":{"type":"string","enum":["fail","warn"]},"message":{"type":"string"},"expected":{"type":"string","nullable":true},"actual":{"type":"string","nullable":true}}},"MonitorTestResultDto":{"type":"object","properties":{"passed":{"type":"boolean"},"error":{"type":"string","nullable":true},"statusCode":{"type":"integer","format":"int32","nullable":true},"responseTimeMs":{"type":"integer","format":"int64","nullable":true},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"nullable":true},"bodyPreview":{"type":"string","nullable":true},"responseSizeBytes":{"type":"integer","format":"int64","nullable":true},"redirectCount":{"type":"integer","format":"int32","nullable":true},"finalUrl":{"type":"string","nullable":true},"assertionResults":{"type":"array","items":{"$ref":"#/components/schemas/AssertionTestResultDto"}},"warnings":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}}}},"SingleValueResponseMonitorTestResultDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorTestResultDto"}}},"TableValueResultTagDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TagDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorTestRequest":{"required":["config","type"],"type":"object","properties":{"type":{"type":"string","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","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"repeatRule":{"maxLength":100,"minLength":0,"type":"string"},"reason":{"type":"string"},"suppressAlerts":{"type":"boolean"}}},"CreateInviteRequest":{"required":["email","roleOffered"],"type":"object","properties":{"email":{"minLength":1,"type":"string","format":"email"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]}}},"InviteDto":{"type":"object","properties":{"inviteId":{"type":"integer","format":"int32"},"email":{"type":"string"},"roleOffered":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"expiresAt":{"type":"string","format":"date-time"},"consumedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseInviteDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/InviteDto"}}},"CreateManualIncidentRequest":{"required":["severity","title"],"type":"object","properties":{"title":{"minLength":1,"type":"string","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"},"newStatus":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"notifySubscribers":{"type":"boolean"}}},"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"}}},"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","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyCreateResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}},"ApiKeyDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"name":{"type":"string"},"key":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true},"revokedAt":{"type":"string","format":"date-time","nullable":true},"expiresAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseApiKeyDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyDto"}}},"SingleValueResponseAlertDeliveryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AlertDeliveryDto"}}},"CreateAlertChannelRequest":{"required":["config","name"],"type":"object","properties":{"name":{"maxLength":255,"minLength":0,"type":"string","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"}]}}},"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"}}}},"SingleValueResponseListMonitorAssertionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorAssertionDto"}}}},"SchedulableMonitorDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["HTTP","DNS","MCP_SERVER","TCP","ICMP","HEARTBEAT"]},"config":{"oneOf":[{"$ref":"#/components/schemas/DnsMonitorConfig"},{"$ref":"#/components/schemas/HeartbeatMonitorConfig"},{"$ref":"#/components/schemas/HttpMonitorConfig"},{"$ref":"#/components/schemas/IcmpMonitorConfig"},{"$ref":"#/components/schemas/McpServerMonitorConfig"},{"$ref":"#/components/schemas/TcpMonitorConfig"}]},"frequencySeconds":{"type":"integer","format":"int32"},"regions":{"type":"array","items":{"type":"string"}},"organizationId":{"type":"integer","format":"int32"}}},"TableValueResultAdapterHealthDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AdapterHealthDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseListBillingPlanDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BillingPlanDto"}}}},"TableValueResultTransactionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransactionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseUpcomingChargeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UpcomingChargeResponse"}}},"UpcomingChargeResponse":{"type":"object","properties":{"action":{"type":"string","enum":["UPGRADE","DOWNGRADE","NOOP"]},"immediateAmount":{"type":"integer","format":"int32"},"nextBillingAmount":{"type":"integer","format":"int32"},"nextBillingDate":{"type":"string","format":"date-time","nullable":true}}},"EntitlementDto":{"type":"object","properties":{"key":{"type":"string","description":"Entitlement key"},"value":{"type":"integer","description":"Effective limit value (overrides applied)","format":"int64"},"defaultValue":{"type":"integer","description":"Plan-tier default value before overrides","format":"int64"},"overridden":{"type":"boolean","description":"Whether this entitlement has an org-level override"}},"description":"A single resolved entitlement for the organization"},"EntitlementResponse":{"type":"object","properties":{"tier":{"type":"string","description":"Resolved billing plan tier","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"entitlements":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/EntitlementDto"},"description":"All entitlements keyed by entitlement key"},"usage":{"type":"object","additionalProperties":{"type":"integer","description":"Current usage counters keyed by entitlement key (only for countable resources)","format":"int64"},"description":"Current usage counters keyed by entitlement key (only for countable resources)"},"trialActive":{"type":"boolean","description":"Whether the org is currently on a trial"},"trialExpiresAt":{"type":"string","description":"Trial expiry date (null if not trialing)","format":"date-time","nullable":true},"subscriptionStatus":{"type":"string","description":"Current subscription status (null if no subscription)","nullable":true}},"description":"Full entitlement state for an organization: resolved limits, usage, and trial info"},"SingleValueResponseEntitlementResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/EntitlementResponse"}}},"PaginationParams":{"required":["sortBy","sortOrder"],"type":"object","properties":{"sortBy":{"type":"string"},"sortOrder":{"type":"string","enum":["ASC","DESC"]},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"IdValuePair":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"value":{"type":"string"}}},"TableValueResultIdValuePair":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IdValuePair"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MyOrgItemDto":{"type":"object","properties":{"orgId":{"type":"integer","format":"int32"},"orgName":{"type":"string"},"orgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER"]},"status":{"type":"string","enum":["INVITED","ACTIVE","SUSPENDED","LEFT","REMOVED","DECLINED"]}}},"TableValueResultMyOrgItemDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MyOrgItemDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64","nullable":true}}},"Pageable":{"type":"object","properties":{"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"minimum":1,"type":"integer","format":"int32"},"sort":{"type":"array","items":{"type":"string"}}}},"TableValueResultUserDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"AdminStatsDto":{"type":"object","properties":{"userCount":{"type":"integer","format":"int64"},"orgCount":{"type":"integer","format":"int64"},"memberCount":{"type":"integer","format":"int64"}}},"SingleValueResponseAdminStatsDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AdminStatsDto"}}},"TableValueResultOrganizationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMemberDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookEndpointDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpointDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultWebhookDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"WebhookDeliveryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"endpointId":{"type":"string","format":"uuid"},"eventId":{"type":"string"},"eventType":{"type":"string"},"status":{"type":"string"},"attemptCount":{"type":"integer","format":"int32"},"maxAttempts":{"type":"integer","format":"int32"},"responseStatus":{"type":"integer","format":"int32","nullable":true},"responseLatencyMs":{"type":"integer","format":"int32","nullable":true},"errorMessage":{"type":"string","nullable":true},"deliveredAt":{"type":"string","format":"date-time","nullable":true},"failedAt":{"type":"string","format":"date-time","nullable":true},"nextRetryAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"SingleValueResponseWebhookSigningSecretDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSigningSecretDto"}}},"WebhookSigningSecretDto":{"type":"object","properties":{"configured":{"type":"boolean"},"maskedSecret":{"type":"string","nullable":true}}},"WebhookEventCatalogEntry":{"type":"object","properties":{"type":{"type":"string","description":"Dot-notation event type identifier, e.g. \"monitor.created\""},"surface":{"type":"string","description":"Product surface this event belongs to, e.g. \"monitoring\" or \"status_data\""},"description":{"type":"string","description":"Human-readable description of when this event fires"}}},"WebhookEventCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventCatalogEntry"}}}},"CursorPageServiceCatalogDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"ServiceCatalogDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"overallStatus":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"componentCount":{"type":"integer","format":"int64"},"activeIncidentCount":{"type":"integer","format":"int64"},"dataCompleteness":{"type":"string"}},"description":"Items on this page"},"MaintenanceComponentRef":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string"}}},"MaintenanceUpdateDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}},"description":"A status update within a scheduled maintenance lifecycle"},"ScheduledMaintenanceDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"shortlink":{"type":"string","nullable":true},"scheduledFor":{"type":"string","format":"date-time","nullable":true},"scheduledUntil":{"type":"string","format":"date-time","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"affectedComponents":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceComponentRef"}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceUpdateDto"}}},"description":"A scheduled maintenance window from a vendor status page"},"ServiceDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","nullable":true},"officialStatusUrl":{"type":"string","nullable":true},"developerContext":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"adapterType":{"type":"string"},"pollingIntervalSeconds":{"type":"integer","format":"int32"},"enabled":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"currentStatus":{"$ref":"#/components/schemas/ServiceStatusDto"},"recentIncidents":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"components":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"uptime":{"$ref":"#/components/schemas/ComponentUptimeSummaryDto"},"activeMaintenances":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"dataCompleteness":{"type":"string"}}},"ServiceIncidentDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"serviceSlug":{"type":"string","nullable":true},"serviceName":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"vendorCreatedAt":{"type":"string","format":"date-time","nullable":true}}},"ServiceStatusDto":{"type":"object","properties":{"overallStatus":{"type":"string"},"lastPolledAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceDetailDto"}}},"ServiceUptimeResponse":{"type":"object","properties":{"overallUptimePct":{"type":"number","description":"Overall uptime percentage across the entire period; null when no polling data exists","format":"double","nullable":true,"example":99.95},"period":{"type":"string","description":"Requested period","example":"7d"},"granularity":{"type":"string","description":"Requested granularity","example":"hourly"},"buckets":{"type":"array","description":"Per-bucket breakdown ordered by time ascending","items":{"$ref":"#/components/schemas/UptimeBucketDto"}},"source":{"type":"string","description":"Data source: vendor_reported, incident_derived, or poll_derived","nullable":true,"example":"vendor_reported"}},"description":"Uptime response with per-bucket breakdown and overall percentage for the period"},"SingleValueResponseServiceUptimeResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceUptimeResponse"}}},"UptimeBucketDto":{"type":"object","properties":{"timestamp":{"type":"string","description":"Start of the bucket interval (ISO 8601)","format":"date-time","example":"2024-01-01T00:00:00Z"},"uptimePct":{"type":"number","description":"Uptime percentage for this bucket; null when no polls occurred","format":"double","nullable":true,"example":100.0},"totalPolls":{"type":"integer","description":"Total number of polls recorded in this bucket","format":"int64","example":12}},"description":"Uptime statistics for a single time bucket"},"TableValueResultScheduledMaintenanceDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ScheduledMaintenanceDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultServiceIncidentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ServiceIncidentDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"status":{"type":"string"},"impact":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"detectedAt":{"type":"string","format":"date-time","nullable":true},"shortlink":{"type":"string","nullable":true},"affectedComponents":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"updates":{"type":"array","items":{"$ref":"#/components/schemas/ServiceIncidentUpdateDto"}}}},"ServiceIncidentUpdateDto":{"type":"object","properties":{"status":{"type":"string"},"body":{"type":"string","nullable":true},"displayAt":{"type":"string","format":"date-time","nullable":true}}},"SingleValueResponseServiceIncidentDetailDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ServiceIncidentDetailDto"}}},"TableValueResultServiceComponentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceComponentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"ComponentUptimeDayDto":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"partialOutageSeconds":{"type":"integer","format":"int32"},"majorOutageSeconds":{"type":"integer","format":"int32"},"uptimePercentage":{"type":"number","format":"double"},"eventsJson":{"type":"string","description":"Incident event references for this day as raw JSON","nullable":true},"source":{"type":"string"}},"description":"Daily uptime data for a component"},"TableValueResultComponentUptimeDayDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ComponentUptimeDayDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"GlobalStatusSummaryDto":{"type":"object","properties":{"totalServices":{"type":"integer","format":"int32"},"operationalCount":{"type":"integer","format":"int32"},"degradedCount":{"type":"integer","format":"int32"},"partialOutageCount":{"type":"integer","format":"int32"},"majorOutageCount":{"type":"integer","format":"int32"},"maintenanceCount":{"type":"integer","format":"int32"},"activeIncidentCount":{"type":"integer","format":"int64"},"servicesWithIssues":{"type":"array","items":{"$ref":"#/components/schemas/ServiceCatalogDto"}}}},"SingleValueResponseGlobalStatusSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/GlobalStatusSummaryDto"}}},"TableValueResultServiceSubscriptionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceSubscriptionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultSecretDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SecretDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultResourceGroupDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ResourceGroupDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseResourceGroupHealthDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResourceGroupHealthDto"}}},"NotificationDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"type":{"type":"string"},"title":{"type":"string"},"body":{"type":"string","nullable":true},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultNotificationDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseLong":{"type":"object","properties":{"data":{"type":"integer","format":"int64"}}},"TableValueResultNotificationPolicyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationPolicyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultNotificationDispatchDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationDispatchDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultMonitorDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"MonitorVersionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"monitorId":{"type":"string","format":"uuid"},"version":{"type":"integer","format":"int32"},"snapshot":{"$ref":"#/components/schemas/MonitorDto"},"changedById":{"type":"integer","format":"int32","nullable":true},"changedVia":{"type":"string","enum":["API","DASHBOARD","CLI","TERRAFORM"]},"changeSummary":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"TableValueResultMonitorVersionDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MonitorVersionDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"SingleValueResponseMonitorVersionDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/MonitorVersionDto"}}},"UptimeDto":{"type":"object","properties":{"uptimePercentage":{"type":"number","description":"Uptime percentage over the requested window; null when no data","format":"double","nullable":true,"example":99.95},"totalChecks":{"type":"integer","description":"Total number of checks executed","format":"int64","example":1440},"passedChecks":{"type":"integer","description":"Number of checks that passed","format":"int64","example":1439},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds; null when no data","format":"double","nullable":true,"example":142.5},"p95LatencyMs":{"type":"number","description":"95th-percentile latency in milliseconds (upper bound across regions); null when no data","format":"double","nullable":true,"example":312.0}},"description":"Uptime statistics aggregated from continuous aggregates"},"SingleValueResponseUptimeDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UptimeDto"}}},"CursorPage":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"type":"object","description":"Items on this page"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"AssertionResultDto":{"type":"object","properties":{"type":{"type":"string","description":"Assertion type","example":"status_code"},"passed":{"type":"boolean","description":"Whether the assertion passed"},"severity":{"type":"string","description":"Assertion severity","enum":["fail","warn"]},"message":{"type":"string","description":"Human-readable result message","nullable":true},"expected":{"type":"string","description":"Expected value","nullable":true,"example":"200"},"actual":{"type":"string","description":"Actual value observed","nullable":true,"example":"503"}},"description":"Result of evaluating a single assertion against a check result"},"CheckResultDetailsDto":{"type":"object","properties":{"statusCode":{"type":"integer","description":"HTTP status code of the response","format":"int32","nullable":true,"example":200},"responseHeaders":{"type":"object","additionalProperties":{"type":"array","description":"HTTP response headers","nullable":true,"items":{"type":"string","description":"HTTP response headers","nullable":true}},"description":"HTTP response headers","nullable":true},"responseBodySnapshot":{"type":"string","description":"Raw response body snapshot (may be HTML, XML, JSON, or plain text)","nullable":true},"assertionResults":{"type":"array","description":"Individual assertion evaluation results","nullable":true,"items":{"$ref":"#/components/schemas/AssertionResultDto"}},"tlsInfo":{"$ref":"#/components/schemas/TlsInfoDto"},"redirectCount":{"type":"integer","description":"Number of HTTP redirects followed","format":"int32","nullable":true,"example":2},"redirectTarget":{"type":"string","description":"Final URL after redirects","nullable":true},"responseSizeBytes":{"type":"integer","description":"Response body size in bytes","format":"int32","nullable":true,"example":4096},"checkDetails":{"oneOf":[{"$ref":"#/components/schemas/Dns"},{"$ref":"#/components/schemas/Http"},{"$ref":"#/components/schemas/Icmp"},{"$ref":"#/components/schemas/McpServer"},{"$ref":"#/components/schemas/Tcp"}]}},"description":"Type-specific details captured during a check execution"},"CheckResultDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the check result","format":"uuid"},"timestamp":{"type":"string","description":"Timestamp when the check was executed (ISO 8601)","format":"date-time"},"region":{"type":"string","description":"Region where the check was executed","example":"us-east"},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds","format":"int32","nullable":true,"example":123},"passed":{"type":"boolean","description":"Whether the check passed","example":true},"failureReason":{"type":"string","description":"Reason for failure when passed=false","nullable":true},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true},"details":{"$ref":"#/components/schemas/CheckResultDetailsDto"}},"description":"A single check result from a monitor run"},"CheckTypeDetailsDto":{"required":["check_type"],"type":"object","properties":{"check_type":{"type":"string"}},"description":"Check-type-specific details — polymorphic by check_type discriminator","discriminator":{"propertyName":"check_type"}},"CursorPageCheckResultDto":{"type":"object","properties":{"data":{"type":"array","description":"Items on this page","items":{"$ref":"#/components/schemas/CheckResultDto"}},"nextCursor":{"type":"string","description":"Opaque cursor for the next page; null when there are no more results","nullable":true},"hasMore":{"type":"boolean","description":"Whether more results exist beyond this page"}},"description":"Cursor-paginated response for time-series and append-only data"},"Dns":{"type":"object","description":"DNS check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"hostname":{"type":"string","description":"Target hostname","nullable":true},"requestedTypes":{"type":"array","description":"Requested DNS record types","nullable":true,"items":{"type":"string","description":"Requested DNS record types","nullable":true}},"usedResolver":{"type":"string","description":"Resolver used for lookup","nullable":true},"records":{"type":"object","additionalProperties":{"type":"array","description":"Resolved DNS records keyed by record type","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"Resolved DNS records keyed by record type","nullable":true},"description":"Resolved DNS records keyed by record type","nullable":true}},"description":"Resolved DNS records keyed by record type","nullable":true},"attempts":{"type":"array","description":"DNS resolution attempts","nullable":true,"items":{"type":"object","additionalProperties":{"type":"object","description":"DNS resolution attempts","nullable":true},"description":"DNS resolution attempts","nullable":true}},"failureKind":{"type":"string","description":"Kind of DNS failure, if any","nullable":true}}}]},"Http":{"type":"object","description":"HTTP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"timing":{"type":"object","additionalProperties":{"type":"object","description":"Request phase timing breakdown","nullable":true},"description":"Request phase timing breakdown","nullable":true},"bodyTruncated":{"type":"boolean","description":"Whether the response body was truncated before storage","nullable":true}}}]},"Icmp":{"type":"object","description":"ICMP (ping) check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"1.1.1.1"},"packetsSent":{"type":"integer","description":"Number of ICMP packets sent","format":"int32","nullable":true},"packetsReceived":{"type":"integer","description":"Number of ICMP packets received","format":"int32","nullable":true},"packetLoss":{"type":"number","description":"Packet loss percentage","format":"double","nullable":true,"example":0.0},"avgRttMs":{"type":"number","description":"Average round-trip time in ms","format":"double","nullable":true},"minRttMs":{"type":"number","description":"Minimum round-trip time in ms","format":"double","nullable":true},"maxRttMs":{"type":"number","description":"Maximum round-trip time in ms","format":"double","nullable":true},"jitterMs":{"type":"number","description":"Jitter in ms","format":"double","nullable":true}}}]},"McpServer":{"type":"object","description":"MCP server check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"url":{"type":"string","description":"MCP server URL","nullable":true},"protocolVersion":{"type":"string","description":"MCP protocol version","nullable":true},"serverInfo":{"type":"object","additionalProperties":{"type":"object","description":"MCP server info (name, version, etc.)","nullable":true},"description":"MCP server info (name, version, etc.)","nullable":true},"toolCount":{"type":"integer","description":"Number of tools exposed","format":"int32","nullable":true},"resourceCount":{"type":"integer","description":"Number of resources exposed","format":"int32","nullable":true},"promptCount":{"type":"integer","description":"Number of prompts exposed","format":"int32","nullable":true}}}]},"Tcp":{"type":"object","description":"TCP check-type-specific details","allOf":[{"$ref":"#/components/schemas/CheckTypeDetailsDto"},{"type":"object","properties":{"host":{"type":"string","description":"Target host","example":"db.example.com"},"port":{"type":"integer","description":"Target port","format":"int32","example":5432},"connected":{"type":"boolean","description":"Whether a TCP connection was established"}}}]},"TlsInfoDto":{"type":"object","properties":{"subjectCn":{"type":"string","description":"Certificate subject common name","nullable":true,"example":"*.example.com"},"subjectSan":{"type":"array","description":"Subject Alternative Names","nullable":true,"items":{"type":"string","description":"Subject Alternative Names","nullable":true}},"issuerCn":{"type":"string","description":"Issuer common name","nullable":true,"example":"R3"},"issuerOrg":{"type":"string","description":"Issuer organisation","nullable":true,"example":"Let's Encrypt"},"notBefore":{"type":"string","description":"Certificate validity start (ISO 8601 UTC)","nullable":true},"notAfter":{"type":"string","description":"Certificate validity end (ISO 8601 UTC)","nullable":true},"serialNumber":{"type":"string","description":"Certificate serial number","nullable":true},"tlsVersion":{"type":"string","description":"TLS protocol version","nullable":true,"example":"TLSv1.3"},"cipherSuite":{"type":"string","description":"Negotiated cipher suite","nullable":true},"chainValid":{"type":"boolean","description":"Whether the chain validated against the OS trust store","nullable":true}},"description":"TLS/SSL certificate details for HTTPS targets"},"ChartBucketDto":{"type":"object","properties":{"bucket":{"type":"string","description":"Start of the time bucket (ISO 8601)","format":"date-time","example":"2026-03-12T10:00:00Z"},"uptimePercent":{"type":"number","description":"Uptime percentage for this bucket; null when no data","format":"double","nullable":true,"example":100.0},"avgLatencyMs":{"type":"number","description":"Weighted average latency in milliseconds for this bucket","format":"double","nullable":true,"example":120.3},"p95LatencyMs":{"type":"number","description":"95th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":250.0},"p99LatencyMs":{"type":"number","description":"99th percentile latency in milliseconds (max across regions)","format":"double","nullable":true,"example":480.0}},"description":"Aggregated metrics for a time bucket"},"RegionStatusDto":{"type":"object","properties":{"region":{"type":"string","description":"Region identifier","example":"us-east"},"passed":{"type":"boolean","description":"Whether the last check in this region passed","example":true},"responseTimeMs":{"type":"integer","description":"Response time in milliseconds for the last check","format":"int32","nullable":true,"example":95},"timestamp":{"type":"string","description":"Timestamp of the last check in this region (ISO 8601)","format":"date-time"},"severityHint":{"type":"string","description":"Severity hint: 'down' for hard failures, 'degraded' for warn-only failures, null when passing","nullable":true}},"description":"Latest check result for a single region"},"ResultSummaryDto":{"type":"object","properties":{"currentStatus":{"type":"string","description":"Derived current status across all regions","enum":["up","degraded","down","unknown"]},"latestPerRegion":{"type":"array","description":"Latest check result per region","items":{"$ref":"#/components/schemas/RegionStatusDto"}},"chartData":{"type":"array","description":"Time-bucketed chart data for the requested window","items":{"$ref":"#/components/schemas/ChartBucketDto"}},"uptime24h":{"type":"number","description":"Uptime percentage over the last 24 hours; null when no data","format":"double","nullable":true,"example":99.95},"uptimeWindow":{"type":"number","description":"Uptime percentage for the selected chart window; null when no data","format":"double","nullable":true,"example":99.8}},"description":"Dashboard summary: current status, per-region latest results, and chart data"},"SingleValueResponseResultSummaryDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ResultSummaryDto"}}},"TableValueResultMaintenanceWindowDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceWindowDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultInviteDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/InviteDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"IntegrationCatalogResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationDto"}}}},"IntegrationConfigSchemaDto":{"type":"object","properties":{"connectionFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}},"channelFields":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationFieldDto"}}}},"IntegrationDto":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"logoUrl":{"type":"string"},"authType":{"type":"string"},"tierAvailability":{"type":"string","enum":["FREE","STARTER","PRO","TEAM","BUSINESS","ENTERPRISE"]},"lifecycle":{"type":"string"},"setupGuideUrl":{"type":"string"},"configSchema":{"$ref":"#/components/schemas/IntegrationConfigSchemaDto"}}},"IntegrationFieldDto":{"required":["key","label","required","sensitive","type"],"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"sensitive":{"type":"boolean"},"placeholder":{"type":"string","nullable":true},"helpText":{"type":"string","nullable":true},"options":{"type":"array","nullable":true,"items":{"type":"string","nullable":true}},"default":{"type":"string","nullable":true}}},"IncidentFilterParams":{"type":"object","properties":{"status":{"type":"string","enum":["WATCHING","TRIGGERED","CONFIRMED","RESOLVED"]},"severity":{"type":"string","enum":["DOWN","DEGRADED","MAINTENANCE"]},"source":{"type":"string","enum":["AUTOMATIC","MANUAL","MONITORS","STATUS_DATA","RESOURCE_GROUP"]},"monitorId":{"type":"string","format":"uuid"},"serviceId":{"type":"string","format":"uuid"},"resourceGroupId":{"type":"string","format":"uuid"},"tagId":{"type":"string","format":"uuid","nullable":true},"environmentId":{"type":"string","format":"uuid","nullable":true},"startedFrom":{"type":"string","format":"date-time","nullable":true},"startedTo":{"type":"string","format":"date-time","nullable":true},"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"maximum":200,"minimum":1,"type":"integer","format":"int32"}}},"TableValueResultEnvironmentDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/EnvironmentDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DashboardOverviewDto":{"type":"object","properties":{"monitors":{"$ref":"#/components/schemas/MonitorsSummaryDto"},"incidents":{"$ref":"#/components/schemas/IncidentsSummaryDto"}}},"IncidentsSummaryDto":{"type":"object","properties":{"active":{"type":"integer","format":"int64"},"resolvedToday":{"type":"integer","format":"int64"},"mttr30d":{"type":"number","format":"double","nullable":true}}},"MonitorsSummaryDto":{"type":"object","properties":{"total":{"type":"integer","format":"int64"},"up":{"type":"integer","format":"int64"},"down":{"type":"integer","format":"int64"},"degraded":{"type":"integer","format":"int64"},"paused":{"type":"integer","format":"int64"},"avgUptime24h":{"type":"number","format":"double","nullable":true},"avgUptime30d":{"type":"number","format":"double","nullable":true}}},"SingleValueResponseDashboardOverviewDto":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DashboardOverviewDto"}}},"CategoryDto":{"type":"object","properties":{"category":{"type":"string"},"serviceCount":{"type":"integer","format":"int64"}}},"TableValueResultCategoryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"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","format":"int64"},"actorId":{"type":"integer","format":"int32","nullable":true},"actorEmail":{"type":"string","nullable":true},"action":{"type":"string"},"resourceType":{"type":"string","nullable":true},"resourceId":{"type":"string","nullable":true},"resourceName":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":{"type":"object","nullable":true},"nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"PageResultAuditEventDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEventDto"}},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"totalPages":{"type":"integer","format":"int32"},"hasNext":{"type":"boolean"}}},"TableValueResultApiKeyDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"DeliveryAttemptDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"deliveryId":{"type":"string","format":"uuid"},"attemptNumber":{"type":"integer","description":"1-based attempt number","format":"int32"},"status":{"type":"string","description":"Outcome: SUCCESS, FAILED, TIMEOUT, ERROR"},"responseStatusCode":{"type":"integer","description":"HTTP response status code from the external service","format":"int32","nullable":true},"requestPayload":{"type":"string","description":"JSON payload sent to the external service","nullable":true},"responseBody":{"type":"string","description":"Response body from the external service (truncated)","nullable":true},"errorMessage":{"type":"string","description":"Error message if the attempt failed","nullable":true},"responseTimeMs":{"type":"integer","description":"Round-trip time in milliseconds","format":"int32","nullable":true},"externalId":{"type":"string","description":"External identifier (e.g. PagerDuty dedup_key, SES MessageId, webhook delivery UUID)","nullable":true},"requestHeaders":{"type":"object","additionalProperties":{"type":"string","description":"HTTP request headers sent to the external service","nullable":true},"description":"HTTP request headers sent to the external service","nullable":true},"attemptedAt":{"type":"string","format":"date-time"}},"description":"Single delivery attempt with request/response audit data"},"TableValueResultDeliveryAttemptDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAttemptDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertChannelDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertChannelDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"TableValueResultAlertDeliveryDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AlertDeliveryDto"}},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}}},"RemoveMonitorTagsRequest":{"required":["tagIds"],"type":"object","properties":{"tagIds":{"minItems":1,"type":"array","description":"IDs of the tags to detach from the monitor","items":{"type":"string","description":"IDs of the tags to detach from the monitor","format":"uuid"}}},"description":"Request body for removing tags from a monitor"},"DeleteChannelResult":{"type":"object","properties":{"affectedPolicies":{"type":"integer","description":"Number of notification policies whose escalation steps were modified","format":"int32"},"disabledPolicies":{"type":"integer","description":"Number of notification policies disabled because they had no remaining channels","format":"int32"}},"description":"Summary of policies affected by channel deletion"}},"securitySchemes":{"BearerAuth":{"type":"http","description":"API key (dh_live_...) or Auth0 JWT token","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file diff --git a/src/commands/alert-channels/test.ts b/src/commands/alert-channels/test.ts index b80b171..b776940 100644 --- a/src/commands/alert-channels/test.ts +++ b/src/commands/alert-channels/test.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../lib/api-client.js' export default class AlertChannelsTest extends Command { static description = 'Send a test notification to an alert channel' @@ -11,10 +11,8 @@ export default class AlertChannelsTest extends Command { async run() { const {args, flags} = await this.parse(AlertChannelsTest) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/alert-channels/${args.id}/test` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = (resp as any)?.data ?? resp - this.log(result.success ? 'Test notification sent successfully.' : 'Test notification failed.') + const resp = await checkedFetch(client.POST('/api/v1/alert-channels/{id}/test', {params: {path: {id: args.id}}})) + const result = unwrap<{success?: boolean}>(resp) + this.log(result?.success ? 'Test notification sent successfully.' : 'Test notification failed.') } } diff --git a/src/commands/api-keys/revoke.ts b/src/commands/api-keys/revoke.ts index 1e91b82..13d29b9 100644 --- a/src/commands/api-keys/revoke.ts +++ b/src/commands/api-keys/revoke.ts @@ -11,8 +11,7 @@ export default class ApiKeysRevoke extends Command { async run() { const {args, flags} = await this.parse(ApiKeysRevoke) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await checkedFetch(client.POST(`/api/v1/api-keys/${args.id}/revoke` as any, {} as any)) + await checkedFetch(client.POST('/api/v1/api-keys/{id}/revoke', {params: {path: {id: Number(args.id)}}})) this.log(`API key '${args.id}' revoked.`) } } diff --git a/src/commands/auth/context/create.ts b/src/commands/auth/context/create.ts index 438fb74..dbdb640 100644 --- a/src/commands/auth/context/create.ts +++ b/src/commands/auth/context/create.ts @@ -1,20 +1,36 @@ import {Command, Args, Flags} from '@oclif/core' import {globalFlags} from '../../../lib/base-command.js' +import {createApiClient, checkedFetch} from '../../../lib/api-client.js' import {saveContext} from '../../../lib/auth.js' export default class AuthContextCreate extends Command { - static description = 'Create a new auth context' - static examples = ['<%= config.bin %> auth context create staging --api-url https://staging-api.devhelm.io --token sk_...'] + static description = 'Create a new auth context (validates token before saving)' + static examples = ['<%= config.bin %> auth context create staging --api-url https://staging-api.devhelm.io --token dh_live_...'] static args = {name: Args.string({description: 'Context name', required: true})} static flags = { ...globalFlags, token: Flags.string({description: 'API token', required: true}), 'set-current': Flags.boolean({description: 'Set as current context', default: true}), + 'skip-validation': Flags.boolean({description: 'Save without validating the token', default: false}), } async run() { const {args, flags} = await this.parse(AuthContextCreate) const apiUrl = flags['api-url'] || 'https://api.devhelm.io' + + if (!flags['skip-validation']) { + const client = createApiClient({baseUrl: apiUrl, token: flags.token}) + try { + await checkedFetch(client.GET('/api/v1/auth/me')) + } catch { + try { + await checkedFetch(client.GET('/api/v1/dashboard/overview')) + } catch { + this.error('Token validation failed. Use --skip-validation to save anyway.', {exit: 2}) + } + } + } + saveContext({name: args.name, apiUrl, token: flags.token}, flags['set-current']) this.log(`Context '${args.name}' created.${flags['set-current'] ? ' (active)' : ''}`) } diff --git a/src/commands/auth/login.ts b/src/commands/auth/login.ts index b979b6f..d897a81 100644 --- a/src/commands/auth/login.ts +++ b/src/commands/auth/login.ts @@ -1,9 +1,11 @@ import {Command, Flags} from '@oclif/core' import {globalFlags} from '../../lib/base-command.js' -import {createApiClient, checkedFetch} from '../../lib/api-client.js' +import {createApiClient, checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' import {saveContext, resolveApiUrl} from '../../lib/auth.js' import * as readline from 'node:readline' +type AuthMeResponse = Schemas['AuthMeResponse'] + export default class AuthLogin extends Command { static description = 'Authenticate with the DevHelm API' static examples = ['<%= config.bin %> auth login', '<%= config.bin %> auth login --token dh_live_...'] @@ -24,13 +26,9 @@ export default class AuthLogin extends Command { this.log('Validating token...') const client = createApiClient({baseUrl: apiUrl, token}) - // Try /api/v1/auth/me first (API key — returns rich identity info). - // Falls back to /api/v1/dashboard/overview for non-API-key tokens (dev tokens, JWTs). try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET('/api/v1/auth/me' as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const me = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.GET('/api/v1/auth/me')) + const me = unwrap(resp) saveContext({name: flags.name, apiUrl, token}, true) this.log('') @@ -42,12 +40,11 @@ export default class AuthLogin extends Command { this.log(` Context '${flags.name}' saved to ~/.devhelm/contexts.json`) return } catch { - // /auth/me failed — might be a non-API-key token; try basic validation + // /auth/me requires API key auth; fall back for dev tokens / JWTs } try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await checkedFetch(client.GET('/api/v1/dashboard/overview' as any, {} as any)) + await checkedFetch(client.GET('/api/v1/dashboard/overview')) saveContext({name: flags.name, apiUrl, token}, true) this.log('') this.log(` Authenticated successfully.`) diff --git a/src/commands/auth/me.ts b/src/commands/auth/me.ts index 120e30d..45c34d7 100644 --- a/src/commands/auth/me.ts +++ b/src/commands/auth/me.ts @@ -1,7 +1,9 @@ import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' -import {formatOutput, OutputFormat} from '../../lib/output.js' +import {checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' +import {formatOutput, type OutputFormat} from '../../lib/output.js' + +type AuthMeResponse = Schemas['AuthMeResponse'] export default class AuthMe extends Command { static description = 'Show current API key identity, organization, plan, and rate limits' @@ -11,10 +13,8 @@ export default class AuthMe extends Command { async run() { const {flags} = await this.parse(AuthMe) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET('/api/v1/auth/me' as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const me = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.GET('/api/v1/auth/me')) + const me = unwrap(resp) const format = flags.output as OutputFormat if (format === 'json' || format === 'yaml') { diff --git a/src/commands/data/services/status.ts b/src/commands/data/services/status.ts index 0df5429..1d03a53 100644 --- a/src/commands/data/services/status.ts +++ b/src/commands/data/services/status.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' -import {checkedFetch} from '../../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../../lib/api-client.js' export default class DataServicesStatus extends Command { static description = 'Get the current status of a service' @@ -11,10 +11,7 @@ export default class DataServicesStatus extends Command { async run() { const {args, flags} = await this.parse(DataServicesStatus) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET(`/api/v1/services/${args.slug}` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const service = (resp as any)?.data ?? resp - display(this, service, flags.output) + const resp = await checkedFetch(client.GET('/api/v1/services/{slugOrId}', {params: {path: {slugOrId: args.slug}}})) + display(this, unwrap(resp), flags.output) } } diff --git a/src/commands/data/services/uptime.ts b/src/commands/data/services/uptime.ts index 1236dd7..60ac22a 100644 --- a/src/commands/data/services/uptime.ts +++ b/src/commands/data/services/uptime.ts @@ -1,6 +1,6 @@ import {Command, Args, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../../lib/base-command.js' -import {checkedFetch} from '../../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../../lib/api-client.js' export default class DataServicesUptime extends Command { static description = 'Get uptime data for a service' @@ -11,19 +11,22 @@ export default class DataServicesUptime extends Command { static args = {slug: Args.string({description: 'Service slug', required: true})} static flags = { ...globalFlags, - period: Flags.string({description: 'Time period (7d, 30d, 90d)', default: '30d'}), - granularity: Flags.string({description: 'Data granularity (hourly, daily)'}), + period: Flags.string({description: 'Time period', default: '30d', options: ['24h', '7d', '30d', '90d', '1y', '2y', 'all']}), + granularity: Flags.string({description: 'Data granularity', options: ['hourly', 'daily', 'monthly']}), } async run() { const {args, flags} = await this.parse(DataServicesUptime) const client = buildClient(flags) - let path = `/api/v1/services/${args.slug}/uptime?period=${flags.period}` - if (flags.granularity) path += `&granularity=${flags.granularity}` - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET(path as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const uptime = (resp as any)?.data ?? resp - display(this, uptime, flags.output) + const resp = await checkedFetch(client.GET('/api/v1/services/{slugOrId}/uptime', { + params: { + path: {slugOrId: args.slug}, + query: { + period: flags.period as '24h' | '7d' | '30d' | '90d' | '1y' | '2y' | 'all', + ...(flags.granularity ? {granularity: flags.granularity as 'hourly' | 'daily' | 'monthly'} : {}), + }, + }, + })) + display(this, unwrap(resp), flags.output) } } diff --git a/src/commands/dependencies/track.ts b/src/commands/dependencies/track.ts index 0887f34..cd4e4f4 100644 --- a/src/commands/dependencies/track.ts +++ b/src/commands/dependencies/track.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../lib/api-client.js' export default class DependenciesTrack extends Command { static description = 'Start tracking a service as a dependency' @@ -11,10 +11,8 @@ export default class DependenciesTrack extends Command { async run() { const {args, flags} = await this.parse(DependenciesTrack) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/service-subscriptions/${args.slug}` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const sub = (resp as any)?.data ?? resp - this.log(`Now tracking '${sub.serviceName}' as a dependency.`) + const resp = await checkedFetch(client.POST('/api/v1/service-subscriptions/{slug}', {params: {path: {slug: args.slug}}})) + const sub = unwrap<{serviceName?: string}>(resp) + this.log(`Now tracking '${sub.serviceName ?? args.slug}' as a dependency.`) } } diff --git a/src/commands/incidents/resolve.ts b/src/commands/incidents/resolve.ts index 93b7360..ed9c8f8 100644 --- a/src/commands/incidents/resolve.ts +++ b/src/commands/incidents/resolve.ts @@ -1,6 +1,6 @@ import {Command, Args, Flags} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' export default class IncidentsResolve extends Command { static description = 'Resolve an incident' @@ -15,12 +15,11 @@ export default class IncidentsResolve extends Command { const {args, flags} = await this.parse(IncidentsResolve) const client = buildClient(flags) const body = flags.message ? {message: flags.message} : undefined - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const opts = body ? {body: body as any} : {} - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/incidents/${args.id}/resolve` as any, opts as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const incident = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.POST('/api/v1/incidents/{id}/resolve', { + params: {path: {id: args.id}}, + ...(body ? {body} : {}), + })) + const incident = unwrap(resp) this.log(`Incident '${incident.title}' resolved.`) } } diff --git a/src/commands/init.ts b/src/commands/init.ts index bc03cc9..caae28c 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -8,7 +8,7 @@ monitors: - name: Website Health Check type: HTTP url: https://example.com - interval: 60 + frequency: 60 regions: - us-east-1 - eu-west-1 @@ -26,17 +26,17 @@ monitors: # type: HTTP # url: https://api.example.com/health # method: GET - # interval: 30 + # frequency: 30 # timeout: 10000 # - name: DNS Check # type: DNS # url: example.com - # interval: 300 + # frequency: 300 # - name: Heartbeat # type: HEARTBEAT - # interval: 120 + # frequency: 120 # grace: 300 ` diff --git a/src/commands/monitors/pause.ts b/src/commands/monitors/pause.ts index f0cb71f..8351572 100644 --- a/src/commands/monitors/pause.ts +++ b/src/commands/monitors/pause.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' export default class MonitorsPause extends Command { static description = 'Pause a monitor' @@ -11,10 +11,8 @@ export default class MonitorsPause extends Command { async run() { const {args, flags} = await this.parse(MonitorsPause) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/monitors/${args.id}/pause` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const monitor = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.POST('/api/v1/monitors/{id}/pause', {params: {path: {id: args.id}}})) + const monitor = unwrap(resp) this.log(`Monitor '${monitor.name}' paused.`) } } diff --git a/src/commands/monitors/results.ts b/src/commands/monitors/results.ts index b7e4c47..2c7f6df 100644 --- a/src/commands/monitors/results.ts +++ b/src/commands/monitors/results.ts @@ -1,6 +1,8 @@ import {Command, Args, Flags} from '@oclif/core' import {globalFlags, buildClient, display} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' + +type CheckResult = Schemas['CheckResultDto'] export default class MonitorsResults extends Command { static description = 'Show recent check results for a monitor' @@ -14,17 +16,16 @@ export default class MonitorsResults extends Command { async run() { const {args, flags} = await this.parse(MonitorsResults) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET(`/api/v1/monitors/${args.id}/results?limit=${flags.limit}` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const items = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.GET('/api/v1/monitors/{id}/results', { + params: {path: {id: args.id}, query: {limit: flags.limit}}, + })) + const items = unwrap(resp) display(this, items, flags.output, [ - {header: 'ID', get: (r: Record) => String(r.id ?? '')}, - {header: 'STATUS', get: (r: Record) => String(r.status ?? '')}, - {header: 'RESPONSE TIME', get: (r: Record) => String(r.responseTime ?? '')}, - {header: 'CODE', get: (r: Record) => String(r.statusCode ?? '')}, - {header: 'REGION', get: (r: Record) => String(r.region ?? '')}, - {header: 'CHECKED AT', get: (r: Record) => String(r.checkedAt ?? '')}, + {header: 'ID', get: (r: CheckResult) => String(r.id ?? '')}, + {header: 'PASSED', get: (r: CheckResult) => String(r.passed ?? '')}, + {header: 'RESPONSE TIME', get: (r: CheckResult) => r.responseTimeMs != null ? `${r.responseTimeMs}ms` : ''}, + {header: 'REGION', get: (r: CheckResult) => r.region ?? ''}, + {header: 'CHECKED AT', get: (r: CheckResult) => r.timestamp ?? ''}, ]) } } diff --git a/src/commands/monitors/resume.ts b/src/commands/monitors/resume.ts index 29d0636..1604a8d 100644 --- a/src/commands/monitors/resume.ts +++ b/src/commands/monitors/resume.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap, type Schemas} from '../../lib/api-client.js' export default class MonitorsResume extends Command { static description = 'Resume a paused monitor' @@ -11,10 +11,8 @@ export default class MonitorsResume extends Command { async run() { const {args, flags} = await this.parse(MonitorsResume) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/monitors/${args.id}/resume` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const monitor = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.POST('/api/v1/monitors/{id}/resume', {params: {path: {id: args.id}}})) + const monitor = unwrap(resp) this.log(`Monitor '${monitor.name}' resumed.`) } } diff --git a/src/commands/monitors/test.ts b/src/commands/monitors/test.ts index c7ff541..725e080 100644 --- a/src/commands/monitors/test.ts +++ b/src/commands/monitors/test.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient, display} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../lib/api-client.js' export default class MonitorsTest extends Command { static description = 'Run an ad-hoc test for a monitor' @@ -12,10 +12,7 @@ export default class MonitorsTest extends Command { const {args, flags} = await this.parse(MonitorsTest) const client = buildClient(flags) this.log('Running test...') - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/monitors/${args.id}/test` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = (resp as any)?.data ?? resp - display(this, result, flags.output) + const resp = await checkedFetch(client.POST('/api/v1/monitors/{id}/test', {params: {path: {id: args.id}}})) + display(this, unwrap(resp), flags.output) } } diff --git a/src/commands/notification-policies/test.ts b/src/commands/notification-policies/test.ts index 110f507..6b6e047 100644 --- a/src/commands/notification-policies/test.ts +++ b/src/commands/notification-policies/test.ts @@ -11,8 +11,10 @@ export default class NotificationPoliciesTest extends Command { async run() { const {args, flags} = await this.parse(NotificationPoliciesTest) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await checkedFetch(client.POST(`/api/v1/notification-policies/${args.id}/test` as any, {} as any)) + await checkedFetch(client.POST('/api/v1/notification-policies/{id}/test', { + params: {path: {id: args.id}}, + body: {}, + })) this.log('Test dispatch sent.') } } diff --git a/src/commands/status.ts b/src/commands/status.ts index 36150be..2a79549 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -1,7 +1,9 @@ import {Command} from '@oclif/core' import {globalFlags, buildClient} from '../lib/base-command.js' -import {checkedFetch} from '../lib/api-client.js' -import {formatOutput, OutputFormat} from '../lib/output.js' +import {checkedFetch, unwrap, type Schemas} from '../lib/api-client.js' +import {formatOutput, type OutputFormat} from '../lib/output.js' + +type DashboardOverview = Schemas['DashboardOverviewDto'] export default class Status extends Command { static description = 'Show dashboard overview' @@ -11,10 +13,8 @@ export default class Status extends Command { async run() { const {flags} = await this.parse(Status) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.GET('/api/v1/dashboard/overview' as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const overview = (resp as any)?.data ?? resp + const resp = await checkedFetch(client.GET('/api/v1/dashboard/overview')) + const overview = unwrap(resp) const format = flags.output as OutputFormat if (format === 'json' || format === 'yaml') { diff --git a/src/commands/validate.ts b/src/commands/validate.ts index 777ff06..7bda0dd 100644 --- a/src/commands/validate.ts +++ b/src/commands/validate.ts @@ -6,6 +6,7 @@ interface MonitorConfig { name?: string type?: string url?: string + frequency?: number interval?: number } @@ -13,7 +14,7 @@ interface DevhelmConfig { monitors?: MonitorConfig[] } -const VALID_TYPES = new Set(['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT']) +const VALID_TYPES = new Set(['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER']) export default class Validate extends Command { static description = 'Validate a devhelm.yml configuration file' @@ -63,8 +64,9 @@ export default class Validate extends Command { errors.push(`${prefix}: "url" is required for ${m.type} monitors`) } - if (m.interval !== undefined && (typeof m.interval !== 'number' || m.interval < 10)) { - errors.push(`${prefix}: "interval" must be a number >= 10`) + const freq = m.frequency ?? m.interval + if (freq !== undefined && (typeof freq !== 'number' || freq < 10)) { + errors.push(`${prefix}: "frequency" must be a number >= 10`) } } } diff --git a/src/commands/webhooks/test.ts b/src/commands/webhooks/test.ts index b2ef883..7b420f5 100644 --- a/src/commands/webhooks/test.ts +++ b/src/commands/webhooks/test.ts @@ -1,6 +1,6 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient} from '../../lib/base-command.js' -import {checkedFetch} from '../../lib/api-client.js' +import {checkedFetch, unwrap} from '../../lib/api-client.js' export default class WebhooksTest extends Command { static description = 'Send a test event to a webhook' @@ -11,10 +11,8 @@ export default class WebhooksTest extends Command { async run() { const {args, flags} = await this.parse(WebhooksTest) const client = buildClient(flags) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(`/api/v1/webhooks/${args.id}/test` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const result = (resp as any)?.data ?? resp - this.log(result.success ? 'Test event delivered.' : 'Test delivery failed.') + const resp = await checkedFetch(client.POST('/api/v1/webhooks/{id}/test', {params: {path: {id: args.id}}})) + const result = unwrap<{success?: boolean}>(resp) + this.log(result?.success ? 'Test event delivered.' : 'Test delivery failed.') } } diff --git a/src/lib/api-client.ts b/src/lib/api-client.ts index 432572a..0dd0f5c 100644 --- a/src/lib/api-client.ts +++ b/src/lib/api-client.ts @@ -1,7 +1,9 @@ import createClient, {type Middleware} from 'openapi-fetch' import type {paths, components} from './api.generated.js' +import {handleApiError} from './errors.js' export type {paths, components} +export type Schemas = components['schemas'] export class ApiRequestError extends Error { constructor( @@ -24,23 +26,6 @@ export class ApiRequestError extends Error { } } -// Backward-compatible wrapper types matching the API response shapes -export interface TableResponse { - data: T[] - hasNext?: boolean - hasPrev?: boolean -} - -export interface CursorPage { - data: T[] - hasNext?: boolean - hasPrev?: boolean -} - -export interface SingleResponse { - data: T -} - export function createApiClient(opts: { baseUrl: string token: string @@ -48,14 +33,19 @@ export function createApiClient(opts: { workspaceId?: string verbose?: boolean }) { + const orgId = opts.orgId ?? process.env.DEVHELM_ORG_ID + const workspaceId = opts.workspaceId ?? process.env.DEVHELM_WORKSPACE_ID + + const headers: Record = { + Authorization: `Bearer ${opts.token}`, + 'Content-Type': 'application/json', + } + if (orgId) headers['x-phelm-org-id'] = orgId + if (workspaceId) headers['x-phelm-workspace-id'] = workspaceId + const client = createClient({ baseUrl: opts.baseUrl.replace(/\/$/, ''), - headers: { - Authorization: `Bearer ${opts.token}`, - 'Content-Type': 'application/json', - 'x-phelm-org-id': opts.orgId ?? process.env.DEVHELM_ORG_ID ?? '1', - 'x-phelm-workspace-id': opts.workspaceId ?? process.env.DEVHELM_WORKSPACE_ID ?? '1', - }, + headers, }) if (opts.verbose) { @@ -74,15 +64,25 @@ export function createApiClient(opts: { export type ApiClient = ReturnType /** - * Unwrap an openapi-fetch response: returns `data` on success, throws `ApiRequestError` on failure. - * Every client.GET / POST / PUT / DELETE call should be wrapped with this. + * Unwrap an openapi-fetch response: returns `data` on success, throws on failure. + * Routes API errors through handleApiError for structured exit codes. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function checkedFetch(promise: Promise<{data?: T; error?: any; response: Response}>): Promise { +export async function checkedFetch(promise: Promise<{data?: T; error?: unknown; response: Response}>): Promise { const {data, error, response} = await promise if (error || !response.ok) { const body = typeof error === 'object' ? JSON.stringify(error) : String(error ?? 'Unknown error') - throw new ApiRequestError(response.status, response.statusText, body) + handleApiError(new ApiRequestError(response.status, response.statusText, body)) } return data as T } + +/** + * Unwrap the `{ data: T }` envelope used by SingleValueResponse / TableValueResult. + * Returns the inner payload when present, or the full response if not wrapped. + */ +export function unwrap(resp: unknown): T { + if (resp && typeof resp === 'object' && 'data' in resp) { + return (resp as {data: T}).data + } + return resp as T +} diff --git a/src/lib/api.generated.ts b/src/lib/api.generated.ts index 73ba0fd..d17b77a 100644 --- a/src/lib/api.generated.ts +++ b/src/lib/api.generated.ts @@ -2523,6 +2523,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/v1/auth/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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_...). + */ + get: operations["me_1"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/v1/audit-log": { parameters: { query?: never; @@ -2648,32 +2668,6 @@ export interface paths { export type webhooks = Record; export interface components { schemas: { - Actor: Record; - ApiKey: components["schemas"]["Actor"] & { - /** Format: int32 */ - orgId?: number; - /** Format: int32 */ - keyId?: number; - }; - Internal: components["schemas"]["Actor"]; - OrgContext: { - /** Format: int32 */ - id?: number; - /** @enum {string} */ - role?: "OWNER" | "ADMIN" | "MEMBER"; - }; - UI: components["schemas"]["Actor"] & { - userContext?: components["schemas"]["UserContext"]; - orgContext?: components["schemas"]["OrgContext"]; - /** Format: int32 */ - workspaceId?: number | null; - }; - UserContext: { - /** Format: int32 */ - id?: number; - /** @enum {string} */ - role?: "SUPERADMIN" | "ADMIN" | "USER"; - }; CreateSubscriptionRequest: { /** Format: int32 */ priceId?: number; @@ -5882,6 +5876,94 @@ export interface components { hasNext?: boolean; hasPrev?: boolean; }; + /** @description Identity, organization, plan, and rate-limit info for the authenticated API key */ + AuthMeResponse: { + key?: components["schemas"]["KeyInfo"]; + organization?: components["schemas"]["OrgInfo"]; + plan?: components["schemas"]["PlanInfo"]; + rateLimits?: components["schemas"]["RateLimitInfo"]; + }; + /** @description API key metadata */ + KeyInfo: { + /** + * Format: int32 + * @description Key ID + */ + id?: number; + /** @description Human-readable key name */ + name?: string; + /** + * Format: date-time + * @description When the key was created + */ + createdAt?: string; + /** + * Format: date-time + * @description When the key expires (null = never) + */ + expiresAt?: string | null; + /** + * Format: date-time + * @description Last time the key was used + */ + lastUsedAt?: string | null; + }; + /** @description Organization the key belongs to */ + OrgInfo: { + /** + * Format: int32 + * @description Organization ID + */ + id?: number; + /** @description Organization name */ + name?: string; + }; + /** @description Billing plan and entitlement state */ + PlanInfo: { + /** + * @description Resolved plan tier + * @enum {string} + */ + tier?: "FREE" | "STARTER" | "PRO" | "TEAM" | "BUSINESS" | "ENTERPRISE"; + /** @description Subscription status (null if no subscription) */ + subscriptionStatus?: string | null; + /** @description Whether the org is on a trial */ + trialActive?: boolean; + /** + * Format: date-time + * @description Trial expiry (null if not trialing) + */ + trialExpiresAt?: string | null; + /** @description Entitlement limits keyed by entitlement name */ + entitlements?: { + [key: string]: components["schemas"]["EntitlementDto"]; + }; + /** @description Current usage counters keyed by entitlement name */ + usage?: { + [key: string]: number; + }; + }; + /** @description Rate-limit quota for the current sliding window */ + RateLimitInfo: { + /** + * Format: int64 + * @description Maximum requests allowed per window + */ + requestsPerMinute?: number; + /** + * Format: int64 + * @description Requests remaining in the current window + */ + remaining?: number; + /** + * Format: int64 + * @description Sliding window size in milliseconds + */ + windowMs?: number; + }; + SingleValueResponseAuthMeResponse: { + data?: components["schemas"]["AuthMeResponse"]; + }; AuditEventDto: { /** Format: int64 */ id?: number; @@ -5997,9 +6079,7 @@ export type $defs = Record; export interface operations { updateSubscription: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -6026,9 +6106,7 @@ export interface operations { }; updateOrgDetails: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -6054,9 +6132,7 @@ export interface operations { }; advanceStage: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6080,9 +6156,7 @@ export interface operations { }; me: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6102,9 +6176,7 @@ export interface operations { }; updateProfile: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6128,9 +6200,7 @@ export interface operations { }; getNotificationPreferences: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6150,9 +6220,7 @@ export interface operations { }; updateNotificationPreferences: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6176,9 +6244,7 @@ export interface operations { }; getWorkspace: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6200,9 +6266,7 @@ export interface operations { }; updateWorkspace: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6228,9 +6292,7 @@ export interface operations { }; deleteWorkspace: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6250,9 +6312,7 @@ export interface operations { }; updateUser: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { userId: number; @@ -6278,9 +6338,7 @@ export interface operations { }; updateOrganization: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -6306,9 +6364,7 @@ export interface operations { }; updateMemberRole: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -6333,9 +6389,7 @@ export interface operations { }; get: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6357,9 +6411,7 @@ export interface operations { }; update: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6385,9 +6437,7 @@ export interface operations { }; delete: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { workspaceId: number; @@ -6407,9 +6457,7 @@ export interface operations { }; get_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6431,9 +6479,7 @@ export interface operations { }; update_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6459,9 +6505,7 @@ export interface operations { }; delete_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6481,9 +6525,7 @@ export interface operations { }; update_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6509,9 +6551,7 @@ export interface operations { }; delete_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6531,9 +6571,7 @@ export interface operations { }; update_3: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { key: string; @@ -6559,9 +6597,7 @@ export interface operations { }; delete_3: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { key: string; @@ -6581,8 +6617,7 @@ export interface operations { }; get_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { includeMetrics?: boolean; }; header?: never; @@ -6606,9 +6641,7 @@ export interface operations { }; update_4: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6634,9 +6667,7 @@ export interface operations { }; delete_4: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6656,9 +6687,7 @@ export interface operations { }; get_3: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6678,9 +6707,7 @@ export interface operations { }; update_5: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6704,9 +6731,7 @@ export interface operations { }; markRead: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: number; @@ -6726,9 +6751,7 @@ export interface operations { }; markAllRead: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6746,9 +6769,7 @@ export interface operations { }; getById: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6770,9 +6791,7 @@ export interface operations { }; update_6: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6798,9 +6817,7 @@ export interface operations { }; delete_5: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -6820,9 +6837,7 @@ export interface operations { }; get_4: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { /** @description Monitor UUID */ @@ -6854,9 +6869,7 @@ export interface operations { }; update_7: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { /** @description Monitor UUID */ @@ -6901,9 +6914,7 @@ export interface operations { }; update_8: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -6929,9 +6940,7 @@ export interface operations { }; set: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -6957,9 +6966,7 @@ export interface operations { }; remove: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -6979,9 +6986,7 @@ export interface operations { }; update_9: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -7008,9 +7013,7 @@ export interface operations { }; remove_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -7031,9 +7034,7 @@ export interface operations { }; setChannels: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -7059,9 +7060,7 @@ export interface operations { }; get_5: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7083,9 +7082,7 @@ export interface operations { }; update_10: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7111,9 +7108,7 @@ export interface operations { }; delete_6: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7133,9 +7128,7 @@ export interface operations { }; changeStatus: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { userId: number; @@ -7159,9 +7152,7 @@ export interface operations { }; changeRole: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { userId: number; @@ -7185,9 +7176,7 @@ export interface operations { }; getById_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7209,9 +7198,7 @@ export interface operations { }; update_11: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7237,9 +7224,7 @@ export interface operations { }; delete_7: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7259,9 +7244,7 @@ export interface operations { }; get_6: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { slug: string; @@ -7283,9 +7266,7 @@ export interface operations { }; update_12: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { slug: string; @@ -7311,9 +7292,7 @@ export interface operations { }; delete_8: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { slug: string; @@ -7333,9 +7312,7 @@ export interface operations { }; update_13: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7361,9 +7338,7 @@ export interface operations { }; delete_9: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -7657,8 +7632,7 @@ export interface operations { }; create_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { ifNotExists?: boolean; }; header?: never; @@ -7684,8 +7658,7 @@ export interface operations { }; list: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { limit?: number; }; header?: never; @@ -7709,9 +7682,7 @@ export interface operations { }; createSubscriptionTransaction: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -7737,9 +7708,7 @@ export interface operations { }; quickMonitor: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7763,9 +7732,7 @@ export interface operations { }; completeSetup: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7789,9 +7756,7 @@ export interface operations { }; analyzeUrl: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7815,9 +7780,7 @@ export interface operations { }; accept: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7866,7 +7829,6 @@ export interface operations { listWorkspaces: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -7890,9 +7852,7 @@ export interface operations { }; createWorkspace: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -7918,9 +7878,7 @@ export interface operations { }; listMembers: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -7942,9 +7900,7 @@ export interface operations { }; addMember: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -7970,9 +7926,7 @@ export interface operations { }; reEnableAdapter: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { serviceId: string; @@ -7995,7 +7949,6 @@ export interface operations { list_1: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -8017,9 +7970,7 @@ export interface operations { }; create_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8044,7 +7995,6 @@ export interface operations { list_2: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -8066,9 +8016,7 @@ export interface operations { }; create_3: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8092,9 +8040,7 @@ export interface operations { }; test: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8120,9 +8066,7 @@ export interface operations { }; rotateSigningSecret: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8142,9 +8086,7 @@ export interface operations { }; rotateDek: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8165,7 +8107,6 @@ export interface operations { list_3: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -8187,9 +8128,7 @@ export interface operations { }; create_4: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8213,9 +8152,7 @@ export interface operations { }; subscribe: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { slug: string; @@ -8241,9 +8178,7 @@ export interface operations { }; list_4: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8263,9 +8198,7 @@ export interface operations { }; create_5: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8289,9 +8222,7 @@ export interface operations { }; list_5: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8311,9 +8242,7 @@ export interface operations { }; create_6: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8337,9 +8266,7 @@ export interface operations { }; addMember_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8365,9 +8292,7 @@ export interface operations { }; list_6: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8387,9 +8312,7 @@ export interface operations { }; create_7: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8413,9 +8336,7 @@ export interface operations { }; test_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8441,9 +8362,7 @@ export interface operations { }; acknowledge: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8466,7 +8385,6 @@ export interface operations { list_7: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; /** @description Filter by enabled state */ enabled?: boolean; /** @description Filter by monitor type */ @@ -8500,9 +8418,7 @@ export interface operations { }; create_8: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8526,9 +8442,7 @@ export interface operations { }; add: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { monitorId: string; @@ -8554,9 +8468,7 @@ export interface operations { }; testExisting: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8578,9 +8490,7 @@ export interface operations { }; getMonitorTags: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8602,9 +8512,7 @@ export interface operations { }; addMonitorTags: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8630,9 +8538,7 @@ export interface operations { }; removeMonitorTags: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8656,9 +8562,7 @@ export interface operations { }; rotateToken: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8680,9 +8584,7 @@ export interface operations { }; resume: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8704,9 +8606,7 @@ export interface operations { }; pause: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -8728,9 +8628,7 @@ export interface operations { }; testAdHoc: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8754,9 +8652,7 @@ export interface operations { }; bulkAction: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8780,8 +8676,7 @@ export interface operations { }; list_8: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { /** @description Filter by monitor UUID */ monitorId?: string; /** @description Filter by status: 'active' or 'upcoming' */ @@ -8806,9 +8701,7 @@ export interface operations { }; create_9: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8832,9 +8725,7 @@ export interface operations { }; list_9: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8854,9 +8745,7 @@ export interface operations { }; create_10: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8880,9 +8769,7 @@ export interface operations { }; revoke: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { inviteId: number; @@ -8902,9 +8789,7 @@ export interface operations { }; resend: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { inviteId: number; @@ -8927,7 +8812,6 @@ export interface operations { list_10: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; params: components["schemas"]["IncidentFilterParams"]; }; header?: never; @@ -8949,9 +8833,7 @@ export interface operations { }; create_11: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8975,9 +8857,7 @@ export interface operations { }; addUpdate: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -9003,9 +8883,7 @@ export interface operations { }; resolve: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -9087,9 +8965,7 @@ export interface operations { }; list_11: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9109,9 +8985,7 @@ export interface operations { }; create_12: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9135,9 +9009,7 @@ export interface operations { }; list_12: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9157,9 +9029,7 @@ export interface operations { }; create_13: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9183,9 +9053,7 @@ export interface operations { }; revoke_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: number; @@ -9207,9 +9075,7 @@ export interface operations { }; regenerate: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: number; @@ -9231,9 +9097,7 @@ export interface operations { }; retry: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -9256,7 +9120,6 @@ export interface operations { list_13: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -9278,9 +9141,7 @@ export interface operations { }; create_14: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9304,9 +9165,7 @@ export interface operations { }; test_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -9328,9 +9187,7 @@ export interface operations { }; testConfig: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9381,9 +9238,7 @@ export interface operations { }; updateAlertSensitivity: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -9409,9 +9264,7 @@ export interface operations { }; delete_10: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: number; @@ -9431,9 +9284,7 @@ export interface operations { }; update_14: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: number; @@ -9653,9 +9504,7 @@ export interface operations { }; listActive: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -9677,9 +9526,7 @@ export interface operations { }; cancel: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -9700,7 +9547,6 @@ export interface operations { getUpcomingCharge: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; priceId: number; }; header?: never; @@ -9724,9 +9570,7 @@ export interface operations { }; getManagementUrls: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -9748,9 +9592,7 @@ export interface operations { }; getCustomerAuthToken: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -9772,9 +9614,7 @@ export interface operations { }; getEntitlements: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -9797,7 +9637,6 @@ export interface operations { searchOrganizations: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; query: string; paginationParams: components["schemas"]["PaginationParams"]; }; @@ -9820,9 +9659,7 @@ export interface operations { }; myOrgs: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9842,9 +9679,7 @@ export interface operations { }; stream: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9865,7 +9700,6 @@ export interface operations { listUsers: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -9887,9 +9721,7 @@ export interface operations { }; getStats: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9910,7 +9742,6 @@ export interface operations { listOrgs: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -9932,9 +9763,7 @@ export interface operations { }; getAdapterHealth: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9954,8 +9783,7 @@ export interface operations { }; listDeliveries: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { limit?: number; }; header?: never; @@ -9979,9 +9807,7 @@ export interface operations { }; getSigningSecretInfo: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -10271,9 +10097,7 @@ export interface operations { }; list_14: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -10293,9 +10117,7 @@ export interface operations { }; get_8: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10317,9 +10139,7 @@ export interface operations { }; unsubscribe: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10339,9 +10159,7 @@ export interface operations { }; getHealth: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10363,8 +10181,7 @@ export interface operations { }; list_15: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { unreadOnly?: boolean; page?: number; size?: number; @@ -10388,9 +10205,7 @@ export interface operations { }; unreadCount: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -10410,9 +10225,7 @@ export interface operations { }; listDispatches: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10435,7 +10248,6 @@ export interface operations { listByIncident: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; /** @description UUID of the incident to inspect */ incident_id: string; }; @@ -10458,9 +10270,7 @@ export interface operations { }; getById_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10483,7 +10293,6 @@ export interface operations { listVersions: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -10507,9 +10316,7 @@ export interface operations { }; getVersion: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10532,8 +10339,7 @@ export interface operations { }; getUptime: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { /** @description Time window for uptime calculation */ window?: "24h" | "7d" | "30d" | "90d"; }; @@ -10585,8 +10391,7 @@ export interface operations { }; getResults: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { /** @description Start of time range (ISO 8601, inclusive); defaults to 24 hours ago */ from?: string; /** @description End of time range (ISO 8601, inclusive); defaults to now */ @@ -10651,8 +10456,7 @@ export interface operations { }; getSummary: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { /** @description Chart window: 24h returns hourly buckets, 7d/30d/90d return daily buckets */ chartWindow?: "24h" | "7d" | "30d" | "90d"; }; @@ -10705,7 +10509,6 @@ export interface operations { list_16: { parameters: { query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; pageable: components["schemas"]["Pageable"]; }; header?: never; @@ -10747,9 +10550,7 @@ export interface operations { }; get_9: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10771,9 +10572,7 @@ export interface operations { }; overview: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -10811,10 +10610,29 @@ export interface operations { }; }; }; + me_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SingleValueResponseAuthMeResponse"]; + }; + }; + }; + }; list_18: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; + query?: { action?: string; actorId?: number; resourceType?: string; @@ -10842,9 +10660,7 @@ export interface operations { }; listAttempts: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10866,9 +10682,7 @@ export interface operations { }; listDeliveries_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10890,9 +10704,7 @@ export interface operations { }; delete_11: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -10912,9 +10724,7 @@ export interface operations { }; removeMember: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { orgId: number; @@ -10935,9 +10745,7 @@ export interface operations { }; removeMember_1: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { id: string; @@ -10958,9 +10766,7 @@ export interface operations { }; remove_2: { parameters: { - query: { - actor: components["schemas"]["ApiKey"] | components["schemas"]["Internal"] | components["schemas"]["UI"]; - }; + query?: never; header?: never; path: { userId: number; diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 0b8878a..bb2cff5 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -81,13 +81,17 @@ export function setCurrentContext(name: string): boolean { function readContextsFile(): ContextsFile | undefined { if (!existsSync(CONTEXTS_PATH)) return undefined - return JSON.parse(readFileSync(CONTEXTS_PATH, 'utf8')) + try { + return JSON.parse(readFileSync(CONTEXTS_PATH, 'utf8')) + } catch { + return undefined + } } function writeContextsFile(file: ContextsFile): void { if (!existsSync(CONFIG_DIR)) { - mkdirSync(CONFIG_DIR, {recursive: true}) + mkdirSync(CONFIG_DIR, {recursive: true, mode: 0o700}) } - writeFileSync(CONTEXTS_PATH, JSON.stringify(file, null, 2)) + writeFileSync(CONTEXTS_PATH, JSON.stringify(file, null, 2), {mode: 0o600}) } diff --git a/src/lib/crud-commands.ts b/src/lib/crud-commands.ts index 8ff48d9..d5cf5d0 100644 --- a/src/lib/crud-commands.ts +++ b/src/lib/crud-commands.ts @@ -1,12 +1,12 @@ import {Command, Args} from '@oclif/core' import {globalFlags, buildClient, display} from './base-command.js' -import {checkedFetch} from './api-client.js' -import {ColumnDef} from './output.js' +import {checkedFetch, unwrap} from './api-client.js' +import type {ColumnDef} from './output.js' // eslint-disable-next-line @typescript-eslint/no-explicit-any type AnyFlag = any -export interface ResourceConfig { +export interface ResourceConfig { name: string plural: string apiPath: string @@ -17,7 +17,15 @@ export interface ResourceConfig { bodyBuilder?: (flags: Record) => Record } -export function createListCommand(config: ResourceConfig) { +/* + * The CRUD factory uses dynamic path construction (config.apiPath + id interpolation), + * which can't be statically verified against the openapi-fetch `paths` type. + * The `as any` here is intentional and confined to this single file. + * Response typing flows through ResourceConfig generics and ColumnDef. + */ + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createListCommand(config: ResourceConfig) { class ListCmd extends Command { static description = `List all ${config.plural}` static examples = [`<%= config.bin %> ${config.plural} list`] @@ -28,16 +36,15 @@ export function createListCommand(config: ResourceConfig) { const client = buildClient(flags) // eslint-disable-next-line @typescript-eslint/no-explicit-any const resp = await checkedFetch(client.GET(config.apiPath as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const items = (resp as any)?.data ?? resp - display(this, items, flags.output, config.columns) + display(this, unwrap(resp), flags.output, config.columns) } } return ListCmd } -export function createGetCommand(config: ResourceConfig) { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createGetCommand(config: ResourceConfig) { const idLabel = config.idField ?? 'id' class GetCmd extends Command { static description = `Get a ${config.name} by ${idLabel}` @@ -51,16 +58,15 @@ export function createGetCommand(config: ResourceConfig) { const id = args[idLabel] // eslint-disable-next-line @typescript-eslint/no-explicit-any const resp = await checkedFetch(client.GET(`${config.apiPath}/${id}` as any, {} as any)) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const item = (resp as any)?.data ?? resp - display(this, item, flags.output) + display(this, unwrap(resp), flags.output) } } return GetCmd } -export function createCreateCommand(config: ResourceConfig) { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createCreateCommand(config: ResourceConfig) { const resourceFlags = config.createFlags ?? {} class CreateCmd extends Command { static description = `Create a new ${config.name}` @@ -73,17 +79,16 @@ export function createCreateCommand(config: ResourceConfig) { const raw = extractResourceFlags(flags, Object.keys(resourceFlags)) const body = config.bodyBuilder ? config.bodyBuilder(raw) : raw // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.POST(config.apiPath as any, {body: body as any})) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const item = (resp as any)?.data ?? resp - display(this, item, flags.output) + const resp = await checkedFetch(client.POST(config.apiPath as any, {body} as any)) + display(this, unwrap(resp), flags.output) } } return CreateCmd } -export function createUpdateCommand(config: ResourceConfig) { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createUpdateCommand(config: ResourceConfig) { const idLabel = config.idField ?? 'id' const resourceFlags = config.updateFlags ?? config.createFlags ?? {} class UpdateCmd extends Command { @@ -99,17 +104,16 @@ export function createUpdateCommand(config: ResourceConfig) { const raw = extractResourceFlags(flags, Object.keys(resourceFlags)) const body = config.bodyBuilder ? config.bodyBuilder(raw) : raw // eslint-disable-next-line @typescript-eslint/no-explicit-any - const resp = await checkedFetch(client.PUT(`${config.apiPath}/${id}` as any, {body: body as any})) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const item = (resp as any)?.data ?? resp - display(this, item, flags.output) + const resp = await checkedFetch(client.PUT(`${config.apiPath}/${id}` as any, {body} as any)) + display(this, unwrap(resp), flags.output) } } return UpdateCmd } -export function createDeleteCommand(config: ResourceConfig) { +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function createDeleteCommand(config: ResourceConfig) { const idLabel = config.idField ?? 'id' class DeleteCmd extends Command { static description = `Delete a ${config.name}` diff --git a/src/lib/errors.ts b/src/lib/errors.ts index 7750587..8989959 100644 --- a/src/lib/errors.ts +++ b/src/lib/errors.ts @@ -1,5 +1,3 @@ -import {ApiRequestError} from './api-client.js' - export const EXIT_CODES = { SUCCESS: 0, GENERAL: 1, @@ -40,18 +38,28 @@ export class NotFoundError extends DevhelmError { } } +/** + * Converts raw API errors into structured DevhelmError with proper exit codes. + * Imported by checkedFetch in api-client.ts — this is the single error-handling boundary. + */ export function handleApiError(error: unknown): never { - if (error instanceof ApiRequestError) { - if (error.status === 401 || error.status === 403) { - throw new AuthError(`Authentication failed: ${error.message}`) + // Avoid circular import: check by name rather than instanceof + if (error && typeof error === 'object' && 'status' in error) { + const apiErr = error as {status: number; message: string} + if (apiErr.status === 401 || apiErr.status === 403) { + throw new AuthError(`Authentication failed: ${apiErr.message}`) } - if (error.status === 404) { - throw new DevhelmError(error.message, EXIT_CODES.NOT_FOUND) + if (apiErr.status === 404) { + throw new DevhelmError(apiErr.message, EXIT_CODES.NOT_FOUND) } - throw new DevhelmError(error.message, EXIT_CODES.API) + throw new DevhelmError(apiErr.message, EXIT_CODES.API) + } + + if (error instanceof Error) { + throw new DevhelmError(error.message, EXIT_CODES.GENERAL) } - throw error + throw new DevhelmError(String(error), EXIT_CODES.GENERAL) } diff --git a/src/lib/resources.ts b/src/lib/resources.ts index 9334c55..777510e 100644 --- a/src/lib/resources.ts +++ b/src/lib/resources.ts @@ -30,7 +30,6 @@ type IncidentSeverity = Schemas['CreateManualIncidentRequest']['severity'] type CreateMonitorRequest = Schemas['CreateMonitorRequest'] type CreateManualIncidentRequest = Schemas['CreateManualIncidentRequest'] type CreateAlertChannelRequest = Schemas['CreateAlertChannelRequest'] -type CreateNotificationPolicyRequest = Schemas['CreateNotificationPolicyRequest'] type CreateApiKeyRequest = Schemas['CreateApiKeyRequest'] const MONITOR_TYPES: MonitorType[] = ['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER'] @@ -193,7 +192,11 @@ export const ALERT_CHANNELS: ResourceConfig = { bodyBuilder: (raw): Record => { let config: CreateAlertChannelRequest['config'] | undefined if (raw.config) { - config = JSON.parse(String(raw.config)) as CreateAlertChannelRequest['config'] + try { + config = JSON.parse(String(raw.config)) as CreateAlertChannelRequest['config'] + } catch { + throw new Error('Invalid JSON for --config flag. Expected valid JSON string.') + } } else { const typeKey = String(raw.type || 'SLACK').toUpperCase() const channelType = CHANNEL_TYPE_MAP[typeKey] ?? 'slack' @@ -231,16 +234,14 @@ export const NOTIFICATION_POLICIES: ResourceConfig = { enabled: Flags.boolean({description: desc('UpdateNotificationPolicyRequest', 'enabled'), allowNo: true}), }, bodyBuilder: (raw): Record => { - const channelIds = raw['channel-ids'] - ? String(raw['channel-ids']).split(',').map((s) => s.trim()).filter(Boolean) - : [] - const body: CreateNotificationPolicyRequest = { - name: String(raw.name), - escalation: {steps: [{channelIds, delayMinutes: 0}]}, - enabled: (raw.enabled as boolean) ?? true, - priority: 0, + const body: Record = {} + if (raw.name !== undefined) body.name = String(raw.name) + if (raw.enabled !== undefined) body.enabled = raw.enabled + if (raw['channel-ids'] !== undefined) { + const channelIds = String(raw['channel-ids']).split(',').map((s) => s.trim()).filter(Boolean) + body.escalation = {steps: [{channelIds, delayMinutes: 0}]} } - return body as unknown as Record + return body }, } @@ -258,7 +259,7 @@ export const ENVIRONMENTS: ResourceConfig = { createFlags: { name: Flags.string({description: desc('CreateEnvironmentRequest', 'name'), required: true}), slug: Flags.string({description: desc('CreateEnvironmentRequest', 'slug'), required: true}), - color: Flags.string({description: desc('CreateTagRequest', 'color', 'Color hex code')}), + color: Flags.string({description: desc('CreateEnvironmentRequest', 'color', 'Color hex code')}), }, updateFlags: { name: Flags.string({description: desc('UpdateEnvironmentRequest', 'name')}),