{"openapi":"3.1.0","info":{"title":"PingZen","description":"Service availability monitoring platform. Monitor your websites, APIs, and services with multi-protocol support.","version":"1.0.0"},"paths":{"/health":{"get":{"tags":["Health"],"summary":"Health check","description":"Check application health including database connectivity.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/health/liveness":{"get":{"tags":["Health"],"summary":"Liveness probe","description":"Kubernetes liveness probe. Returns 200 if application is alive.","operationId":"liveness_probe_health_liveness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessResponse"}}}}}}},"/health/readiness":{"get":{"tags":["Health"],"summary":"Readiness probe","description":"Kubernetes readiness probe. Returns 200 if ready to accept traffic.","operationId":"readiness_probe_health_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadinessResponse"}}}}}}},"/health/deep":{"get":{"tags":["Health"],"summary":"Deep health check","description":"Comprehensive health check including database, Redis, and data model validation.","operationId":"deep_health_check_health_deep_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeepHealthResponse"}}}}}}},"/version":{"get":{"tags":["Health"],"summary":"Version info","description":"Get application version and build information.","operationId":"version_info_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Version Info Version Get"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["Authentication"],"summary":"Register new user","description":"Create a new user account with email and password. Rate limited to 3 requests per minute.","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Login","description":"Authenticate with email and password to get access and refresh tokens. Rate limited to 5 requests per minute.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh tokens","description":"Exchange a valid refresh token for new access and refresh tokens.","operationId":"refresh_token_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/change-password":{"post":{"tags":["Authentication"],"summary":"Change password","description":"Change the current user's password. Requires authentication.","operationId":"change_password_api_v1_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me":{"get":{"tags":["Authentication"],"summary":"Get current user","description":"Get the currently authenticated user's profile.","operationId":"get_current_user_profile_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me/stats":{"get":{"tags":["Authentication"],"summary":"Get current user statistics","description":"Get monitoring statistics for the currently authenticated user.","operationId":"get_current_user_stats_api_v1_auth_me_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me/locale":{"patch":{"tags":["Authentication"],"summary":"Update preferred locale","description":"Update the current user's preferred locale for alert notifications.","operationId":"update_locale_api_v1_auth_me_locale_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLocaleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me/timezone":{"patch":{"tags":["Authentication"],"summary":"Update preferred IANA timezone","description":"Update the current user's preferred IANA timezone (e.g. 'Europe/Moscow'). Applied across UI datetime display, MCP tool output, and alert bodies.","operationId":"update_timezone_api_v1_auth_me_timezone_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTimezoneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout current session","description":"Revoke the current refresh token to logout from this session.","operationId":"logout_api_v1_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/logout/all":{"post":{"tags":["Authentication"],"summary":"Logout all sessions","description":"Revoke all refresh tokens for the current user, logging out from all devices.","operationId":"logout_all_sessions_api_v1_auth_logout_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutAllResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/forgot-password":{"post":{"tags":["Authentication"],"summary":"Request password reset","description":"Send a password reset link to the given email. Always returns the same response to prevent account enumeration.","operationId":"forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["Authentication"],"summary":"Reset password","description":"Set a new password using a reset token from the email link. Revokes all existing sessions on success.","operationId":"reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/telegram/login":{"post":{"tags":["Authentication"],"summary":"Login with Telegram","description":"Authenticate using Telegram Login Widget. Creates account if user doesn't exist.","operationId":"telegram_login_api_v1_auth_telegram_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/telegram/webapp":{"post":{"tags":["Authentication"],"summary":"Login with Telegram Mini App","description":"Authenticate using Telegram Mini App initData. Creates account if user doesn't exist.","operationId":"telegram_webapp_login_api_v1_auth_telegram_webapp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramWebAppRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google/login":{"get":{"tags":["Authentication"],"summary":"Get Google OAuth URL","description":"Get the Google OAuth2 authorization URL. Frontend redirects user to this URL.","operationId":"google_login_api_v1_auth_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/google/callback":{"get":{"tags":["Authentication"],"summary":"Google OAuth callback","description":"Handles Google OAuth2 callback. Redirects to frontend with tokens in URL hash.","operationId":"google_callback_api_v1_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/yandex/login":{"get":{"tags":["Authentication"],"summary":"Get Yandex OAuth URL","description":"Get the Yandex ID OAuth2 authorization URL. Frontend redirects user to this URL.","operationId":"yandex_login_api_v1_auth_yandex_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/yandex/callback":{"get":{"tags":["Authentication"],"summary":"Yandex OAuth callback","description":"Handles Yandex ID OAuth2 callback. Redirects to frontend with tokens in URL hash.","operationId":"yandex_callback_api_v1_auth_yandex_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/discord/webhook":{"get":{"tags":["Authentication"],"summary":"Get Discord OAuth URL for webhook setup","description":"Get the Discord OAuth2 authorization URL with webhook.incoming scope. Requires authentication.","operationId":"discord_webhook_login_api_v1_auth_discord_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discord Webhook Login Api V1 Auth Discord Webhook Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/discord/webhook/callback":{"get":{"tags":["Authentication"],"summary":"Discord OAuth webhook callback","description":"Handles Discord OAuth2 callback. Saves webhook URL and redirects to alerts page.","operationId":"discord_webhook_callback_api_v1_auth_discord_webhook_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}":{"get":{"tags":["Users"],"summary":"Get user by ID","description":"Get a user's public profile by their ID. Only basic info is returned.","operationId":"get_user_api_v1_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/export/csv":{"get":{"tags":["Monitors"],"summary":"Export monitors as CSV","description":"Download monitor configurations as a CSV file. Scope: all workspaces (default) or one workspace via workspace_id. Secret fields (passwords, tokens) are never exported. The file re-imports via POST /monitors/import/csv.","operationId":"export_monitors_csv_api_v1_monitors_export_csv_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Limit the export to one workspace. Omit for all workspaces.","title":"Workspace Id"},"description":"Limit the export to one workspace. Omit for all workspaces."},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"}],"responses":{"200":{"description":"CSV file download","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/import/csv":{"post":{"tags":["Monitors"],"summary":"Import monitors from CSV","description":"Bulk-create monitors from a CSV file (max 500 rows / 1 MB). Accepts our export format plus UptimeRobot/StatusCake/HetrixTools column names, comma or semicolon delimited. Target: one workspace via workspace_id, or per-row routing through the CSV's workspace column when workspace_id is omitted. Partial success by design — the response reports every row as created, skipped, or failed. Use dry_run=true to validate without creating anything.","operationId":"import_monitors_csv_api_v1_monitors_import_csv_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Import every row into this workspace. Omit to route rows by the CSV's workspace column (rows without one go to your default workspace).","title":"Workspace Id"},"description":"Import every row into this workspace. Omit to route rows by the CSV's workspace column (rows without one go to your default workspace)."},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"Validate only — report what would happen, create nothing","default":false,"title":"Dry Run"},"description":"Validate only — report what would happen, create nothing"},{"name":"on_duplicate","in":"query","required":false,"schema":{"type":"string","pattern":"^(skip|create)$","description":"skip (default): rows whose URL+protocol already exist are skipped","default":"skip","title":"On Duplicate"},"description":"skip (default): rows whose URL+protocol already exist are skipped"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_monitors_csv_api_v1_monitors_import_csv_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorImportReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors":{"post":{"tags":["Monitors"],"summary":"Create monitor","description":"Create a new monitor to track service availability.","operationId":"create_monitor_api_v1_monitors_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMonitorRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Monitors"],"summary":"List monitors","description":"Get a paginated list of monitors for the current user.","operationId":"list_monitors_api_v1_monitors_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category: up (active), down (active DOWN+TIMEOUT, DNSBL excluded), degraded (active DEGRADED+PARTIAL+WARNING, DNSBL excluded), unknown (other active), paused (inactive) — matches the dashboard status-card counts. Raw statuses (partial, timeout, warning, transient, skipped) also accepted.","title":"Status Filter"},"description":"Filter by category: up (active), down (active DOWN+TIMEOUT, DNSBL excluded), degraded (active DEGRADED+PARTIAL+WARNING, DNSBL excluded), unknown (other active), paused (inactive) — matches the dashboard status-card counts. Raw statuses (partial, timeout, warning, transient, skipped) also accepted."},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Case-insensitive substring of the monitor name or URL","title":"Search"},"description":"Case-insensitive substring of the monitor name or URL"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MonitorSortField","description":"status: worst first in the status-card order (down, degraded, unknown, up), paused last; name; uptime (24h); response (last latency, as the list shows it); manual: drag-and-drop order, then status.","default":"status"},"description":"status: worst first in the status-card order (down, degraded, unknown, up), paused last; name; uptime (24h); response (last latency, as the list shows it); manual: drag-and-drop order, then status."},{"name":"order","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortOrder","description":"asc or desc","default":"asc"},"description":"asc or desc"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/dnsbl-providers":{"get":{"tags":["Monitors"],"summary":"List default DNSBL providers","description":"Return the bundled pydnsbl provider lists that `BlacklistHealthChecker` uses when a DNSBL monitor's `dnsbl_servers` is empty. Frontend uses this to render the read-only 'show what's in the default list' expander under the 'Use default blacklists' radio.","operationId":"list_default_dnsbl_providers_api_v1_monitors_dnsbl_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Response List Default Dnsbl Providers Api V1 Monitors Dnsbl Providers Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/monitors/{monitor_id}":{"get":{"tags":["Monitors"],"summary":"Get monitor","description":"Get details of a specific monitor.","operationId":"get_monitor_api_v1_monitors__monitor_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Monitors"],"summary":"Update monitor","description":"Update an existing monitor's configuration (partial update).","operationId":"update_monitor_api_v1_monitors__monitor_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitors"],"summary":"Delete monitor","description":"Delete a monitor and all its associated data. Runs synchronously: returns 204 only after the monitor row, its check_results, and all stale references (alerts.monitor_ids, scheduled_reports.monitor_ids, monitor_groups.monitor_ids) have been committed to the database. Returns 504 if the deletion exceeds the server-side timeout.","operationId":"delete_monitor_api_v1_monitors__monitor_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/test":{"post":{"tags":["Monitors"],"summary":"Test connection","description":"Test a connection before creating a monitor. This allows users to verify their configuration works before saving.","operationId":"test_connection_api_v1_monitors_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestConnectionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monitors/{monitor_id}/check":{"post":{"tags":["Monitors"],"summary":"Execute health check","description":"Manually execute a health check for a monitor. Runs the check synchronously and returns the result with response_time_ms. Manual checks are excluded from uptime calculations.","operationId":"execute_health_check_api_v1_monitors__monitor_id__check_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ExecuteCheckRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/sla":{"get":{"tags":["Monitors"],"summary":"Get SLA report","description":"Generate SLA report with MTTR, MTBF, latency percentiles, error budget.","operationId":"get_sla_report_api_v1_monitors__monitor_id__sla_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":2160,"minimum":1,"description":"Report period in hours","default":24,"title":"Hours"},"description":"Report period in hours"},{"name":"slo_target","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":90.0},{"type":"null"}],"description":"SLO target percentage for error budget (e.g., 99.9)","title":"Slo Target"},"description":"SLO target percentage for error budget (e.g., 99.9)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/sla/export/pdf":{"get":{"tags":["Monitors"],"summary":"Export SLA report as PDF","description":"Download SLA report as a professionally formatted PDF document.","operationId":"export_sla_report_pdf_api_v1_monitors__monitor_id__sla_export_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":2160,"minimum":1,"description":"Report period in hours","default":24,"title":"Hours"},"description":"Report period in hours"},{"name":"slo_target","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":90.0},{"type":"null"}],"description":"SLO target percentage for error budget (e.g., 99.9)","title":"Slo Target"},"description":"SLO target percentage for error budget (e.g., 99.9)"}],"responses":{"200":{"description":"PDF file download","content":{"application/json":{"schema":{}},"application/pdf":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/sla/export/csv":{"get":{"tags":["Monitors"],"summary":"Export SLA report as CSV","description":"Download SLA report as a CSV file for spreadsheet analysis.","operationId":"export_sla_report_csv_api_v1_monitors__monitor_id__sla_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":2160,"minimum":1,"description":"Report period in hours","default":24,"title":"Hours"},"description":"Report period in hours"},{"name":"slo_target","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100.0,"minimum":90.0},{"type":"null"}],"description":"SLO target percentage for error budget (e.g., 99.9)","title":"Slo Target"},"description":"SLO target percentage for error budget (e.g., 99.9)"}],"responses":{"200":{"description":"CSV file download","content":{"application/json":{"schema":{}},"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause monitor","description":"Pause monitoring for a monitor (set is_active to false).","operationId":"pause_monitor_api_v1_monitors__monitor_id__pause_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume monitor","description":"Resume monitoring for a paused monitor (set is_active to true).","operationId":"resume_monitor_api_v1_monitors__monitor_id__resume_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/cert-chain":{"get":{"tags":["Monitors"],"summary":"Inspect TLS certificate chain","description":"Performs a live TLS handshake against the monitor's URL and returns a structured representation of the certificate chain the server sent. Useful for diagnosing 'incomplete chain' DOWN reports — browsers hide the misconfig via AIA-fetch, so users see a green padlock while our checker (and Python/Go/Java/curl/mobile clients) correctly fail.","operationId":"inspect_cert_chain_api_v1_monitors__monitor_id__cert_chain_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Bypass the 5-minute Redis cache (UI Refresh button).","default":false,"title":"Force"},"description":"Bypass the 5-minute Redis cache (UI Refresh button)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertChainResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/reset-stats":{"post":{"tags":["Monitors"],"summary":"Reset monitor statistics","description":"Wipe all check history (check_results, status_ranges, hourly/daily aggregates, per-probe state), associated incidents and alert_history rows, and reset the monitor's cached uptime fields. The monitor row itself, its configuration, alerts and probe assignments are preserved. Caller must pass `confirm: true` — defense in depth against accidental shell / LLM-tool invocations.","operationId":"reset_monitor_stats_api_v1_monitors__monitor_id__reset_stats_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetMonitorStatsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetMonitorStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/stats":{"get":{"tags":["Monitors"],"summary":"Get monitor stats","description":"Get detailed statistics for a monitor over a time period.","operationId":"get_monitor_stats_api_v1_monitors__monitor_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Hours to look back","default":24,"title":"Hours"},"description":"Hours to look back"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/results":{"get":{"tags":["Monitors"],"summary":"Get check results","description":"Get paginated check results for a monitor.","operationId":"get_monitor_results_api_v1_monitors__monitor_id__results_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Page Size"},"description":"Results per page"},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter results with created_at >= start_time (ISO 8601)","title":"Start Time"},"description":"Filter results with created_at >= start_time (ISO 8601)"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter results with created_at <= end_time (ISO 8601)","title":"End Time"},"description":"Filter results with created_at <= end_time (ISO 8601)"},{"name":"with_total","in":"query","required":false,"schema":{"type":"boolean","description":"When false, skip count(*) and set total = len(results).","default":true,"title":"With Total"},"description":"When false, skip count(*) and set total = len(results)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResultsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/status-ranges":{"get":{"tags":["Monitors"],"summary":"Get monitor state-history ranges","description":"Return run-length-encoded status ranges for a monitor, newest first. Each range is a contiguous period of identical status (UP/DOWN/TIMEOUT/DEGRADED) with the real started_at/ended_at (ended_at is null for the currently ongoing run).","operationId":"get_monitor_status_ranges_api_v1_monitors__monitor_id__status_ranges_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Ranges per page","default":20,"title":"Page Size"},"description":"Ranges per page"},{"name":"hours","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":17520,"minimum":1},{"type":"null"}],"description":"Window size in hours (e.g. 24, 168, 720). Returns ranges that overlap the [now-hours, now] interval. Omit to get full history.","title":"Hours"},"description":"Window size in hours (e.g. 24, 168, 720). Returns ranges that overlap the [now-hours, now] interval. Omit to get full history."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusRangeListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/timeline":{"get":{"tags":["Monitors"],"summary":"Get monitor timeline","description":"Timeline of monitor state over a time period. For multi-probe monitors (≥2 probes) the default response is aggregate-driven — one entry per `status_range` row representing the consensus state — so the chart shows clean step transitions instead of probe-side noise. Pass `?probe_id=` to drill into a specific probe's per-row check_results timeline. Single-probe and central monitors always use the per-row path.","operationId":"get_monitor_timeline_api_v1_monitors__monitor_id__timeline_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Number of hours to look back","default":24,"title":"Hours"},"description":"Number of hours to look back"},{"name":"probe_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional probe filter — when set, returns the per-row timeline for ONE probe (drill-down view). When omitted on a multi-probe monitor, returns aggregate consensus state from status_ranges. Has no effect on single-probe or central monitors (their timeline already has one source).","title":"Probe Id"},"description":"Optional probe filter — when set, returns the per-row timeline for ONE probe (drill-down view). When omitted on a multi-probe monitor, returns aggregate consensus state from status_ranges. Has no effect on single-probe or central monitors (their timeline already has one source)."},{"name":"include_manual","in":"query","required":false,"schema":{"type":"boolean","description":"When `?probe_id=` drilldown is set, controls whether manual diagnostic checks (`is_manual=true`) and central fallback rows (`is_fallback=true`) are included. Default `true` preserves the operator's 'show me what this probe saw, diagnostics included' drill-down semantic. Front-end Compare-probes view passes `false` to keep the multi-line chart consistent with the bucketed Min/Max/Avg badge below (which always excludes manuals via `get_average_response_time(exclude_manual=True)`). Has no effect outside drill-down — aggregate / non-drilldown per-row paths already filter manuals.","default":true,"title":"Include Manual"},"description":"When `?probe_id=` drilldown is set, controls whether manual diagnostic checks (`is_manual=true`) and central fallback rows (`is_fallback=true`) are included. Default `true` preserves the operator's 'show me what this probe saw, diagnostics included' drill-down semantic. Front-end Compare-probes view passes `false` to keep the multi-line chart consistent with the bucketed Min/Max/Avg badge below (which always excludes manuals via `get_average_response_time(exclude_manual=True)`). Has no effect outside drill-down — aggregate / non-drilldown per-row paths already filter manuals."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/response-time-distribution":{"get":{"tags":["Monitors"],"summary":"Get response time distribution","description":"Get response time percentiles (P50, P90, P95, P99) for a monitor.","operationId":"get_response_time_distribution_api_v1_monitors__monitor_id__response_time_distribution_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Number of hours to analyze","default":24,"title":"Hours"},"description":"Number of hours to analyze"},{"name":"probe_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional probe filter — percentiles of ONE probe's checks (drill-down view).","title":"Probe Id"},"description":"Optional probe filter — percentiles of ONE probe's checks (drill-down view)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeDistributionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/{monitor_id}/dnsbl/provider-history":{"get":{"tags":["Monitors"],"summary":"DNSBL per-provider listing history","description":"Per-provider timeline of whether each DNSBL provider flagged the monitored target during the requested window. Returns one entry per provider that appeared in at least one check — clean-the-whole-time providers are included so the UI can still render their flat-green sparkline. Non-DNSBL monitors return an empty list. Samples are downsampled to at most ~300 points per provider for 7d/30d windows so the JSON payload stays under a few hundred kB.","operationId":"get_dnsbl_provider_history_api_v1_monitors__monitor_id__dnsbl_provider_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","maximum":2147483647,"minimum":1,"description":"Monitor ID","title":"Monitor Id"},"description":"Monitor ID"},{"name":"window","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d)$","description":"Window: 24h, 7d, or 30d","default":"24h","title":"Window"},"description":"Window: 24h, 7d, or 30d"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsblProviderHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors/reorder":{"put":{"tags":["Monitors"],"summary":"Reorder monitors","description":"Set custom display order for monitors in a workspace.","operationId":"reorder_monitors_api_v1_monitors_reorder_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderMonitorsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reorder Monitors Api V1 Monitors Reorder Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/alerts":{"post":{"tags":["Alerts"],"summary":"Create alert","description":"Create a new alert configuration for monitor notifications.","operationId":"create_alert_api_v1_alerts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlertRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Alerts"],"summary":"List alerts","description":"Get a paginated list of alerts for the current user.","operationId":"list_alerts_api_v1_alerts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/channels/availability":{"get":{"tags":["Alerts"],"summary":"Get channel availability","description":"Check which alert channels are configured and available.","operationId":"get_channel_availability_api_v1_alerts_channels_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelAvailabilityResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/alerts/history":{"get":{"tags":["Alerts"],"summary":"Get all alerts history","description":"Get notification history for all user's alerts.","operationId":"get_all_alerts_history_api_v1_alerts_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertHistoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/{alert_id}":{"get":{"tags":["Alerts"],"summary":"Get alert","description":"Get details of a specific alert.","operationId":"get_alert_api_v1_alerts__alert_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Alerts"],"summary":"Update alert","description":"Update an existing alert configuration (partial update).","operationId":"update_alert_api_v1_alerts__alert_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Alerts"],"summary":"Delete alert","description":"Delete an alert configuration.","operationId":"delete_alert_api_v1_alerts__alert_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/{alert_id}/history":{"get":{"tags":["Alerts"],"summary":"Get alert history","description":"Get the notification history for a specific alert.","operationId":"get_alert_history_api_v1_alerts__alert_id__history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertHistoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/{alert_id}/test":{"post":{"tags":["Alerts"],"summary":"Test alert","description":"Send a test notification using the alert configuration.","operationId":"test_alert_api_v1_alerts__alert_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestAlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts/test-send":{"post":{"tags":["Alerts"],"summary":"Test send (ad-hoc)","description":"Send a real test notification to the given channel/target without saving an alert. Used by AlertForm to validate deliverability before the user commits the form. Returns a step-by-step debug trace so the operator can see why a send failed (Telegram /start state, bot credentials, network reachability).","operationId":"test_send_api_v1_alerts_test_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/alerts/{alert_id}/toggle":{"post":{"tags":["Alerts"],"summary":"Toggle alert","description":"Toggle the active state of an alert (enable/disable).","operationId":"toggle_alert_api_v1_alerts__alert_id__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alert-channel-configs":{"get":{"tags":["Alert Channel Configs"],"summary":"List alert channel configurations","description":"Get all alert channel configurations for the authenticated user.","operationId":"list_alert_channel_configs_api_v1_alert_channel_configs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Alert Channel Configs"],"summary":"Create alert channel configuration","description":"Create a new alert channel configuration. Each user can have one configuration per channel type. Configurations store channel-specific credentials and settings. Plan limits are enforced - free users can configure 2 channels.","operationId":"create_alert_channel_config_api_v1_alert_channel_configs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAlertChannelConfigRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/alert-channel-configs/{config_id}":{"get":{"tags":["Alert Channel Configs"],"summary":"Get alert channel configuration","description":"Get a specific alert channel configuration by ID.","operationId":"get_alert_channel_config_api_v1_alert_channel_configs__config_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Alert Channel Configs"],"summary":"Update alert channel configuration","description":"Update an existing alert channel configuration. You can update the configuration settings and/or the active status.","operationId":"update_alert_channel_config_api_v1_alert_channel_configs__config_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAlertChannelConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Alert Channel Configs"],"summary":"Delete alert channel configuration","description":"Delete an alert channel configuration. This action cannot be undone.","operationId":"delete_alert_channel_config_api_v1_alert_channel_configs__config_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alert-channel-configs/{config_id}/activate":{"post":{"tags":["Alert Channel Configs"],"summary":"Activate alert channel configuration","description":"Activate an alert channel configuration to start using it for alerts.","operationId":"activate_alert_channel_config_api_v1_alert_channel_configs__config_id__activate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alert-channel-configs/{config_id}/deactivate":{"post":{"tags":["Alert Channel Configs"],"summary":"Deactivate alert channel configuration","description":"Deactivate an alert channel configuration to stop using it for alerts.","operationId":"deactivate_alert_channel_config_api_v1_alert_channel_configs__config_id__deactivate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alert-channel-configs/channels/{channel}":{"get":{"tags":["Alert Channel Configs"],"summary":"Get configuration for specific channel","description":"Get the alert channel configuration for a specific channel type.","operationId":"get_channel_config_api_v1_alert_channel_configs_channels__channel__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","title":"Channel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertChannelConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alert-channel-configs/{config_id}/test":{"post":{"tags":["Alert Channel Configs"],"summary":"Test alert channel configuration","description":"Test if the alert channel configuration is working correctly. For Telegram, this verifies the bot token is valid by calling getMe API. For webhooks, this sends a test payload to the configured URL.","operationId":"test_alert_channel_config_api_v1_alert_channel_configs__config_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"integer","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Alert Channel Config Api V1 Alert Channel Configs  Config Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/events":{"get":{"tags":["webhooks"],"summary":"List available webhook event types","description":"List all available webhook event types with descriptions.\n\nNo authentication required.","operationId":"list_event_types_api_v1_webhooks_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventTypesResponse"}}}}}}},"/api/v1/webhooks":{"post":{"tags":["webhooks"],"summary":"Create a new webhook","description":"Create a new webhook configuration.\n\nThe webhook will receive POST requests with HMAC-SHA256 signed payloads\nfor the subscribed events.\n\n**Authentication required.**\n\nPlan limits:\n- FREE: 0 webhooks (not available)\n- PRO: 5 webhooks\n- BUSINESS: 20 webhooks\n- ENTERPRISE: 100 webhooks","operationId":"create_webhook_api_v1_webhooks_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"List user's webhooks","description":"List all webhooks for the current user.\n\n**Authentication required.**","operationId":"list_webhooks_api_v1_webhooks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}":{"get":{"tags":["webhooks"],"summary":"Get webhook details","description":"Get details of a specific webhook.\n\n**Authentication required.**","operationId":"get_webhook_api_v1_webhooks__webhook_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["webhooks"],"summary":"Update a webhook (partial update)","description":"Update an existing webhook.\n\nOnly provided fields will be updated.\n\n**Authentication required.**","operationId":"update_webhook_api_v1_webhooks__webhook_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete a webhook","description":"Delete a webhook and all its deliveries.\n\n**Authentication required.**","operationId":"delete_webhook_api_v1_webhooks__webhook_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/test":{"post":{"tags":["webhooks"],"summary":"Test a webhook","description":"Send a test payload to the webhook endpoint.\n\nThis will send a test event to verify the webhook configuration.\nThe test payload includes a `test: true` field.\n\n**Authentication required.**","operationId":"test_webhook_api_v1_webhooks__webhook_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/secret":{"post":{"tags":["webhooks"],"summary":"Regenerate webhook secret","description":"Regenerate the webhook's signing secret.\n\nThe new secret will be used for all future webhook signatures.\nMake sure to update your webhook handler with the new secret.\n\n**Warning:** The old secret will be immediately invalidated.\n\n**Authentication required.**","operationId":"regenerate_secret_api_v1_webhooks__webhook_id__secret_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/stats":{"get":{"tags":["webhooks"],"summary":"Get webhook statistics","description":"Get delivery statistics for a webhook.\n\n**Authentication required.**","operationId":"get_webhook_stats_api_v1_webhooks__webhook_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List webhook deliveries","description":"List delivery history for a webhook.\n\n**Authentication required.**","operationId":"list_deliveries_api_v1_webhooks__webhook_id__deliveries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/dlq":{"get":{"tags":["webhooks"],"summary":"List dead letter queue entries","description":"List dead letter queue entries for a webhook.\n\nBy default, only shows unresolved entries.\n\n**Authentication required.**","operationId":"list_dlq_entries_api_v1_webhooks__webhook_id__dlq_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Resolved"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDLQListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/dlq/{dlq_id}/retry":{"post":{"tags":["webhooks"],"summary":"Retry a DLQ entry","description":"Manually retry a dead letter queue entry.\n\nCreates a new delivery attempt for the DLQ entry's payload.\n\n**Authentication required.**","operationId":"retry_dlq_entry_api_v1_webhooks__webhook_id__dlq__dlq_id__retry_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"dlq_id","in":"path","required":true,"schema":{"type":"string","title":"Dlq Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/dlq/{dlq_id}/resolve":{"post":{"tags":["webhooks"],"summary":"Resolve a DLQ entry","description":"Mark a DLQ entry as resolved without retrying.\n\nUse this to dismiss entries that don't need to be retried.\n\n**Authentication required.**","operationId":"resolve_dlq_entry_api_v1_webhooks__webhook_id__dlq__dlq_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"dlq_id","in":"path","required":true,"schema":{"type":"string","title":"Dlq Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveDLQRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDLQEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/visit":{"post":{"tags":["analytics"],"summary":"Track anonymous page visit","description":"Track a page visit from any visitor (authenticated or anonymous). No authentication required. Uses localStorage UUID for uniqueness. One row per visitor per day (upsert pattern).","operationId":"track_visit_api_v1_analytics_visit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitRequest"}}},"required":true},"responses":{"204":{"description":"Visit tracked successfully"},"422":{"description":"Invalid visitor_id format (must be UUID)"}}}},"/api/v1/analytics/stats":{"get":{"tags":["analytics"],"summary":"Get user activity statistics","description":"Returns DAU, WAU, MAU, active sessions, and stickiness ratio.","operationId":"get_stats_api_v1_analytics_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivityStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/analytics/retention":{"get":{"tags":["analytics"],"summary":"Get retention statistics","description":"Returns D1, D7, D30 retention rates with cohort sizes.","operationId":"get_retention_api_v1_analytics_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/analytics/churn":{"get":{"tags":["analytics"],"summary":"Get churn statistics","description":"Returns churn rate and counts for users inactive after 30 days.","operationId":"get_churn_api_v1_analytics_churn_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurnStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/analytics/funnel":{"get":{"tags":["analytics"],"summary":"Get funnel statistics","description":"Returns funnel stage counts and conversion rates.","operationId":"get_funnel_api_v1_analytics_funnel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunnelStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/analytics/full":{"get":{"tags":["analytics"],"summary":"Get full analytics snapshot","description":"Returns all analytics metrics in a single response.","operationId":"get_full_analytics_api_v1_analytics_full_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullAnalyticsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/dashboard/stats":{"get":{"tags":["Dashboard"],"summary":"Get dashboard statistics","description":"Get aggregated dashboard stats: monitor counts, uptime, activity.","operationId":"get_dashboard_stats_api_v1_dashboard_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/uptime-summary":{"get":{"tags":["Dashboard"],"summary":"Get uptime summary","description":"Get uptime summary for all monitors with optional time period filter.","operationId":"get_uptime_summary_api_v1_dashboard_uptime_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimePeriod","description":"Time period","default":"24h"},"description":"Time period"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UptimeSummaryResponse"},"title":"Response Get Uptime Summary Api V1 Dashboard Uptime Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/incidents":{"get":{"tags":["Dashboard"],"summary":"Get recent incidents","description":"Get recent incidents across all monitors with optional time period filter.","operationId":"get_incidents_api_v1_dashboard_incidents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimePeriod","description":"Time period","default":"7d"},"description":"Time period"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum incidents to return","default":50,"title":"Limit"},"description":"Maximum incidents to return"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/presentation__api__v1__schemas__dashboard__IncidentResponse"},"title":"Response Get Incidents Api V1 Dashboard Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/alerts-summary":{"get":{"tags":["Dashboard"],"summary":"Get alerts summary","description":"Get alerts summary including counts by channel and recent activity.","operationId":"get_alerts_summary_api_v1_dashboard_alerts_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertsSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/combined":{"get":{"tags":["Dashboard"],"summary":"Get combined dashboard data","description":"Get all dashboard data in a single request for optimal performance.","operationId":"get_combined_dashboard_api_v1_dashboard_combined_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimePeriod","description":"Time period","default":"24h"},"description":"Time period"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardCombinedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/counts":{"get":{"tags":["Dashboard"],"summary":"Get live dashboard counters","description":"Monitor, heartbeat and alert counters plus ongoing incidents — what the sidebar and list pages poll. No uptime, incident-history or alert-history aggregates; GET /dashboard/combined carries those.","operationId":"get_dashboard_counts_api_v1_dashboard_counts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardCountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["feedback"],"summary":"Create Feedback","description":"Submit new feedback.\n\nCreates a new feedback item for the current workspace.\nFeedback is automatically associated with the current user.\n\nArgs:\n    request: FastAPI Request object (for rate limiting)\n    data: Feedback creation data (type, title, description)\n    current_user_id: ID of authenticated user\n    current_workspace: Current workspace entity\n    feedback_service: Feedback service dependency\n\nReturns:\n    Created feedback with ID and timestamps\n\nRaises:\n    HTTPException 400: Validation error\n    HTTPException 401: Not authenticated","operationId":"create_feedback_api_v1_feedback_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["feedback"],"summary":"List Feedback","description":"List feedback for current workspace.\n\nReturns paginated list of feedback items with optional filtering\nby type and status. Results ordered by creation date (newest first).\n\nArgs:\n    current_workspace: Current workspace entity\n    feedback_service: Feedback service dependency\n    type_filter: Optional type filter (idea, bug, feedback)\n    status_filter: Optional status filter\n    limit: Maximum items to return (1-100)\n    offset: Pagination offset\n\nReturns:\n    Paginated feedback list with total count\n\nRaises:\n    HTTPException 400: Invalid filter values\n    HTTPException 401: Not authenticated","operationId":"list_feedback_api_v1_feedback_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type (idea, bug, feedback)","title":"Type Filter"},"description":"Filter by type (idea, bug, feedback)"},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status Filter"},"description":"Filter by status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum items per page","default":100,"title":"Limit"},"description":"Maximum items per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/{feedback_id}":{"get":{"tags":["feedback"],"summary":"Get Feedback","description":"Get single feedback by ID.\n\nReturns detailed information about a specific feedback item.\nOnly returns feedback from the current workspace.\n\nArgs:\n    request: FastAPI Request object (for rate limiting)\n    feedback_id: Feedback ID\n    current_workspace: Current workspace entity\n    feedback_service: Feedback service dependency\n\nReturns:\n    Feedback details\n\nRaises:\n    HTTPException 404: Feedback not found in workspace\n    HTTPException 401: Not authenticated","operationId":"get_feedback_api_v1_feedback__feedback_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"integer","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["feedback"],"summary":"Delete Feedback","description":"Delete feedback (admin only).\n\nPermanently deletes a feedback item from the workspace.\n\nArgs:\n    request: FastAPI Request object (for rate limiting)\n    feedback_id: Feedback ID\n    current_user: Current authenticated user (for admin check)\n    current_workspace: Current workspace entity\n    feedback_service: Feedback service dependency\n\nRaises:\n    HTTPException 403: Not an admin\n    HTTPException 404: Feedback not found\n    HTTPException 401: Not authenticated","operationId":"delete_feedback_api_v1_feedback__feedback_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"integer","title":"Feedback Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/{feedback_id}/status":{"put":{"tags":["feedback"],"summary":"Update Feedback Status","description":"Update feedback status (admin only).\n\nUpdates the status of a feedback item. This endpoint is typically\nused by admins to track feedback progress through the workflow:\nopen → planned → in_progress → done/rejected\n\nArgs:\n    request: FastAPI Request object (for rate limiting)\n    feedback_id: Feedback ID\n    status_data: New status data\n    current_user: Current authenticated user (for admin check)\n    current_workspace: Current workspace entity\n    feedback_service: Feedback service dependency\n\nReturns:\n    Updated feedback\n\nRaises:\n    HTTPException 403: Not an admin\n    HTTPException 404: Feedback not found\n    HTTPException 400: Invalid status value\n    HTTPException 401: Not authenticated","operationId":"update_feedback_status_api_v1_feedback__feedback_id__status_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"integer","title":"Feedback Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeedbackStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents":{"get":{"tags":["incidents"],"summary":"List Incidents","description":"List incidents for the current workspace or all workspaces.\n\nIf workspace_id is not provided, returns incidents from ALL user's workspaces.\nSupports filtering by status and pagination.","operationId":"list_incidents_api_v1_incidents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status Filter"},"description":"Filter by status"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Alias of status_filter (the intuitive name; wins when both sent)","title":"Status"},"description":"Alias of status_filter (the intuitive name; wins when both sent)"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Period lower bound. Ongoing incidents are always included; resolved ones only if resolved_at >= since.","title":"Since"},"description":"Period lower bound. Ongoing incidents are always included; resolved ones only if resolved_at >= since."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["incidents"],"summary":"Create Incident","operationId":"create_incident_api_v1_incidents_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__incidents__IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/open":{"get":{"tags":["incidents"],"summary":"List Open Incidents","description":"Every open incident (investigating/identified/monitoring), newest first, unpaged.\n\n``total`` is /incidents/stats.ongoing and /dashboard/counts.incidents_ongoing (one\npredicate) and keeps counting past ``limit`` rows. Declared before GET /{incident_id}.","operationId":"list_open_incidents_api_v1_incidents_open_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/stats":{"get":{"tags":["incidents"],"summary":"Get Incident Stats","description":"Aggregate incident stats (total/ongoing/resolved/MTTR) without pagination.\n\nThe /incidents summary cards previously recomputed these numbers from\nthe paginated list and drifted when the user changed pages (bug 17).\nDeclared BEFORE GET /{incident_id} so \"stats\" is not parsed as an id.","operationId":"get_incident_stats_api_v1_incidents_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Period lower bound. Ongoing incidents always counted; resolved ones only if resolved_at >= since (matches the list).","title":"Since"},"description":"Period lower bound. Ongoing incidents always counted; resolved ones only if resolved_at >= since (matches the list)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}":{"get":{"tags":["incidents"],"summary":"Get Incident","operationId":"get_incident_api_v1_incidents__incident_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__incidents__IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["incidents"],"summary":"Update Incident","operationId":"update_incident_api_v1_incidents__incident_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__incidents__IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["incidents"],"summary":"Delete Incident","operationId":"delete_incident_api_v1_incidents__incident_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/updates":{"post":{"tags":["incidents"],"summary":"Add Incident Update","description":"Add a timeline update to an incident.","operationId":"add_incident_update_api_v1_incidents__incident_id__updates_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentUpdateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/incidents/{incident_id}/resolve":{"post":{"tags":["incidents"],"summary":"Resolve Incident","description":"Resolve an incident.","operationId":"resolve_incident_api_v1_incidents__incident_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"integer","title":"Incident Id"}},{"name":"message","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resolution message","title":"Message"},"description":"Resolution message"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__incidents__IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/maintenance":{"get":{"tags":["maintenance"],"summary":"List Maintenance","description":"List maintenance windows for the current workspace or all workspaces.\n\nIf workspace_id is not provided, returns maintenance from ALL user's workspaces.\nSupports filtering by status and pagination.","operationId":"list_maintenance_api_v1_maintenance_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status Filter"},"description":"Filter by status"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["maintenance"],"summary":"Create Maintenance","operationId":"create_maintenance_api_v1_maintenance_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/maintenance/{maintenance_id}":{"get":{"tags":["maintenance"],"summary":"Get Maintenance","operationId":"get_maintenance_api_v1_maintenance__maintenance_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"maintenance_id","in":"path","required":true,"schema":{"type":"integer","title":"Maintenance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["maintenance"],"summary":"Update Maintenance","operationId":"update_maintenance_api_v1_maintenance__maintenance_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"maintenance_id","in":"path","required":true,"schema":{"type":"integer","title":"Maintenance Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["maintenance"],"summary":"Delete Maintenance","operationId":"delete_maintenance_api_v1_maintenance__maintenance_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"maintenance_id","in":"path","required":true,"schema":{"type":"integer","title":"Maintenance Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/maintenance/{maintenance_id}/cancel":{"post":{"tags":["maintenance"],"summary":"Cancel Maintenance","description":"Cancel a maintenance window.","operationId":"cancel_maintenance_api_v1_maintenance__maintenance_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"maintenance_id","in":"path","required":true,"schema":{"type":"integer","title":"Maintenance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats":{"post":{"tags":["heartbeats"],"summary":"Create heartbeat monitor","description":"Create a new heartbeat monitor for cron job/task monitoring.","operationId":"create_heartbeat_monitor_api_v1_heartbeats_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHeartbeatMonitorRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorWithSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["heartbeats"],"summary":"List heartbeat monitors","description":"Get all heartbeat monitors for the current user.","operationId":"list_heartbeat_monitors_api_v1_heartbeats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","description":"Include inactive monitors","default":false,"title":"Include Inactive"},"description":"Include inactive monitors"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}":{"get":{"tags":["heartbeats"],"summary":"Get heartbeat monitor","description":"Get details of a specific heartbeat monitor.","operationId":"get_heartbeat_monitor_api_v1_heartbeats__monitor_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["heartbeats"],"summary":"Update heartbeat monitor","description":"Update a heartbeat monitor configuration (partial update).","operationId":"update_heartbeat_monitor_api_v1_heartbeats__monitor_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHeartbeatMonitorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["heartbeats"],"summary":"Delete heartbeat monitor","description":"Delete a heartbeat monitor and all its ping history.","operationId":"delete_heartbeat_monitor_api_v1_heartbeats__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}/pause":{"post":{"tags":["heartbeats"],"summary":"Pause heartbeat monitor","description":"Pause a heartbeat monitor (stops alerting on missed pings).","operationId":"pause_heartbeat_monitor_api_v1_heartbeats__monitor_id__pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}/resume":{"post":{"tags":["heartbeats"],"summary":"Resume heartbeat monitor","description":"Resume a paused heartbeat monitor.","operationId":"resume_heartbeat_monitor_api_v1_heartbeats__monitor_id__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}/regenerate-secret":{"post":{"tags":["heartbeats"],"summary":"Regenerate secret","description":"Regenerate the secret token for a heartbeat monitor.","operationId":"regenerate_secret_api_v1_heartbeats__monitor_id__regenerate_secret_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__heartbeats__RegenerateSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}/stats":{"get":{"tags":["heartbeats"],"summary":"Get monitor statistics","description":"Get statistics for a heartbeat monitor.","operationId":"get_heartbeat_stats_api_v1_heartbeats__monitor_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeats/{monitor_id}/pings":{"get":{"tags":["heartbeats"],"summary":"List pings","description":"Get ping history for a heartbeat monitor.","operationId":"list_pings_api_v1_heartbeats__monitor_id__pings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatPingListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ping/{ping_key}/{slug}/start":{"post":{"tags":["heartbeat-ping"],"summary":"Record start signal (secure URL)","description":"Record a job start signal via secure URL.","operationId":"record_start_secure_api_v1_ping__ping_key___slug__start_post","parameters":[{"name":"ping_key","in":"path","required":true,"schema":{"type":"string","title":"Ping Key"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RecordPingRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ping/{ping_key}/{slug}/success":{"post":{"tags":["heartbeat-ping"],"summary":"Record success signal (secure URL)","description":"Record a job success signal via secure URL.","operationId":"record_success_secure_api_v1_ping__ping_key___slug__success_post","parameters":[{"name":"ping_key","in":"path","required":true,"schema":{"type":"string","title":"Ping Key"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RecordPingRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ping/{ping_key}/{slug}/fail":{"post":{"tags":["heartbeat-ping"],"summary":"Record fail signal (secure URL)","description":"Record a job failure signal via secure URL.","operationId":"record_fail_secure_api_v1_ping__ping_key___slug__fail_post","parameters":[{"name":"ping_key","in":"path","required":true,"schema":{"type":"string","title":"Ping Key"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RecordPingRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ping/{part1}/{part2}":{"post":{"tags":["heartbeat-ping"],"summary":"Record ping (secure or legacy signal)","description":"Handle two-segment ping URL (secure ping_key/slug OR legacy slug/signal).\n\nResolution order:\n1. If part2 is a signal name (start/success/fail): try legacy first\n   (common case for existing monitors), then secure\n2. Otherwise: try secure first, then legacy slug=part1\nThis avoids unnecessary DB lookups for the common legacy signal case.","operationId":"record_ping_two_parts_api_v1_ping__part1___part2__post","parameters":[{"name":"part1","in":"path","required":true,"schema":{"type":"string","title":"Part1"}},{"name":"part2","in":"path","required":true,"schema":{"type":"string","title":"Part2"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RecordPingRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["heartbeat-ping"],"summary":"Record ping GET (secure or legacy signal)","description":"Handle two-segment GET ping URL (secure or legacy).","operationId":"record_ping_two_parts_get_api_v1_ping__part1___part2__get","parameters":[{"name":"part1","in":"path","required":true,"schema":{"type":"string","title":"Part1"}},{"name":"part2","in":"path","required":true,"schema":{"type":"string","title":"Part2"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ping/{slug}":{"post":{"tags":["heartbeat-ping"],"summary":"Record ping","description":"Record a heartbeat ping (single-slug URL).","operationId":"record_ping_api_v1_ping__slug__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RecordPingRequest"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["heartbeat-ping"],"summary":"Record ping GET","description":"Record a ping using GET.","operationId":"record_ping_get_api_v1_ping__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"secret","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},{"name":"X-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingAckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/":{"post":{"tags":["webhook-checks"],"summary":"Create webhook check monitor","description":"Create a webhook check monitor for external system status updates.","operationId":"create_webhook_check_api_v1_webhook_checks__post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookCheckRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckWithSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhook-checks"],"summary":"List webhook checks","description":"List all webhook check monitors for the current user.","operationId":"list_webhook_checks_api_v1_webhook_checks__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Page Size"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/WebhookCheckStatus"},{"type":"null"}],"title":"Status Filter"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}":{"get":{"tags":["webhook-checks"],"summary":"Get webhook check","description":"Get details of a specific webhook check monitor.","operationId":"get_webhook_check_api_v1_webhook_checks__check_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["webhook-checks"],"summary":"Update webhook check","description":"Update a webhook check monitor configuration.","operationId":"update_webhook_check_api_v1_webhook_checks__check_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhook-checks"],"summary":"Delete webhook check","description":"Delete a webhook check monitor and all its event history.","operationId":"delete_webhook_check_api_v1_webhook_checks__check_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}/pause":{"post":{"tags":["webhook-checks"],"summary":"Pause webhook check","description":"Pause monitoring for a webhook check. Incoming webhooks will still be recorded.","operationId":"pause_webhook_check_api_v1_webhook_checks__check_id__pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}/resume":{"post":{"tags":["webhook-checks"],"summary":"Resume webhook check","description":"Resume monitoring for a paused webhook check.","operationId":"resume_webhook_check_api_v1_webhook_checks__check_id__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}/regenerate-secret":{"post":{"tags":["webhook-checks"],"summary":"Regenerate secret","description":"Generate a new webhook secret. Old secret will be invalidated.","operationId":"regenerate_secret_api_v1_webhook_checks__check_id__regenerate_secret_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__webhook_checks__RegenerateSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}/stats":{"get":{"tags":["webhook-checks"],"summary":"Get webhook check statistics","description":"Get statistics for a webhook check including uptime and webhook counts.","operationId":"get_webhook_check_stats_api_v1_webhook_checks__check_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCheckStatsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-checks/{check_id}/events":{"get":{"tags":["webhook-checks"],"summary":"Get webhook events","description":"Get the history of incoming webhooks for this check.","operationId":"get_webhook_events_api_v1_webhook_checks__check_id__events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","title":"Check Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Page Size"}},{"name":"valid_only","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-check/{slug}":{"post":{"tags":["webhook-receive"],"summary":"Receive incoming webhook","description":"Public endpoint to receive status updates from external monitoring systems. The slug is a unique identifier for each webhook check monitor. Optional authentication via X-Webhook-Secret header.","operationId":"receive_webhook_api_v1_webhook_check__slug__post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Webhook accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAckResponse"}}}},"400":{"description":"Invalid payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookErrorResponse"}}}},"401":{"description":"Authentication failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookErrorResponse"}}}},"403":{"description":"IP not allowed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookErrorResponse"}}}},"404":{"description":"Webhook check not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/resend":{"post":{"tags":["Resend Webhook"],"summary":"Receive Resend delivery webhook","description":"Public endpoint; Svix-signed by Resend. Updates the matching alert_history row when a previously-accepted email later bounces, hits a quota, or generates a spam complaint.","operationId":"resend_webhook_api_v1_webhooks_resend_post","responses":{"204":{"description":"Successful Response"}}}},"/api/v1/monitor-groups":{"post":{"tags":["Monitor Groups"],"summary":"Create Monitor Group","description":"Create a new monitor group.\n\nMonitor groups allow you to aggregate up to 200 monitors into a logical unit\nwith threshold-based status calculation.","operationId":"create_monitor_group_api_v1_monitor_groups_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMonitorGroupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Monitor Groups"],"summary":"List Monitor Groups","description":"List monitor groups for the current user.\n\nSupports pagination and filtering by active status, tag, and workspace.","operationId":"list_monitor_groups_api_v1_monitor_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return active groups","default":true,"title":"Active Only"},"description":"Only return active groups"},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag","title":"Tag"},"description":"Filter by tag"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitor-groups/stats":{"get":{"tags":["Monitor Groups"],"summary":"Get Monitor Group Stats","description":"Get aggregate statistics for all monitor groups.\n\nReturns counts by status, activity, and average monitors per group.","operationId":"get_monitor_group_stats_api_v1_monitor_groups_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/monitor-groups/{group_id}":{"get":{"tags":["Monitor Groups"],"summary":"Get Monitor Group","operationId":"get_monitor_group_api_v1_monitor_groups__group_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Monitor Groups"],"summary":"Update Monitor Group","description":"Update a monitor group.\n\nOnly provided fields will be updated.","operationId":"update_monitor_group_api_v1_monitor_groups__group_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMonitorGroupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitor Groups"],"summary":"Delete Monitor Group","operationId":"delete_monitor_group_api_v1_monitor_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitor-groups/{group_id}/monitors":{"post":{"tags":["Monitor Groups"],"summary":"Add Monitors To Group","description":"Add monitors to a group.\n\nEach group can have up to 200 monitors.","operationId":"add_monitors_to_group_api_v1_monitor_groups__group_id__monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMonitorsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitor Groups"],"summary":"Remove Monitors From Group","description":"Remove monitors from a group.","operationId":"remove_monitors_from_group_api_v1_monitor_groups__group_id__monitors_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveMonitorsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitor-groups/{group_id}/tags":{"post":{"tags":["Monitor Groups"],"summary":"Add Tags To Group","description":"Add tags to a group.\n\nEach group can have up to 50 tags.","operationId":"add_tags_to_group_api_v1_monitor_groups__group_id__tags_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitor Groups"],"summary":"Remove Tags From Group","description":"Remove tags from a group.","operationId":"remove_tags_from_group_api_v1_monitor_groups__group_id__tags_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitor-groups/{group_id}/status":{"get":{"tags":["Monitor Groups"],"summary":"Get Group Status","description":"Get detailed status breakdown for a monitor group.\n\nReturns counts of monitors in each status category and health percentage.","operationId":"get_group_status_api_v1_monitor_groups__group_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Monitor Groups"],"summary":"Update Group Status","description":"Update group status based on current monitor statuses.\n\nThis endpoint is typically called by the scheduler to update the aggregate\nstatus based on the latest monitor check results.","operationId":"update_group_status_api_v1_monitor_groups__group_id__status_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGroupStatusRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorGroupStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces":{"get":{"tags":["Workspaces"],"summary":"List Workspaces","description":"List all workspaces accessible to the current user (owned + shared).\n\nReturns paginated list of workspaces with monitor counts and caller role.","operationId":"list_workspaces_api_v1_workspaces_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":100,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workspaces"],"summary":"Create Workspace","description":"Create a new workspace.\n\nWorkspace limits are enforced by subscription plan:\n- FREE: 10 workspaces\n- PRO: 25 workspaces\n- BUSINESS: 50 workspaces\n- ENTERPRISE: 200 workspaces","operationId":"create_workspace_api_v1_workspaces_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/summary":{"get":{"tags":["Workspaces"],"summary":"List Workspaces Summary","description":"List accessible workspaces (owned + shared) for dropdown selectors.\n\nReturns minimal workspace info plus caller role for UI selectors.","operationId":"list_workspaces_summary_api_v1_workspaces_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WorkspaceSummaryResponse"},"type":"array","title":"Response List Workspaces Summary Api V1 Workspaces Summary Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workspaces/default":{"get":{"tags":["Workspaces"],"summary":"Get Default Workspace","description":"Get the user's default workspace.\n\nReturns null if no default workspace is set.","operationId":"get_default_workspace_api_v1_workspaces_default_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/WorkspaceResponse"},{"type":"null"}],"title":"Response Get Default Workspace Api V1 Workspaces Default Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workspaces/{workspace_id}":{"get":{"tags":["Workspaces"],"summary":"Get Workspace","description":"Get workspace by ID.\n\nOnly returns workspaces owned by the current user.","operationId":"get_workspace_api_v1_workspaces__workspace_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workspaces"],"summary":"Update Workspace","description":"Update workspace.\n\nOnly the workspace owner can update it.","operationId":"update_workspace_api_v1_workspaces__workspace_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workspaces"],"summary":"Delete Workspace","description":"Delete workspace.\n\nCannot delete:\n- Workspace with monitors (move/delete monitors first)\n- The last remaining workspace","operationId":"delete_workspace_api_v1_workspaces__workspace_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/set-default":{"post":{"tags":["Workspaces"],"summary":"Set Default Workspace","description":"Set workspace as the default for the current user.\n\nThe default workspace is pre-selected in UI dropdowns.","operationId":"set_default_workspace_api_v1_workspaces__workspace_id__set_default_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/regenerate-ping-key":{"post":{"tags":["Workspaces"],"summary":"Regenerate workspace ping key","description":"Regenerate the workspace's heartbeat ping key. WARNING: This invalidates ALL existing heartbeat ping URLs for this workspace.","operationId":"regenerate_ping_key_api_v1_workspaces__workspace_id__regenerate_ping_key_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/members":{"get":{"tags":["Workspaces"],"summary":"List Workspace Members","operationId":"list_workspace_members_api_v1_workspaces__workspace_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkspaceMemberResponse"},"title":"Response List Workspace Members Api V1 Workspaces  Workspace Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workspaces"],"summary":"Add Workspace Member","operationId":"add_workspace_member_api_v1_workspaces__workspace_id__members_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWorkspaceMemberRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/invites":{"post":{"tags":["Workspaces"],"summary":"Create Workspace Invite Link","operationId":"create_workspace_invite_link_api_v1_workspaces__workspace_id__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceInviteRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceInviteLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/invites/accept":{"post":{"tags":["Workspaces"],"summary":"Accept Workspace Invite","operationId":"accept_workspace_invite_api_v1_workspaces_invites_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptWorkspaceInviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptWorkspaceInviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/workspaces/{workspace_id}/members/{member_id}":{"patch":{"tags":["Workspaces"],"summary":"Change Workspace Member Role","operationId":"change_workspace_member_role_api_v1_workspaces__workspace_id__members__member_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeWorkspaceMemberRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workspaces"],"summary":"Remove Workspace Member","operationId":"remove_workspace_member_api_v1_workspaces__workspace_id__members__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/leave":{"post":{"tags":["Workspaces"],"summary":"Leave Workspace","operationId":"leave_workspace_api_v1_workspaces__workspace_id__leave_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"integer","title":"Workspace Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks":{"post":{"tags":["api-checks"],"summary":"Create Api Check","description":"Create a new API check.\n\nCreates a multi-step HTTP workflow monitor.","operationId":"create_api_check_api_v1_api_checks_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiCheckRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api-checks"],"summary":"List Api Checks","description":"List user's API checks with pagination and filtering.\n\nReturns summary view (without full step details).\nPagination is done at database level for efficiency (Bug #44 fix).","operationId":"list_api_checks_api_v1_api_checks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Size"},"description":"Items per page"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by active status","title":"Is Active"},"description":"Filter by active status"},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag","title":"Tag"},"description":"Filter by tag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks/{api_check_id}":{"get":{"tags":["api-checks"],"summary":"Get Api Check","description":"Get API check by ID.\n\nReturns full details including all step configurations.","operationId":"get_api_check_api_v1_api_checks__api_check_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-checks"],"summary":"Update Api Check","description":"Update an API check.\n\nOnly provided fields will be updated.","operationId":"update_api_check_api_v1_api_checks__api_check_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-checks"],"summary":"Delete Api Check","description":"Delete an API check.\n\nAlso deletes all associated check results.","operationId":"delete_api_check_api_v1_api_checks__api_check_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks/{api_check_id}/execute":{"post":{"tags":["api-checks"],"summary":"Execute Api Check","description":"Execute an API check on demand.\n\nRuns the multi-step workflow and returns detailed results.\nRate limited to 10/minute due to resource intensity.","operationId":"execute_api_check_api_v1_api_checks__api_check_id__execute_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteApiCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteApiCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks/{api_check_id}/results":{"get":{"tags":["api-checks"],"summary":"List Api Check Results","description":"List results for an API check with pagination.\n\nReturns summary view of check results.","operationId":"list_api_check_results_api_v1_api_checks__api_check_id__results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckResultListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks/{api_check_id}/results/{result_id}":{"get":{"tags":["api-checks"],"summary":"Get Api Check Result","description":"Get a specific API check result.\n\nReturns full details including all step results.","operationId":"get_api_check_result_api_v1_api_checks__api_check_id__results__result_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}},{"name":"result_id","in":"path","required":true,"schema":{"type":"string","title":"Result Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCheckResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-checks/{api_check_id}/stats":{"get":{"tags":["api-checks"],"summary":"Get Api Check Stats","description":"Get statistics for an API check.\n\nReturns success rate, average response time, and recent status.","operationId":"get_api_check_stats_api_v1_api_checks__api_check_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_check_id","in":"path","required":true,"schema":{"type":"string","title":"Api Check Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Hours to analyze","default":24,"title":"Hours"},"description":"Hours to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Api Check Stats Api V1 Api Checks  Api Check Id  Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys":{"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Create a new API key.\n\nIMPORTANT: The raw key is returned ONLY in this response.\nCopy it now - it cannot be retrieved later!\n\nAPI keys are used for programmatic access:\n- CI/CD integrations\n- Scripts and automation\n- AI agents (Claude, GPT, MCP servers)\n\nUsage:\n```\ncurl -H \"X-API-Key: pz_abc12345_...\" https://pingzen.dev/api/v1/monitors\n```","operationId":"create_api_key_api_v1_api_keys_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"List all API keys for the current workspace.\n\nReturns keys WITHOUT raw values - only the prefix is visible.","operationId":"list_api_keys_api_v1_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_revoked","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Revoked"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys/{key_id}":{"get":{"tags":["API Keys"],"summary":"Get Api Key","description":"Get API key by ID.\n\nReturns the key metadata - the raw key value is NEVER returned.","operationId":"get_api_key_api_v1_api_keys__key_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke an API key (soft delete).\n\nThe key will immediately stop working for authentication.\nThis action cannot be undone.","operationId":"revoke_api_key_api_v1_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports":{"post":{"tags":["Scheduled Reports"],"summary":"Create Scheduled Report","description":"Create a new scheduled report.\n\nThe report will be scheduled to run at the next appropriate time\nbased on the specified frequency.","operationId":"create_scheduled_report_api_v1_scheduled_reports_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScheduledReportRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Scheduled Reports"],"summary":"List Scheduled Reports","operationId":"list_scheduled_reports_api_v1_scheduled_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return active reports","default":false,"title":"Active Only"},"description":"Only return active reports"},{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace","title":"Workspace Id"},"description":"Filter by workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}":{"get":{"tags":["Scheduled Reports"],"summary":"Get Scheduled Report","operationId":"get_scheduled_report_api_v1_scheduled_reports__report_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Scheduled Reports"],"summary":"Update Scheduled Report","operationId":"update_scheduled_report_api_v1_scheduled_reports__report_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScheduledReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Scheduled Reports"],"summary":"Delete Scheduled Report","operationId":"delete_scheduled_report_api_v1_scheduled_reports__report_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}/pause":{"post":{"tags":["Scheduled Reports"],"summary":"Pause Scheduled Report","description":"Pause a scheduled report (set is_active to False).","operationId":"pause_scheduled_report_api_v1_scheduled_reports__report_id__pause_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}/resume":{"post":{"tags":["Scheduled Reports"],"summary":"Resume Scheduled Report","description":"Resume a paused scheduled report.","operationId":"resume_scheduled_report_api_v1_scheduled_reports__report_id__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}/toggle":{"post":{"tags":["Scheduled Reports"],"summary":"Toggle Scheduled Report","description":"Toggle a scheduled report active/inactive (convenience endpoint).","operationId":"toggle_scheduled_report_api_v1_scheduled_reports__report_id__toggle_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}/run":{"post":{"tags":["Scheduled Reports"],"summary":"Run Scheduled Report Now","description":"Manually trigger a scheduled report execution.\n\nThis endpoint enqueues the report for immediate generation and delivery\nvia the background ReportScheduler. The report's last_run_at and\nlast_run_status fields are updated to track the execution.\n\nThe actual report generation and email delivery happens asynchronously\nin the background. Check the /runs endpoint for execution status.","operationId":"run_scheduled_report_now_api_v1_scheduled_reports__report_id__run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/scheduled-reports/{report_id}/runs":{"get":{"tags":["Scheduled Reports"],"summary":"List Scheduled Report Runs","description":"Get execution history for a scheduled report.\n\nReturns a paginated list of report execution runs with their status.\n\nNote: This endpoint returns synthetic run data based on the report's\nlast_run_* fields until a dedicated report_runs table is implemented.","operationId":"list_scheduled_report_runs_api_v1_scheduled_reports__report_id__runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledReportRunListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status-pages":{"get":{"tags":["Status Pages"],"summary":"List Status Pages","description":"List all status pages for the specified workspace.\n\nIf workspace_id is not provided, returns status pages from ALL user's workspaces.","operationId":"list_status_pages_api_v1_status_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Status Pages"],"summary":"Create Status Page","description":"Create a new status page.\n\nThe slug must be unique across all status pages.\nPlan limits are enforced - free users can create 1 status page.","operationId":"create_status_page_api_v1_status_pages_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStatusPageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status-pages/{page_id}":{"get":{"tags":["Status Pages"],"summary":"Get Status Page","description":"Get status page by ID.\n\nVerifies user owns the status page's workspace.","operationId":"get_status_page_api_v1_status_pages__page_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Status Pages"],"summary":"Update Status Page","description":"Update status page.\n\nOnly the workspace owner can update it.","operationId":"update_status_page_api_v1_status_pages__page_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatusPageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Status Pages"],"summary":"Delete Status Page","description":"Delete status page.","operationId":"delete_status_page_api_v1_status_pages__page_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status-pages/{page_id}/monitors":{"post":{"tags":["Status Pages"],"summary":"Add Monitor To Status Page","description":"Add a monitor to a status page.","operationId":"add_monitor_to_status_page_api_v1_status_pages__page_id__monitors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMonitorRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageMonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status-pages/{page_id}/monitors/{monitor_id}":{"delete":{"tags":["Status Pages"],"summary":"Remove Monitor From Status Page","description":"Remove a monitor from a status page.","operationId":"remove_monitor_from_status_page_api_v1_status_pages__page_id__monitors__monitor_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}},{"name":"monitor_id","in":"path","required":true,"schema":{"type":"integer","title":"Monitor Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}":{"get":{"tags":["Public Status Pages"],"summary":"Get Public Status Page","description":"Get public status page by slug.\n\nThis endpoint is publicly accessible without authentication.\nOnly returns data for pages marked as public.\n\nArgs:\n    tz: Viewer's UTC offset in minutes (e.g. 180 for UTC+3, -300 for UTC-5).\n        Used to align daily uptime bars to the viewer's local day boundaries.\n    history: \"full\" (default) sends daily_history as one object per day;\n        \"compact\" sends parallel arrays per monitor plus history_start,\n        about a tenth of the bytes for the same data.","operationId":"get_public_status_page_api_v1_public_status__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"tz","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tz"}},{"name":"history","in":"query","required":false,"schema":{"enum":["full","compact"],"type":"string","default":"full","title":"History"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PublicCompactStatusPageResponse"},{"$ref":"#/components/schemas/PublicStatusPageResponse"}],"title":"Response Get Public Status Page Api V1 Public Status  Slug  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/incidents":{"get":{"tags":["Public Status Pages"],"summary":"Get Public Status Page Incidents","description":"Get incidents for a public status page.\n\nReturns ongoing and recent incidents for the status page.","operationId":"get_public_status_page_incidents_api_v1_public_status__slug__incidents_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Resolved"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicIncidentResponse"},"title":"Response Get Public Status Page Incidents Api V1 Public Status  Slug  Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/maintenance":{"get":{"tags":["Public Status Pages"],"summary":"Get Public Status Page Maintenance","description":"Get scheduled maintenance for a public status page.\n\nReturns upcoming and active maintenance windows.","operationId":"get_public_status_page_maintenance_api_v1_public_status__slug__maintenance_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"include_past","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Past"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaintenanceResponse"},"title":"Response Get Public Status Page Maintenance Api V1 Public Status  Slug  Maintenance Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/report.pdf":{"get":{"tags":["Public Status Pages"],"summary":"Download status page SLA report as PDF","description":"Generate a downloadable PDF covering everything shown on the public status page: overall status, per-monitor uptime (24h/7d/30d/90d), 90-day daily history, incident history, and scheduled maintenance.","operationId":"download_status_page_report_pdf_api_v1_public_status__slug__report_pdf_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"PDF file download","content":{"application/json":{"schema":{}},"application/pdf":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/subscribe":{"post":{"tags":["Public Status Pages"],"summary":"Subscribe To Status Page","description":"Subscribe to status page updates.\n\nA verification email will be sent to confirm the subscription.","operationId":"subscribe_to_status_page_api_v1_public_status__slug__subscribe_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__subscriptions__SubscribeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__schemas__subscriptions__SubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/verify":{"get":{"tags":["Public Status Pages"],"summary":"Verify Subscription","description":"Verify email subscription.\n\nUses the token sent in the verification email.","operationId":"verify_subscription_api_v1_public_status__slug__verify_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/status/{slug}/unsubscribe":{"get":{"tags":["Public Status Pages"],"summary":"Unsubscribe From Status Page","description":"Unsubscribe from status page updates.\n\nUses the unsubscribe token from notification emails.","operationId":"unsubscribe_from_status_page_api_v1_public_status__slug__unsubscribe_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/webhook":{"post":{"tags":["Telegram Bot"],"summary":"Telegram Bot webhook","description":"Receives updates from Telegram Bot API. Verified by secret_token header.","operationId":"telegram_webhook_api_v1_telegram_bot_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telegram Webhook Api V1 Telegram Bot Webhook Post"}}}}}}},"/api/v1/telegram/bot/deep-link":{"get":{"tags":["Telegram Bot"],"summary":"Generate Deep Link","description":"Generate HMAC-signed Telegram Deep Link URL with 1h TTL. Requires JWT.","operationId":"get_deep_link_api_v1_telegram_bot_deep_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Deep Link Api V1 Telegram Bot Deep Link Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/telegram/bot/group-deep-link":{"get":{"tags":["Telegram Bot"],"summary":"Generate Group Deep Link","description":"Generate startgroup Deep Link URL with 1h TTL. Requires JWT.","operationId":"get_group_deep_link_api_v1_telegram_bot_group_deep_link_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"integer","description":"Workspace ID to link group to","title":"Workspace Id"},"description":"Workspace ID to link group to"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Group Deep Link Api V1 Telegram Bot Group Deep Link Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/groups":{"get":{"tags":["Telegram Bot"],"summary":"List linked Telegram groups","description":"List user's active linked Telegram groups. Requires JWT.","operationId":"list_groups_api_v1_telegram_bot_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Groups Api V1 Telegram Bot Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/groups/{group_id}":{"delete":{"tags":["Telegram Bot"],"summary":"Unlink Telegram group","description":"Remove a linked Telegram group. Requires JWT.","operationId":"delete_group_api_v1_telegram_bot_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Group Api V1 Telegram Bot Groups  Group Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/channel-deep-link":{"get":{"tags":["Telegram Bot"],"summary":"Generate Channel Deep Link URL","description":"Returns t.me/<bot>?startchannel&admin=post_messages+delete_messages plus a one-time claim_command (/link pzlink_XXX) the user posts in the channel after promoting the bot. Telegram does not accept a token payload for ?startchannel, so we bind via channel_post text token instead of my_chat_member.from.id (which fails for users without linked telegram_id or with cross-account telegram_id). Requires JWT.","operationId":"get_channel_deep_link_api_v1_telegram_bot_channel_deep_link_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Workspace to bind the new channel to","title":"Workspace Id"},"description":"Workspace to bind the new channel to"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Channel Deep Link Api V1 Telegram Bot Channel Deep Link Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/channels":{"get":{"tags":["Telegram Bot"],"summary":"List linked Telegram channels","description":"List user's active linked Telegram channels. Requires JWT.","operationId":"list_channels_api_v1_telegram_bot_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by workspace ID","title":"Workspace Id"},"description":"Filter by workspace ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Channels Api V1 Telegram Bot Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telegram/bot/channels/{group_id}":{"delete":{"tags":["Telegram Bot"],"summary":"Unlink Telegram channel","description":"Remove a linked Telegram channel. Requires JWT.","operationId":"delete_channel_api_v1_telegram_bot_channels__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Channel Api V1 Telegram Bot Channels  Group Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/web-push/vapid-public-key":{"get":{"tags":["Web Push"],"summary":"Get Vapid Public Key","operationId":"get_vapid_public_key_api_v1_web_push_vapid_public_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VapidPublicKeyResponse"}}}}}}},"/api/v1/web-push/subscriptions":{"get":{"tags":["Web Push"],"summary":"Get Subscriptions","operationId":"get_subscriptions_api_v1_web_push_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionsStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/web-push/subscribe":{"post":{"tags":["Web Push"],"summary":"Subscribe","operationId":"subscribe_api_v1_web_push_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__routers__web_push__SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__routers__web_push__SubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/web-push/unsubscribe":{"post":{"tags":["Web Push"],"summary":"Unsubscribe","operationId":"unsubscribe_api_v1_web_push_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/presentation__api__v1__routers__web_push__SubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/probes":{"get":{"tags":["probes"],"summary":"List Probes","description":"List all probes for current workspace + public community probes.","operationId":"list_probes_api_v1_probes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["probes"],"summary":"Create Probe","description":"Register a new external checker. Admin only.\n\nReturns the API key (shown once!) and docker run command.","operationId":"create_probe_api_v1_probes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/probes/{probe_id}":{"get":{"tags":["probes"],"summary":"Get Probe","description":"Get probe details. Accessible if probe is public or belongs to current workspace.","operationId":"get_probe_api_v1_probes__probe_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"probe_id","in":"path","required":true,"schema":{"type":"integer","title":"Probe Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["probes"],"summary":"Delete Probe","description":"Delete probe. Admin only.\n\nCascade behaviour:\n\n- `monitor_probes` rows referencing this probe are CASCADE-deleted —\n  multi-probe monitors lose this probe from their assignment list\n  but keep checking via the remaining M2M probes.\n- `monitor_probe_state` rows for this probe also CASCADE-delete, so\n  the aggregator stops including stale per-probe streaks for it.\n- `monitors.probe_id` (legacy single-probe mirror) ON DELETE SET NULL.\n  For a strictly single-probe monitor (count(M2M)=0 after the cascade)\n  this means the monitor reverts to central-server checks. For a\n  multi-probe monitor where the primary mirror happened to be this\n  probe, the column goes NULL but `find_due_for_check` still skips\n  central because the M2M still has assignments (Bug 41 guard).\n\nConnected checker receives a shutdown message after the DB commit so\nit stops sending check_results.","operationId":"delete_probe_api_v1_probes__probe_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"probe_id","in":"path","required":true,"schema":{"type":"integer","title":"Probe Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/probe/ips":{"get":{"tags":["probes"],"summary":"List Probe Ips","description":"Addresses PingZen checks arrive from, for firewall/WAF allowlists.","operationId":"list_probe_ips_api_v1_probe_ips_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeIpsResponse"}}}}}}},"/api/v1/probe/ips.txt":{"get":{"tags":["probes"],"summary":"List Probe Ips Text","description":"Same list, one address per line.\n\nBot-verification programs (Cloudflare's IP-list method fetches the URL\ndaily) want a \"publicly accessible plain-text, JSON, or CSV\" list of\naddresses — a bare list, not our JSON envelope.","operationId":"list_probe_ips_text_api_v1_probe_ips_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/v1/mcp/test":{"post":{"tags":["MCP"],"summary":"Test Mcp Connection","description":"Test MCP API key validity via internal Docker service.\n\nPerforms a 2-step MCP handshake:\n1. ``initialize`` — establishes session (always succeeds if server is up)\n2. ``tools/call ping`` — validates the API key (requires auth)\n\nArgs:\n    request: FastAPI Request object (for rate limiting).\n    data: Test request containing the API key.\n    current_user_id: Current authenticated user ID.\n\nReturns:\n    McpTestResponse with connected status.","operationId":"test_mcp_connection_api_v1_mcp_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"AcceptWorkspaceInviteRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":16,"title":"Token","description":"Invite token"}},"type":"object","required":["token"],"title":"AcceptWorkspaceInviteRequest"},"AcceptWorkspaceInviteResponse":{"properties":{"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace the user joined"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name","description":"Workspace name"},"role":{"type":"string","title":"Role","description":"Granted role"}},"type":"object","required":["workspace_id","role"],"title":"AcceptWorkspaceInviteResponse"},"AddMonitorRequest":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"ID of the monitor to add"},"display_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Display Name","description":"Optional custom display name for this monitor on the status page"},"display_order":{"type":"integer","minimum":0.0,"title":"Display Order","description":"Display order (lower numbers appear first)","default":0}},"type":"object","required":["monitor_id"],"title":"AddMonitorRequest","description":"Request schema for adding a monitor to a status page."},"AddMonitorsRequest":{"properties":{"monitor_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Monitor Ids","description":"List of monitor IDs to add to the group"}},"type":"object","required":["monitor_ids"],"title":"AddMonitorsRequest","description":"Request schema for adding monitors to a group."},"AddTagsRequest":{"properties":{"tags":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Tags","description":"List of tags to add"}},"type":"object","required":["tags"],"title":"AddTagsRequest","description":"Request schema for adding tags to a group."},"AddWorkspaceMemberRequest":{"properties":{"email":{"type":"string","maxLength":320,"minLength":3,"title":"Email","description":"Registered user email"},"role":{"type":"string","title":"Role","description":"Member role: editor or viewer","default":"viewer"}},"type":"object","required":["email"],"title":"AddWorkspaceMemberRequest"},"AlertChannelConfigListResponse":{"properties":{"configs":{"items":{"$ref":"#/components/schemas/AlertChannelConfigResponse"},"type":"array","title":"Configs","description":"List of configurations"},"total":{"type":"integer","title":"Total","description":"Total number of configurations"}},"type":"object","required":["configs","total"],"title":"AlertChannelConfigListResponse","description":"Response schema for paginated alert channel config list."},"AlertChannelConfigResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Configuration ID"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"channel":{"type":"string","title":"Channel","description":"Alert channel type"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Channel-specific configuration (sensitive fields may be redacted)"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether configuration is enabled"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","user_id","channel","config","is_active"],"title":"AlertChannelConfigResponse","description":"Response schema for an alert channel configuration."},"AlertHistoryListResponse":{"properties":{"history":{"items":{"$ref":"#/components/schemas/AlertHistoryResponse"},"type":"array","title":"History","description":"History records"},"total":{"type":"integer","title":"Total","description":"Total records"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["history","total","page","page_size"],"title":"AlertHistoryListResponse","description":"Response schema for paginated alert history."},"AlertHistoryResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"History record ID"},"alert_id":{"type":"integer","title":"Alert Id","description":"Alert ID"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id","description":"Monitor ID that triggered the alert (null if monitor deleted)"},"trigger":{"type":"string","title":"Trigger","description":"Trigger type"},"channel":{"type":"string","title":"Channel","description":"Delivery channel"},"target":{"type":"string","title":"Target","description":"Delivery target"},"status":{"type":"string","title":"Status","description":"Delivery status: sent or failed"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At","description":"When alert was sent"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","alert_id","trigger","channel","target","status"],"title":"AlertHistoryResponse","description":"Response schema for alert history record."},"AlertListResponse":{"properties":{"alerts":{"items":{"$ref":"#/components/schemas/AlertResponse"},"type":"array","title":"Alerts","description":"List of alerts"},"total":{"type":"integer","title":"Total","description":"Total number of alerts"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["alerts","total","page","page_size"],"title":"AlertListResponse","description":"Response schema for paginated alert list."},"AlertResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Alert ID"},"name":{"type":"string","title":"Name","description":"Alert name"},"channel":{"type":"string","title":"Channel","description":"Alert channel"},"target":{"type":"string","title":"Target","description":"Target"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace Id","description":"Workspace ID"},"monitor_ids":{"items":{"type":"integer"},"type":"array","title":"Monitor Ids","description":"Associated monitor IDs"},"heartbeat_monitor_ids":{"items":{"type":"string"},"type":"array","title":"Heartbeat Monitor Ids","description":"Associated heartbeat monitor IDs"},"apply_to_all_monitors":{"type":"boolean","title":"Apply To All Monitors","description":"When true, the alert broadcasts to every monitor in the workspace","default":false},"triggers":{"items":{"type":"string"},"type":"array","title":"Triggers","description":"Active triggers"},"cooldown_minutes":{"type":"integer","title":"Cooldown Minutes","description":"Cooldown in minutes"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether alert is active"},"enable_reminders":{"type":"boolean","title":"Enable Reminders","description":"Reminder alerts enabled","default":false},"message_fields":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Message Fields","description":"Message field visibility toggles"},"reminder_escalation_level":{"type":"integer","title":"Reminder Escalation Level","description":"Current reminder escalation level","default":0},"reminder_last_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reminder Last Sent At","description":"Last reminder sent time"},"degraded_reminder_last_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Degraded Reminder Last Sent At","description":"Last DEGRADED reminder sent time (24h cadence)"},"last_triggered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Triggered At","description":"Last trigger time"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","channel","target","user_id","monitor_ids","triggers","cooldown_minutes","is_active"],"title":"AlertResponse","description":"Response schema for an alert."},"AlertsSummaryResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of alerts"},"active":{"type":"integer","title":"Active","description":"Number of active alerts"},"by_channel":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Channel","description":"Count by channel type"},"sent_last_24h":{"type":"integer","title":"Sent Last 24H","description":"Alerts sent in last 24 hours"},"sent_last_7d":{"type":"integer","title":"Sent Last 7D","description":"Alerts sent in last 7 days"}},"type":"object","required":["total","active","by_channel","sent_last_24h","sent_last_7d"],"title":"AlertsSummaryResponse","description":"Alerts summary statistics."},"ApiCheckListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiCheckSummaryResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"ApiCheckListResponse","description":"Response schema for listing API checks."},"ApiCheckResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"steps":{"items":{"$ref":"#/components/schemas/ApiCheckStepSchema"},"type":"array","title":"Steps"},"global_headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Global Headers"},"global_auth":{"$ref":"#/components/schemas/AuthConfigSchema"},"global_timeout_seconds":{"type":"integer","title":"Global Timeout Seconds"},"stop_on_failure":{"type":"boolean","title":"Stop On Failure"},"initial_variables":{"additionalProperties":{"type":"string"},"type":"object","title":"Initial Variables"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"is_active":{"type":"boolean","title":"Is Active"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"last_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check At"},"last_status":{"$ref":"#/components/schemas/ApiCheckStatusSchema"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","name","description","steps","global_headers","global_auth","global_timeout_seconds","stop_on_failure","initial_variables","interval_seconds","is_active","tags","last_check_at","last_status","consecutive_failures","created_at","updated_at"],"title":"ApiCheckResponse","description":"Response schema for a single API check."},"ApiCheckResultListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiCheckResultSummaryResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"ApiCheckResultListResponse","description":"Response schema for listing API check results."},"ApiCheckResultResponse":{"properties":{"id":{"type":"string","title":"Id"},"api_check_id":{"type":"string","title":"Api Check Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"$ref":"#/components/schemas/ApiCheckStatusSchema"},"total_time_ms":{"type":"integer","title":"Total Time Ms"},"step_results":{"items":{"$ref":"#/components/schemas/StepResultSchema"},"type":"array","title":"Step Results"},"final_variables":{"additionalProperties":{"type":"string"},"type":"object","title":"Final Variables"},"error_message":{"type":"string","title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","api_check_id","user_id","status","total_time_ms","step_results","final_variables","error_message","created_at"],"title":"ApiCheckResultResponse","description":"Response schema for a single API check result."},"ApiCheckResultSummaryResponse":{"properties":{"id":{"type":"string","title":"Id"},"api_check_id":{"type":"string","title":"Api Check Id"},"status":{"$ref":"#/components/schemas/ApiCheckStatusSchema"},"total_time_ms":{"type":"integer","title":"Total Time Ms"},"step_count":{"type":"integer","title":"Step Count"},"passed_steps":{"type":"integer","title":"Passed Steps"},"error_message":{"type":"string","title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","api_check_id","status","total_time_ms","step_count","passed_steps","error_message","created_at"],"title":"ApiCheckResultSummaryResponse","description":"Summary response for API check result listing."},"ApiCheckStatusSchema":{"type":"string","enum":["pending","success","partial_success","failure","error","timeout"],"title":"ApiCheckStatusSchema","description":"Status values for API check results."},"ApiCheckStepSchema":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Step name for identification"},"method":{"$ref":"#/components/schemas/HttpMethodSchema","description":"HTTP method","default":"GET"},"url":{"type":"string","maxLength":2000,"minLength":1,"title":"Url","description":"URL to request (supports variable substitution with {{var_name}})"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","description":"Request headers (supports variable substitution)"},"body":{"type":"string","maxLength":65536,"title":"Body","description":"Request body (supports variable substitution)","default":""},"timeout_seconds":{"type":"integer","maximum":300.0,"minimum":1.0,"title":"Timeout Seconds","description":"Timeout for this step in seconds","default":30},"assertions":{"items":{"$ref":"#/components/schemas/AssertionSchema"},"type":"array","maxItems":20,"title":"Assertions","description":"Assertions to validate the response"},"extract_variables":{"items":{"$ref":"#/components/schemas/VariableExtractionSchema"},"type":"array","maxItems":20,"title":"Extract Variables","description":"Variables to extract from the response"},"auth":{"anyOf":[{"$ref":"#/components/schemas/AuthConfigSchema"},{"type":"null"}],"description":"Step-specific auth (overrides global auth)"},"continue_on_failure":{"type":"boolean","title":"Continue On Failure","description":"Continue workflow even if this step fails","default":false}},"type":"object","required":["name","url"],"title":"ApiCheckStepSchema","description":"Schema for a single step in an API check workflow."},"ApiCheckSummaryResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"step_count":{"type":"integer","title":"Step Count"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"is_active":{"type":"boolean","title":"Is Active"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"last_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check At"},"last_status":{"$ref":"#/components/schemas/ApiCheckStatusSchema"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","step_count","interval_seconds","is_active","tags","last_check_at","last_status","consecutive_failures","created_at"],"title":"ApiCheckSummaryResponse","description":"Summary response for API check listing (without full step details)."},"ApiKeyListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Keys","description":"List of API keys"},"total":{"type":"integer","title":"Total","description":"Total number of keys"}},"type":"object","required":["keys","total"],"title":"ApiKeyListResponse","description":"Response schema for API key list."},"ApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"API key ID"},"name":{"type":"string","title":"Name","description":"Key name"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Key prefix for display"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Associated workspace ID"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"Last usage timestamp"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether key is active (not revoked)"}},"type":"object","required":["id","name","key_prefix","user_id","workspace_id","created_at","is_active"],"title":"ApiKeyResponse","description":"Response schema for an API key.\n\nNote: Does NOT include the raw key - only prefix is visible."},"AssertionOperatorSchema":{"type":"string","enum":["equals","not_equals","contains","not_contains","matches","lt","gt","lte","gte","exists","not_exists"],"title":"AssertionOperatorSchema","description":"Operators for assertion comparisons."},"AssertionResultSchema":{"properties":{"assertion":{"$ref":"#/components/schemas/AssertionSchema"},"passed":{"type":"boolean","title":"Passed"},"actual_value":{"type":"string","title":"Actual Value","default":""},"error_message":{"type":"string","title":"Error Message","default":""}},"type":"object","required":["assertion","passed"],"title":"AssertionResultSchema","description":"Schema for the result of an assertion execution."},"AssertionSchema":{"properties":{"assertion_type":{"$ref":"#/components/schemas/AssertionTypeSchema","description":"Type of assertion to perform"},"target":{"type":"string","maxLength":500,"title":"Target","description":"Target for the assertion (e.g., header name, JSON path)","default":""},"operator":{"$ref":"#/components/schemas/AssertionOperatorSchema","description":"Comparison operator","default":"equals"},"expected_value":{"type":"string","maxLength":2000,"title":"Expected Value","description":"Expected value for comparison","default":""},"description":{"type":"string","maxLength":200,"title":"Description","description":"Human-readable description of this assertion","default":""}},"type":"object","required":["assertion_type"],"title":"AssertionSchema","description":"Schema for a single assertion in an API check step."},"AssertionTypeSchema":{"type":"string","enum":["status_code","header","body_contains","body_regex","json_path","response_time"],"title":"AssertionTypeSchema","description":"Types of assertions for API check validation."},"AuthConfigSchema":{"properties":{"auth_type":{"$ref":"#/components/schemas/AuthTypeSchema","description":"Type of authentication","default":"none"},"username":{"type":"string","maxLength":200,"title":"Username","description":"Username for basic auth","default":""},"password":{"type":"string","maxLength":500,"title":"Password","description":"Password for basic auth","default":""},"token":{"type":"string","maxLength":2000,"title":"Token","description":"Token for bearer auth","default":""},"api_key_name":{"type":"string","maxLength":100,"title":"Api Key Name","description":"Header name for API key auth","default":""},"api_key_value":{"type":"string","maxLength":500,"title":"Api Key Value","description":"API key value","default":""},"api_key_in":{"type":"string","pattern":"^(header|query)$","title":"Api Key In","description":"Where to send API key (header or query)","default":"header"}},"type":"object","title":"AuthConfigSchema","description":"Schema for authentication configuration."},"AuthTypeSchema":{"type":"string","enum":["none","basic","bearer","api_key"],"title":"AuthTypeSchema","description":"Authentication types for API checks."},"Body_import_monitors_csv_api_v1_monitors_import_csv_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"CSV file (UTF-8, max 1 MB)"}},"type":"object","required":["file"],"title":"Body_import_monitors_csv_api_v1_monitors_import_csv_post"},"CertChainResponse":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"handshake_succeeded":{"type":"boolean","title":"Handshake Succeeded"},"tls_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tls Version"},"cipher_suite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cipher Suite"},"nodes":{"items":{"$ref":"#/components/schemas/CertNodeResponse"},"type":"array","title":"Nodes","default":[]},"chain_complete":{"type":"boolean","title":"Chain Complete","default":false},"missing_intermediate":{"type":"boolean","title":"Missing Intermediate","default":false},"expected_intermediate_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Intermediate Url"},"diagnosis":{"type":"string","enum":["ok","missing_intermediate","self_signed","expired","expiring_soon","hostname_mismatch","handshake_failed","parse_error"],"title":"Diagnosis","default":"ok"},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["host","port","handshake_succeeded"],"title":"CertChainResponse"},"CertNodeResponse":{"properties":{"position":{"type":"integer","title":"Position"},"subject_cn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Cn"},"subject_o":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject O"},"issuer_cn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer Cn"},"san_dns":{"items":{"type":"string"},"type":"array","title":"San Dns","default":[]},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"not_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not After"},"days_until_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Until Expiry"},"signature_algorithm":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature Algorithm"},"is_self_signed":{"type":"boolean","title":"Is Self Signed","default":false},"aia_ca_issuers_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aia Ca Issuers Url"},"fingerprint_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint Sha256"}},"type":"object","required":["position"],"title":"CertNodeResponse"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","maxLength":128,"title":"Current Password","description":"Current password"},"new_password":{"type":"string","maxLength":128,"minLength":1,"title":"New Password","description":"New password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest","description":"Request schema for password change."},"ChangeWorkspaceMemberRoleRequest":{"properties":{"role":{"type":"string","title":"Role","description":"Member role: editor or viewer"}},"type":"object","required":["role"],"title":"ChangeWorkspaceMemberRoleRequest"},"ChannelAvailabilityItem":{"properties":{"channel":{"type":"string","title":"Channel","description":"Channel name"},"available":{"type":"boolean","title":"Available","description":"Whether channel is configured and available"},"reason":{"type":"string","title":"Reason","description":"Reason for availability status"}},"type":"object","required":["channel","available","reason"],"title":"ChannelAvailabilityItem","description":"Single channel availability status."},"ChannelAvailabilityResponse":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/ChannelAvailabilityItem"},"type":"array","title":"Channels","description":"List of channel availability"}},"type":"object","required":["channels"],"title":"ChannelAvailabilityResponse","description":"Response schema for channel availability."},"CheckResultResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Check result ID"},"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"status":{"type":"string","title":"Status","description":"Check status: UP, DOWN, TIMEOUT, DEGRADED"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms","description":"Response time in milliseconds"},"region":{"type":"string","title":"Region","description":"Region where check was executed"},"protocol":{"type":"string","title":"Protocol","description":"Protocol used"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status","description":"HTTP status code"},"cdn_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdn Provider","description":"Detected CDN/WAF provider (e.g., Cloudflare, Akamai)"},"bot_protection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Protection","description":"Bot-protection vendor that refused this check (PerimeterX, DataDome, Cloudflare, Akamai, Imperva, WBaaS), set only on block-level evidence. Independent of cdn_provider. NULL when no block was detected."},"failure_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Category","description":"Classified failure reason (anti_bot, rate_limited, auth_required, geo_blocked, timeout, dns_failure, tls_failure, connection_refused, server_error, status_mismatch, content_mismatch, ssl_expired, ssl_expiring, ssl_chain_incomplete, dnsbl_listed, stub_page). NULL for successful checks or when signals don't match any bucket."},"probe_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Id","description":"External checker ID (NULL = central server)"},"is_fallback":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Fallback","description":"True if central server checked as fallback for offline probe"},"timing_dns_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timing Dns Ms","description":"DNS lookup time in milliseconds"},"timing_tcp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timing Tcp Ms","description":"TCP connection time in milliseconds"},"timing_tls_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timing Tls Ms","description":"TLS handshake time in milliseconds"},"timing_ttfb_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timing Ttfb Ms","description":"Time to First Byte in milliseconds"},"pagespeed_performance_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Performance Score","description":"Performance score 0-100"},"pagespeed_accessibility_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Accessibility Score","description":"Accessibility score 0-100"},"pagespeed_seo_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Seo Score","description":"SEO score 0-100"},"pagespeed_best_practices_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Best Practices Score","description":"Best practices score 0-100"},"pagespeed_lcp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Lcp Ms","description":"Largest Contentful Paint in ms"},"pagespeed_tbt_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Tbt Ms","description":"Total Blocking Time in ms"},"pagespeed_cls":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pagespeed Cls","description":"Cumulative Layout Shift"},"pagespeed_fcp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Fcp Ms","description":"First Contentful Paint in ms"},"pagespeed_si_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Si Ms","description":"Speed Index in ms"},"pagespeed_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pagespeed Strategy","description":"Strategy: mobile or desktop"},"whois_days_until_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Whois Days Until Expiry","description":"Days until domain expires"},"whois_registrar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whois Registrar","description":"Domain registrar name"},"dnsbl_listed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dnsbl Listed","description":"True if target is on ≥1 DNSBL provider; None = not checked"},"dnsbl_providers_listed":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dnsbl Providers Listed","description":"Provider hostnames that returned a positive match"},"dnsbl_providers_checked":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dnsbl Providers Checked","description":"All DNSBL provider hostnames that were queried"},"dnsbl_providers_failed":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dnsbl Providers Failed","description":"Providers that errored (timeout/refused)"},"dnsbl_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dnsbl Categories","description":"Aggregated categories (spam, exploits, ...)"},"ssl_days_until_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ssl Days Until Expiry","description":"Days until SSL certificate expires"},"ping_packet_loss":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ping Packet Loss","description":"Packet loss percentage"},"ping_avg_rtt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ping Avg Rtt","description":"Average RTT in ms"},"grpc_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grpc Status","description":"gRPC status code"},"tcp_banner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tcp Banner","description":"TCP banner response"},"dns_resolved_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dns Resolved Values","description":"DNS resolved values"},"per_probe_results":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProbeCheckResultBriefResponse"},"type":"array"},{"type":"null"}],"title":"Per Probe Results","description":"Per-probe slices when Check Now fanned out across multiple probes"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When check was executed"}},"type":"object","required":["id","monitor_id","status","region","protocol","created_at"],"title":"CheckResultResponse","description":"Response schema for a single check result."},"ChurnStatsResponse":{"properties":{"churn_rate":{"type":"number","title":"Churn Rate","description":"Churn rate as percentage"},"churned_count":{"type":"integer","title":"Churned Count","description":"Number of churned users"},"baseline_count":{"type":"integer","title":"Baseline Count","description":"Total users in baseline period"}},"type":"object","required":["churn_rate","churned_count","baseline_count"],"title":"ChurnStatsResponse","description":"Response schema for churn statistics."},"CreateAlertChannelConfigRequest":{"properties":{"channel":{"type":"string","title":"Channel","description":"Alert channel: email, telegram, slack, webhook, discord, etc."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Channel-specific configuration (e.g., SMTP server, API keys, webhook URLs)"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether this configuration is enabled","default":true}},"type":"object","required":["channel","config"],"title":"CreateAlertChannelConfigRequest","description":"Request schema for creating an alert channel configuration."},"CreateAlertRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Alert name"},"channel":{"type":"string","title":"Channel","description":"Alert channel: email, telegram, slack, webhook, etc."},"target":{"type":"string","maxLength":500,"minLength":1,"title":"Target","description":"Target: email, chat_id, webhook URL"},"workspace_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace Id","description":"Workspace ID"},"monitor_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"title":"Monitor Ids","description":"Monitor IDs this alert is scoped to. Cannot be combined with apply_to_all_monitors=true."},"heartbeat_monitor_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Heartbeat Monitor Ids","description":"Heartbeat monitor IDs (UUID strings)"},"apply_to_all_monitors":{"type":"boolean","title":"Apply To All Monitors","description":"When true, the alert fires for every monitor in the workspace; monitor_ids and heartbeat_monitor_ids must be empty. Mutually exclusive with any explicit ID list.","default":false},"triggers":{"items":{"type":"string"},"type":"array","title":"Triggers","description":"Triggers: down, recovered, degraded, certificate_expiring, response_time_high","default":["down","recovered","certificate_expiring"]},"cooldown_minutes":{"type":"integer","maximum":1440.0,"minimum":0.0,"title":"Cooldown Minutes","description":"Cooldown between alerts in minutes (0 = no cooldown)","default":5},"is_active":{"type":"boolean","title":"Is Active","description":"Whether alert is active","default":true},"enable_reminders":{"type":"boolean","title":"Enable Reminders","description":"Send reminder alerts while monitor stays down","default":false},"message_fields":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Message Fields","description":"Message field toggles: show_url, show_protocol, show_response_time, show_http_status, show_error, show_account, show_downtime, show_monitor_link, show_probe_location"}},"type":"object","required":["name","channel","target"],"title":"CreateAlertRequest","description":"Request schema for creating an alert."},"CreateApiCheckRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Name of the API check"},"description":{"type":"string","maxLength":1000,"title":"Description","description":"Description of what this check does","default":""},"steps":{"items":{"$ref":"#/components/schemas/ApiCheckStepSchema"},"type":"array","maxItems":20,"minItems":1,"title":"Steps","description":"Steps to execute in order"},"global_headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Global Headers","description":"Headers applied to all steps"},"global_auth":{"$ref":"#/components/schemas/AuthConfigSchema","description":"Authentication applied to all steps (unless overridden)"},"global_timeout_seconds":{"type":"integer","maximum":300.0,"minimum":1.0,"title":"Global Timeout Seconds","description":"Default timeout for steps","default":30},"stop_on_failure":{"type":"boolean","title":"Stop On Failure","description":"Stop workflow on first step failure","default":true},"initial_variables":{"additionalProperties":{"type":"string"},"type":"object","title":"Initial Variables","description":"Pre-defined variables available to all steps"},"interval_seconds":{"type":"integer","maximum":86400.0,"minimum":30.0,"title":"Interval Seconds","description":"Check interval in seconds (min 30s, max 24h)","default":60},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the check is active","default":true},"tags":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Tags","description":"Tags for organization"}},"type":"object","required":["name","steps"],"title":"CreateApiCheckRequest","description":"Request schema for creating a new API check."},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Human-readable key name (e.g., 'CI/CD Integration')"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest","description":"Request schema for creating an API key."},"CreateApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"API key ID"},"name":{"type":"string","title":"Name","description":"Key name"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Key prefix for display (e.g., 'pz_abc12345')"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace the key is bound to (the user's default workspace)"},"raw_key":{"type":"string","title":"Raw Key","description":"Full API key - COPY NOW! This will NOT be shown again."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"}},"type":"object","required":["id","name","key_prefix","workspace_id","raw_key","created_at"],"title":"CreateApiKeyResponse","description":"Response schema for creating an API key.\n\nIMPORTANT: The raw_key is shown ONCE at creation.\nIt cannot be retrieved later - only the prefix is stored.","example":{"created_at":"2026-02-05T12:00:00Z","id":1,"key_prefix":"pz_abc12345","name":"CI/CD Integration","raw_key":"pz_abc12345_Xk9mN2pQrStUvWxYz0123456789abcdefghij","workspace_id":1}},"CreateHeartbeatMonitorRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Display name for the heartbeat monitor"},"slug":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Slug","description":"Custom URL slug (auto-generated from name if not provided)"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description of what job/task is being monitored"},"expected_interval_seconds":{"type":"integer","maximum":2592000.0,"minimum":60.0,"title":"Expected Interval Seconds","description":"Expected interval between pings in seconds (min 60, max 30 days)","default":3600},"grace_period_seconds":{"type":"integer","maximum":86400.0,"minimum":0.0,"title":"Grace Period Seconds","description":"Grace period before marking as DOWN (max 24 hours)","default":300}},"type":"object","required":["name"],"title":"CreateHeartbeatMonitorRequest","description":"Request schema for creating a heartbeat monitor."},"CreateMonitorGroupRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Human-readable name for the group"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID to assign group to"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional description of the group"},"monitor_ids":{"items":{"type":"integer"},"type":"array","title":"Monitor Ids","description":"List of monitor IDs to include in the group (max 200)"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"List of tags for categorization (max 50)"},"threshold_degraded":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Threshold Degraded","description":"Percentage of monitors that must be UP to avoid DEGRADED status (0.0-1.0)","default":0.8},"threshold_down":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Threshold Down","description":"Percentage of monitors that must be UP to avoid DOWN status (0.0-1.0)","default":0.0},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the group is actively monitored","default":true}},"type":"object","required":["name","workspace_id"],"title":"CreateMonitorGroupRequest","description":"Request schema for creating a monitor group."},"CreateMonitorRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Monitor name"},"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url","description":"URL or host to monitor"},"protocol":{"type":"string","title":"Protocol","description":"Protocol: HTTP, HTTPS, TCP, ICMP, DNS, GRPC"},"workspace_id":{"type":"integer","maximum":2147483647.0,"minimum":1.0,"title":"Workspace Id","description":"Workspace ID to assign monitor to"},"probe_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Probe Id","description":"Single probe ID (legacy). DEPRECATED — pass `probe_ids` instead. Will be removed 2026-07-27. If both fields are supplied, `probe_ids` wins.","deprecated":true},"probe_ids":{"anyOf":[{"items":{"type":"integer","maximum":2147483647.0,"minimum":1.0},"type":"array"},{"type":"null"}],"title":"Probe Ids","description":"Probe IDs to assign for multi-region checks. None = legacy single-probe via `probe_id`. Empty list = detach all probes (central server). Plan caps: FREE=1, PRO=3, BUSINESS=10, ENTERPRISE=50."},"aggregation_rule":{"type":"string","title":"Aggregation Rule","description":"How per-probe states combine into Monitor.status. MVP: only `any_fails` (DOWN if any probe confirms 3 consecutive failures). `majority_fail` and `all_fail` reserved at schema level.","default":"any_fails"},"interval_seconds":{"type":"integer","maximum":86400.0,"minimum":10.0,"title":"Interval Seconds","description":"Check interval in seconds (up to 86400 for WHOIS)","default":60},"timeout_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout Seconds","description":"Timeout in seconds (5s default, up to 120s for PageSpeed)","default":5},"http_method":{"type":"string","title":"Http Method","description":"HTTP method (GET, POST, HEAD, etc.)","default":"GET"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","description":"HTTP headers"},"expected_status":{"type":"integer","maximum":599.0,"minimum":100.0,"title":"Expected Status","description":"Expected HTTP status code","default":200},"keyword":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Keyword","description":"Keyword to search in response"},"keyword_present":{"type":"boolean","title":"Keyword Present","description":"Whether keyword should be present or absent","default":true},"keyword_type":{"type":"string","pattern":"^(contains|not_contains|regex)$","title":"Keyword Type","description":"Keyword match type: contains, not_contains, or regex","default":"contains"},"json_path":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Json Path","description":"JSON path to check"},"json_expected_value":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Json Expected Value","description":"Expected JSON value"},"follow_redirects":{"type":"boolean","title":"Follow Redirects","description":"Whether to follow HTTP redirects","default":true},"verify_ssl":{"type":"boolean","title":"Verify Ssl","description":"Whether to verify SSL certificate","default":true},"trust_extra_anchor_any_tld":{"type":"boolean","title":"Trust Extra Anchor Any Tld","description":"Allow the extra-anchor (НУЦ) fallback to green this host even if it is outside .ru/.su/.рф (e.g. a Russian operator serving a НУЦ cert on a .com domain). Off by default.","default":false},"detect_stub_pages":{"type":"boolean","title":"Detect Stub Pages","description":"Detect domain-parking / hosting-suspension pages on HTTP 200","default":true},"retry_count":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retry Count","description":"Number of retries before marking as DOWN (0-5)","default":2},"retry_delay_seconds":{"type":"number","maximum":10.0,"minimum":0.5,"title":"Retry Delay Seconds","description":"Base delay between retries in seconds","default":2.0},"grpc_service_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Grpc Service Name","description":"gRPC service name for health check"},"grpc_use_tls":{"type":"boolean","title":"Grpc Use Tls","description":"Use TLS for gRPC","default":false},"tcp_expect_banner":{"type":"boolean","title":"Tcp Expect Banner","description":"Expect a banner/greeting","default":false},"tcp_expected_banner":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Tcp Expected Banner","description":"Expected banner content"},"ping_count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Ping Count","description":"Number of pings","default":4},"ping_packet_size":{"type":"integer","maximum":1500.0,"minimum":32.0,"title":"Ping Packet Size","description":"ICMP packet size in bytes (RFC 792 default: 64)","default":64},"confirmation_threshold":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Confirmation Threshold","description":"Consecutive failures before marking DOWN (Pingdom/Datadog standard)","default":3},"recovery_threshold":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Recovery Threshold","description":"Consecutive successes before marking UP","default":2},"grace_period_seconds":{"type":"integer","maximum":3600.0,"minimum":0.0,"title":"Grace Period Seconds","description":"Extra time before alerting (0-3600 seconds)","default":0},"response_time_warn_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Response Time Warn Ms","description":"Warning if RTT > X ms (0=disabled)","default":0},"response_time_critical_ms":{"type":"integer","maximum":60000.0,"minimum":0.0,"title":"Response Time Critical Ms","description":"Critical if RTT > X ms (0=disabled)","default":0},"packet_loss_warn_percent":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Packet Loss Warn Percent","description":"Warning if packet loss > X% (0=disabled)","default":0.0},"packet_loss_critical_percent":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Packet Loss Critical Percent","description":"Critical if packet loss > X% (0=disabled)","default":0.0},"dns_record_type":{"type":"string","title":"Dns Record Type","description":"DNS record type (A, AAAA, MX, TXT, etc.)","default":"A"},"dns_expected_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dns Expected Values","description":"Expected DNS resolution values"},"ws_send_message":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Ws Send Message","description":"Message to send after WebSocket connect"},"ws_expected_response":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Ws Expected Response","description":"Expected WebSocket response"},"ssl_warn_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Ssl Warn Days","description":"Days before expiry to warn (default 14). At check time both thresholds are additionally capped by the certificate lifetime: warn ≤ lifetime/3, critical ≤ lifetime/6 — so short-lived certs are not permanently degraded.","default":14},"ssl_critical_days":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Ssl Critical Days","description":"Days before expiry for critical alert","default":7},"whois_warn_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Whois Warn Days","description":"Days before domain expiry to warn","default":30},"whois_critical_days":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Whois Critical Days","description":"Days before domain expiry for critical alert","default":7},"smtp_use_starttls":{"type":"boolean","title":"Smtp Use Starttls","description":"Use STARTTLS for SMTP","default":true},"smtp_verify_tls":{"type":"boolean","title":"Smtp Verify Tls","description":"Verify TLS certificate for SMTP","default":true},"imap_use_ssl":{"type":"boolean","title":"Imap Use Ssl","description":"Use SSL for IMAP (port 993 vs 143)","default":true},"pop3_use_ssl":{"type":"boolean","title":"Pop3 Use Ssl","description":"Use SSL for POP3 (port 995 vs 110)","default":true},"ftp_use_tls":{"type":"boolean","title":"Ftp Use Tls","description":"Use TLS for FTP (FTPS)","default":false},"ftp_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Ftp Username","description":"FTP username (defaults to anonymous)"},"ftp_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Ftp Password","description":"FTP password"},"socks5_auth_required":{"type":"boolean","title":"Socks5 Auth Required","description":"Whether SOCKS5 proxy requires username/password auth","default":false},"socks5_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Username","description":"SOCKS5 username (max 255 per RFC 1929)"},"socks5_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Password","description":"SOCKS5 password (max 255 per RFC 1929)"},"socks5_test_target":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Socks5 Test Target","description":"Optional host:port for proxy-through CONNECT test (e.g. google.com:80)"},"mtproxy_secret":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Mtproxy Secret","description":"MTProxy secret (plain: 32 hex, dd: dd+32 hex, ee: ee+32 hex+domain_hex, or base64)"},"dnsbl_servers":{"anyOf":[{"items":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)+$"},"type":"array","maxItems":50},{"type":"null"}],"title":"Dnsbl Servers","description":"Custom DNSBL providers (hostnames). Empty/None → pydnsbl default list (zen.spamhaus.org, bl.spamcop.net, etc.)"},"pagespeed_strategy":{"type":"string","pattern":"^(mobile|desktop)$","title":"Pagespeed Strategy","description":"PageSpeed strategy: mobile or desktop","default":"mobile"},"pagespeed_threshold":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Pagespeed Threshold","description":"Performance score threshold for DEGRADED status (0-100)","default":50},"udp_payload":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Udp Payload","description":"Custom UDP payload to send"},"udp_expect_response":{"type":"boolean","title":"Udp Expect Response","description":"Whether to wait for a UDP response","default":true},"udp_expected_response":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Udp Expected Response","description":"Expected content in UDP response"},"api_check_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Api Check Config","description":"API check configuration (steps, assertions, auth, variables)"},"transaction_steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transaction Steps","description":"Transaction step configurations"},"transaction_viewport_width":{"type":"integer","maximum":3840.0,"minimum":320.0,"title":"Transaction Viewport Width","default":1920},"transaction_viewport_height":{"type":"integer","maximum":2160.0,"minimum":240.0,"title":"Transaction Viewport Height","default":1080},"transaction_user_agent":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Transaction User Agent"},"transaction_screenshot_on_error":{"type":"boolean","title":"Transaction Screenshot On Error","default":true}},"type":"object","required":["name","url","protocol","workspace_id"],"title":"CreateMonitorRequest","description":"Request schema for creating a monitor."},"CreateScheduledReportRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Report name"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID to assign report to"},"monitor_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Monitor Ids","description":"List of monitor IDs to include in the report (at least one required)"},"frequency":{"type":"string","title":"Frequency","description":"Report frequency: daily, weekly, or monthly","default":"weekly"},"format":{"type":"string","title":"Format","description":"Report format: pdf or csv","default":"pdf"},"recipients":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Recipients","description":"List of email addresses to send the report to (at least one required)"},"slo_target":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Slo Target","description":"SLO target percentage (0-100)"},"custom_hours_period":{"anyOf":[{"type":"integer","maximum":2160.0,"minimum":1.0},{"type":"null"}],"title":"Custom Hours Period","description":"Custom reporting period in hours (1-2160)"},"timezone":{"type":"string","maxLength":50,"title":"Timezone","description":"Timezone for report scheduling (e.g., 'UTC', 'Europe/London')","default":"UTC"},"include_incidents":{"type":"boolean","title":"Include Incidents","description":"Include incident details in the report","default":true},"include_latency_chart":{"type":"boolean","title":"Include Latency Chart","description":"Include latency chart in the report","default":true}},"type":"object","required":["name","workspace_id","monitor_ids","recipients"],"title":"CreateScheduledReportRequest","description":"Request schema for creating a scheduled report."},"CreateStatusPageRequest":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title","description":"Status page title (1-200 characters)"},"slug":{"type":"string","maxLength":100,"minLength":1,"title":"Slug","description":"URL slug for the status page (lowercase, numbers, hyphens)"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description","description":"Optional description (max 2000 characters)"},"theme":{"type":"string","enum":["dark","light"],"title":"Theme","description":"Page theme (dark or light)","default":"dark"},"logo_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Logo Url","description":"Optional logo URL"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID to create the status page in"},"is_public":{"type":"boolean","title":"Is Public","description":"Whether the page is publicly accessible","default":true},"allow_indexing":{"type":"boolean","title":"Allow Indexing","description":"Whether search engines are allowed to index this page","default":true},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone","description":"Optional IANA timezone for public viewers (e.g. 'Europe/Moscow'). Null/omitted = Auto (viewer's browser timezone)."}},"type":"object","required":["title","slug","workspace_id"],"title":"CreateStatusPageRequest","description":"Request schema for creating a new status page."},"CreateWebhookCheckRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Display name for the webhook check monitor"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description of the external system being monitored"},"secret":{"anyOf":[{"type":"string","maxLength":64,"minLength":16},{"type":"null"}],"title":"Secret","description":"Optional shared secret for webhook validation (min 16 chars)"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Allowed Ips","description":"Optional list of allowed source IP addresses/CIDRs (max 20)"},"state_field":{"type":"string","maxLength":100,"minLength":1,"title":"State Field","description":"JSON path to status field in payload (e.g., 'status', 'data.state')","default":"status"},"response_time_field":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Response Time Field","description":"Optional JSON path to response time field in payload"},"message_field":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Message Field","description":"Optional JSON path to message field in payload"},"expected_interval_seconds":{"type":"integer","maximum":2592000.0,"minimum":0.0,"title":"Expected Interval Seconds","description":"Expected interval between webhooks (0 = no timeout check)","default":0}},"type":"object","required":["name"],"title":"CreateWebhookCheckRequest","description":"Request schema for creating a webhook check monitor."},"CreateWebhookRequest":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url","description":"Webhook endpoint URL (must be HTTPS in production)"},"events":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Events","description":"List of events to subscribe to"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description for the webhook"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether webhook is active","default":true},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional metadata to include in webhook payloads"}},"type":"object","required":["url","events"],"title":"CreateWebhookRequest","description":"Request schema for creating a webhook."},"CreateWorkspaceInviteRequest":{"properties":{"role":{"type":"string","title":"Role","description":"Member role: editor or viewer","default":"viewer"}},"type":"object","title":"CreateWorkspaceInviteRequest"},"CreateWorkspaceRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human-readable name for the workspace (e.g., 'Work 1 - FinTech')"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description of the workspace"},"color":{"type":"string","title":"Color","description":"Hex color for UI display (#RRGGBB)","default":"#3B82F6"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon","description":"Optional emoji or icon for UI"}},"type":"object","required":["name"],"title":"CreateWorkspaceRequest","description":"Request schema for creating a workspace."},"DashboardCombinedResponse":{"properties":{"stats":{"$ref":"#/components/schemas/DashboardStatsResponse","description":"Dashboard statistics"},"uptime_summaries":{"items":{"$ref":"#/components/schemas/UptimeSummaryResponse"},"type":"array","title":"Uptime Summaries","description":"Uptime summaries per monitor"},"recent_incidents":{"items":{"$ref":"#/components/schemas/presentation__api__v1__schemas__dashboard__IncidentResponse"},"type":"array","title":"Recent Incidents","description":"Recent incidents"},"alerts_summary":{"$ref":"#/components/schemas/AlertsSummaryResponse","description":"Alerts summary"}},"type":"object","required":["stats","uptime_summaries","recent_incidents","alerts_summary"],"title":"DashboardCombinedResponse","description":"Combined dashboard response - all data in one request.\n\nPERFORMANCE: Reduces 4 API calls to 1, eliminates duplicate DB queries."},"DashboardCountsResponse":{"properties":{"total_monitors":{"type":"integer","title":"Total Monitors","description":"Total number of monitors"},"monitors_up":{"type":"integer","title":"Monitors Up","description":"Monitors currently UP"},"monitors_down":{"type":"integer","title":"Monitors Down","description":"ACTIVE monitors in a critical state (DOWN + TIMEOUT merged; paused monitors are excluded and counted in monitors_paused)"},"monitors_degraded":{"type":"integer","title":"Monitors Degraded","description":"ACTIVE monitors in the degraded tier: DEGRADED + PARTIAL + WARNING statuses (DNSBL excluded). monitors_partial is a subset of this count — do NOT sum the two"},"monitors_partial":{"type":"integer","title":"Monitors Partial","description":"Monitors in PARTIAL outage (down from some probe locations, up from others) — subset of monitors_degraded","default":0},"monitors_timeout":{"type":"integer","title":"Monitors Timeout","description":"ACTIVE monitors in TIMEOUT — subset of monitors_down (DNSBL excluded)","default":0},"monitors_unknown":{"type":"integer","title":"Monitors Unknown","description":"Active monitors outside the up/down/degraded categories (never checked, transient, skipped, DNSBL-listed in a problem state) — the five categories up/down/degraded/unknown/paused sum to total_monitors","default":0},"monitors_paused":{"type":"integer","title":"Monitors Paused","description":"Monitors currently paused (inactive)"},"total_heartbeats":{"type":"integer","title":"Total Heartbeats","description":"Total number of heartbeat monitors"},"heartbeats_up":{"type":"integer","title":"Heartbeats Up","description":"Heartbeats currently UP"},"heartbeats_down":{"type":"integer","title":"Heartbeats Down","description":"Heartbeats currently DOWN"},"heartbeats_pending":{"type":"integer","title":"Heartbeats Pending","description":"Heartbeats awaiting first ping"},"heartbeats_paused":{"type":"integer","title":"Heartbeats Paused","description":"Heartbeats currently paused (inactive)","default":0},"total_alerts":{"type":"integer","title":"Total Alerts","description":"Total number of alert configurations"},"alerts_active":{"type":"integer","title":"Alerts Active","description":"Currently active alerts"},"incidents_ongoing":{"type":"integer","title":"Incidents Ongoing","description":"Open incident records of the workspace (or of every accessible workspace without workspace_id): investigating + identified + monitoring, PARTIAL, DNSBL, paused-monitor and monitor-less ones included, deleted monitors excluded. Same predicate as GET /incidents/open (its total) and /incidents/stats.ongoing; 0 for a workspace the caller cannot access","default":0},"global_total_monitors":{"type":"integer","title":"Global Total Monitors","description":"Total monitors + heartbeats across all workspaces (for plan limit X/55 — heartbeats share the monitor budget)","default":0},"global_total_alerts":{"type":"integer","title":"Global Total Alerts","description":"Total alerts across all workspaces (for plan limit X/50)","default":0}},"type":"object","required":["total_monitors","monitors_up","monitors_down","monitors_degraded","monitors_paused","total_heartbeats","heartbeats_up","heartbeats_down","heartbeats_pending","total_alerts","alerts_active"],"title":"DashboardCountsResponse","description":"Live counters: what the sidebar and list pages poll (GET /dashboard/counts)."},"DashboardStatsResponse":{"properties":{"total_monitors":{"type":"integer","title":"Total Monitors","description":"Total number of monitors"},"monitors_up":{"type":"integer","title":"Monitors Up","description":"Monitors currently UP"},"monitors_down":{"type":"integer","title":"Monitors Down","description":"ACTIVE monitors in a critical state (DOWN + TIMEOUT merged; paused monitors are excluded and counted in monitors_paused)"},"monitors_degraded":{"type":"integer","title":"Monitors Degraded","description":"ACTIVE monitors in the degraded tier: DEGRADED + PARTIAL + WARNING statuses (DNSBL excluded). monitors_partial is a subset of this count — do NOT sum the two"},"monitors_partial":{"type":"integer","title":"Monitors Partial","description":"Monitors in PARTIAL outage (down from some probe locations, up from others) — subset of monitors_degraded","default":0},"monitors_timeout":{"type":"integer","title":"Monitors Timeout","description":"ACTIVE monitors in TIMEOUT — subset of monitors_down (DNSBL excluded)","default":0},"monitors_unknown":{"type":"integer","title":"Monitors Unknown","description":"Active monitors outside the up/down/degraded categories (never checked, transient, skipped, DNSBL-listed in a problem state) — the five categories up/down/degraded/unknown/paused sum to total_monitors","default":0},"monitors_paused":{"type":"integer","title":"Monitors Paused","description":"Monitors currently paused (inactive)"},"total_heartbeats":{"type":"integer","title":"Total Heartbeats","description":"Total number of heartbeat monitors"},"heartbeats_up":{"type":"integer","title":"Heartbeats Up","description":"Heartbeats currently UP"},"heartbeats_down":{"type":"integer","title":"Heartbeats Down","description":"Heartbeats currently DOWN"},"heartbeats_pending":{"type":"integer","title":"Heartbeats Pending","description":"Heartbeats awaiting first ping"},"heartbeats_paused":{"type":"integer","title":"Heartbeats Paused","description":"Heartbeats currently paused (inactive)","default":0},"total_alerts":{"type":"integer","title":"Total Alerts","description":"Total number of alert configurations"},"alerts_active":{"type":"integer","title":"Alerts Active","description":"Currently active alerts"},"incidents_ongoing":{"type":"integer","title":"Incidents Ongoing","description":"Open incident records of the workspace (or of every accessible workspace without workspace_id): investigating + identified + monitoring, PARTIAL, DNSBL, paused-monitor and monitor-less ones included, deleted monitors excluded. Same predicate as GET /incidents/open (its total) and /incidents/stats.ongoing; 0 for a workspace the caller cannot access","default":0},"global_total_monitors":{"type":"integer","title":"Global Total Monitors","description":"Total monitors + heartbeats across all workspaces (for plan limit X/55 — heartbeats share the monitor budget)","default":0},"global_total_alerts":{"type":"integer","title":"Global Total Alerts","description":"Total alerts across all workspaces (for plan limit X/50)","default":0},"overall_uptime_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Uptime 24H","description":"Overall uptime % in last 24 hours"},"overall_uptime_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Uptime 7D","description":"Overall uptime % in last 7 days"},"overall_uptime_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Uptime 30D","description":"Overall uptime % in last 30 days"},"avg_response_time_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Time 24H","description":"Average response time in last 24 hours (ms)"},"checks_last_24h":{"type":"integer","title":"Checks Last 24H","description":"Total checks in last 24 hours"},"incidents_last_24h":{"type":"integer","title":"Incidents Last 24H","description":"Incident records open now or resolved in the last 24 hours, the rule of /incidents/stats?since=now-24h (its total)"},"alerts_sent_last_24h":{"type":"integer","title":"Alerts Sent Last 24H","description":"Alerts sent in last 24 hours"},"checks_in_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checks In Period","description":"Total checks in selected period"},"incidents_in_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Incidents In Period","description":"Incident records open now or resolved in the selected period, the rule of /incidents/stats?since=<period start> (its total)"}},"type":"object","required":["total_monitors","monitors_up","monitors_down","monitors_degraded","monitors_paused","total_heartbeats","heartbeats_up","heartbeats_down","heartbeats_pending","total_alerts","alerts_active","checks_last_24h","incidents_last_24h","alerts_sent_last_24h"],"title":"DashboardStatsResponse","description":"Dashboard summary statistics: the counters plus uptime and activity aggregates."},"DeepHealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Overall status: healthy or unhealthy"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Check timestamp"},"checks":{"additionalProperties":{"type":"string"},"type":"object","title":"Checks","description":"Individual component check results"}},"type":"object","required":["status","timestamp","checks"],"title":"DeepHealthResponse","description":"Deep health check response with detailed component status."},"DnsblProviderHistoryItem":{"properties":{"host":{"type":"string","title":"Host","description":"Provider hostname (e.g. zen.spamhaus.org)"},"listing_count":{"type":"integer","title":"Listing Count","description":"Number of checks where this provider flagged"},"total_checks":{"type":"integer","title":"Total Checks","description":"Total checks in the window that queried this provider"},"first_listed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Listed At","description":"Earliest check in window when this provider flagged, NULL if never"},"last_listed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Listed At","description":"Most recent check in window when this provider flagged, NULL if never"},"points":{"items":{"$ref":"#/components/schemas/DnsblProviderHistoryPoint"},"type":"array","title":"Points","description":"Chronological sample points, oldest first"}},"type":"object","required":["host","listing_count","total_checks","points"],"title":"DnsblProviderHistoryItem","description":"Per-provider listing history within the requested window."},"DnsblProviderHistoryPoint":{"properties":{"t":{"type":"string","format":"date-time","title":"T","description":"Check timestamp"},"listed":{"type":"boolean","title":"Listed","description":"Was this provider in detected_by at check time"}},"type":"object","required":["t","listed"],"title":"DnsblProviderHistoryPoint","description":"One sample point in a provider's listing timeline."},"DnsblProviderHistoryResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"window_start":{"type":"string","format":"date-time","title":"Window Start","description":"Start of the queried window"},"window_end":{"type":"string","format":"date-time","title":"Window End","description":"End of the queried window"},"providers":{"items":{"$ref":"#/components/schemas/DnsblProviderHistoryItem"},"type":"array","title":"Providers","description":"One entry per provider seen in any check within the window"}},"type":"object","required":["monitor_id","window_start","window_end","providers"],"title":"DnsblProviderHistoryResponse","description":"Response schema for per-provider DNSBL listing history.\n\nPowers the mini-sparkline next to each provider chip on the monitor\ndetail page. A single payload gives the frontend everything it\nneeds to render: window bounds for x-axis, per-provider sample\npoints for sparkline, aggregate counts for the tooltip."},"ErrorBudgetResponse":{"properties":{"slo_target":{"type":"number","title":"Slo Target","description":"Target SLO percentage (e.g., 99.9)"},"allowed_downtime_seconds":{"type":"number","title":"Allowed Downtime Seconds","description":"Total allowed downtime for the period"},"allowed_downtime_formatted":{"type":"string","title":"Allowed Downtime Formatted","description":"Human-readable allowed downtime"},"consumed_downtime_seconds":{"type":"number","title":"Consumed Downtime Seconds","description":"Actual downtime consumed"},"consumed_downtime_formatted":{"type":"string","title":"Consumed Downtime Formatted","description":"Human-readable consumed downtime"},"remaining_seconds":{"type":"number","title":"Remaining Seconds","description":"Remaining error budget in seconds"},"remaining_formatted":{"type":"string","title":"Remaining Formatted","description":"Human-readable remaining budget"},"remaining_percentage":{"type":"number","title":"Remaining Percentage","description":"Remaining error budget as percentage of allowed"},"budget_exhausted":{"type":"boolean","title":"Budget Exhausted","description":"Whether error budget is exhausted"}},"type":"object","required":["slo_target","allowed_downtime_seconds","allowed_downtime_formatted","consumed_downtime_seconds","consumed_downtime_formatted","remaining_seconds","remaining_formatted","remaining_percentage","budget_exhausted"],"title":"ErrorBudgetResponse","description":"Response schema for error budget metrics."},"ExecuteApiCheckRequest":{"properties":{"variable_overrides":{"additionalProperties":{"type":"string"},"type":"object","title":"Variable Overrides","description":"Override initial variables for this execution"}},"type":"object","title":"ExecuteApiCheckRequest","description":"Request schema for manually executing an API check."},"ExecuteApiCheckResponse":{"properties":{"result":{"$ref":"#/components/schemas/ApiCheckResultResponse"},"api_check":{"$ref":"#/components/schemas/ApiCheckSummaryResponse"}},"type":"object","required":["result","api_check"],"title":"ExecuteApiCheckResponse","description":"Response schema for manual API check execution."},"ExecuteCheckRequest":{"properties":{"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region","description":"Region to execute check from"}},"type":"object","title":"ExecuteCheckRequest","description":"Request schema for manual health check execution."},"FeedbackCreateRequest":{"properties":{"type":{"type":"string","enum":["idea","bug","feedback"],"title":"Type","description":"Feedback type: idea (💡), bug (🐛), or feedback (💬)"},"title":{"type":"string","maxLength":200,"minLength":3,"title":"Title","description":"Feedback title (3-200 characters)"},"description":{"type":"string","maxLength":2000,"minLength":10,"title":"Description","description":"Detailed feedback description (10-2000 characters)"}},"type":"object","required":["type","title","description"],"title":"FeedbackCreateRequest","description":"Request schema for creating new feedback."},"FeedbackListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FeedbackResponse"},"type":"array","title":"Items","description":"List of feedback items"},"total":{"type":"integer","title":"Total","description":"Total number of feedback items"},"limit":{"type":"integer","title":"Limit","description":"Maximum number of items per page"},"offset":{"type":"integer","title":"Offset","description":"Pagination offset"}},"type":"object","required":["items","total","limit","offset"],"title":"FeedbackListResponse","description":"Response schema for paginated feedback list."},"FeedbackResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Feedback ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id","description":"Submitter user ID (optional)"},"type":{"type":"string","title":"Type","description":"Feedback type (idea, bug, feedback)"},"title":{"type":"string","title":"Title","description":"Feedback title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Feedback description (optional)"},"status":{"type":"string","title":"Status","description":"Feedback status"},"votes_count":{"type":"integer","title":"Votes Count","description":"Number of votes","default":0},"is_public":{"type":"boolean","title":"Is Public","description":"Whether feedback is publicly visible","default":true},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","workspace_id","type","title","status"],"title":"FeedbackResponse","description":"Response schema for feedback."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Account email to send the reset link to"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Request schema for the forgot-password flow (reset link by email)."},"FullAnalyticsResponse":{"properties":{"stats":{"$ref":"#/components/schemas/UserActivityStatsResponse","description":"User activity statistics"},"retention":{"$ref":"#/components/schemas/RetentionStatsResponse","description":"Retention statistics"},"churn":{"$ref":"#/components/schemas/ChurnStatsResponse","description":"Churn statistics"},"funnel":{"$ref":"#/components/schemas/FunnelStatsResponse","description":"Funnel statistics"},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"Timestamp when analytics were generated"}},"type":"object","required":["stats","retention","churn","funnel","generated_at"],"title":"FullAnalyticsResponse","description":"Response schema for complete analytics snapshot."},"FunnelConversions":{"properties":{"registered_to_first_monitor":{"type":"number","title":"Registered To First Monitor","description":"Conversion rate from registered to first monitor (%)"},"first_monitor_to_active":{"type":"number","title":"First Monitor To Active","description":"Conversion rate from first monitor to active (%)"},"active_to_paid":{"type":"number","title":"Active To Paid","description":"Conversion rate from active to paid (%)"}},"type":"object","required":["registered_to_first_monitor","first_monitor_to_active","active_to_paid"],"title":"FunnelConversions","description":"Funnel conversion rates."},"FunnelStages":{"properties":{"registered":{"type":"integer","title":"Registered","description":"Total registered users"},"first_monitor":{"type":"integer","title":"First Monitor","description":"Users with at least one monitor"},"active_7d":{"type":"integer","title":"Active 7D","description":"Users active in last 7 days"},"paid":{"type":"integer","title":"Paid","description":"Users on paid plans"}},"type":"object","required":["registered","first_monitor","active_7d","paid"],"title":"FunnelStages","description":"Funnel stage counts."},"FunnelStatsResponse":{"properties":{"stages":{"$ref":"#/components/schemas/FunnelStages","description":"Stage counts"},"conversions":{"$ref":"#/components/schemas/FunnelConversions","description":"Conversion rates between stages"}},"type":"object","required":["stages","conversions"],"title":"FunnelStatsResponse","description":"Response schema for funnel statistics."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Health status: healthy or unhealthy"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Check timestamp"},"database":{"type":"string","title":"Database","description":"Database connection status"},"version":{"type":"string","title":"Version","description":"Application version","default":"1.0.0"}},"type":"object","required":["status","timestamp","database"],"title":"HealthResponse","description":"Health check response."},"HeartbeatMonitorListResponse":{"properties":{"monitors":{"items":{"$ref":"#/components/schemas/HeartbeatMonitorResponse"},"type":"array","title":"Monitors","description":"List of heartbeat monitors"},"total":{"type":"integer","title":"Total","description":"Total number of monitors"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["monitors","total","page","page_size"],"title":"HeartbeatMonitorListResponse","description":"Response schema for paginated heartbeat monitor list."},"HeartbeatMonitorResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Heartbeat monitor UUID"},"name":{"type":"string","title":"Name","description":"Display name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"slug":{"type":"string","title":"Slug","description":"URL slug for ping endpoint"},"ping_key":{"type":"string","title":"Ping Key","description":"Workspace ping key (secret component of URL)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Monitor description"},"expected_interval_seconds":{"type":"integer","title":"Expected Interval Seconds","description":"Expected ping interval"},"grace_period_seconds":{"type":"integer","title":"Grace Period Seconds","description":"Grace period before DOWN"},"status":{"$ref":"#/components/schemas/HeartbeatStatus","description":"Current monitor status"},"last_ping_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ping At","description":"Last received ping timestamp"},"last_signal":{"anyOf":[{"$ref":"#/components/schemas/HeartbeatSignal"},{"type":"null"}],"description":"Last ping signal type"},"last_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Payload","description":"Last ping payload data"},"total_pings":{"type":"integer","title":"Total Pings","description":"Total pings received"},"consecutive_misses":{"type":"integer","title":"Consecutive Misses","description":"Consecutive missed pings"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether monitor is active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","user_id","workspace_id","slug","ping_key","expected_interval_seconds","grace_period_seconds","status","total_pings","consecutive_misses","is_active"],"title":"HeartbeatMonitorResponse","description":"Response schema for a heartbeat monitor."},"HeartbeatMonitorWithSecretResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Heartbeat monitor UUID"},"name":{"type":"string","title":"Name","description":"Display name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"slug":{"type":"string","title":"Slug","description":"URL slug for ping endpoint"},"ping_key":{"type":"string","title":"Ping Key","description":"Workspace ping key (secret component of URL)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Monitor description"},"expected_interval_seconds":{"type":"integer","title":"Expected Interval Seconds","description":"Expected ping interval"},"grace_period_seconds":{"type":"integer","title":"Grace Period Seconds","description":"Grace period before DOWN"},"status":{"$ref":"#/components/schemas/HeartbeatStatus","description":"Current monitor status"},"last_ping_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ping At","description":"Last received ping timestamp"},"last_signal":{"anyOf":[{"$ref":"#/components/schemas/HeartbeatSignal"},{"type":"null"}],"description":"Last ping signal type"},"last_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Payload","description":"Last ping payload data"},"total_pings":{"type":"integer","title":"Total Pings","description":"Total pings received"},"consecutive_misses":{"type":"integer","title":"Consecutive Misses","description":"Consecutive missed pings"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether monitor is active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Secret for authenticated pings (None if disabled)"}},"type":"object","required":["id","name","user_id","workspace_id","slug","ping_key","expected_interval_seconds","grace_period_seconds","status","total_pings","consecutive_misses","is_active"],"title":"HeartbeatMonitorWithSecretResponse","description":"Response schema including secret (only shown on create)."},"HeartbeatPingListResponse":{"properties":{"pings":{"items":{"$ref":"#/components/schemas/HeartbeatPingResponse"},"type":"array","title":"Pings","description":"List of pings"},"total":{"type":"integer","title":"Total","description":"Total number of pings"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["pings","total","page","page_size"],"title":"HeartbeatPingListResponse","description":"Response schema for paginated ping list."},"HeartbeatPingResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Ping UUID"},"heartbeat_monitor_id":{"type":"string","title":"Heartbeat Monitor Id","description":"Parent monitor UUID"},"signal":{"$ref":"#/components/schemas/HeartbeatSignal","description":"Signal type"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Ping payload data"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms","description":"Job duration in ms"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address","description":"Source IP address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent","description":"User agent string"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When ping was received"}},"type":"object","required":["id","heartbeat_monitor_id","signal","created_at"],"title":"HeartbeatPingResponse","description":"Response schema for a heartbeat ping record."},"HeartbeatSignal":{"type":"string","enum":["ping","start","success","fail"],"title":"HeartbeatSignal","description":"Signal types for heartbeat monitoring.\n\nSignals indicate the state of a monitored job/cron task:\n- PING: Generic heartbeat ping (job is alive)\n- START: Job has started execution\n- SUCCESS: Job completed successfully\n- FAIL: Job failed with error"},"HeartbeatStatsResponse":{"properties":{"monitor_id":{"type":"string","title":"Monitor Id","description":"Monitor ID"},"total_pings":{"type":"integer","title":"Total Pings","description":"Total pings received"},"pings_last_24h":{"type":"integer","title":"Pings Last 24H","description":"Pings in last 24 hours"},"pings_last_7d":{"type":"integer","title":"Pings Last 7D","description":"Pings in last 7 days"},"uptime_percent_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percent 24H","description":"Uptime percentage (24h); null when the window can't measure uptime"},"uptime_percent_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percent 7D","description":"Uptime percentage (7d); null when the window can't measure uptime"},"avg_interval_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Interval Seconds","description":"Average interval between pings"},"last_ping_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ping At","description":"Last ping timestamp"},"status":{"$ref":"#/components/schemas/HeartbeatStatus","description":"Current status"}},"type":"object","required":["monitor_id","total_pings","pings_last_24h","pings_last_7d","status"],"title":"HeartbeatStatsResponse","description":"Response schema for heartbeat monitor statistics."},"HeartbeatStatus":{"type":"string","enum":["pending","up","down","paused"],"title":"HeartbeatStatus","description":"Status of a heartbeat monitor.\n\n- PENDING: No pings received yet (new monitor)\n- UP: Receiving pings within expected interval\n- DOWN: Missed expected ping (grace period exceeded)\n- PAUSED: Monitoring temporarily disabled"},"HttpMethodSchema":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],"title":"HttpMethodSchema","description":"HTTP methods supported for API checks."},"IncidentCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"severity":{"type":"string","pattern":"^(minor|major|critical)$","title":"Severity","default":"minor"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"}},"type":"object","required":["title"],"title":"IncidentCreate","description":"Request to create a new incident."},"IncidentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/presentation__api__v1__schemas__incidents__IncidentResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"IncidentListResponse","description":"Response for paginated incident list."},"IncidentStatsResponse":{"properties":{"total":{"type":"integer","title":"Total"},"ongoing":{"type":"integer","title":"Ongoing","description":"Open incident records (investigating + identified + monitoring), monitor-less ones included, those of deleted monitors excluded. Ignores since. Same predicate as GET /incidents/open (its total) and /dashboard/*.incidents_ongoing"},"resolved":{"type":"integer","title":"Resolved"},"mttr_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mttr Seconds"}},"type":"object","required":["total","ongoing","resolved"],"title":"IncidentStatsResponse","description":"Aggregate incident stats, independent of list pagination (bug 17)."},"IncidentUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"severity":{"anyOf":[{"type":"string","pattern":"^(minor|major|critical)$"},{"type":"null"}],"title":"Severity"},"status":{"anyOf":[{"type":"string","pattern":"^(investigating|identified|monitoring|resolved)$"},{"type":"null"}],"title":"Status"}},"type":"object","title":"IncidentUpdate","description":"Request to update an incident."},"IncidentUpdateCreate":{"properties":{"message":{"type":"string","maxLength":1000,"minLength":1,"title":"Message"},"status":{"anyOf":[{"type":"string","pattern":"^(investigating|identified|monitoring|resolved)$"},{"type":"null"}],"title":"Status"}},"type":"object","required":["message"],"title":"IncidentUpdateCreate","description":"Request to add a timeline update to an incident."},"IncidentUpdateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"message":{"type":"string","title":"Message"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"posted_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posted By User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","message","status","posted_by_user_id","created_at"],"title":"IncidentUpdateResponse","description":"Response for an incident timeline update."},"LatencyPercentilesResponse":{"properties":{"p50":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50","description":"50th percentile (median) response time in ms"},"p90":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90","description":"90th percentile response time in ms"},"p95":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95","description":"95th percentile response time in ms"},"p99":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P99","description":"99th percentile response time in ms"},"avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg","description":"Average response time in ms"},"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min","description":"Minimum response time in ms"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max","description":"Maximum response time in ms"}},"type":"object","title":"LatencyPercentilesResponse","description":"Response schema for latency percentile metrics."},"LivenessResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Liveness status","default":"alive"}},"type":"object","title":"LivenessResponse","description":"Liveness probe response."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"User email address"},"password":{"type":"string","maxLength":128,"title":"Password","description":"User password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Request schema for user login."},"LogoutAllResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Result message"},"success":{"type":"boolean","title":"Success","description":"Whether logout was successful"},"sessions_revoked":{"type":"integer","title":"Sessions Revoked","description":"Number of sessions revoked"}},"type":"object","required":["message","success","sessions_revoked"],"title":"LogoutAllResponse","description":"Response schema for logout all sessions operation."},"LogoutRequest":{"properties":{"refresh_token":{"type":"string","maxLength":2048,"title":"Refresh Token","description":"Refresh token to revoke"}},"type":"object","required":["refresh_token"],"title":"LogoutRequest","description":"Request schema for logout (revoke refresh token)."},"LogoutResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Result message"},"success":{"type":"boolean","title":"Success","description":"Whether logout was successful"}},"type":"object","required":["message","success"],"title":"LogoutResponse","description":"Response schema for logout operation."},"MaintenanceCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"scheduled_start":{"type":"string","format":"date-time","title":"Scheduled Start"},"scheduled_end":{"type":"string","format":"date-time","title":"Scheduled End"},"status_page_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Page Id"},"affected_monitors":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Affected Monitors"}},"type":"object","required":["title","scheduled_start","scheduled_end"],"title":"MaintenanceCreate","description":"Request to create a maintenance window."},"MaintenanceListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MaintenanceResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"MaintenanceListResponse","description":"Response for paginated maintenance list."},"MaintenanceResponse":{"properties":{"id":{"type":"integer","title":"Id"},"workspace_id":{"type":"integer","title":"Workspace Id"},"status_page_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Page Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scheduled_start":{"type":"string","format":"date-time","title":"Scheduled Start"},"scheduled_end":{"type":"string","format":"date-time","title":"Scheduled End"},"status":{"type":"string","title":"Status"},"affected_monitors":{"items":{"type":"integer"},"type":"array","title":"Affected Monitors"},"created_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","workspace_id","status_page_id","title","description","scheduled_start","scheduled_end","status","affected_monitors","created_by_user_id","created_at","updated_at"],"title":"MaintenanceResponse","description":"Response for a maintenance window."},"MaintenanceUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Description"},"scheduled_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Start"},"scheduled_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled End"},"affected_monitors":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Affected Monitors"}},"type":"object","title":"MaintenanceUpdate","description":"Request to update a maintenance window."},"McpTestRequest":{"properties":{"api_key":{"type":"string","maxLength":100,"minLength":3,"pattern":"^pz_[a-zA-Z0-9_\\-]+$","title":"Api Key","description":"PingZen API key (pz_ prefix, alphanumeric)"}},"type":"object","required":["api_key"],"title":"McpTestRequest","description":"Request schema for MCP connection test."},"McpTestResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"Whether connection succeeded"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error type if connection failed"}},"type":"object","required":["connected"],"title":"McpTestResponse","description":"Response schema for MCP connection test."},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Response message"}},"type":"object","required":["message"],"title":"MessageResponse","description":"Generic message response."},"MonitorGroupListResponse":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/MonitorGroupResponse"},"type":"array","title":"Groups","description":"List of monitor groups"},"total":{"type":"integer","title":"Total","description":"Total number of groups"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["groups","total","page","page_size"],"title":"MonitorGroupListResponse","description":"Response schema for paginated monitor group list."},"MonitorGroupResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Monitor group UUID"},"name":{"type":"string","title":"Name","description":"Group name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Group description"},"monitor_ids":{"items":{"type":"integer"},"type":"array","title":"Monitor Ids","description":"List of monitor IDs in the group"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"List of tags"},"threshold_degraded":{"type":"number","title":"Threshold Degraded","description":"Threshold for DEGRADED status (0.0-1.0)"},"threshold_down":{"type":"number","title":"Threshold Down","description":"Threshold for DOWN status (0.0-1.0)"},"status":{"type":"string","title":"Status","description":"Current aggregated status"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the group is active"},"monitor_count":{"type":"integer","title":"Monitor Count","description":"Number of monitors in the group"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","name","user_id","workspace_id","monitor_ids","tags","threshold_degraded","threshold_down","status","is_active","monitor_count"],"title":"MonitorGroupResponse","description":"Response schema for a monitor group."},"MonitorGroupStatsResponse":{"properties":{"total_groups":{"type":"integer","title":"Total Groups","description":"Total number of groups"},"active_groups":{"type":"integer","title":"Active Groups","description":"Number of active groups"},"inactive_groups":{"type":"integer","title":"Inactive Groups","description":"Number of inactive groups"},"groups_up":{"type":"integer","title":"Groups Up","description":"Groups with UP status"},"groups_degraded":{"type":"integer","title":"Groups Degraded","description":"Groups with DEGRADED status"},"groups_down":{"type":"integer","title":"Groups Down","description":"Groups with DOWN status"},"groups_unknown":{"type":"integer","title":"Groups Unknown","description":"Groups with UNKNOWN status"},"total_monitors_grouped":{"type":"integer","title":"Total Monitors Grouped","description":"Total monitors across all groups"},"avg_monitors_per_group":{"type":"number","title":"Avg Monitors Per Group","description":"Average monitors per group"}},"type":"object","required":["total_groups","active_groups","inactive_groups","groups_up","groups_degraded","groups_down","groups_unknown","total_monitors_grouped","avg_monitors_per_group"],"title":"MonitorGroupStatsResponse","description":"Response schema for monitor group statistics."},"MonitorGroupStatusResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Monitor group UUID"},"name":{"type":"string","title":"Name","description":"Group name"},"status":{"type":"string","title":"Status","description":"Current aggregated status"},"monitor_count":{"type":"integer","title":"Monitor Count","description":"Total monitors in group"},"healthy_count":{"type":"integer","title":"Healthy Count","description":"Number of healthy monitors"},"degraded_count":{"type":"integer","title":"Degraded Count","description":"Number of degraded monitors"},"down_count":{"type":"integer","title":"Down Count","description":"Number of down monitors"},"unknown_count":{"type":"integer","title":"Unknown Count","description":"Number of unknown status monitors"},"health_percentage":{"type":"number","title":"Health Percentage","description":"Percentage of healthy monitors"},"threshold_degraded":{"type":"number","title":"Threshold Degraded","description":"Threshold for DEGRADED"},"threshold_down":{"type":"number","title":"Threshold Down","description":"Threshold for DOWN"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At","description":"Last status check time"}},"type":"object","required":["id","name","status","monitor_count","healthy_count","degraded_count","down_count","unknown_count","health_percentage","threshold_degraded","threshold_down"],"title":"MonitorGroupStatusResponse","description":"Response schema for monitor group status with details."},"MonitorImportReportResponse":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run"},"total_rows":{"type":"integer","title":"Total Rows"},"created":{"items":{"$ref":"#/components/schemas/MonitorImportRowResult"},"type":"array","title":"Created"},"skipped":{"items":{"$ref":"#/components/schemas/MonitorImportRowResult"},"type":"array","title":"Skipped"},"errors":{"items":{"$ref":"#/components/schemas/MonitorImportRowResult"},"type":"array","title":"Errors"},"ignored_columns":{"items":{"type":"string"},"type":"array","title":"Ignored Columns","description":"CSV columns that matched no known monitor field and were ignored"}},"type":"object","required":["dry_run","total_rows","created","skipped","errors"],"title":"MonitorImportReportResponse","description":"Per-row report of a CSV import (partial success by design)."},"MonitorImportRowResult":{"properties":{"row_number":{"type":"integer","title":"Row Number","description":"1-based CSV line number (header is line 1)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"workspace_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id","description":"Set for created rows"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why the row was skipped or failed"}},"type":"object","required":["row_number"],"title":"MonitorImportRowResult","description":"Outcome of a single CSV row."},"MonitorListResponse":{"properties":{"monitors":{"items":{"$ref":"#/components/schemas/MonitorResponse"},"type":"array","title":"Monitors","description":"List of monitors"},"total":{"type":"integer","title":"Total","description":"Total number of monitors"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["monitors","total","page","page_size"],"title":"MonitorListResponse","description":"Response schema for paginated monitor list."},"MonitorResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Monitor ID"},"name":{"type":"string","title":"Name","description":"Monitor name"},"url":{"type":"string","title":"Url","description":"URL or host"},"protocol":{"type":"string","title":"Protocol","description":"Protocol"},"interval_seconds":{"type":"integer","title":"Interval Seconds","description":"Check interval in seconds"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds","description":"Timeout in seconds"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"probe_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Id","description":"Single probe ID alias = probe_ids[0]. DEPRECATED — read `probe_ids` instead. Will be removed 2026-07-27.","deprecated":true},"probe_ids":{"items":{"type":"integer"},"type":"array","title":"Probe Ids","description":"Probe IDs assigned for multi-region checks. Empty list = central server."},"aggregation_rule":{"type":"string","title":"Aggregation Rule","description":"How per-probe states combine into Monitor.status: any_fails, majority_fail, or all_fail.","default":"any_fails"},"status":{"type":"string","title":"Status","description":"Current status: UP, DOWN, UNKNOWN"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether monitor is active"},"http_method":{"type":"string","title":"Http Method","description":"HTTP method"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","description":"HTTP headers"},"expected_status":{"type":"integer","title":"Expected Status","description":"Expected HTTP status"},"keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyword","description":"Keyword to search"},"keyword_present":{"type":"boolean","title":"Keyword Present","description":"Keyword present or absent"},"keyword_type":{"type":"string","title":"Keyword Type","description":"Keyword match type","default":"contains"},"json_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Json Path"},"json_expected_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Json Expected Value"},"follow_redirects":{"type":"boolean","title":"Follow Redirects"},"verify_ssl":{"type":"boolean","title":"Verify Ssl"},"trust_extra_anchor_any_tld":{"type":"boolean","title":"Trust Extra Anchor Any Tld","default":false},"detect_stub_pages":{"type":"boolean","title":"Detect Stub Pages","default":true},"retry_count":{"type":"integer","title":"Retry Count","description":"Number of retries before marking as DOWN"},"retry_delay_seconds":{"type":"number","title":"Retry Delay Seconds","description":"Base delay between retries in seconds"},"grpc_service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grpc Service Name"},"grpc_use_tls":{"type":"boolean","title":"Grpc Use Tls"},"tcp_expect_banner":{"type":"boolean","title":"Tcp Expect Banner"},"tcp_expected_banner":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tcp Expected Banner"},"ping_count":{"type":"integer","title":"Ping Count"},"ping_packet_size":{"type":"integer","title":"Ping Packet Size","description":"ICMP packet size in bytes","default":64},"confirmation_threshold":{"type":"integer","title":"Confirmation Threshold","description":"Consecutive failures before DOWN","default":3},"recovery_threshold":{"type":"integer","title":"Recovery Threshold","description":"Consecutive successes before UP","default":2},"current_failure_streak":{"type":"integer","title":"Current Failure Streak","description":"Current consecutive failures","default":0},"current_success_streak":{"type":"integer","title":"Current Success Streak","description":"Current consecutive successes","default":0},"grace_period_seconds":{"type":"integer","title":"Grace Period Seconds","description":"Extra time before alerting","default":0},"response_time_warn_ms":{"type":"integer","title":"Response Time Warn Ms","description":"Warning if RTT > X ms","default":0},"response_time_critical_ms":{"type":"integer","title":"Response Time Critical Ms","description":"Critical if RTT > X ms","default":0},"packet_loss_warn_percent":{"type":"number","title":"Packet Loss Warn Percent","description":"Warning if loss > X%","default":0.0},"packet_loss_critical_percent":{"type":"number","title":"Packet Loss Critical Percent","description":"Critical if loss > X%","default":0.0},"dns_record_type":{"type":"string","title":"Dns Record Type","description":"DNS record type (A, AAAA, MX, etc.)","default":"A"},"dns_expected_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dns Expected Values","description":"Expected DNS resolution values"},"ws_send_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Send Message","description":"Message to send after WebSocket connect"},"ws_expected_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ws Expected Response","description":"Expected WebSocket response"},"ssl_warn_days":{"type":"integer","title":"Ssl Warn Days"},"ssl_critical_days":{"type":"integer","title":"Ssl Critical Days"},"whois_warn_days":{"type":"integer","title":"Whois Warn Days"},"whois_critical_days":{"type":"integer","title":"Whois Critical Days"},"smtp_use_starttls":{"type":"boolean","title":"Smtp Use Starttls"},"smtp_verify_tls":{"type":"boolean","title":"Smtp Verify Tls"},"imap_use_ssl":{"type":"boolean","title":"Imap Use Ssl"},"pop3_use_ssl":{"type":"boolean","title":"Pop3 Use Ssl"},"ftp_use_tls":{"type":"boolean","title":"Ftp Use Tls"},"ftp_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ftp Username"},"ftp_password_set":{"type":"boolean","title":"Ftp Password Set","description":"Whether FTP password is configured","default":false},"socks5_auth_required":{"type":"boolean","title":"Socks5 Auth Required","default":false},"socks5_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Socks5 Username"},"socks5_password_set":{"type":"boolean","title":"Socks5 Password Set","description":"Whether SOCKS5 password is configured","default":false},"socks5_test_target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Socks5 Test Target"},"mtproxy_secret_set":{"type":"boolean","title":"Mtproxy Secret Set","description":"Whether MTProxy secret is configured","default":false},"dnsbl_servers":{"items":{"type":"string"},"type":"array","title":"Dnsbl Servers","description":"Custom DNSBL providers (empty → pydnsbl defaults)"},"pagespeed_strategy":{"type":"string","title":"Pagespeed Strategy","description":"PageSpeed strategy","default":"mobile"},"pagespeed_threshold":{"type":"integer","title":"Pagespeed Threshold","description":"Performance threshold (0-100)","default":50},"udp_payload":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Udp Payload","description":"Custom UDP payload"},"udp_expect_response":{"type":"boolean","title":"Udp Expect Response","description":"Wait for UDP response","default":true},"udp_expected_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Udp Expected Response","description":"Expected UDP response content"},"api_check_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Api Check Config","description":"API check configuration"},"transaction_steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transaction Steps","description":"Transaction step configurations"},"transaction_viewport_width":{"type":"integer","title":"Transaction Viewport Width","description":"Browser viewport width","default":1920},"transaction_viewport_height":{"type":"integer","title":"Transaction Viewport Height","description":"Browser viewport height","default":1080},"transaction_user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction User Agent","description":"Custom user agent string"},"transaction_screenshot_on_error":{"type":"boolean","title":"Transaction Screenshot On Error","description":"Capture screenshot on failure","default":true},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"last_check_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Check At"},"incident_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Incident Started At","description":"Start time of current ongoing incident"},"uptime_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 24H","description":"Uptime % in last 24 hours"},"avg_response_time_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Time 24H","description":"Avg response time in last 24 hours (ms)"},"last_response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Response Time Ms","description":"Most recent check's response time (ms, integer)"},"last_ping_avg_rtt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Ping Avg Rtt","description":"Most recent PING check's kernel-measured avg RTT (float, 3 decimals). Present only for PING/ICMP monitors. Preserves sub-millisecond precision (e.g. 0.260 ms for in-datacenter targets) that `last_response_time_ms` cannot express due to its integer type. UI should prefer this field for PING monitors when the value is below a few ms."},"last_failure_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure Category","description":"failure_category of the most recent check (e.g. anti_bot, timeout); null when the latest check is UP or unclassified."},"last_bot_protection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Bot Protection","description":"Bot-protection vendor that refused the most recent check (Cloudflare, PerimeterX, DataDome, Akamai, Imperva, WBaaS) when the checker stored evidence for it. anti_bot + last_bot_protection = checks blocked with evidence; the category alone may come from the 403 + WAF-CDN heuristic."},"last_http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Http Status","description":"HTTP status code of the most recent check; null when it got no HTTP reply."},"last_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Message","description":"Error message of the most recent check, first 300 characters; null when the check passed. The full text is in the check results."},"ssl_days_until_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ssl Days Until Expiry","description":"Days until SSL certificate expires (SSL monitors only)"},"ssl_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ssl Expires At","description":"SSL certificate expiration date (SSL monitors only)"},"ssl_issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssl Issuer","description":"SSL certificate issuer (SSL monitors only)"},"ssl_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssl Subject","description":"SSL certificate subject/CN (SSL monitors only)"},"ssl_san":{"items":{"type":"string"},"type":"array","title":"Ssl San","description":"Subject Alternative Names (DNS entries)"},"ssl_tls_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssl Tls Version","description":"TLS protocol version (e.g., TLSv1.3)"},"ssl_cipher_suite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ssl Cipher Suite","description":"Cipher suite name"},"ssl_cipher_bits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ssl Cipher Bits","description":"Cipher strength in bits"},"ssl_issued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ssl Issued At","description":"SSL certificate notBefore (SSL monitors only)"},"ssl_effective_warn_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ssl Effective Warn Days","description":"ssl_warn_days after the certificate-lifetime cap (min(warn, lifetime/3)). NULL until a check has recorded the certificate's notBefore."},"ssl_effective_critical_days":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ssl Effective Critical Days","description":"ssl_critical_days after the certificate-lifetime cap (min(critical, lifetime/6))"},"whois_days_until_expiry":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Whois Days Until Expiry","description":"Days until domain expires (WHOIS monitors only)"},"whois_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Whois Expires At","description":"Domain expiration date (WHOIS monitors only)"},"whois_registrar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whois Registrar","description":"Domain registrar name (WHOIS monitors only)"},"imap_capabilities":{"items":{"type":"string"},"type":"array","title":"Imap Capabilities","description":"IMAP server CAPABILITY tokens from RFC 3501 §7.1.1 / RFC 9051 §7.1.1 (e.g., IMAP4rev1, IDLE, STARTTLS, AUTH=OAUTHBEARER, LOGINDISABLED). Empty for non-IMAP monitors or before the first successful check."}},"type":"object","required":["id","name","url","protocol","interval_seconds","timeout_seconds","user_id","workspace_id","status","is_active","http_method","headers","expected_status","keyword_present","follow_redirects","verify_ssl","retry_count","retry_delay_seconds","grpc_use_tls","tcp_expect_banner","ping_count","ssl_warn_days","ssl_critical_days","whois_warn_days","whois_critical_days","smtp_use_starttls","smtp_verify_tls","imap_use_ssl","pop3_use_ssl","ftp_use_tls"],"title":"MonitorResponse","description":"Response schema for a monitor."},"MonitorSortField":{"type":"string","enum":["status","name","uptime","response","manual"],"title":"MonitorSortField"},"MonitorStatsResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"uptime_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percentage","description":"Uptime percentage (null if no checks in period)"},"avg_response_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Time Ms","description":"Average response time in ms"},"checks_total":{"type":"integer","title":"Checks Total","description":"Total checks"},"checks_up":{"type":"integer","title":"Checks Up","description":"Successful checks"},"checks_down":{"type":"integer","title":"Checks Down","description":"Failed checks"},"checks_timeout":{"type":"integer","title":"Checks Timeout","description":"Timeout checks"},"checks_degraded":{"type":"integer","title":"Checks Degraded","description":"Degraded checks (site works, config issues)","default":0},"checks_other":{"type":"integer","title":"Checks Other","description":"Checks in other states (partial/warning/unknown/transient/skipped) — checks_total always equals up+down+timeout+degraded+other","default":0},"checks_blocked_by_bot_protection":{"type":"integer","title":"Checks Blocked By Bot Protection","description":"Checks the target refused with bot protection (failure_category = anti_bot), any status: DEGRADED when the vendor is named (since 2026-10), DOWN otherwise or before. NOT a sixth bucket; checks_total still equals up+down+timeout+degraded+other.","default":0},"checks_down_blocked_by_bot_protection":{"type":"integer","title":"Checks Down Blocked By Bot Protection","description":"The part of checks_blocked_by_bot_protection that is DOWN — a subset of checks_down, capped at it.","default":0},"checks_counted_for_bot_protection":{"type":"integer","title":"Checks Counted For Bot Protection","description":"Raw checks in the window the blocked count was taken from (same source and filters). Use it as the denominator of the 'N of M checks refused by bot protection' sentence — for multi-probe monitors checks_total is a status_ranges estimate and can be smaller than this. 0 when nothing was blocked.","default":0},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Stats period start"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"Stats period end"}},"type":"object","required":["monitor_id","checks_total","checks_up","checks_down","checks_timeout","period_start","period_end"],"title":"MonitorStatsResponse","description":"Response schema for monitor statistics."},"PingAckResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Whether ping was recorded","default":true},"monitor_id":{"type":"string","title":"Monitor Id","description":"Monitor UUID"},"signal":{"$ref":"#/components/schemas/HeartbeatSignal","description":"Recorded signal"},"status":{"$ref":"#/components/schemas/HeartbeatStatus","description":"Current monitor status"},"received_at":{"type":"string","format":"date-time","title":"Received At","description":"When ping was received"}},"type":"object","required":["monitor_id","signal","status","received_at"],"title":"PingAckResponse","description":"Response schema for ping acknowledgment (public endpoint)."},"ProbeCheckResultBriefResponse":{"properties":{"probe_id":{"type":"integer","title":"Probe Id","description":"Probe ID that ran this check slice"},"region":{"type":"string","title":"Region","description":"Probe region label (e.g. \"Novosibirsk, RU\")"},"status":{"type":"string","title":"Status","description":"Per-probe check status"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms","description":"Per-probe response time in ms"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Per-probe error message if failed"},"is_offline":{"type":"boolean","title":"Is Offline","description":"True when this probe was offline / adhoc dispatch timed out","default":false}},"type":"object","required":["probe_id","region","status"],"title":"ProbeCheckResultBriefResponse","description":"Per-probe slice in a multi-probe Check Now response (Bug 1 fan-out)."},"ProbeCreateRequest":{"properties":{"city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"City","description":"City (e.g., 'Novosibirsk')"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code","description":"ISO 3166-1 alpha-2 (e.g., 'RU')"},"country_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country Name","description":"Country name (e.g., 'Russia')"},"cloud_provider":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Cloud Provider","description":"Cloud provider (e.g., 'Hetzner')"},"is_public":{"type":"boolean","title":"Is Public","description":"Whether visible to other users as community checker","default":true}},"type":"object","title":"ProbeCreateRequest","description":"Request to create a new probe (register external checker)."},"ProbeCreateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"api_key":{"type":"string","title":"Api Key","description":"Full API key — save it, shown only once!"},"docker_command":{"type":"string","title":"Docker Command","description":"Docker run command for the user"}},"type":"object","required":["id","api_key","docker_command"],"title":"ProbeCreateResponse","description":"Response after creating a probe. Contains the API key (shown once)."},"ProbeIpsResponse":{"properties":{"ips":{"items":{"type":"string"},"type":"array","title":"Ips","description":"Sorted, deduplicated IPv4/IPv6 addresses"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds","description":"How long this list may be cached"}},"type":"object","required":["ips","ttl_seconds"],"title":"ProbeIpsResponse","description":"Addresses to allowlist."},"ProbeListResponse":{"properties":{"probes":{"items":{"$ref":"#/components/schemas/ProbeResponse"},"type":"array","title":"Probes"},"total":{"type":"integer","title":"Total"},"central_ips":{"items":{"type":"string"},"type":"array","title":"Central Ips","default":[]}},"type":"object","required":["probes","total"],"title":"ProbeListResponse","description":"List of probes."},"ProbeResponse":{"properties":{"id":{"type":"integer","title":"Id"},"workspace_id":{"type":"integer","title":"Workspace Id"},"api_key_prefix":{"type":"string","title":"Api Key Prefix"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"},"cloud_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cloud Provider"},"status":{"type":"string","title":"Status"},"last_heartbeat_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Heartbeat At"},"checker_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checker Version"},"last_seen_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen Ip"},"last_seen_ip_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen Ip At"},"retired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retired At"},"health_metrics":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Health Metrics"},"system_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"System Info"},"max_concurrent_checks":{"type":"integer","title":"Max Concurrent Checks"},"supported_protocols":{"items":{"type":"string"},"type":"array","title":"Supported Protocols"},"is_public":{"type":"boolean","title":"Is Public"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"created_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By User Id"},"monitors_count":{"type":"integer","title":"Monitors Count","default":0},"max_monitors":{"type":"integer","title":"Max Monitors","default":60},"display_name":{"type":"string","title":"Display Name","default":""},"display_name_full":{"type":"string","title":"Display Name Full","default":""},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","workspace_id","api_key_prefix","status","max_concurrent_checks","supported_protocols","is_public"],"title":"ProbeResponse","description":"Probe details for UI display."},"PublicCompactMonitorStatus":{"properties":{"name":{"type":"string","title":"Name","description":"Monitor display name"},"status":{"type":"string","title":"Status","description":"Current status (up, down, timeout, degraded, partial, paused, unknown)"},"uptime_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 24H","description":"Uptime percentage last 24 hours (null = no data)"},"uptime_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 7D","description":"Uptime percentage last 7 days (null = no data)"},"uptime_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 30D","description":"Uptime percentage last 30 days (null = no data)"},"uptime_90d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 90D","description":"Uptime percentage last 90 days (null = no data)"},"history":{"$ref":"#/components/schemas/PublicMonitorHistory","description":"Daily history for last 90 days"}},"type":"object","required":["name","status","uptime_24h","uptime_7d","uptime_30d","uptime_90d","history"],"title":"PublicCompactMonitorStatus","description":"Public monitor status with the columnar daily history."},"PublicCompactStatusPageResponse":{"properties":{"title":{"type":"string","title":"Title","description":"Page title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Page description"},"theme":{"type":"string","title":"Theme","description":"Page theme"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"Logo URL"},"overall_status":{"type":"string","title":"Overall Status","description":"Overall status (operational, degraded, outage)"},"allow_indexing":{"type":"boolean","title":"Allow Indexing","description":"Whether search engines can index this page"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Owner-pinned IANA timezone for display (e.g. 'Europe/Moscow'). Null = Auto: frontend should fall back to the viewer's browser timezone."},"history_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"History Start","description":"Viewer-local date of index 0 in every monitor history (null = no days)"},"history_days":{"type":"integer","title":"History Days","description":"Number of days in each monitor history"},"monitors":{"items":{"$ref":"#/components/schemas/PublicCompactMonitorStatus"},"type":"array","title":"Monitors","description":"Monitor statuses"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Last updated timestamp"}},"type":"object","required":["title","theme","overall_status","allow_indexing","history_start","history_days","last_updated"],"title":"PublicCompactStatusPageResponse","description":"Public status page response with ?history=compact."},"PublicIncidentResponse":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status"},"severity":{"type":"string","title":"Severity"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"latest_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Update"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"updates":{"items":{"$ref":"#/components/schemas/PublicIncidentUpdateResponse"},"type":"array","title":"Updates","default":[]},"title_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Key"},"title_params":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Title Params"},"is_auto_detected":{"type":"boolean","title":"Is Auto Detected","default":false}},"type":"object","required":["id","title","status","severity","started_at","resolved_at","latest_update","duration_seconds"],"title":"PublicIncidentResponse","description":"Public response for an incident (minimal info)."},"PublicIncidentUpdateResponse":{"properties":{"message":{"type":"string","title":"Message"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["message","status","created_at"],"title":"PublicIncidentUpdateResponse","description":"Public response for an incident timeline update."},"PublicMaintenanceResponse":{"properties":{"id":{"type":"integer","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scheduled_start":{"type":"string","format":"date-time","title":"Scheduled Start"},"scheduled_end":{"type":"string","format":"date-time","title":"Scheduled End"},"status":{"type":"string","title":"Status"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"had_incident":{"type":"boolean","title":"Had Incident","default":false},"incidents_in_window_count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Incidents In Window Count"}},"type":"object","required":["id","title","description","scheduled_start","scheduled_end","status","duration_minutes"],"title":"PublicMaintenanceResponse","description":"Public response for maintenance (minimal info)."},"PublicMonitorHistory":{"properties":{"uptime":{"items":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"array","title":"Uptime","description":"Uptime percentage per day, oldest first (null = no data)"},"downtime_seconds":{"items":{"type":"integer"},"type":"array","title":"Downtime Seconds","description":"Incident downtime per day, in seconds"},"maintenance_days":{"items":{"type":"integer"},"type":"array","title":"Maintenance Days","description":"Indexes of days that had a maintenance window"},"maintenance_status_days":{"items":{"type":"integer"},"type":"array","title":"Maintenance Status Days","description":"Indexes of days shown as maintenance (window over half the day, no downtime)"}},"type":"object","title":"PublicMonitorHistory","description":"Daily history as parallel arrays: index i is the day history_start + i."},"PublicMonitorStatus":{"properties":{"name":{"type":"string","title":"Name","description":"Monitor display name"},"status":{"type":"string","title":"Status","description":"Current status (up, down, timeout, degraded, partial, paused, unknown)"},"uptime_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 24H","description":"Uptime percentage last 24 hours (null = no data)"},"uptime_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 7D","description":"Uptime percentage last 7 days (null = no data)"},"uptime_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 30D","description":"Uptime percentage last 30 days (null = no data)"},"uptime_90d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 90D","description":"Uptime percentage last 90 days (null = no data)"},"daily_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Daily History","description":"Daily uptime history for last 90 days"}},"type":"object","required":["name","status","uptime_24h","uptime_7d","uptime_30d","uptime_90d"],"title":"PublicMonitorStatus","description":"Public monitor status information."},"PublicStatusPageResponse":{"properties":{"title":{"type":"string","title":"Title","description":"Page title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Page description"},"theme":{"type":"string","title":"Theme","description":"Page theme"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"Logo URL"},"overall_status":{"type":"string","title":"Overall Status","description":"Overall status (operational, degraded, outage)"},"allow_indexing":{"type":"boolean","title":"Allow Indexing","description":"Whether search engines can index this page"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Owner-pinned IANA timezone for display (e.g. 'Europe/Moscow'). Null = Auto: frontend should fall back to the viewer's browser timezone."},"monitors":{"items":{"$ref":"#/components/schemas/PublicMonitorStatus"},"type":"array","title":"Monitors","description":"Monitor statuses"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated","description":"Last updated timestamp"}},"type":"object","required":["title","theme","overall_status","allow_indexing","last_updated"],"title":"PublicStatusPageResponse","description":"Public status page response."},"PublicUserResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"User ID"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Account creation time"}},"type":"object","required":["id"],"title":"PublicUserResponse","description":"Response schema for public user profile (no sensitive data)."},"PushSubscriptionInfo":{"properties":{"endpoint":{"type":"string","maxLength":2048,"minLength":10,"title":"Endpoint"},"keys":{"$ref":"#/components/schemas/PushSubscriptionKeys"}},"type":"object","required":["endpoint","keys"],"title":"PushSubscriptionInfo"},"PushSubscriptionKeys":{"properties":{"p256dh":{"type":"string","maxLength":200,"minLength":1,"title":"P256Dh"},"auth":{"type":"string","maxLength":100,"minLength":1,"title":"Auth"}},"type":"object","required":["p256dh","auth"],"title":"PushSubscriptionKeys"},"ReadinessResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Readiness status: ready or not_ready"},"database":{"type":"string","title":"Database","description":"Database connection status"}},"type":"object","required":["status","database"],"title":"ReadinessResponse","description":"Readiness probe response."},"RecordPingRequest":{"properties":{"signal":{"$ref":"#/components/schemas/HeartbeatSignal","description":"Signal type: ping, start, success, or fail","default":"ping"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Optional payload data (max 10KB)"},"duration_ms":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":0.0},{"type":"null"}],"title":"Duration Ms","description":"Optional job duration in milliseconds"}},"type":"object","title":"RecordPingRequest","description":"Request schema for recording a ping (optional body)."},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","maxLength":2048,"title":"Refresh Token","description":"Refresh token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest","description":"Request schema for token refresh."},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"User email address"},"password":{"type":"string","maxLength":128,"minLength":1,"title":"Password","description":"User password"}},"type":"object","required":["email","password"],"title":"RegisterRequest","description":"Request schema for user registration."},"RemoveMonitorsRequest":{"properties":{"monitor_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Monitor Ids","description":"List of monitor IDs to remove from the group"}},"type":"object","required":["monitor_ids"],"title":"RemoveMonitorsRequest","description":"Request schema for removing monitors from a group."},"RemoveTagsRequest":{"properties":{"tags":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Tags","description":"List of tags to remove"}},"type":"object","required":["tags"],"title":"RemoveTagsRequest","description":"Request schema for removing tags from a group."},"ReorderMonitorsRequest":{"properties":{"workspace_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Workspace Id","description":"Workspace ID"},"monitor_ids":{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1,"title":"Monitor Ids","description":"Monitor IDs in desired display order"}},"type":"object","required":["workspace_id","monitor_ids"],"title":"ReorderMonitorsRequest","description":"Request body for reordering monitors."},"ResetMonitorStatsRequest":{"properties":{"confirm":{"type":"boolean","title":"Confirm","description":"Must be true to actually reset. False returns 422.","default":false}},"type":"object","title":"ResetMonitorStatsRequest","description":"Request schema for monitor statistics reset.\n\n`confirm` MUST be `true` — defense in depth against shell-script /\nLLM-tool misuse. The frontend type-to-confirm modal sets this from\nuser input; the MCP tool surfaces it as a warning when missing."},"ResetMonitorStatsResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"ID of the monitor that was reset"},"summary":{"$ref":"#/components/schemas/ResetMonitorStatsSummary","description":"Per-table delete counts"},"reset_at":{"type":"string","format":"date-time","title":"Reset At","description":"UTC timestamp of reset completion"}},"type":"object","required":["monitor_id","summary","reset_at"],"title":"ResetMonitorStatsResponse","description":"Response schema for monitor statistics reset."},"ResetMonitorStatsSummary":{"properties":{"check_results_deleted":{"type":"integer","title":"Check Results Deleted","description":"check_results rows removed"},"status_ranges_deleted":{"type":"integer","title":"Status Ranges Deleted","description":"status_ranges rows removed"},"hourly_stats_deleted":{"type":"integer","title":"Hourly Stats Deleted","description":"check_stats_hourly rows removed"},"daily_stats_deleted":{"type":"integer","title":"Daily Stats Deleted","description":"check_stats_daily rows removed"},"probe_states_deleted":{"type":"integer","title":"Probe States Deleted","description":"monitor_probe_state rows removed (one per assigned probe)"},"incidents_resolved":{"type":"integer","title":"Incidents Resolved","description":"Open incidents auto-resolved before deletion (0 or 1)"},"incidents_deleted":{"type":"integer","title":"Incidents Deleted","description":"incidents rows removed"},"alert_history_deleted":{"type":"integer","title":"Alert History Deleted","description":"alert_history rows removed"},"was_active":{"type":"boolean","title":"Was Active","description":"Whether the monitor was active before the reset (now restored)"}},"type":"object","required":["check_results_deleted","status_ranges_deleted","hourly_stats_deleted","daily_stats_deleted","probe_states_deleted","incidents_resolved","incidents_deleted","alert_history_deleted","was_active"],"title":"ResetMonitorStatsSummary","description":"Counts of rows wiped during a reset, returned for transparency."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":16,"title":"Token","description":"Reset token from the email link"},"new_password":{"type":"string","maxLength":128,"minLength":1,"title":"New Password","description":"New password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest","description":"Request schema for consuming a password reset token."},"ResolveDLQRequest":{"properties":{"resolution_notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Resolution Notes","description":"Optional notes about the resolution"}},"type":"object","title":"ResolveDLQRequest","description":"Request schema for resolving a DLQ entry."},"ResponseTimeDistributionResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"p50_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P50 Ms","description":"50th percentile (median) in ms"},"p90_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90 Ms","description":"90th percentile in ms"},"p95_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Ms","description":"95th percentile in ms"},"p99_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P99 Ms","description":"99th percentile in ms"},"avg_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Ms","description":"Average response time in ms"},"min_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Ms","description":"Minimum response time in ms"},"max_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Ms","description":"Maximum response time in ms"},"sample_count":{"type":"integer","title":"Sample Count","description":"Number of samples"},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Start of period"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"End of period"}},"type":"object","required":["monitor_id","sample_count","period_start","period_end"],"title":"ResponseTimeDistributionResponse","description":"Response schema for response time distribution."},"ResultsListResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/CheckResultResponse"},"type":"array","title":"Results","description":"List of check results"},"total":{"type":"integer","title":"Total","description":"Total number of results"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["results","total","page","page_size"],"title":"ResultsListResponse","description":"Response schema for paginated check results list."},"RetentionPeriod":{"properties":{"rate":{"type":"number","title":"Rate","description":"Retention rate as percentage"},"cohort_size":{"type":"integer","title":"Cohort Size","description":"Size of the cohort"}},"type":"object","required":["rate","cohort_size"],"title":"RetentionPeriod","description":"Retention data for a specific period."},"RetentionStatsResponse":{"properties":{"d1":{"$ref":"#/components/schemas/RetentionPeriod","description":"Day 1 retention"},"d7":{"$ref":"#/components/schemas/RetentionPeriod","description":"Day 7 retention"},"d30":{"$ref":"#/components/schemas/RetentionPeriod","description":"Day 30 retention"}},"type":"object","required":["d1","d7","d30"],"title":"RetentionStatsResponse","description":"Response schema for retention statistics."},"RevokeApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Revoked key ID"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Revoked key prefix"},"revoked":{"type":"boolean","title":"Revoked","description":"Whether revocation was successful"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["id","key_prefix","revoked","message"],"title":"RevokeApiKeyResponse","description":"Response schema for revoking an API key."},"SLAReportResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"monitor_name":{"type":"string","title":"Monitor Name","description":"Monitor name"},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Report period start"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"Report period end"},"period_hours":{"type":"integer","title":"Period Hours","description":"Report period in hours"},"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"When the report was generated"},"uptime_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percentage","description":"Overall uptime percentage (None if insufficient data)"},"availability_nines":{"type":"string","title":"Availability Nines","description":"Availability in 'nines' notation"},"total_checks":{"type":"integer","title":"Total Checks","description":"Total number of health checks"},"successful_checks":{"type":"integer","title":"Successful Checks","description":"Number of successful (UP) checks"},"failed_checks":{"type":"integer","title":"Failed Checks","description":"Number of non-UP checks (DOWN, TIMEOUT, DEGRADED, PARTIAL)"},"mttr_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mttr Seconds","description":"Mean Time To Recovery in seconds"},"mttr_formatted":{"type":"string","title":"Mttr Formatted","description":"Human-readable MTTR"},"mtbf_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mtbf Seconds","description":"Mean Time Between Failures in seconds"},"mtbf_formatted":{"type":"string","title":"Mtbf Formatted","description":"Human-readable MTBF"},"total_incidents":{"type":"integer","title":"Total Incidents","description":"Total number of incidents"},"resolved_incidents":{"type":"integer","title":"Resolved Incidents","description":"Number of resolved incidents"},"ongoing_incidents":{"type":"integer","title":"Ongoing Incidents","description":"Number of ongoing (unresolved) incidents"},"total_downtime_seconds":{"type":"number","title":"Total Downtime Seconds","description":"Total downtime duration in seconds"},"total_downtime_formatted":{"type":"string","title":"Total Downtime Formatted","description":"Human-readable total downtime"},"latency":{"$ref":"#/components/schemas/LatencyPercentilesResponse","description":"Response time percentile metrics"},"error_budget":{"anyOf":[{"$ref":"#/components/schemas/ErrorBudgetResponse"},{"type":"null"}],"description":"Error budget calculation (if SLO target provided)"},"incidents":{"items":{"$ref":"#/components/schemas/presentation__api__v1__schemas__sla__IncidentResponse"},"type":"array","title":"Incidents","description":"List of individual incidents"},"maintenance_excluded_seconds":{"type":"number","title":"Maintenance Excluded Seconds","description":"Total maintenance time excluded from uptime calculation (seconds)","default":0.0},"maintenance_excluded_formatted":{"type":"string","title":"Maintenance Excluded Formatted","description":"Human-readable maintenance excluded time","default":"None"},"maintenance_window_count":{"type":"integer","title":"Maintenance Window Count","description":"Number of maintenance windows in the period","default":0}},"type":"object","required":["monitor_id","monitor_name","period_start","period_end","period_hours","generated_at","uptime_percentage","availability_nines","total_checks","successful_checks","failed_checks","mttr_formatted","mtbf_formatted","total_incidents","resolved_incidents","ongoing_incidents","total_downtime_seconds","total_downtime_formatted","latency"],"title":"SLAReportResponse","description":"Complete SLA Report response.\n\nEnterprise-grade SLA metrics following ITIL and SRE best practices."},"ScheduledReportListResponse":{"properties":{"reports":{"items":{"$ref":"#/components/schemas/ScheduledReportResponse"},"type":"array","title":"Reports","description":"List of scheduled reports"},"total":{"type":"integer","title":"Total","description":"Total number of reports"},"page":{"type":"integer","title":"Page","description":"Current page number"},"page_size":{"type":"integer","title":"Page Size","description":"Number of reports per page"}},"type":"object","required":["reports","total","page","page_size"],"title":"ScheduledReportListResponse","description":"Response schema for a list of scheduled reports."},"ScheduledReportResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Report ID"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"name":{"type":"string","title":"Name","description":"Report name"},"monitor_ids":{"items":{"type":"integer"},"type":"array","title":"Monitor Ids","description":"Monitor IDs included in report"},"frequency":{"type":"string","title":"Frequency","description":"Report frequency"},"format":{"type":"string","title":"Format","description":"Report format"},"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients","description":"Email recipients"},"slo_target":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Slo Target","description":"SLO target percentage"},"custom_hours_period":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Custom Hours Period","description":"Custom period in hours"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the report is active"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At","description":"Next scheduled run time"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At","description":"Last run time"},"last_run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Run Status","description":"Last run status"},"last_run_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Run Error","description":"Last run error message"},"timezone":{"type":"string","title":"Timezone","description":"Report timezone"},"include_incidents":{"type":"boolean","title":"Include Incidents","description":"Include incidents in report"},"include_latency_chart":{"type":"boolean","title":"Include Latency Chart","description":"Include latency chart"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","user_id","workspace_id","name","monitor_ids","frequency","format","recipients","is_active","timezone","include_incidents","include_latency_chart","created_at","updated_at"],"title":"ScheduledReportResponse","description":"Response schema for a scheduled report."},"ScheduledReportRunListResponse":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/ScheduledReportRunResponse"},"type":"array","title":"Runs","description":"List of report runs"},"total":{"type":"integer","title":"Total","description":"Total number of runs"},"page":{"type":"integer","title":"Page","description":"Current page number"},"page_size":{"type":"integer","title":"Page Size","description":"Number of runs per page"}},"type":"object","required":["runs","total","page","page_size"],"title":"ScheduledReportRunListResponse","description":"Response schema for a list of scheduled report runs."},"ScheduledReportRunResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Run ID"},"report_id":{"type":"integer","title":"Report Id","description":"Report ID"},"status":{"type":"string","title":"Status","description":"Run status (success, failed, running)"},"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When the run started"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When the run completed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if run failed"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"}},"type":"object","required":["id","report_id","status","started_at","created_at"],"title":"ScheduledReportRunResponse","description":"Response schema for a scheduled report execution run."},"SortOrder":{"type":"string","enum":["asc","desc"],"title":"SortOrder"},"StatusPageListResponse":{"properties":{"status_pages":{"items":{"$ref":"#/components/schemas/StatusPageResponse"},"type":"array","title":"Status Pages","description":"List of status pages"},"total":{"type":"integer","title":"Total","description":"Total number of status pages"},"limit":{"type":"integer","title":"Limit","description":"Maximum items per page","default":50},"offset":{"type":"integer","title":"Offset","description":"Number of items skipped","default":0}},"type":"object","required":["status_pages","total"],"title":"StatusPageListResponse","description":"Response schema for list of status pages."},"StatusPageMonitorResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Status page monitor ID"},"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Custom display name"},"display_order":{"type":"integer","title":"Display Order","description":"Display order"},"hidden_reason":{"anyOf":[{"type":"string","enum":["paused","dnsbl"]},{"type":"null"}],"title":"Hidden Reason","description":"Why public visitors do not see this monitor (null = shown). Set by the status page list only."}},"type":"object","required":["id","monitor_id","display_order"],"title":"StatusPageMonitorResponse","description":"Response schema for a status page monitor."},"StatusPageResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Status page ID"},"workspace_id":{"type":"integer","title":"Workspace Id","description":"Workspace ID"},"slug":{"type":"string","title":"Slug","description":"URL slug"},"title":{"type":"string","title":"Title","description":"Page title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Page description"},"theme":{"type":"string","title":"Theme","description":"Page theme"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"Logo URL"},"is_public":{"type":"boolean","title":"Is Public","description":"Whether page is public"},"allow_indexing":{"type":"boolean","title":"Allow Indexing","description":"Whether search engines can index this page"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Owner-pinned IANA timezone (null = Auto / browser-detected)"},"monitors":{"items":{"$ref":"#/components/schemas/StatusPageMonitorResponse"},"type":"array","title":"Monitors","description":"Monitors on this page"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","workspace_id","slug","title","theme","is_public","allow_indexing"],"title":"StatusPageResponse","description":"Response schema for a status page."},"StatusRangeListResponse":{"properties":{"ranges":{"items":{"$ref":"#/components/schemas/StatusRangeResponse"},"type":"array","title":"Ranges","description":"List of status ranges, newest first"},"total":{"type":"integer","title":"Total","description":"Total number of ranges for the monitor"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["ranges","total","page","page_size"],"title":"StatusRangeListResponse","description":"Response schema for paginated status-range list (state history)."},"StatusRangeResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Status range ID"},"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"status":{"type":"string","title":"Status","description":"Status during this run, lowercase CheckStatus value: 'up' | 'down' | 'degraded' | 'warning' | 'unknown' | 'transient' | 'timeout' | 'skipped'"},"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When this status run started"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At","description":"When it ended; null means ongoing"},"check_count":{"type":"integer","title":"Check Count","description":"Number of checks in this run"},"avg_response_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Ms","description":"Average response time (ms)"},"min_response_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Response Ms","description":"Min response time (ms)"},"max_response_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Response Ms","description":"Max response time (ms)"},"last_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Message","description":"Last error message seen in this run"},"last_failure_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure Category","description":"Classified failure reason of the latest failing check in this run (anti_bot, rate_limited, auth_required, etc.). NULL for UP runs or unclassified failures."}},"type":"object","required":["id","monitor_id","status","started_at","check_count"],"title":"StatusRangeResponse","description":"Response schema for a single status range (run of identical status)."},"StepResultSchema":{"properties":{"step_name":{"type":"string","title":"Step Name"},"step_index":{"type":"integer","title":"Step Index"},"status":{"$ref":"#/components/schemas/ApiCheckStatusSchema"},"response_time_ms":{"type":"integer","title":"Response Time Ms","default":0},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"response_headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Headers"},"response_body_preview":{"type":"string","maxLength":2000,"title":"Response Body Preview","description":"First 2000 chars of response body","default":""},"assertion_results":{"items":{"$ref":"#/components/schemas/AssertionResultSchema"},"type":"array","title":"Assertion Results"},"extracted_variables":{"additionalProperties":{"type":"string"},"type":"object","title":"Extracted Variables"},"error_message":{"type":"string","title":"Error Message","default":""}},"type":"object","required":["step_name","step_index","status"],"title":"StepResultSchema","description":"Schema for the result of executing a single step."},"SubscriptionSummary":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"device_name":{"type":"string","title":"Device Name","default":"Browser"},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["endpoint"],"title":"SubscriptionSummary"},"SubscriptionsStatusResponse":{"properties":{"subscriptions":{"items":{"$ref":"#/components/schemas/SubscriptionSummary"},"type":"array","title":"Subscriptions"},"device_count":{"type":"integer","title":"Device Count"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["subscriptions","device_count","is_active"],"title":"SubscriptionsStatusResponse"},"TelegramLoginRequest":{"properties":{"id":{"type":"integer","title":"Id","description":"Telegram user ID"},"first_name":{"type":"string","maxLength":255,"title":"First Name","description":"User's first name"},"auth_date":{"type":"integer","title":"Auth Date","description":"Authentication timestamp"},"hash":{"type":"string","maxLength":128,"title":"Hash","description":"HMAC-SHA-256 signature"},"last_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Last Name","description":"User's last name"},"username":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Username","description":"Telegram username"},"photo_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Photo Url","description":"User's photo URL"}},"type":"object","required":["id","first_name","auth_date","hash"],"title":"TelegramLoginRequest","description":"Request schema for Telegram Login Widget authentication."},"TelegramWebAppRequest":{"properties":{"init_data":{"type":"string","maxLength":4096,"title":"Init Data","description":"Telegram WebApp initData string"}},"type":"object","required":["init_data"],"title":"TelegramWebAppRequest","description":"Request schema for Telegram Mini App authentication."},"TestAlertResponse":{"properties":{"alert_id":{"type":"integer","title":"Alert Id","description":"Tested alert ID"},"success":{"type":"boolean","title":"Success","description":"Whether test was successful"},"message":{"type":"string","title":"Message","description":"Result message"},"sent_at":{"type":"string","format":"date-time","title":"Sent At","description":"When test was executed"}},"type":"object","required":["alert_id","success","message","sent_at"],"title":"TestAlertResponse","description":"Response schema for alert test result."},"TestConnectionRequest":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url","description":"URL or host to test"},"protocol":{"type":"string","title":"Protocol","description":"Protocol: HTTP, HTTPS, TCP, ICMP, DNS, GRPC, etc."},"timeout_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout Seconds","description":"Timeout in seconds","default":30},"probe_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Id","description":"Run the test from this probe. None = central server."},"http_method":{"type":"string","title":"Http Method","description":"HTTP method","default":"GET"},"expected_status":{"type":"integer","maximum":599.0,"minimum":100.0,"title":"Expected Status","description":"Expected HTTP status code","default":200},"verify_ssl":{"type":"boolean","title":"Verify Ssl","description":"Whether to verify SSL certificate","default":true},"follow_redirects":{"type":"boolean","title":"Follow Redirects","description":"Whether to follow HTTP redirects","default":true},"detect_stub_pages":{"type":"boolean","title":"Detect Stub Pages","description":"Detect domain-parking / hosting-suspension pages on HTTP 200","default":true},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers","description":"HTTP headers"},"keyword":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Keyword","description":"Keyword to search in response body"},"keyword_present":{"type":"boolean","title":"Keyword Present","description":"True = keyword must be present, False = must be absent","default":true},"keyword_type":{"type":"string","pattern":"^(contains|not_contains|regex)$","title":"Keyword Type","description":"Keyword match type: contains, not_contains, or regex","default":"contains"},"json_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Json Path","description":"JSONPath expression to validate"},"json_expected_value":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Json Expected Value","description":"Expected value at JSONPath"},"socks5_auth_required":{"type":"boolean","title":"Socks5 Auth Required","description":"Whether SOCKS5 proxy requires authentication","default":false},"socks5_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Username","description":"SOCKS5 auth username"},"socks5_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Password","description":"SOCKS5 auth password"},"socks5_test_target":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Socks5 Test Target","description":"Target host:port to test proxy-through (e.g. google.com:80)"},"mtproxy_secret":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Mtproxy Secret"},"dnsbl_servers":{"anyOf":[{"items":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)+$"},"type":"array","maxItems":50},{"type":"null"}],"title":"Dnsbl Servers"},"pagespeed_strategy":{"type":"string","pattern":"^(mobile|desktop)$","title":"Pagespeed Strategy","description":"PageSpeed strategy: mobile or desktop","default":"mobile"}},"type":"object","required":["url","protocol"],"title":"TestConnectionRequest","description":"Request schema for testing a connection before creating a monitor."},"TestConnectionResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the connection test succeeded"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms","description":"Response time in milliseconds"},"ping_avg_rtt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ping Avg Rtt","description":"Kernel-measured float RTT (3 decimals) for PING/ICMP test connections. Preserves sub-millisecond precision (e.g. 0.260 ms for in-DC targets) that the integer `response_time_ms` cannot express. Null for non-PING protocols. UI should prefer this field when displaying PING/ICMP latency."},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"HTTP status code (for HTTP/HTTPS)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if test failed"},"failure_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Category","description":"Classified failure category — one of anti_bot, rate_limited, auth_required, geo_blocked, timeout, dns_failure, tls_failure, connection_refused, server_error, status_mismatch, content_mismatch, ssl_expired, ssl_expiring, ssl_chain_incomplete, dnsbl_listed, stub_page. NULL when not classified."},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning","description":"Warning/suggestion (e.g., host reachable via HTTPS but not ICMP)"},"actual_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actual Region","description":"Where the check actually ran (e.g. 'central', 'Novosibirsk, RU')"},"is_fallback":{"type":"boolean","title":"Is Fallback","description":"True when central was used because the selected probe was offline/slow.","default":false},"pagespeed_performance_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Performance Score","description":"PageSpeed performance score 0-100"},"pagespeed_accessibility_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Accessibility Score","description":"PageSpeed accessibility score 0-100"},"pagespeed_seo_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Seo Score","description":"PageSpeed SEO score 0-100"},"pagespeed_best_practices_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Best Practices Score","description":"PageSpeed best-practices score 0-100"},"pagespeed_lcp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Lcp Ms","description":"Largest Contentful Paint in ms"},"pagespeed_tbt_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Tbt Ms","description":"Total Blocking Time in ms"},"pagespeed_cls":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pagespeed Cls","description":"Cumulative Layout Shift"},"pagespeed_fcp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Fcp Ms","description":"First Contentful Paint in ms"},"pagespeed_si_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pagespeed Si Ms","description":"Speed Index in ms"},"pagespeed_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pagespeed Strategy","description":"Strategy: mobile or desktop"}},"type":"object","required":["success"],"title":"TestConnectionResponse","description":"Response schema for connection test result."},"TestSendRequest":{"properties":{"channel":{"type":"string","title":"Channel","description":"Alert channel"},"target":{"type":"string","maxLength":500,"minLength":1,"title":"Target","description":"Channel target"},"workspace_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Workspace Id","description":"Active workspace ID, used to scope auto-linked Telegram groups"}},"type":"object","required":["channel","target"],"title":"TestSendRequest","description":"Request schema for ad-hoc test send.\n\nUsed by AlertForm \"Send test\" button before the alert is saved, so the\nuser can verify deliverability (e.g. that their Telegram chat_id is\nreachable, that they pressed /start at the bot) without committing the\nalert. No alert_id, no monitors — synthetic test payload."},"TestSendResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the test message was delivered"},"message":{"type":"string","title":"Message","description":"Result message (success confirmation or error reason)"},"channel":{"type":"string","title":"Channel","description":"Channel that was tested"},"sent_at":{"type":"string","format":"date-time","title":"Sent At","description":"When the test was executed"},"steps":{"items":{"$ref":"#/components/schemas/TestSendStep"},"type":"array","title":"Steps","description":"Per-step debug trace. Each step records duration + raw upstream response."},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion","description":"Actionable hint when the test fails (e.g. 'press /start at @bot')."},"target_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Kind","description":"Channel-specific classification of the target. For Telegram: 'personal_chat' | 'group' | 'supergroup' | 'channel' | 'username'."},"server":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Server","description":"Backend identity that processed the request. Helps operators verify which pod/host actually answered (dev vs prod, which of N replicas) when correlating with prod logs. Keys: hostname, instance, version (when known)."}},"type":"object","required":["success","message","channel","sent_at"],"title":"TestSendResponse","description":"Response schema for ad-hoc test send (debug-friendly)."},"TestSendStep":{"properties":{"name":{"type":"string","title":"Name","description":"Step name (e.g. 'verify_bot', 'send_message')"},"success":{"type":"boolean","title":"Success","description":"Whether the step succeeded"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Wall-clock duration of the step"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Step-specific structured data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message when success=False"}},"type":"object","required":["name","success","duration_ms"],"title":"TestSendStep","description":"Single step in the test-send debug trace.\n\nFrontends render the full ``steps`` list under a \"Show details\" toggle so\nusers (and operators tailing prod logs by ear) can see exactly what was\nattempted and what the upstream API returned, instead of guessing from a\none-line error."},"TestWebhookResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id","description":"Tested webhook ID"},"success":{"type":"boolean","title":"Success","description":"Whether test was successful"},"http_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status Code","description":"HTTP response status code"},"response_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body","description":"HTTP response body (truncated)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Request duration in milliseconds"},"tested_at":{"type":"string","format":"date-time","title":"Tested At","description":"When test was executed"}},"type":"object","required":["webhook_id","success","duration_ms","tested_at"],"title":"TestWebhookResponse","description":"Response schema for webhook test result."},"TimePeriod":{"type":"string","enum":["24h","7d","30d"],"title":"TimePeriod","description":"Time period for dashboard queries."},"TimelineEntry":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the check was executed"},"status":{"type":"string","title":"Status","description":"Check status"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms","description":"Response time in milliseconds"},"ping_avg_rtt":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ping Avg Rtt","description":"Kernel-measured float RTT (3 decimals) for PING/ICMP timeline points. Carries sub-millisecond precision for in-DC monitors that the integer `response_time_ms` cannot express — chart series should pick this when non-null so the line shape reflects real variation instead of a flat 1ms baseline."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"failure_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Category","description":"Classified failure reason (FailureCategory value). Per-row entries carry the check's own category; aggregate entries carry the range's last one. None for UP or when the classifier could not decide."},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status","description":"HTTP status code of the check when the protocol has one (per-row only)."},"range_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Range Id","description":"When set, this entry was synthesised from a `status_ranges` row rather than a single `check_result`. Multi-probe monitors return one entry per consensus range so the chart shows aggregate state transitions instead of probe-side noise (Bug B fix). Null for single-probe / central monitors and for the optional `?probe_id=` per-probe drill-down view."},"probe_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Probe Id","description":"Probe id that produced this entry. Null for aggregate (multi-probe consensus) entries and for central server checks."},"hourly":{"anyOf":[{"$ref":"#/components/schemas/TimelineHourly"},{"type":"null"}],"description":"Set on hourly entries (7d/30d windows) — one entry stands for an hour of checks: status is the worst of them, response_time_ms the mean of the successful ones. Null on per-check and range entries."}},"type":"object","required":["timestamp","status"],"title":"TimelineEntry","description":"Single entry in the monitor timeline."},"TimelineHourly":{"properties":{"checks":{"type":"integer","title":"Checks","description":"Checks with an actionable status (the five below)"},"up":{"type":"integer","title":"Up"},"degraded":{"type":"integer","title":"Degraded"},"warning":{"type":"integer","title":"Warning"},"down":{"type":"integer","title":"Down"},"timeout":{"type":"integer","title":"Timeout"},"uptime_credit":{"type":"number","title":"Uptime Credit","description":"Summed uptime credit (UP/DEGRADED 1, PARTIAL 0.5)"},"response_time_min_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Response Time Min Ms","description":"Fastest successful check"},"response_time_max_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Response Time Max Ms","description":"Slowest successful check"}},"type":"object","required":["checks","up","degraded","warning","down","timeout","uptime_credit"],"title":"TimelineHourly","description":"The checks behind one hourly timeline entry."},"TimelineResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"entries":{"items":{"$ref":"#/components/schemas/TimelineEntry"},"type":"array","title":"Entries","description":"Timeline entries"},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Start of period"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"End of period"}},"type":"object","required":["monitor_id","entries","period_start","period_end"],"title":"TimelineResponse","description":"Response schema for monitor timeline."},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"JWT access token"},"refresh_token":{"type":"string","title":"Refresh Token","description":"JWT refresh token"},"token_type":{"type":"string","title":"Token Type","description":"Token type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Access token expiry in seconds"},"user_created":{"type":"boolean","title":"User Created","description":"True if user was auto-created during login","default":false}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenResponse","description":"Response schema for authentication tokens."},"UnsubscribeRequest":{"properties":{"endpoint":{"type":"string","maxLength":2048,"minLength":10,"title":"Endpoint"}},"type":"object","required":["endpoint"],"title":"UnsubscribeRequest"},"UnsubscribeResponse":{"properties":{"message":{"type":"string","title":"Message"},"email":{"type":"string","title":"Email"}},"type":"object","required":["message","email"],"title":"UnsubscribeResponse","description":"Response after unsubscribing."},"UpdateAlertChannelConfigRequest":{"properties":{"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"Channel-specific configuration to update"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether configuration is enabled"}},"type":"object","title":"UpdateAlertChannelConfigRequest","description":"Request schema for updating an alert channel configuration."},"UpdateAlertRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Alert name"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","description":"Alert channel"},"target":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Target","description":"Target"},"monitor_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":500},{"type":"null"}],"title":"Monitor Ids","description":"Monitor IDs"},"heartbeat_monitor_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Heartbeat Monitor Ids","description":"Heartbeat monitor IDs"},"apply_to_all_monitors":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Apply To All Monitors","description":"Broadcast flag. Mutually exclusive with non-empty monitor_ids / heartbeat_monitor_ids when explicitly toggled in the same request."},"triggers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Triggers","description":"Triggers"},"cooldown_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Minutes","description":"Cooldown in minutes (0 = no cooldown)"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether alert is active"},"enable_reminders":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enable Reminders","description":"Send reminder alerts while monitor stays down"},"message_fields":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Message Fields","description":"Message field toggles: show_url, show_protocol, show_response_time, show_http_status, show_error, show_account, show_downtime, show_monitor_link, show_probe_location"}},"type":"object","title":"UpdateAlertRequest","description":"Request schema for updating an alert."},"UpdateApiCheckRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name","description":"Name of the API check"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Description of what this check does"},"steps":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiCheckStepSchema"},"type":"array","maxItems":20,"minItems":1},{"type":"null"}],"title":"Steps","description":"Steps to execute in order"},"global_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Global Headers","description":"Headers applied to all steps"},"global_auth":{"anyOf":[{"$ref":"#/components/schemas/AuthConfigSchema"},{"type":"null"}],"description":"Authentication applied to all steps"},"global_timeout_seconds":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":1.0},{"type":"null"}],"title":"Global Timeout Seconds","description":"Default timeout for steps"},"stop_on_failure":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stop On Failure","description":"Stop workflow on first step failure"},"initial_variables":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Initial Variables","description":"Pre-defined variables available to all steps"},"interval_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":30.0},{"type":"null"}],"title":"Interval Seconds","description":"Check interval in seconds"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether the check is active"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Tags","description":"Tags for organization"}},"type":"object","title":"UpdateApiCheckRequest","description":"Request schema for updating an API check."},"UpdateFeedbackStatusRequest":{"properties":{"status":{"type":"string","enum":["open","planned","in_progress","done","rejected"],"title":"Status","description":"New feedback status"}},"type":"object","required":["status"],"title":"UpdateFeedbackStatusRequest","description":"Request schema for updating feedback status (admin only)."},"UpdateGroupStatusRequest":{"properties":{"monitor_statuses":{"additionalProperties":{"type":"string"},"type":"object","title":"Monitor Statuses","description":"Dict mapping monitor_id to status string (up, down, degraded, unknown)"}},"type":"object","required":["monitor_statuses"],"title":"UpdateGroupStatusRequest","description":"Request schema for updating group status based on monitor statuses."},"UpdateHeartbeatMonitorRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name","description":"Display name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description"},"expected_interval_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":60.0},{"type":"null"}],"title":"Expected Interval Seconds","description":"Expected interval between pings"},"grace_period_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":0.0},{"type":"null"}],"title":"Grace Period Seconds","description":"Grace period before DOWN"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether monitor is active"}},"type":"object","title":"UpdateHeartbeatMonitorRequest","description":"Request schema for updating a heartbeat monitor."},"UpdateLocaleRequest":{"properties":{"locale":{"type":"string","maxLength":10,"minLength":2,"title":"Locale","description":"Locale code (e.g. 'en', 'ru')"}},"type":"object","required":["locale"],"title":"UpdateLocaleRequest","description":"Request schema for updating user locale."},"UpdateMonitorGroupRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name","description":"Human-readable name for the group"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional description of the group"},"monitor_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Monitor Ids","description":"List of monitor IDs to include in the group (max 200)"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tags for categorization (max 50)"},"threshold_degraded":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Threshold Degraded","description":"Percentage of monitors that must be UP to avoid DEGRADED status"},"threshold_down":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Threshold Down","description":"Percentage of monitors that must be UP to avoid DOWN status"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether the group is actively monitored"}},"type":"object","title":"UpdateMonitorGroupRequest","description":"Request schema for updating a monitor group."},"UpdateMonitorRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Monitor name"},"url":{"anyOf":[{"type":"string","maxLength":2048,"minLength":1},{"type":"null"}],"title":"Url","description":"URL or host to monitor"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol","description":"Protocol: HTTP, HTTPS, TCP, ICMP, DNS, GRPC"},"workspace_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Workspace Id","description":"Workspace ID to move monitor to"},"probe_id":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Probe Id","description":"Single probe ID (legacy). DEPRECATED — pass `probe_ids` instead. Will be removed 2026-07-27. If both fields are supplied, `probe_ids` wins.","deprecated":true},"probe_ids":{"anyOf":[{"items":{"type":"integer","maximum":2147483647.0,"minimum":1.0},"type":"array"},{"type":"null"}],"title":"Probe Ids","description":"Probe IDs to assign. None = unchanged. Empty list = detach all probes (central server). Plan caps: FREE=1, PRO=3, BUSINESS=10, ENTERPRISE=50."},"aggregation_rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aggregation Rule","description":"Update aggregation rule. None = unchanged. Valid: any_fails, majority_fail, all_fail. Silent transition: changing the rule does NOT fire a spurious alert on the next check."},"interval_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":10.0},{"type":"null"}],"title":"Interval Seconds","description":"Check interval in seconds (up to 86400 for WHOIS)"},"timeout_seconds":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Timeout Seconds","description":"Timeout in seconds"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether monitor is active"},"http_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Http Method","description":"HTTP method"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Headers","description":"HTTP headers"},"expected_status":{"anyOf":[{"type":"integer","maximum":599.0,"minimum":100.0},{"type":"null"}],"title":"Expected Status","description":"Expected HTTP status code"},"keyword":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Keyword"},"keyword_present":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keyword Present"},"keyword_type":{"anyOf":[{"type":"string","pattern":"^(contains|not_contains|regex)$"},{"type":"null"}],"title":"Keyword Type","description":"Keyword match type: contains, not_contains, or regex"},"json_path":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Json Path"},"json_expected_value":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Json Expected Value"},"follow_redirects":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Follow Redirects"},"verify_ssl":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Verify Ssl"},"trust_extra_anchor_any_tld":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trust Extra Anchor Any Tld"},"detect_stub_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Detect Stub Pages"},"retry_count":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":0.0},{"type":"null"}],"title":"Retry Count"},"retry_delay_seconds":{"anyOf":[{"type":"number","maximum":10.0,"minimum":0.5},{"type":"null"}],"title":"Retry Delay Seconds"},"grpc_service_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Grpc Service Name"},"grpc_use_tls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Grpc Use Tls"},"tcp_expect_banner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tcp Expect Banner"},"tcp_expected_banner":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Tcp Expected Banner"},"ping_count":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Ping Count"},"ping_packet_size":{"anyOf":[{"type":"integer","maximum":1500.0,"minimum":32.0},{"type":"null"}],"title":"Ping Packet Size"},"confirmation_threshold":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Confirmation Threshold"},"recovery_threshold":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Recovery Threshold"},"grace_period_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Grace Period Seconds"},"response_time_warn_ms":{"anyOf":[{"type":"integer","maximum":60000.0,"minimum":0.0},{"type":"null"}],"title":"Response Time Warn Ms"},"response_time_critical_ms":{"anyOf":[{"type":"integer","maximum":60000.0,"minimum":0.0},{"type":"null"}],"title":"Response Time Critical Ms"},"packet_loss_warn_percent":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Packet Loss Warn Percent"},"packet_loss_critical_percent":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Packet Loss Critical Percent"},"dns_record_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dns Record Type","description":"DNS record type"},"dns_expected_values":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dns Expected Values"},"ws_send_message":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Ws Send Message"},"ws_expected_response":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Ws Expected Response"},"ssl_warn_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Ssl Warn Days"},"ssl_critical_days":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Ssl Critical Days"},"whois_warn_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Whois Warn Days"},"whois_critical_days":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Whois Critical Days"},"smtp_use_starttls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smtp Use Starttls"},"smtp_verify_tls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smtp Verify Tls"},"imap_use_ssl":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Imap Use Ssl"},"pop3_use_ssl":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pop3 Use Ssl"},"ftp_use_tls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ftp Use Tls"},"ftp_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Ftp Username"},"ftp_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Ftp Password"},"socks5_auth_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Socks5 Auth Required"},"socks5_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Username"},"socks5_password":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Socks5 Password"},"socks5_test_target":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Socks5 Test Target"},"mtproxy_secret":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Mtproxy Secret"},"dnsbl_servers":{"anyOf":[{"items":{"type":"string","maxLength":200,"minLength":3,"pattern":"^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)+$"},"type":"array","maxItems":50},{"type":"null"}],"title":"Dnsbl Servers"},"pagespeed_strategy":{"anyOf":[{"type":"string","pattern":"^(mobile|desktop)$"},{"type":"null"}],"title":"Pagespeed Strategy"},"pagespeed_threshold":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Pagespeed Threshold"},"udp_payload":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Udp Payload"},"udp_expect_response":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Udp Expect Response"},"udp_expected_response":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Udp Expected Response"},"api_check_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Api Check Config"},"transaction_steps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Transaction Steps"},"transaction_viewport_width":{"anyOf":[{"type":"integer","maximum":3840.0,"minimum":320.0},{"type":"null"}],"title":"Transaction Viewport Width"},"transaction_viewport_height":{"anyOf":[{"type":"integer","maximum":2160.0,"minimum":240.0},{"type":"null"}],"title":"Transaction Viewport Height"},"transaction_user_agent":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Transaction User Agent"},"transaction_screenshot_on_error":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Transaction Screenshot On Error"}},"type":"object","title":"UpdateMonitorRequest","description":"Request schema for updating a monitor."},"UpdateScheduledReportRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Report name"},"monitor_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":500,"minItems":1},{"type":"null"}],"title":"Monitor Ids","description":"List of monitor IDs to include in the report (at least one required)"},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency","description":"Report frequency: daily, weekly, or monthly"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"Report format: pdf or csv"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Recipients","description":"List of email addresses to send the report to (at least one required)"},"slo_target":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Slo Target","description":"SLO target percentage (0-100)"},"custom_hours_period":{"anyOf":[{"type":"integer","maximum":2160.0,"minimum":1.0},{"type":"null"}],"title":"Custom Hours Period","description":"Custom reporting period in hours (1-2160)"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether the report is active"},"timezone":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Timezone","description":"Timezone for report scheduling"},"include_incidents":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Incidents","description":"Include incident details in the report"},"include_latency_chart":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Latency Chart","description":"Include latency chart in the report"}},"type":"object","title":"UpdateScheduledReportRequest","description":"Request schema for updating a scheduled report."},"UpdateStatusPageRequest":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title","description":"Status page title (1-200 characters)"},"slug":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Slug","description":"URL slug for the status page"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description","description":"Optional description (max 2000 characters)"},"theme":{"anyOf":[{"type":"string","enum":["dark","light"]},{"type":"null"}],"title":"Theme","description":"Page theme (dark or light)"},"logo_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Logo Url","description":"Optional logo URL"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public","description":"Whether the page is publicly accessible"},"allow_indexing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Indexing","description":"Whether search engines are allowed to index this page"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone","description":"IANA timezone for public viewers. Pass null to switch to Auto (viewer's browser timezone)."}},"type":"object","title":"UpdateStatusPageRequest","description":"Request schema for updating a status page."},"UpdateTimezoneRequest":{"properties":{"timezone":{"type":"string","maxLength":64,"minLength":1,"title":"Timezone","description":"IANA timezone name (e.g. 'Europe/Moscow', 'UTC')"}},"type":"object","required":["timezone"],"title":"UpdateTimezoneRequest","description":"Request schema for updating user's preferred IANA timezone."},"UpdateWebhookCheckRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name","description":"Display name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description"},"secret":{"anyOf":[{"type":"string","maxLength":64,"minLength":16},{"type":"null"}],"title":"Secret","description":"Shared secret (min 16 chars)"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Allowed Ips","description":"Allowed source IPs/CIDRs"},"state_field":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"State Field","description":"JSON path to status field"},"response_time_field":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Response Time Field","description":"JSON path to response time field"},"message_field":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Message Field","description":"JSON path to message field"},"expected_interval_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":0.0},{"type":"null"}],"title":"Expected Interval Seconds","description":"Expected interval (0 = no timeout check)"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether monitor is active"}},"type":"object","title":"UpdateWebhookCheckRequest","description":"Request schema for updating a webhook check monitor."},"UpdateWebhookRequest":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2048,"minLength":1},{"type":"null"}],"title":"Url","description":"Webhook endpoint URL"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Events","description":"List of events to subscribe to"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Whether webhook is active"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional metadata"}},"type":"object","title":"UpdateWebhookRequest","description":"Request schema for updating a webhook."},"UpdateWorkspaceRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name","description":"Human-readable name for the workspace"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional description of the workspace"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Hex color for UI display (#RRGGBB)"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon","description":"Optional emoji or icon for UI"}},"type":"object","title":"UpdateWorkspaceRequest","description":"Request schema for updating a workspace."},"UptimeSummaryResponse":{"properties":{"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"monitor_name":{"type":"string","title":"Monitor Name","description":"Monitor name"},"uptime_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percentage","description":"Uptime percentage (None = no data yet)"},"total_checks":{"type":"integer","title":"Total Checks","description":"Total number of checks"},"checks_up":{"type":"integer","title":"Checks Up","description":"Successful checks"},"checks_down":{"type":"integer","title":"Checks Down","description":"Failed checks"},"checks_timeout":{"type":"integer","title":"Checks Timeout","description":"Timed out checks"},"avg_response_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Time Ms","description":"Average response time (ms)"},"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Period start"},"period_end":{"type":"string","format":"date-time","title":"Period End","description":"Period end"}},"type":"object","required":["monitor_id","monitor_name","total_checks","checks_up","checks_down","checks_timeout","period_start","period_end"],"title":"UptimeSummaryResponse","description":"Uptime summary for a single monitor."},"UserActivityStatsResponse":{"properties":{"daily_active_users":{"type":"integer","title":"Daily Active Users","description":"Users active today (DAU)"},"weekly_active_users":{"type":"integer","title":"Weekly Active Users","description":"Users active in last 7 days (WAU)"},"monthly_active_users":{"type":"integer","title":"Monthly Active Users","description":"Users active in last 30 days (MAU)"},"active_sessions":{"type":"integer","title":"Active Sessions","description":"Users active in last 15 minutes"},"stickiness_ratio":{"type":"number","title":"Stickiness Ratio","description":"DAU/MAU ratio as percentage"}},"type":"object","required":["daily_active_users","weekly_active_users","monthly_active_users","active_sessions","stickiness_ratio"],"title":"UserActivityStatsResponse","description":"Response schema for user activity statistics."},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"User ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email (None for Telegram-only users)"},"telegram_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Telegram Id","description":"Telegram user ID"},"telegram_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram Username","description":"Telegram username"},"google_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Id","description":"Google user ID"},"yandex_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yandex Id","description":"Yandex user ID"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"User avatar URL (from Google or Yandex)"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether user is active"},"is_verified":{"type":"boolean","title":"Is Verified","description":"Whether email is verified"},"plan":{"type":"string","title":"Plan","description":"Subscription plan"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Account creation time"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At","description":"Last login time"},"monitor_limit":{"type":"integer","title":"Monitor Limit","description":"Maximum monitors allowed"},"alert_limit":{"type":"integer","title":"Alert Limit","description":"Maximum alerts allowed"},"alert_channel_limit":{"type":"integer","title":"Alert Channel Limit","description":"Maximum alert channels allowed","default":0},"status_page_limit":{"type":"integer","title":"Status Page Limit","description":"Maximum status pages allowed","default":0},"webhook_limit":{"type":"integer","title":"Webhook Limit","description":"Maximum webhooks allowed","default":0},"workspace_limit":{"type":"integer","title":"Workspace Limit","description":"Maximum workspaces allowed","default":0},"api_key_limit":{"type":"integer","title":"Api Key Limit","description":"Maximum API keys allowed","default":0},"scheduled_report_limit":{"type":"integer","title":"Scheduled Report Limit","description":"Maximum scheduled reports allowed","default":0},"check_interval_min":{"type":"integer","title":"Check Interval Min","description":"Minimum check interval in seconds"},"preferred_locale":{"type":"string","title":"Preferred Locale","description":"Preferred locale for notifications (e.g. 'en', 'ru')","default":"en"},"timezone":{"type":"string","title":"Timezone","description":"Preferred IANA timezone for datetime display across UI, MCP tool output, and alert bodies (e.g. 'Europe/Moscow').","default":"UTC"}},"type":"object","required":["id","is_active","is_verified","plan","monitor_limit","alert_limit","check_interval_min"],"title":"UserResponse","description":"Response schema for user profile (authenticated users only)."},"UserStatsResponse":{"properties":{"user_id":{"type":"integer","title":"User Id","description":"User ID"},"monitors_count":{"type":"integer","title":"Monitors Count","description":"Number of monitors"},"monitors_limit":{"type":"integer","title":"Monitors Limit","description":"Maximum monitors allowed"},"alerts_count":{"type":"integer","title":"Alerts Count","description":"Number of alert channels"},"alerts_limit":{"type":"integer","title":"Alerts Limit","description":"Maximum alert channels allowed"},"total_checks_24h":{"type":"integer","title":"Total Checks 24H","description":"Total checks in last 24 hours"},"uptime_average_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Average 24H","description":"Average uptime in last 24 hours"}},"type":"object","required":["user_id","monitors_count","monitors_limit","alerts_count","alerts_limit","total_checks_24h"],"title":"UserStatsResponse","description":"Response schema for user statistics."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VapidPublicKeyResponse":{"properties":{"public_key":{"type":"string","title":"Public Key"}},"type":"object","required":["public_key"],"title":"VapidPublicKeyResponse"},"VariableExtractionSchema":{"properties":{"variable_name":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-zA-Z_][a-zA-Z0-9_]*$","title":"Variable Name","description":"Name of the variable to extract (must be valid identifier)"},"source":{"$ref":"#/components/schemas/VariableSourceSchema","description":"Where to extract the variable from"},"expression":{"type":"string","maxLength":500,"title":"Expression","description":"Expression for extraction (JSON path, regex, header name)","default":""},"default_value":{"type":"string","maxLength":1000,"title":"Default Value","description":"Default value if extraction fails","default":""}},"type":"object","required":["variable_name","source"],"title":"VariableExtractionSchema","description":"Schema for extracting variables from API responses."},"VariableSourceSchema":{"type":"string","enum":["header","body_json","body_regex","status_code","response_time"],"title":"VariableSourceSchema","description":"Sources for extracting variables from responses."},"VerifyResponse":{"properties":{"message":{"type":"string","title":"Message"},"email":{"type":"string","title":"Email"},"verified":{"type":"boolean","title":"Verified"}},"type":"object","required":["message","email","verified"],"title":"VerifyResponse","description":"Response after email verification."},"VisitRequest":{"properties":{"visitor_id":{"type":"string","maxLength":36,"minLength":36,"title":"Visitor Id","description":"UUID from browser localStorage","examples":["550e8400-e29b-41d4-a716-446655440000"]},"page_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Page Path","description":"Optional page path being visited","examples":["/","/pricing","/dashboard"]},"referrer_path":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Referrer Path","description":"Previous page path in SPA navigation (for journey tracking)","examples":["/","/features","/pricing"]},"external_referrer":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"External Referrer","description":"External referrer URL (document.referrer), excluding self-referrals","examples":["https://google.com/search?q=uptime+monitoring","https://t.me/"]},"utm_source":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Utm Source","description":"UTM source parameter from URL","examples":["yandex","google","telegram"]},"utm_medium":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Utm Medium","description":"UTM medium parameter from URL","examples":["cpc","organic","social"]}},"type":"object","required":["visitor_id"],"title":"VisitRequest","description":"Request schema for tracking anonymous page visits."},"WebhookAckResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Whether webhook was recorded","default":true},"check_id":{"type":"string","title":"Check Id","description":"Webhook check UUID"},"status_extracted":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Extracted status"},"current_status":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Current monitor status"},"received_at":{"type":"string","format":"date-time","title":"Received At","description":"When webhook was received"}},"type":"object","required":["check_id","status_extracted","current_status","received_at"],"title":"WebhookAckResponse","description":"Response schema for webhook acknowledgment (public endpoint)."},"WebhookCheckListResponse":{"properties":{"checks":{"items":{"$ref":"#/components/schemas/WebhookCheckResponse"},"type":"array","title":"Checks","description":"List of webhook check monitors"},"total":{"type":"integer","title":"Total","description":"Total number of checks"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["checks","total","page","page_size"],"title":"WebhookCheckListResponse","description":"Response schema for paginated webhook check list."},"WebhookCheckResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Webhook check UUID"},"name":{"type":"string","title":"Name","description":"Display name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"slug":{"type":"string","title":"Slug","description":"Unique URL slug for webhook endpoint"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Monitor description"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips","description":"Allowed source IPs"},"state_field":{"type":"string","title":"State Field","description":"JSON path to status field"},"response_time_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Time Field","description":"JSON path to response time"},"message_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Field","description":"JSON path to message"},"expected_interval_seconds":{"type":"integer","title":"Expected Interval Seconds","description":"Expected interval (0 = disabled)"},"status":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Current monitor status"},"last_webhook_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Webhook At","description":"Last webhook timestamp"},"last_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Payload","description":"Last webhook payload"},"last_source_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Source Ip","description":"Last source IP"},"last_response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Response Time Ms","description":"Last response time in ms"},"last_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message","description":"Last extracted message"},"total_webhooks":{"type":"integer","title":"Total Webhooks","description":"Total webhooks received"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether monitor is active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","user_id","slug","state_field","expected_interval_seconds","status","total_webhooks","is_active"],"title":"WebhookCheckResponse","description":"Response schema for a webhook check monitor."},"WebhookCheckStatsResponse":{"properties":{"check_id":{"type":"string","title":"Check Id","description":"Webhook check ID"},"total_webhooks":{"type":"integer","title":"Total Webhooks","description":"Total webhooks received"},"webhooks_last_24h":{"type":"integer","title":"Webhooks Last 24H","description":"Webhooks in last 24 hours"},"webhooks_last_7d":{"type":"integer","title":"Webhooks Last 7D","description":"Webhooks in last 7 days"},"valid_webhooks_24h":{"type":"integer","title":"Valid Webhooks 24H","description":"Valid webhooks in last 24 hours"},"invalid_webhooks_24h":{"type":"integer","title":"Invalid Webhooks 24H","description":"Invalid webhooks in last 24 hours"},"uptime_percent_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percent 24H","description":"Uptime percentage (24h); null when the window can't measure uptime"},"uptime_percent_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percent 7D","description":"Uptime percentage (7d); null when the window can't measure uptime"},"avg_interval_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Interval Seconds","description":"Average interval between webhooks"},"last_webhook_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Webhook At","description":"Last webhook timestamp"},"status":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Current status"}},"type":"object","required":["check_id","total_webhooks","webhooks_last_24h","webhooks_last_7d","valid_webhooks_24h","invalid_webhooks_24h","status"],"title":"WebhookCheckStatsResponse","description":"Response schema for webhook check statistics."},"WebhookCheckStatus":{"type":"string","enum":["pending","up","down","degraded","paused","stale"],"title":"WebhookCheckStatus","description":"Status of a webhook check monitor.\n\n- PENDING: No webhooks received yet (new monitor)\n- UP: Last received webhook indicated healthy state\n- DOWN: Last received webhook indicated unhealthy state\n- DEGRADED: Last received webhook indicated degraded state\n- PAUSED: Monitoring temporarily disabled\n- STALE: No webhooks received within expected interval"},"WebhookCheckWithSecretResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Webhook check UUID"},"name":{"type":"string","title":"Name","description":"Display name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"slug":{"type":"string","title":"Slug","description":"Unique URL slug for webhook endpoint"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Monitor description"},"allowed_ips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Ips","description":"Allowed source IPs"},"state_field":{"type":"string","title":"State Field","description":"JSON path to status field"},"response_time_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Time Field","description":"JSON path to response time"},"message_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Field","description":"JSON path to message"},"expected_interval_seconds":{"type":"integer","title":"Expected Interval Seconds","description":"Expected interval (0 = disabled)"},"status":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Current monitor status"},"last_webhook_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Webhook At","description":"Last webhook timestamp"},"last_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Payload","description":"Last webhook payload"},"last_source_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Source Ip","description":"Last source IP"},"last_response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Response Time Ms","description":"Last response time in ms"},"last_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message","description":"Last extracted message"},"total_webhooks":{"type":"integer","title":"Total Webhooks","description":"Total webhooks received"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether monitor is active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Secret for authenticated webhooks"}},"type":"object","required":["id","name","user_id","slug","state_field","expected_interval_seconds","status","total_webhooks","is_active"],"title":"WebhookCheckWithSecretResponse","description":"Response schema including secret (only shown on create/regenerate)."},"WebhookDLQEntryResponse":{"properties":{"id":{"type":"string","title":"Id","description":"DLQ entry UUID"},"webhook_id":{"type":"string","title":"Webhook Id","description":"Webhook UUID"},"delivery_id":{"type":"string","title":"Delivery Id","description":"Original delivery UUID"},"event_type":{"type":"string","title":"Event Type","description":"Event type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Original payload"},"failure_reason":{"type":"string","title":"Failure Reason","description":"Why delivery failed"},"retry_count":{"type":"integer","title":"Retry Count","description":"Total retry attempts"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At","description":"When resolved"},"resolution_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Notes","description":"Resolution notes"},"failed_at":{"type":"string","format":"date-time","title":"Failed At","description":"When moved to DLQ"}},"type":"object","required":["id","webhook_id","delivery_id","event_type","payload","failure_reason","retry_count","failed_at"],"title":"WebhookDLQEntryResponse","description":"Response schema for a dead letter queue entry."},"WebhookDLQListResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/WebhookDLQEntryResponse"},"type":"array","title":"Entries","description":"DLQ entries"},"total":{"type":"integer","title":"Total","description":"Total entries"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["entries","total","page","page_size"],"title":"WebhookDLQListResponse","description":"Response schema for paginated DLQ list."},"WebhookDeliveryListResponse":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"type":"array","title":"Deliveries","description":"List of deliveries"},"total":{"type":"integer","title":"Total","description":"Total number of deliveries"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["deliveries","total","page","page_size"],"title":"WebhookDeliveryListResponse","description":"Response schema for paginated delivery list."},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Delivery UUID"},"webhook_id":{"type":"string","title":"Webhook Id","description":"Webhook UUID"},"event_type":{"type":"string","title":"Event Type","description":"Event type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Delivered payload"},"idempotency_key":{"type":"string","title":"Idempotency Key","description":"Idempotency key"},"status":{"type":"string","title":"Status","description":"Delivery status"},"http_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status Code","description":"HTTP response status code"},"response_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body","description":"HTTP response body (truncated)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"attempt_count":{"type":"integer","title":"Attempt Count","description":"Number of delivery attempts"},"next_retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Retry At","description":"Next retry scheduled at"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At","description":"When successfully delivered"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","webhook_id","event_type","payload","idempotency_key","status","attempt_count"],"title":"WebhookDeliveryResponse","description":"Response schema for a webhook delivery record."},"WebhookErrorResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Always false for errors","default":false},"error":{"type":"string","title":"Error","description":"Error message"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error","description":"Detailed validation error"}},"type":"object","required":["error"],"title":"WebhookErrorResponse","description":"Response schema for webhook validation errors."},"WebhookEventListResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/WebhookEventResponse"},"type":"array","title":"Events","description":"List of events"},"total":{"type":"integer","title":"Total","description":"Total number of events"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["events","total","page","page_size"],"title":"WebhookEventListResponse","description":"Response schema for paginated event list."},"WebhookEventResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Event UUID"},"webhook_check_id":{"type":"string","title":"Webhook Check Id","description":"Parent webhook check UUID"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Original webhook payload"},"status_extracted":{"$ref":"#/components/schemas/WebhookCheckStatus","description":"Extracted status"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms","description":"Extracted response time"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Extracted message"},"source_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ip","description":"Source IP address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent","description":"User agent string"},"is_valid":{"type":"boolean","title":"Is Valid","description":"Whether webhook passed validation"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error","description":"Validation error if invalid"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When webhook was received"}},"type":"object","required":["id","webhook_check_id","payload","status_extracted","is_valid","created_at"],"title":"WebhookEventResponse","description":"Response schema for a webhook event record."},"WebhookEventTypesResponse":{"properties":{"events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Events","description":"Available event types with descriptions"}},"type":"object","required":["events"],"title":"WebhookEventTypesResponse","description":"Response schema for listing available event types."},"WebhookListResponse":{"properties":{"webhooks":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Webhooks","description":"List of webhooks"},"total":{"type":"integer","title":"Total","description":"Total number of webhooks"},"page":{"type":"integer","title":"Page","description":"Current page"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["webhooks","total","page","page_size"],"title":"WebhookListResponse","description":"Response schema for paginated webhook list."},"WebhookResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Webhook UUID"},"url":{"type":"string","title":"Url","description":"Webhook endpoint URL"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Subscribed events"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Webhook description"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether webhook is active"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Custom metadata"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","url","events","user_id","is_active"],"title":"WebhookResponse","description":"Response schema for a webhook."},"WebhookSecretResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id","description":"Webhook ID"},"secret":{"type":"string","title":"Secret","description":"New webhook secret (show only once)"},"regenerated_at":{"type":"string","format":"date-time","title":"Regenerated At","description":"When secret was regenerated"}},"type":"object","required":["webhook_id","secret","regenerated_at"],"title":"WebhookSecretResponse","description":"Response schema for webhook secret regeneration."},"WebhookStatsResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id","description":"Webhook ID"},"total_deliveries":{"type":"integer","title":"Total Deliveries","description":"Total delivery attempts"},"successful_deliveries":{"type":"integer","title":"Successful Deliveries","description":"Successful deliveries"},"failed_deliveries":{"type":"integer","title":"Failed Deliveries","description":"Failed deliveries"},"pending_retries":{"type":"integer","title":"Pending Retries","description":"Deliveries pending retry"},"dlq_entries":{"type":"integer","title":"Dlq Entries","description":"Entries in DLQ"},"success_rate":{"type":"number","title":"Success Rate","description":"Success rate percentage"},"avg_response_time_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Response Time Ms","description":"Average response time"},"last_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivery At","description":"Last delivery attempt"}},"type":"object","required":["webhook_id","total_deliveries","successful_deliveries","failed_deliveries","pending_retries","dlq_entries","success_rate"],"title":"WebhookStatsResponse","description":"Response schema for webhook statistics."},"WorkspaceInviteLinkResponse":{"properties":{"member":{"$ref":"#/components/schemas/WorkspaceMemberResponse"},"token":{"type":"string","title":"Token","description":"One-time invite token; returned only once"}},"type":"object","required":["member","token"],"title":"WorkspaceInviteLinkResponse"},"WorkspaceListResponse":{"properties":{"workspaces":{"items":{"$ref":"#/components/schemas/WorkspaceResponse"},"type":"array","title":"Workspaces","description":"List of workspaces"},"total":{"type":"integer","title":"Total","description":"Total number of workspaces"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)"},"page_size":{"type":"integer","title":"Page Size","description":"Page size"}},"type":"object","required":["workspaces","total","page","page_size"],"title":"WorkspaceListResponse","description":"Response schema for paginated workspace list."},"WorkspaceMemberResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Membership row ID"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id","description":"Member user ID (null while invite pending)"},"role":{"type":"string","title":"Role","description":"Member role (owner|editor|viewer)"},"status":{"type":"string","title":"Status","description":"Membership status (active|pending)"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Member email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Member display name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"Member avatar URL"},"invited_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited Email","description":"Invited email for pending invites"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When a pending invite expires"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"When the membership was created"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At","description":"When the invite was accepted"}},"type":"object","required":["id","role","status"],"title":"WorkspaceMemberResponse"},"WorkspaceResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Workspace ID"},"name":{"type":"string","title":"Name","description":"Workspace name"},"user_id":{"type":"integer","title":"User Id","description":"Owner user ID"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Workspace description"},"color":{"type":"string","title":"Color","description":"Hex color (#RRGGBB)"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Emoji or icon"},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is user's default workspace"},"ping_key":{"type":"string","title":"Ping Key","description":"Secret key for heartbeat ping URLs"},"monitor_count":{"type":"integer","title":"Monitor Count","description":"Number of monitors in this workspace"},"role":{"type":"string","title":"Role","description":"Caller role in workspace (owner|editor|viewer)","default":"owner"},"is_owner":{"type":"boolean","title":"Is Owner","description":"Whether the caller owns this workspace","default":true},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"Creation timestamp"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"Last update timestamp"}},"type":"object","required":["id","name","user_id","color","is_default","ping_key","monitor_count"],"title":"WorkspaceResponse","description":"Response schema for a workspace."},"WorkspaceSummaryResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Workspace ID"},"name":{"type":"string","title":"Name","description":"Workspace name"},"color":{"type":"string","title":"Color","description":"Hex color (#RRGGBB)"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Emoji or icon"},"is_default":{"type":"boolean","title":"Is Default","description":"Whether this is user's default workspace"},"monitor_count":{"type":"integer","title":"Monitor Count","description":"Number of monitors"},"monitor_limit":{"type":"integer","title":"Monitor Limit","description":"Monitor cap from the workspace owner's plan (governing)","default":0},"monitor_usage":{"type":"integer","title":"Monitor Usage","description":"Workspace owner's total monitor footprint (governing usage)","default":0},"alert_limit":{"type":"integer","title":"Alert Limit","description":"Alert cap from the workspace owner's plan (governing)","default":0},"role":{"type":"string","title":"Role","description":"Caller role in workspace (owner|editor|viewer)","default":"owner"},"is_owner":{"type":"boolean","title":"Is Owner","description":"Whether the caller owns this workspace","default":true}},"type":"object","required":["id","name","color","is_default","monitor_count"],"title":"WorkspaceSummaryResponse","description":"Minimal workspace info for dropdown selectors."},"presentation__api__v1__routers__web_push__SubscribeRequest":{"properties":{"subscription":{"$ref":"#/components/schemas/PushSubscriptionInfo"},"device_name":{"type":"string","maxLength":100,"title":"Device Name","default":"Browser"}},"type":"object","required":["subscription"],"title":"SubscribeRequest"},"presentation__api__v1__routers__web_push__SubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"device_count":{"type":"integer","title":"Device Count"}},"type":"object","required":["success","message","device_count"],"title":"SubscribeResponse"},"presentation__api__v1__schemas__dashboard__IncidentResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Incident ID"},"monitor_id":{"type":"integer","title":"Monitor Id","description":"Monitor ID"},"monitor_name":{"type":"string","title":"Monitor Name","description":"Monitor name"},"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When incident started"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At","description":"When incident ended"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At","description":"When incident was resolved"},"duration_seconds":{"type":"integer","title":"Duration Seconds","description":"Duration in seconds"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message"},"status":{"type":"string","title":"Status","description":"Status: ongoing or resolved"}},"type":"object","required":["id","monitor_id","monitor_name","started_at","duration_seconds","status"],"title":"IncidentResponse","description":"Incident record for a monitor."},"presentation__api__v1__schemas__heartbeats__RegenerateSecretResponse":{"properties":{"monitor_id":{"type":"string","title":"Monitor Id","description":"Monitor ID"},"secret":{"type":"string","title":"Secret","description":"New secret (shown once)"},"regenerated_at":{"type":"string","format":"date-time","title":"Regenerated At","description":"When secret was regenerated"}},"type":"object","required":["monitor_id","secret","regenerated_at"],"title":"RegenerateSecretResponse","description":"Response schema for secret regeneration."},"presentation__api__v1__schemas__incidents__IncidentResponse":{"properties":{"id":{"type":"integer","title":"Id"},"workspace_id":{"type":"integer","title":"Workspace Id"},"monitor_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitor Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"severity":{"type":"string","title":"Severity"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"is_auto_detected":{"type":"boolean","title":"Is Auto Detected"},"created_by_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created By User Id"},"updates":{"items":{"$ref":"#/components/schemas/IncidentUpdateResponse"},"type":"array","title":"Updates"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"title_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Key"},"title_params":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Title Params"},"monitor_protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monitor Protocol"},"monitor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Monitor Name"},"affected_probes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Affected Probes","default":[]}},"type":"object","required":["id","workspace_id","monitor_id","title","description","status","severity","started_at","resolved_at","is_auto_detected","created_by_user_id","updates","created_at","updated_at"],"title":"IncidentResponse","description":"Response for an incident."},"presentation__api__v1__schemas__sla__IncidentResponse":{"properties":{"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When the incident started"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At","description":"When the incident ended (None if ongoing)"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"Incident duration in seconds (None if ongoing)"},"duration_formatted":{"type":"string","title":"Duration Formatted","description":"Human-readable duration"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message from the first failed check"},"is_resolved":{"type":"boolean","title":"Is Resolved","description":"Whether the incident is resolved"}},"type":"object","required":["started_at","duration_formatted","is_resolved"],"title":"IncidentResponse","description":"Response schema for a single incident."},"presentation__api__v1__schemas__subscriptions__SubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email address to subscribe"}},"type":"object","required":["email"],"title":"SubscribeRequest","description":"Request to subscribe to a status page."},"presentation__api__v1__schemas__subscriptions__SubscribeResponse":{"properties":{"message":{"type":"string","title":"Message"},"email":{"type":"string","title":"Email"},"requires_verification":{"type":"boolean","title":"Requires Verification","default":true}},"type":"object","required":["message","email"],"title":"SubscribeResponse","description":"Response after subscribing."},"presentation__api__v1__schemas__webhook_checks__RegenerateSecretResponse":{"properties":{"check_id":{"type":"string","title":"Check Id","description":"Webhook check ID"},"secret":{"type":"string","title":"Secret","description":"New secret (shown once)"},"regenerated_at":{"type":"string","format":"date-time","title":"Regenerated At","description":"When secret was regenerated"}},"type":"object","required":["check_id","secret","regenerated_at"],"title":"RegenerateSecretResponse","description":"Response schema for secret regeneration."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"},"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"tags":[{"name":"Health","description":"Health check endpoints for liveness and readiness probes."},{"name":"Authentication","description":"User registration, login, token refresh, and password management."},{"name":"Users","description":"Public user profile endpoints. Authenticated data via /auth/me."},{"name":"Monitors","description":"HTTP/HTTPS endpoint monitoring configuration and management."},{"name":"Alerts","description":"Alert channels for notifications (email, Telegram, Slack, webhooks)."},{"name":"Alert Channel Configs","description":"Configure channel-specific credentials (SMTP, Telegram bot tokens, webhook URLs)."},{"name":"Webhooks","description":"Webhook subscriptions for event-driven integrations."},{"name":"Analytics","description":"Monitoring statistics, uptime metrics, and historical data."},{"name":"Dashboard","description":"Dashboard statistics, uptime summaries, and alerts overview."},{"name":"Feedback","description":"User feedback submission and management for feature requests, bug reports, and general feedback."},{"name":"incidents","description":"Incident management for status pages. Track and communicate service disruptions."},{"name":"maintenance","description":"Scheduled maintenance windows for status pages. Plan and communicate upcoming downtime."},{"name":"Heartbeats","description":"Heartbeat/cron job monitoring. Configure monitors and view history."},{"name":"Heartbeat Ping","description":"Public endpoints for recording heartbeat pings from external jobs."},{"name":"Webhook Checks","description":"Incoming webhook monitoring. Receive status from external systems."},{"name":"Webhook Receive","description":"Public endpoints for receiving webhook payloads from external systems."},{"name":"Monitor Groups","description":"Logical groupings of monitors with threshold-based status aggregation."},{"name":"Workspaces","description":"Organizational containers for monitors. Separate work and personal projects."},{"name":"API Checks","description":"Multi-step HTTP workflow monitoring with assertions."},{"name":"websocket","description":"Real-time WebSocket for live updates on monitor status and alerts."}]}