{"openapi":"3.1.0","info":{"title":"fettle.sh","version":"1.3.1"},"paths":{"/v1/users/auth/oauth/{provider}/start":{"get":{"tags":["Users"],"summary":"Start Oauth","description":"Start signing in with Google or GitHub. Redirects to the provider's consent\nscreen; `next` is where to land afterwards, `invite_token` joins a workspace\non sign-up.","operationId":"start_oauth_v1_users_auth_oauth__provider__start_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"invite_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Invite Token"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/register":{"post":{"tags":["Users"],"summary":"Signup User","description":"Create a new user account. Optionally name the workspace to create, or\npass an invite token to join the inviting organization instead.\n\nRequires a Cloudflare Turnstile token in the\n`X-Turnstile-Token` header when bot protection is enabled.","operationId":"signup_user_v1_users_auth_register_post","parameters":[{"name":"X-Turnstile-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Turnstile-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserModel"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileViewModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/verification-email":{"post":{"tags":["Users"],"summary":"Send Verification Email","description":"Sends the verification link to the user's email.","operationId":"send_verification_email_v1_users_auth_verification_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/verify":{"get":{"tags":["Users"],"summary":"Verify Email","description":"Verifies the user's email using the provided token.","operationId":"verify_email_v1_users_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/login":{"post":{"tags":["Users"],"summary":"Login User","description":"Authenticate user and return the access token.\n\nThe refresh token is delivered as an httpOnly cookie\n(`refresh_token`, path `/v1/users/auth/login/refresh`, `SameSite=Lax`,\n`Secure` in production) so SPA frontends can keep the access token in\nmemory while letting the browser handle refresh transport.\n\nRequires a Cloudflare Turnstile token in the\n`X-Turnstile-Token` header when bot protection is enabled.","operationId":"login_user_v1_users_auth_login_post","parameters":[{"name":"X-Turnstile-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Turnstile-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginUserModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessTokenResponseModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/login/refresh":{"post":{"tags":["Users"],"summary":"Get Access By Refresh","description":"Refresh the access token using a valid refresh token.\n\nReads the refresh token from the httpOnly cookie (or, as a fallback,\nthe `Authorization` header), rotates the refresh token, and returns\nthe new access token. The rotated refresh token replaces the cookie.","operationId":"get_access_by_refresh_v1_users_auth_login_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessTokenResponseModel"}}}}},"security":[{"refresh-token":[]}]}},"/v1/users/auth/logout":{"post":{"tags":["Users"],"summary":"Logout User","description":"Invalidate the current session or all user sessions and clear the\nrefresh cookie.","operationId":"logout_user_v1_users_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LogoutRequestModel"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"access-token":[]}]}},"/v1/users/auth/password/reset":{"post":{"tags":["Users"],"summary":"Send Reset Password Request","description":"Email a password-reset link to the address, if an account exists.\n\nRequires a Cloudflare Turnstile token in the\n`X-Turnstile-Token` header when bot protection is enabled.","operationId":"send_reset_password_request_v1_users_auth_password_reset_post","parameters":[{"name":"X-Turnstile-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Turnstile-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendResetPasswordRequestModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/auth/password/reset/confirm":{"put":{"tags":["Users"],"summary":"Confirm Reset Password Request","operationId":"confirm_reset_password_request_v1_users_auth_password_reset_confirm_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/me/identities":{"get":{"tags":["Users"],"summary":"List Identities","description":"Your sign-in methods: whether the account has a password and which Google /\nGitHub accounts are connected.","operationId":"list_identities_v1_users_me_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentitiesRead"}}}}},"security":[{"access-token":[]}]}},"/v1/users/me/identities/{provider}/link":{"post":{"tags":["Users"],"summary":"Start Link","description":"Connect a Google or GitHub account to yours. Send your current password when\nthe account has one. Navigate to the returned URL to finish on the provider.","operationId":"start_link_v1_users_me_identities__provider__link_post","security":[{"access-token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkIdentityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/me/identities/{identity_id}/unlink":{"post":{"tags":["Users"],"summary":"Unlink Identity","description":"Disconnect a Google or GitHub account. Send your current password when the\naccount has one. The only remaining sign-in method cannot be disconnected —\nset a password first.","operationId":"unlink_identity_v1_users_me_identities__identity_id__unlink_post","security":[{"access-token":[]}],"parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Identity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlinkIdentityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/me":{"get":{"tags":["Users"],"summary":"Get User Profile","description":"Returns the current user's information.","operationId":"get_user_profile_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileViewModel"}}}}},"security":[{"access-token":[]}]},"delete":{"tags":["Users"],"summary":"Delete User Account","description":"Permanently close your account. Your monitors stop running and you are\nsigned out everywhere.","operationId":"delete_user_account_v1_users_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}},"security":[{"access-token":[]}]},"patch":{"tags":["Users"],"summary":"Update User Profile","description":"Update your profile (name).","operationId":"update_user_profile_v1_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileViewModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"access-token":[]}]}},"/v1/users/me/subscription":{"get":{"tags":["Users"],"summary":"Get User Subscription","description":"Returns the active organization's subscription: plan, status, renewal\ndates, billing period, and next-charge amount and currency.","operationId":"get_user_subscription_v1_users_me_subscription_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/me/password":{"patch":{"tags":["Users"],"summary":"Update User Password","description":"Change your password. Send `current_password` when you already have one;\naccounts created with Google or GitHub set their first password without it.\nYou stay signed in on this device; other sessions are signed out.","operationId":"update_user_password_v1_users_me_password_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserNewPassword"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"access-token":[]}]}},"/v1/orgs":{"post":{"tags":["Organizations"],"summary":"Create Organization","description":"Create a new organization. You become its owner.","operationId":"create_organization_v1_orgs_post","security":[{"access-token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrganizationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Organizations"],"summary":"List My Organizations","description":"List the organizations you belong to, with your role in each.","operationId":"list_my_organizations_v1_orgs_get","security":[{"access-token":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationMembershipRead"},"title":"Response List My Organizations V1 Orgs Get"}}}}}},"patch":{"tags":["Organizations"],"summary":"Update Organization","description":"Update the active organization's name and/or timezone.","operationId":"update_organization_v1_orgs_patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Organizations"],"summary":"Delete Organization","description":"Delete the active organization.","operationId":"delete_organization_v1_orgs_delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/current":{"get":{"tags":["Organizations"],"summary":"Get Current Organization","description":"Return the organization selected by the X-Organization-Id header.","operationId":"get_current_organization_v1_orgs_current_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/members":{"get":{"tags":["Organizations"],"summary":"List Members","description":"List the members of the active organization.","operationId":"list_members_v1_orgs_members_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationMemberRead"},"title":"Response List Members V1 Orgs Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/members/{user_id}":{"patch":{"tags":["Organizations"],"summary":"Change Member Role","description":"Change a member's role (ADMIN, MEMBER, or VIEWER).","operationId":"change_member_role_v1_orgs_members__user_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Organizations"],"summary":"Remove Member","description":"Remove a member from the active organization.","operationId":"remove_member_v1_orgs_members__user_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/leave":{"post":{"tags":["Organizations"],"summary":"Leave Organization","description":"Leave the active organization.","operationId":"leave_organization_v1_orgs_leave_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/transfer-ownership":{"post":{"tags":["Organizations"],"summary":"Transfer Ownership","description":"Transfer ownership of the active organization to another member.","operationId":"transfer_ownership_v1_orgs_transfer_ownership_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOwnershipRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/invites":{"post":{"tags":["Organizations"],"summary":"Create Invitation","description":"Invite an email address to the active organization at a role.","operationId":"create_invitation_v1_orgs_invites_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Organizations"],"summary":"List Invitations","description":"List pending invitations for the active organization.","operationId":"list_invitations_v1_orgs_invites_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvitationRead"},"title":"Response List Invitations V1 Orgs Invites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/invites/{invitation_id}":{"delete":{"tags":["Organizations"],"summary":"Revoke Invitation","description":"Revoke a pending invitation.","operationId":"revoke_invitation_v1_orgs_invites__invitation_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invites/accept":{"post":{"tags":["Invitations"],"summary":"Accept Invitation","description":"Accept an invitation addressed to your account's email.","operationId":"accept_invitation_v1_invites_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"access-token":[]}]}},"/v1/invites/{token}":{"get":{"tags":["Invitations"],"summary":"Preview Invitation","description":"Preview an invitation (organization, role) before accepting.","operationId":"preview_invitation_v1_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors":{"post":{"tags":["Monitors"],"summary":"Create Monitor","description":"Create a new monitor for the active organization.\n\nPlan limits apply to the monitor count, the minimum interval, monitors\nchecked more often than every 60 seconds and the number of regions;\n`GET /v1/plans/usage` shows them and what is left. Send `is_active: false`\nto create it paused — no check runs until you resume it.","operationId":"create_monitor_v1_monitors_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"get":{"tags":["Monitors"],"summary":"List Monitors","description":"List monitors for the active organization.\n\nFilter by search text, by type and by status (repeat a parameter to allow\nseveral values), and by tags: with `tag_match=all` (default) a monitor must\ncarry every tag given, with `tag_match=any` at least one. Problems come\nfirst by default; `sort=ssl_expiry` puts the soonest-expiring certificates\nfirst. `view=compact` returns short rows without configuration or uptime\nhistory.","operationId":"list_monitors_v1_monitors_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MonitorSortOption","default":"status"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10},{"type":"null"}],"title":"Tag"}},{"name":"tag_match","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TagMatchMode","default":"all"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CheckType"}},{"type":"null"}],"title":"Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/MonitorStatus"}},{"type":"null"}],"title":"Status"}},{"name":"view","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MonitorListView","default":"full"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"A page of monitors: full rows by default, compact rows for `view=compact`.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PaginatedResponse_MonitorListRead_"},{"$ref":"#/components/schemas/PaginatedResponse_MonitorCompactRead_"}],"title":"Response 200 List Monitors V1 Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/precheck":{"post":{"tags":["Monitors"],"summary":"Precheck Monitor Target","description":"Probe a target once before creating a monitor to flag if it looks down.","operationId":"precheck_monitor_target_v1_monitors_precheck_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorPrecheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorPrecheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/minimal":{"get":{"tags":["Monitors"],"summary":"List Minimal Monitors","description":"List compact monitor rows for selector controls.\n\nThe response carries an `ETag`; send it back in `If-None-Match` to get\n`304 Not Modified` while the catalog is unchanged.","operationId":"list_minimal_monitors_v1_monitors_minimal_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonitorMinimalRead"},"title":"Response List Minimal Monitors V1 Monitors Minimal Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/presets/exposed-ports":{"get":{"tags":["Monitors"],"summary":"Get Exposed Ports Preset","description":"List ports that should not be reachable from the internet.\n\nWatch them with one TCP monitor on your server's host:\n`config: {\"ports\": [...], \"expected_state\": \"closed\"}`, one region, an\ninterval of at least 300 seconds. Any of them answering opens an incident.","operationId":"get_exposed_ports_preset_v1_monitors_presets_exposed_ports_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExposedPortsPresetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/summary":{"get":{"tags":["Monitors"],"summary":"Get Monitors Summary","description":"Return monitor counts by status and 30-day uptime for the active organization.","operationId":"get_monitors_summary_v1_monitors_summary_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorsSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/uptime/batch":{"post":{"tags":["Monitors"],"summary":"Get Monitors Uptime Batch","description":"Return uptime windows for selected owned monitors.","operationId":"get_monitors_uptime_batch_v1_monitors_uptime_batch_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUptimeBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUptimeBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/tags":{"post":{"tags":["Monitors"],"summary":"Bulk Update Monitor Tags","description":"Add or remove tags across several monitors at once.\n\nEvery listed monitor must belong to your organization. The change is\napplied to all of them or to none: an unknown monitor, or a monitor that\nwould end up with more than 10 tags, rejects the whole request.","operationId":"bulk_update_monitor_tags_v1_monitors_tags_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorTagsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/bulk":{"post":{"tags":["Monitors"],"summary":"Bulk Create Monitors","description":"Create up to 100 monitors in one request.\n\nAll of them are created or none is: an invalid monitor, or a batch that\nwould exceed your plan's monitor limits, rejects the whole request.\n\nA field that fails request validation is reported with its position, for\nexample `body.monitors.3.target`. Any other rejection of one monitor (its\nconfig, interval, regions or channels) keeps its usual status code, and\nthe message starts with `monitors[3] (\"<name>\"): ` so you can tell which\none failed.","operationId":"bulk_create_monitors_v1_monitors_bulk_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"patch":{"tags":["Monitors"],"summary":"Bulk Update Monitors","description":"Change the interval, timeout, regions, notification channels, confirmation\nthreshold or notification cooldown of up to 100 monitors at once.\n\nThe same values go to every listed monitor; omitted fields stay unchanged\nand `null` is refused. All of them change or none does: an unknown\nmonitor or channel, a value your plan does not allow, or a value one\nmonitor's type does not accept rejects the whole request. A problem with\none monitor names it, for example `monitors[3] (\"API\"): `.","operationId":"bulk_update_monitors_v1_monitors_bulk_patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/bulk/pause":{"post":{"tags":["Monitors"],"summary":"Bulk Pause Monitors","description":"Pause up to 100 monitors at once.\n\nEvery listed monitor must belong to your organization; one unknown id\nrejects the whole request. Pausing closes a monitor's open incident without\nan alert. Pausing an already paused monitor is not an error.","operationId":"bulk_pause_monitors_v1_monitors_bulk_pause_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorIdsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/bulk/resume":{"post":{"tags":["Monitors"],"summary":"Bulk Resume Monitors","description":"Resume up to 100 paused monitors at once.\n\nAll of them are resumed or none is: an unknown id, or more active monitors\nthan your plan allows, rejects the whole request. Resuming a monitor that\nis already running is not an error.","operationId":"bulk_resume_monitors_v1_monitors_bulk_resume_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorIdsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkMonitorStateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/{monitor_id}":{"get":{"tags":["Monitors"],"summary":"Get Monitor","description":"Return a single monitor by id.","operationId":"get_monitor_v1_monitors__monitor_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"},"patch":{"tags":["Monitors"],"summary":"Update Monitor","description":"Update fields on a monitor.\n\nPlan limits apply as on create; moving a monitor below 60 seconds counts\ntoward the plan's fast-interval quota.","operationId":"update_monitor_v1_monitors__monitor_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"delete":{"tags":["Monitors"],"summary":"Delete Monitor","description":"Delete a monitor.","operationId":"delete_monitor_v1_monitors__monitor_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/{monitor_id}/pause":{"post":{"tags":["Monitors"],"summary":"Pause Monitor","description":"Pause checks for the monitor.","operationId":"pause_monitor_v1_monitors__monitor_id__pause_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/{monitor_id}/resume":{"post":{"tags":["Monitors"],"summary":"Resume Monitor","description":"Resume a paused monitor.\n\nFails when the plan's monitor limit is already reached by active monitors.","operationId":"resume_monitor_v1_monitors__monitor_id__resume_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/{monitor_id}/check-now":{"post":{"tags":["Monitors"],"summary":"Check Now Monitor","description":"Run this monitor on the next scheduler tick instead of waiting for its interval.\n\nRepeat requests for the same monitor within 30 seconds return it unchanged.\nAcross monitors the endpoint is limited per user; over the limit it answers\n429 with a `Retry-After` header.","operationId":"check_now_monitor_v1_monitors__monitor_id__check_now_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/monitors/{monitor_id}/check-results":{"get":{"tags":["Monitors"],"summary":"List Check Results","description":"List recent check results for a monitor.","operationId":"list_check_results_v1_monitors__monitor_id__check_results_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Region"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CheckResultStatus"},{"type":"null"}],"title":"Status"}},{"name":"period_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Period Days"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_CheckResultRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/{monitor_id}/stats":{"get":{"tags":["Monitors"],"summary":"Get Monitor Stats","description":"Return uptime statistics for a monitor over the 24h, 7d, and 30d windows.","operationId":"get_monitor_stats_v1_monitors__monitor_id__stats_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"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"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/{monitor_id}/uptime-daily":{"get":{"tags":["Monitors"],"summary":"Get Monitor Uptime Daily","description":"Return the daily uptime series for a monitor over the last N days.\n\nDays with no checks (before the monitor was created, or any gap) are\nreturned as explicit no-data points so the strip never shows uptime the\nmonitor did not record. Days are UTC calendar days.","operationId":"get_monitor_uptime_daily_v1_monitors__monitor_id__uptime_daily_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUptimeDailyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/monitors/{monitor_id}/response-time-by-region":{"get":{"tags":["Monitors"],"summary":"Get Monitor Response Time By Region","description":"Return the per-region response-time series for a monitor.\n\nEach region is returned as its own dense, evenly-spaced series so the card\ncan plot one region at a time on an axis scaled to that region's baseline —\na fast region and a slow region never share an axis. ``window`` selects the\nspan and point granularity (24h hourly, 7d six-hourly, 30d daily).","operationId":"get_monitor_response_time_by_region_v1_monitors__monitor_id__response_time_by_region_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"window","in":"query","required":false,"schema":{"enum":["24h","7d","30d"],"type":"string","default":"24h","title":"Window"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponseTimeByRegionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/tags":{"get":{"tags":["Tags"],"summary":"List Tags","description":"List the tags used in this organization, with how many monitors and\nheartbeats carry each one. Most-used first.","operationId":"list_tags_v1_tags_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TagKind","default":"all"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"},"patch":{"tags":["Tags"],"summary":"Rename Tag","description":"Rename a tag on every monitor and heartbeat that carries it. Renaming to\na tag an item already has merges the two rather than duplicating.","operationId":"rename_tag_v1_tags_patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"delete":{"tags":["Tags"],"summary":"Delete Tag","description":"Remove a tag from every monitor and heartbeat that carries it. The tag\nitself disappears from the organization once nothing uses it.","operationId":"delete_tag_v1_tags_delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"tag","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Tag"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/incidents":{"get":{"tags":["Incidents"],"summary":"List Incidents","description":"List incidents across the active organization's monitors, filtered by status, cause, period.","operationId":"list_incidents_v1_incidents_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Monitor Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IncidentStatusFilter"},{"type":"null"}],"description":"Filter by open or resolved; omit for both.","title":"Status"},"description":"Filter by open or resolved; omit for both."},{"name":"cause","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IncidentCause"},{"type":"null"}],"description":"Filter by structured failure cause.","title":"Cause"},"description":"Filter by structured failure cause."},{"name":"period_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"Only incidents that were active within the last N days. An incident still open is always included, whenever it started. Combined with status=open this makes period_days a no-op, since every open incident already satisfies that arm — use status=resolved or omit status to see the window take effect.","title":"Period Days"},"description":"Only incidents that were active within the last N days. An incident still open is always included, whenever it started. Combined with status=open this makes period_days a no-op, since every open incident already satisfies that arm — use status=resolved or omit status to see the window take effect."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_IncidentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/incidents/summary":{"get":{"tags":["Incidents"],"summary":"Get Incident Summary","description":"Return total, open, and resolved incident counts for the organization.","operationId":"get_incident_summary_v1_incidents_summary_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"monitor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Monitor Id"}},{"name":"cause","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IncidentCause"},{"type":"null"}],"title":"Cause"}},{"name":"period_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Period Days"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentSummaryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/incidents/{incident_id}":{"get":{"tags":["Incidents"],"summary":"Get Incident","description":"Return a single incident by id.","operationId":"get_incident_v1_incidents__incident_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/incidents/{incident_id}/acknowledge":{"post":{"tags":["Incidents"],"summary":"Acknowledge Incident","description":"Mark an incident as acknowledged.","operationId":"acknowledge_incident_v1_incidents__incident_id__acknowledge_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/heartbeats":{"post":{"tags":["Heartbeats"],"summary":"Create Heartbeat","description":"Create a new heartbeat for the active organization.","operationId":"create_heartbeat_v1_heartbeats_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"get":{"tags":["Heartbeats"],"summary":"List Heartbeats","description":"List heartbeats for the active organization, optionally filtered by a\nsearch query and by tags: with `tag_match=all` (default) a heartbeat must\ncarry every tag given, with `tag_match=any` at least one. Ordered by the\ngiven sort option (problems-first by default).","operationId":"list_heartbeats_v1_heartbeats_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/HeartbeatSortOption","default":"status"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10},{"type":"null"}],"title":"Tag"}},{"name":"tag_match","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TagMatchMode","default":"all"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_HeartbeatRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/heartbeats/minimal":{"get":{"tags":["Heartbeats"],"summary":"List Minimal Heartbeats","description":"List compact heartbeat rows for selector controls.","operationId":"list_minimal_heartbeats_v1_heartbeats_minimal_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HeartbeatMinimalRead"},"title":"Response List Minimal Heartbeats V1 Heartbeats Minimal Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/heartbeats/{heartbeat_id}":{"get":{"tags":["Heartbeats"],"summary":"Get Heartbeat","description":"Return a single heartbeat by id.","operationId":"get_heartbeat_v1_heartbeats__heartbeat_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"heartbeat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heartbeat Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"},"patch":{"tags":["Heartbeats"],"summary":"Update Heartbeat","description":"Update fields on a heartbeat.","operationId":"update_heartbeat_v1_heartbeats__heartbeat_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"heartbeat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heartbeat Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"delete":{"tags":["Heartbeats"],"summary":"Delete Heartbeat","description":"Delete a heartbeat.","operationId":"delete_heartbeat_v1_heartbeats__heartbeat_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"heartbeat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heartbeat Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/heartbeats/{heartbeat_id}/pause":{"post":{"tags":["Heartbeats"],"summary":"Pause Heartbeat","description":"Pause liveness tracking for the heartbeat.","operationId":"pause_heartbeat_v1_heartbeats__heartbeat_id__pause_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"heartbeat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heartbeat Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/heartbeats/{heartbeat_id}/resume":{"post":{"tags":["Heartbeats"],"summary":"Resume Heartbeat","description":"Resume a paused heartbeat.","operationId":"resume_heartbeat_v1_heartbeats__heartbeat_id__resume_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"heartbeat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Heartbeat Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/heartbeat/{token}":{"post":{"tags":["Heartbeat Ingest"],"summary":"Ingest Success","description":"Record a success ping for the heartbeat identified by the URL token.","operationId":"ingest_success_v1_heartbeat__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Ingest Success V1 Heartbeat  Token  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/heartbeat/{token}/start":{"post":{"tags":["Heartbeat Ingest"],"summary":"Ingest Start","description":"Record that the job has started (advances the clock; no state flip).","operationId":"ingest_start_v1_heartbeat__token__start_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Ingest Start V1 Heartbeat  Token  Start Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/heartbeat/{token}/fail":{"post":{"tags":["Heartbeat Ingest"],"summary":"Ingest Fail","description":"Record an explicit job failure (immediate DOWN + alert).","operationId":"ingest_fail_v1_heartbeat__token__fail_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Ingest Fail V1 Heartbeat  Token  Fail Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/maintenance-windows":{"post":{"tags":["Maintenance Windows"],"summary":"Create Maintenance Window","description":"Create a maintenance window for the active organization.","operationId":"create_maintenance_window_v1_maintenance_windows_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"get":{"tags":["Maintenance Windows"],"summary":"List Maintenance Windows","description":"List the active organization's maintenance windows, optionally filtered by name.","operationId":"list_maintenance_windows_v1_maintenance_windows_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Q"}},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/MaintenanceSortOption","default":"created_at"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_MaintenanceWindowRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/maintenance-windows/active":{"get":{"tags":["Maintenance Windows"],"summary":"List Active Maintenance Windows","description":"List the organization's maintenance windows that are currently active.","operationId":"list_active_maintenance_windows_v1_maintenance_windows_active_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceWindowRead"},"title":"Response List Active Maintenance Windows V1 Maintenance Windows Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/maintenance-windows/preview":{"post":{"tags":["Maintenance Windows"],"summary":"Preview Maintenance Window","description":"Preview the next occurrences of a draft maintenance schedule.","operationId":"preview_maintenance_window_v1_maintenance_windows_preview_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OccurrenceRead"},"title":"Response Preview Maintenance Window V1 Maintenance Windows Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/maintenance-windows/{window_id}":{"get":{"tags":["Maintenance Windows"],"summary":"Get Maintenance Window","description":"Return a single maintenance window by id, with its next occurrences.","operationId":"get_maintenance_window_v1_maintenance_windows__window_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"window_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Window Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowDetailRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"},"patch":{"tags":["Maintenance Windows"],"summary":"Update Maintenance Window","description":"Update fields on a maintenance window.","operationId":"update_maintenance_window_v1_maintenance_windows__window_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"window_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Window Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"delete":{"tags":["Maintenance Windows"],"summary":"Delete Maintenance Window","description":"Delete a maintenance window.","operationId":"delete_maintenance_window_v1_maintenance_windows__window_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"window_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Window Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/maintenance-windows/{window_id}/effective":{"get":{"tags":["Maintenance Windows"],"summary":"Get Effective Maintenance Window","description":"Return the window's schedule as it was effective at the given instant.","operationId":"get_effective_maintenance_window_v1_maintenance_windows__window_id__effective_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"window_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Window Id"}},{"name":"at","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"At"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceWindowRevisionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/status-pages":{"post":{"tags":["Status pages"],"summary":"Create Status Page","description":"Create a status page for the active organization.","operationId":"create_status_page_v1_status_pages_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Status pages"],"summary":"List Status Pages","description":"List the active organization's status pages.","operationId":"list_status_pages_v1_status_pages_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/StatusPageSortOption","default":"created_at"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_StatusPageRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/status-pages/slug-available":{"get":{"tags":["Status pages"],"summary":"Check Slug Availability","description":"Check whether a public slug is still free.\n\nThe slug is normalized the same way creation normalizes it, and the\nresponse echoes that canonical form. A slug that could never be created —\ninvalid characters, or a name the platform reserves — comes back as simply\nunavailable.","operationId":"check_slug_availability_v1_status_pages_slug_available_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"title":"Slug"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlugAvailabilityRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status-pages/{page_id}":{"get":{"tags":["Status pages"],"summary":"Get Status Page","description":"Return a single status page and its layout.","operationId":"get_status_page_v1_status_pages__page_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"},"patch":{"tags":["Status pages"],"summary":"Update Status Page","description":"Update a status page's public settings.","operationId":"update_status_page_v1_status_pages__page_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Status pages"],"summary":"Delete Status Page","description":"Delete a status page and free its slug.","operationId":"delete_status_page_v1_status_pages__page_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status-pages/{page_id}/preview":{"get":{"tags":["Status pages"],"summary":"Preview Status Page","description":"Return the public view of a page, including unpublished drafts.","operationId":"preview_status_page_v1_status_pages__page_id__preview_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPagePublicRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status-pages/{page_id}/layout":{"put":{"tags":["Status pages"],"summary":"Replace Status Page Layout","description":"Replace the page's groups and components.","operationId":"replace_status_page_layout_v1_status_pages__page_id__layout_put","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageLayoutWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status-pages/{page_id}/incidents":{"post":{"tags":["Status pages"],"summary":"Create Page Incident","description":"Publish a manual incident on a status page.","operationId":"create_page_incident_v1_status_pages__page_id__incidents_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"get":{"tags":["Status pages"],"summary":"List Page Incidents","description":"List a status page's manual and automatic incidents.","operationId":"list_page_incidents_v1_status_pages__page_id__incidents_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_PageIncidentRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/status-pages/{page_id}/incidents/{incident_id}/updates":{"post":{"tags":["Status pages"],"summary":"Post Page Incident Update","description":"Post a timeline update on a public incident.","operationId":"post_page_incident_update_v1_status_pages__page_id__incidents__incident_id__updates_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentUpdateCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/status-pages/{page_id}/incidents/{incident_id}":{"patch":{"tags":["Status pages"],"summary":"Update Page Incident","description":"Rename a public incident.","operationId":"update_page_incident_v1_status_pages__page_id__incidents__incident_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageIncidentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"},"delete":{"tags":["Status pages"],"summary":"Delete Page Incident","description":"Delete a public incident from a status page.","operationId":"delete_page_incident_v1_status_pages__page_id__incidents__incident_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"write"}},"/v1/status-pages/{page_id}/subscribers":{"get":{"tags":["Status pages"],"summary":"List Subscribers","description":"List a status page's email subscribers.","operationId":"list_subscribers_v1_status_pages__page_id__subscribers_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SubscriberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status-pages/{page_id}/subscribers/{subscriber_id}":{"delete":{"tags":["Status pages"],"summary":"Delete Subscriber","description":"Remove a subscriber from a status page.","operationId":"delete_subscriber_v1_status_pages__page_id__subscribers__subscriber_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Page Id"}},{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscriber Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels":{"get":{"tags":["Channels"],"summary":"List Channels","description":"List notification channels for the active organization.","operationId":"list_channels_v1_channels_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NotificationChannelRead"},"title":"Response List Channels V1 Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Channels"],"summary":"Create Channel","description":"Create a notification channel for the active organization.\n\nFor a webhook channel the response includes the signing ``secret`` once — it\nis not retrievable afterwards. For Slack and Discord channels, the incoming\nwebhook URL is encrypted and never returned after creation.","operationId":"create_channel_v1_channels_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelCreatedRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/directory":{"get":{"tags":["Channels"],"summary":"List Channel Directory","description":"List the organization's notification channels with their ids, so they can\nbe bound to monitors and heartbeats. Delivery URLs are shortened to their\nhost. Email is not listed: every alert also goes to the account email of the\nuser who created the monitor or heartbeat.","operationId":"list_channel_directory_v1_channels_directory_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NotificationChannelDirectoryRead"},"title":"Response List Channel Directory V1 Channels Directory Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/channels/{channel_id}":{"patch":{"tags":["Channels"],"summary":"Update Channel","description":"Update a notification channel.","operationId":"update_channel_v1_channels__channel_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Channels"],"summary":"Delete Channel","description":"Delete a notification channel.","operationId":"delete_channel_v1_channels__channel_id__delete","security":[{"access-token-optional":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/test":{"post":{"tags":["Channels"],"summary":"Test Channel","description":"Send a synchronous test event to a webhook, Slack, or Discord channel and return the result.","operationId":"test_channel_v1_channels__channel_id__test_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/plans/limits":{"get":{"tags":["Plans"],"summary":"Get Plans Limits","description":"Return all subscription tiers and their feature limits.","operationId":"get_plans_limits_v1_plans_limits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlansLimitsResponse"}}}}}}},"/v1/plans/usage":{"get":{"tags":["Plans"],"summary":"Get Plan Usage","description":"Return your organization's plan, its limits, and how much of it you use.","operationId":"get_plan_usage_v1_plans_usage_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-fettle-public-api":"read"}},"/v1/regions":{"get":{"tags":["Regions"],"summary":"List Regions","description":"Return the check regions available across the platform.","operationId":"list_regions_v1_regions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionsResponse"}}}}},"x-fettle-public-api":"read"}},"/v1/integrations/telegram/link":{"post":{"tags":["Integrations"],"summary":"Create Telegram Link","description":"Issue a one-time deep-link binding a Telegram chat to the active organization.","operationId":"create_telegram_link_v1_integrations_telegram_link_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkout-session":{"post":{"tags":["Billing"],"summary":"Create Checkout Session","description":"Start a checkout to upgrade the active organization to a paid plan.\n\nThe request body selects a monthly or yearly product for the chosen plan.\nReturns a hosted checkout URL to redirect the user to. The plan activates\nonce payment completes and the subscription webhook is received.","operationId":"create_checkout_session_v1_checkout_session_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customer-portal":{"post":{"tags":["Billing"],"summary":"Create Customer Portal Session","description":"Open the billing portal to manage your organization's subscription.\n\nReturns a hosted Polar portal URL where you can cancel, change your payment\nmethod, or view invoices. Requires an active or past subscription.","operationId":"create_customer_portal_session_v1_customer_portal_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPortalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPortalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/polar/webhook":{"post":{"tags":["Integrations"],"summary":"Handle Polar Webhook","description":"Receive subscription lifecycle events from Polar.\n\nThe request signature is verified against the configured webhook secret;\nsupported subscription events update the account's plan. Unknown or\nduplicate events are ignored safely.","operationId":"handle_polar_webhook_v1_integrations_polar_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/v1/api-keys":{"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Create an API key.\n\nThe secret is returned once, in this response, and cannot be retrieved\nagain — store it somewhere safe before closing the page.","operationId":"create_api_key_v1_api_keys_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"List the organization's API keys, newest first. Secrets are never included.","operationId":"list_api_keys_v1_api_keys_get","security":[{"access-token-optional":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Size"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ApiKeyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys/{api_key_id}":{"get":{"tags":["API Keys"],"summary":"Get Api Key","description":"Return a single API key's metadata. The secret is never included.","operationId":"get_api_key_v1_api_keys__api_key_id__get","security":[{"access-token-optional":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Api Key Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["API Keys"],"summary":"Update Api Key","description":"Update an API key's name, scopes, expiry, or IP allowlist.\n\nOmitted fields are left untouched.","operationId":"update_api_key_v1_api_keys__api_key_id__patch","security":[{"access-token-optional":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Api Key Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys/{api_key_id}/rotate":{"post":{"tags":["API Keys"],"summary":"Rotate Api Key","description":"Replace this key's secret.\n\nThe previous secret keeps working for a short grace window so in-flight\nclients have time to switch. The new secret is returned once, here, and\ncannot be retrieved again.","operationId":"rotate_api_key_v1_api_keys__api_key_id__rotate_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Api Key Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys/{api_key_id}/revoke":{"post":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke an API key immediately.\n\nRevocation is permanent and takes effect right away, including any\nsecret from a rotation still inside its grace window.","operationId":"revoke_api_key_v1_api_keys__api_key_id__revoke_post","security":[{"access-token-optional":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Api Key Id"}},{"name":"X-Organization-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"X-Organization-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/live/":{"get":{"tags":["System"],"summary":"Check Liveness","description":"Liveness probe: the process is running and able to serve requests.\n\nDeclares no dependency at all — not even a database session — so a dead\nPostgres pool or a Redis/NATS outage can never fail or hang this\nendpoint and trigger a Kubernetes restart of an otherwise healthy pod.","operationId":"check_liveness_live__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeResponse"}}}}}}},"/ready/":{"get":{"tags":["System"],"summary":"Check Readiness","description":"Readiness probe: gates traffic on PostgreSQL only.\n\nRedis, NATS and RabbitMQ are never consulted, so an outage of any of\nthem cannot pull every pod out of the Kubernetes Service.","operationId":"check_readiness_ready__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbeResponse"}}}}}}},"/health/":{"get":{"tags":["System"],"summary":"Check Health","description":"Detailed health check reporting the status of PostgreSQL, Redis and NATS.","operationId":"check_health_health__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponse"}}}}}}},"/time/":{"get":{"tags":["System"],"summary":"Get Utc Time","description":"Endpoint to get the current UTC time in ISO format.","operationId":"get_utc_time_time__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Utc Time Time  Get"}}}}}}},"/public/status-pages/subscriptions/confirm":{"post":{"tags":["Status pages (public)"],"summary":"Confirm Subscription","description":"Confirm a status-page email subscription.","operationId":"confirm_subscription_public_status_pages_subscriptions_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/status-pages/subscriptions/unsubscribe":{"post":{"tags":["Status pages (public)"],"summary":"Unsubscribe","description":"Unsubscribe from status-page emails. Always succeeds.","operationId":"unsubscribe_public_status_pages_subscriptions_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionTokenRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/status-pages/{slug}/subscribe":{"post":{"tags":["Status pages (public)"],"summary":"Subscribe To Status Page","description":"Subscribe an email address to incident notifications for this page.","operationId":"subscribe_to_status_page_public_status_pages__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/SubscribeRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/status-pages/{slug}":{"get":{"tags":["Status pages (public)"],"summary":"Get Public Status Page","description":"Return the public status page for a slug.","operationId":"get_public_status_page_public_status_pages__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPagePublicRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/badges/{monitor_id}/uptime.svg":{"get":{"tags":["Badges (public)"],"summary":"Uptime Badge","description":"Uptime badge for a monitor, as an SVG image.","operationId":"uptime_badge_public_badges__monitor_id__uptime_svg_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"image/svg+xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/badges/{monitor_id}/status.svg":{"get":{"tags":["Badges (public)"],"summary":"Status Badge","description":"Current-status badge for a monitor, as an SVG image.","operationId":"status_badge_public_badges__monitor_id__status_svg_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"image/svg+xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/tools/ssl-check":{"post":{"tags":["Tools (public)"],"summary":"Ssl Check","description":"Check a host's TLS certificate.\n\nReturns the issuer, validity window, days left and the certificate chain.\nA host that cannot be reached is reported in the body, not as an error.","operationId":"public_ssl_check","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslCheckResponse"}}}},"422":{"description":"The target is malformed or cannot be checked (non-global address, disallowed port, unresolvable host), or the request body itself failed validation.","content":{"application/json":{"schema":{"anyOf":[{"properties":{"error":{"type":"string","title":"Error"},"message":{"type":"string","title":"Message"}},"type":"object","required":["error","message"],"title":"ErrorMessage"},{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","required":["detail"],"title":"HTTPValidationError"}]},"examples":{"invalid_target":{"summary":"Rejected by the tool's own target validation","value":{"error":"Invalid target","message":"This target cannot be checked — it must resolve to a public address"}},"request_validation":{"summary":"The request body failed schema validation","value":{"detail":[{"loc":["body","host"],"msg":"String should have at most 253 characters","type":"string_too_long"}]}}}}}},"503":{"description":"This tool is temporarily disabled by the operator kill switch.","content":{"application/json":{"example":{"error":"Service unavailable","message":"This tool is temporarily unavailable"}}}}}}},"/public/tools/multi-region-check":{"post":{"tags":["Tools (public)"],"summary":"Multi Region Check","description":"Check a URL from every monitoring region.\n\nReturns one entry per region with the HTTP status and latency. A region\nthat does not answer in time is reported as unknown.","operationId":"public_multi_region_check","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRegionCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiRegionCheckResponse"}}}},"422":{"description":"The target is malformed or cannot be checked (non-global address, disallowed port, unresolvable host), or the request body itself failed validation.","content":{"application/json":{"schema":{"anyOf":[{"properties":{"error":{"type":"string","title":"Error"},"message":{"type":"string","title":"Message"}},"type":"object","required":["error","message"],"title":"ErrorMessage"},{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","required":["detail"],"title":"HTTPValidationError"}]},"examples":{"invalid_target":{"summary":"Rejected by the tool's own target validation","value":{"error":"Invalid target","message":"This target cannot be checked — it must resolve to a public address"}},"request_validation":{"summary":"The request body failed schema validation","value":{"detail":[{"loc":["body","host"],"msg":"String should have at most 253 characters","type":"string_too_long"}]}}}}}},"503":{"description":"This tool is temporarily disabled by the operator kill switch.","content":{"application/json":{"example":{"error":"Service unavailable","message":"This tool is temporarily unavailable"}}}}}}},"/public/pulse":{"get":{"tags":["Pulse (public)"],"summary":"Get Pulse","description":"Return the anonymous landing-hero payload for the configured monitor.","operationId":"get_pulse_public_pulse_get","parameters":[{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PulsePublicRead"}}}},"404":{"description":"No monitor is configured, or the configured id resolves to nothing.","content":{"application/json":{"schema":{"title":"ErrorMessage","type":"object","properties":{"error":{"title":"Error","type":"string"},"message":{"title":"Message","type":"string"}},"required":["error","message"]},"example":{"error":"Instance not found","message":"No pulse monitor is configured."}}}},"503":{"description":"This endpoint is temporarily disabled by the operator kill switch.","content":{"application/json":{"schema":{"title":"ErrorMessage","type":"object","properties":{"error":{"title":"Error","type":"string"},"message":{"title":"Message","type":"string"}},"required":["error","message"]},"example":{"error":"Service unavailable","message":"This endpoint is temporarily unavailable"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptInvitationRequest":{"properties":{"token":{"type":"string","minLength":1,"title":"Token"}},"additionalProperties":false,"type":"object","required":["token"],"title":"AcceptInvitationRequest","description":"Request body for accepting an invitation by token."},"AccessTokenResponseModel":{"properties":{"access_token":{"type":"string","title":"Access Token"}},"additionalProperties":false,"type":"object","required":["access_token"],"title":"AccessTokenResponseModel","description":"Response body for login and refresh — refresh token lives in httpOnly cookie."},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"scopes":{"items":{"$ref":"#/components/schemas/ApiScope"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs"}},"additionalProperties":false,"type":"object","required":["name","scopes"],"title":"ApiKeyCreate","description":"Request body for minting a key."},"ApiKeyCreateResponse":{"properties":{"api_key":{"type":"string","title":"Api Key"},"key":{"$ref":"#/components/schemas/ApiKeyRead"}},"additionalProperties":false,"type":"object","required":["api_key","key"],"title":"ApiKeyCreateResponse","description":"The one and only time the secret leaves the server."},"ApiKeyRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"scopes":{"items":{"$ref":"#/components/schemas/ApiScope"},"type":"array","title":"Scopes"},"status":{"$ref":"#/components/schemas/ApiKeyStatus"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"rotation_grace_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Rotation Grace Expires At"},"created_by_user_id":{"type":"string","format":"uuid","title":"Created By User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","name","prefix","scopes","status","allowed_cidrs","expires_at","revoked_at","last_used_at","rotation_grace_expires_at","created_by_user_id","created_at"],"title":"ApiKeyRead","description":"Key metadata. Never carries the secret."},"ApiKeyStatus":{"type":"string","enum":["ACTIVE","REVOKED","EXPIRED"],"title":"ApiKeyStatus","description":"Derived lifecycle state of a key. Never stored — see ``ApiKeyService.get_status``."},"ApiKeyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"scopes":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiScope"},"type":"array"},{"type":"null"}],"title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs"}},"additionalProperties":false,"type":"object","title":"ApiKeyUpdate","description":"Partial update. Omitted fields are left untouched."},"ApiScope":{"type":"string","enum":["READ","WRITE"],"title":"ApiScope","description":"Product-wide permission granted to an API key.\n\n``WRITE`` implies ``READ``; the pair is deliberately coarse — per-resource\nscopes are out of scope for S1 (see the design doc, \"Non-goals\")."},"AuthProvider":{"type":"string","enum":["GOOGLE","GITHUB"],"title":"AuthProvider","description":"External identity providers a user can sign in with.\n\nMember name == value (the persisted DB label). URL path segments use the\nlowercase value — see ``path_value`` / ``from_path``."},"BillingPeriod":{"type":"string","enum":["MONTH","YEAR"],"title":"BillingPeriod","description":"How often a subscription renews.\n\nPolar models monthly and yearly billing as separate products, so the\nperiod is part of what a checkout selects. Member name == value to match\nthe project's enum convention and the persisted DB labels."},"BulkMonitorCreateRequest":{"properties":{"monitors":{"items":{"$ref":"#/components/schemas/MonitorCreate"},"type":"array","maxItems":100,"minItems":1,"title":"Monitors","description":"Monitors to create, each shaped like a single create request."}},"additionalProperties":false,"type":"object","required":["monitors"],"title":"BulkMonitorCreateRequest","description":"Create several monitors in one all-or-nothing request."},"BulkMonitorCreateResponse":{"properties":{"monitors":{"items":{"$ref":"#/components/schemas/MonitorCompactRead"},"type":"array","title":"Monitors"}},"additionalProperties":false,"type":"object","required":["monitors"],"title":"BulkMonitorCreateResponse","description":"The created monitors, in request order."},"BulkMonitorIdsRequest":{"properties":{"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Monitor Ids","description":"Monitors to act on. Every id must belong to the active organization."}},"additionalProperties":false,"type":"object","required":["monitor_ids"],"title":"BulkMonitorIdsRequest","description":"A set of the organization's monitors to act on together."},"BulkMonitorStateResponse":{"properties":{"monitors":{"items":{"$ref":"#/components/schemas/MonitorCompactRead"},"type":"array","title":"Monitors"}},"additionalProperties":false,"type":"object","required":["monitors"],"title":"BulkMonitorStateResponse","description":"The affected monitors after the change, in request order."},"BulkMonitorTagsRequest":{"properties":{"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":300,"minItems":1,"title":"Monitor Ids","description":"Monitors to retag. Every id must belong to the active organization."},"add":{"items":{"type":"string"},"type":"array","title":"Add","description":"Tags to add to every listed monitor."},"remove":{"items":{"type":"string"},"type":"array","title":"Remove","description":"Tags to remove from every listed monitor."}},"additionalProperties":false,"type":"object","required":["monitor_ids"],"title":"BulkMonitorTagsRequest","description":"Add and/or remove tags across several monitors in one transaction.\n\n``MonitorUpdate.tags`` is a full replacement, so \"add one tag to twelve\nmonitors\" through PATCH means twelve reads, twelve client-side unions and\ntwelve writes, any of which can fail halfway. This request states the\nintent instead, and the server applies it atomically."},"BulkMonitorTagsResponse":{"properties":{"monitors_updated":{"type":"integer","minimum":0.0,"title":"Monitors Updated"}},"additionalProperties":false,"type":"object","required":["monitors_updated"],"title":"BulkMonitorTagsResponse","description":"How many monitors the bulk tag write actually changed."},"BulkMonitorUpdateRequest":{"properties":{"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Monitor Ids","description":"Monitors to act on. Every id must belong to the active organization."},"changes":{"$ref":"#/components/schemas/MonitorBulkChanges"}},"additionalProperties":false,"type":"object","required":["monitor_ids","changes"],"title":"BulkMonitorUpdateRequest","description":"Set the same fields on several monitors in one all-or-nothing request."},"ChannelType":{"type":"string","enum":["EMAIL","TELEGRAM","WEBHOOK","SLACK","DISCORD"],"title":"ChannelType","description":"Transport for a user notification channel."},"CheckResultRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"region":{"type":"string","title":"Region"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"status":{"$ref":"#/components/schemas/CheckResultStatus"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"job_id":{"type":"string","title":"Job Id"},"maintenance_window_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Maintenance Window Id"}},"additionalProperties":false,"type":"object","required":["id","monitor_id","region","checked_at","status","response_time_ms","status_code","error_message","details","job_id"],"title":"CheckResultRead","description":"Response model for a single check probe outcome."},"CheckResultStatus":{"type":"string","enum":["UP","DEGRADED","DOWN","ERROR"],"title":"CheckResultStatus","description":"Outcome of a single probe execution reported in a :class:`CheckResult`.\n\n``DEGRADED`` means the resource responded / is working but in a degraded\nstate (e.g. partial ping packet loss, a TLS cert expiring soon). It counts\nas up for uptime — it never penalises uptime% and never opens an incident —\nbut is tracked separately so the UI can render it distinctly."},"CheckType":{"type":"string","enum":["HTTP","PING","SSL","TCP","DNS"],"title":"CheckType","description":"Type of probe a worker must run for a :class:`CheckJob`."},"CheckoutSessionRequest":{"properties":{"plan":{"$ref":"#/components/schemas/PlanTier"},"billing_period":{"$ref":"#/components/schemas/BillingPeriod","default":"MONTH"},"success_url":{"type":"string","minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","minLength":1,"format":"uri","title":"Cancel Url"}},"additionalProperties":false,"type":"object","required":["plan","success_url","cancel_url"],"title":"CheckoutSessionRequest","description":"Request body for ``POST /v1/checkout-session``.\n\n``billing_period`` defaults to ``MONTH`` on purpose: core deploys ahead of\nthe frontend, so during that window the older client posts no period at\nall and must keep buying monthly plans rather than failing validation."},"CheckoutSessionResponse":{"properties":{"checkout_id":{"type":"string","title":"Checkout Id"},"redirect_url":{"type":"string","minLength":1,"format":"uri","title":"Redirect Url"}},"additionalProperties":false,"type":"object","required":["checkout_id","redirect_url"],"title":"CheckoutSessionResponse"},"ComponentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"position":{"type":"integer","title":"Position"}},"additionalProperties":false,"type":"object","required":["id","monitor_id","display_name","position"],"title":"ComponentRead","description":"Editor view of a component (carries the monitor id, unlike the public one)."},"ComponentStatus":{"type":"string","enum":["OPERATIONAL","DEGRADED_PERFORMANCE","MAJOR_OUTAGE","MAINTENANCE","UNKNOWN"],"title":"ComponentStatus","description":"Public status of a single component on a status page."},"CreateOrganizationRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"additionalProperties":false,"type":"object","required":["name"],"title":"CreateOrganizationRequest","description":"Request body for creating an organization."},"CreateUserModel":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"organization_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Organization Name"},"invite_token":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Invite Token"}},"additionalProperties":false,"type":"object","required":["first_name","last_name","email","password"],"title":"CreateUserModel"},"CustomerPortalRequest":{"properties":{"return_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Return Url"}},"additionalProperties":false,"type":"object","title":"CustomerPortalRequest","description":"Request body for ``POST /v1/customer-portal``."},"CustomerPortalResponse":{"properties":{"redirect_url":{"type":"string","minLength":1,"format":"uri","title":"Redirect Url"}},"additionalProperties":false,"type":"object","required":["redirect_url"],"title":"CustomerPortalResponse"},"ExposedPortRead":{"properties":{"port":{"type":"integer","title":"Port"},"service":{"type":"string","title":"Service"}},"additionalProperties":false,"type":"object","required":["port","service"],"title":"ExposedPortRead","description":"One port of the exposed-ports preset."},"ExposedPortsPresetResponse":{"properties":{"ports":{"items":{"$ref":"#/components/schemas/ExposedPortRead"},"type":"array","title":"Ports"}},"additionalProperties":false,"type":"object","required":["ports"],"title":"ExposedPortsPresetResponse","description":"Ports to check are closed on a server, with what usually listens there."},"FailureKind":{"type":"string","enum":["TIMEOUT","DNS_FAILURE","CONNECTION_REFUSED","TLS_INVALID","HTTP_4XX","HTTP_5XX","HTTP_UNEXPECTED_STATUS","KEYWORD_MISSING","TOO_MANY_REDIRECTS","TARGET_BLOCKED","PORT_STATE_MISMATCH","INVALID_TARGET","UNKNOWN"],"title":"FailureKind","description":"Structured classification of why a probe reported a non-UP result.\n\nSet by the worker on DOWN/ERROR outcomes so the core can store a typed\nincident cause (icons, grouping, filtering) while ``CheckResult.error`` /\nthe incident's ``cause_detail`` carry the raw human-readable reason.\nAbsent on UP results."},"GroupRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"position":{"type":"integer","title":"Position"},"components":{"items":{"$ref":"#/components/schemas/ComponentRead"},"type":"array","title":"Components"}},"additionalProperties":false,"type":"object","required":["id","name","position","components"],"title":"GroupRead","description":"Editor view of a group."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthCheckResponse":{"properties":{"status":{"type":"string","enum":["ok","degraded"],"title":"Status"},"postgres":{"type":"boolean","title":"Postgres"},"redis":{"type":"boolean","title":"Redis"},"nats":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Nats"}},"additionalProperties":false,"type":"object","required":["status","postgres","redis","nats"],"title":"HealthCheckResponse","description":"Detailed, per-dependency status served at /health/ for observability and\ndebugging — not consulted by Kubernetes probes.\n\n``nats`` is ``None`` when this process has no NATS client attached to\napp.state (unknown), rather than a boolean guess."},"HeartbeatCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"period_seconds":{"type":"integer","maximum":2592000.0,"minimum":60.0,"title":"Period Seconds"},"grace_seconds":{"type":"integer","maximum":2592000.0,"minimum":0.0,"title":"Grace Seconds"},"notification_cooldown_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":60.0},{"type":"null"}],"title":"Notification Cooldown Seconds"},"channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"additionalProperties":false,"type":"object","required":["name","period_seconds","grace_seconds"],"title":"HeartbeatCreate","description":"Create payload for a heartbeat."},"HeartbeatMinimalRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"state":{"$ref":"#/components/schemas/HeartbeatState"}},"additionalProperties":false,"type":"object","required":["id","name","state"],"title":"HeartbeatMinimalRead","description":"Compact heartbeat payload for organization-scoped selector controls."},"HeartbeatRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"state":{"$ref":"#/components/schemas/HeartbeatState"},"period_seconds":{"type":"integer","title":"Period Seconds"},"grace_seconds":{"type":"integer","title":"Grace Seconds"},"ping_url":{"type":"string","title":"Ping Url"},"last_ping_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Ping At"},"last_success_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Success At"},"last_start_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Start At"},"last_duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Duration Ms"},"overdue_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Overdue At"},"notification_cooldown_seconds":{"type":"integer","title":"Notification Cooldown Seconds"},"is_active":{"type":"boolean","title":"Is Active"},"channel_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Channel Ids"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["id","name","state","period_seconds","grace_seconds","ping_url","last_ping_at","last_success_at","last_start_at","last_duration_ms","overdue_at","notification_cooldown_seconds","is_active","created_at","updated_at"],"title":"HeartbeatRead","description":"Response model for a heartbeat, including the full ping-URL."},"HeartbeatSortOption":{"type":"string","enum":["status","name","created_at"],"title":"HeartbeatSortOption","description":"Ordering options for the heartbeat listing endpoint."},"HeartbeatState":{"type":"string","enum":["PENDING","UP","DOWN","PAUSED"],"title":"HeartbeatState","description":"Lifecycle state of a heartbeat.\n\n``PENDING`` — created, never pinged; the sweep skips it (``overdue_at``\nis NULL) so a freshly created heartbeat does not false-alarm.\n``UP`` — pinged within ``period + grace``; the only state the sweep can\nflip to ``DOWN``.\n``DOWN`` — a ping was missed or the job sent ``/fail``; an incident is open.\n``PAUSED`` — owner-paused; inactive, never alerts."},"HeartbeatUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"period_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":60.0},{"type":"null"}],"title":"Period Seconds"},"grace_seconds":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":0.0},{"type":"null"}],"title":"Grace Seconds"},"notification_cooldown_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":60.0},{"type":"null"}],"title":"Notification Cooldown Seconds"},"channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"additionalProperties":false,"type":"object","title":"HeartbeatUpdate","description":"Partial update payload — every field optional."},"IdentitiesRead":{"properties":{"has_password":{"type":"boolean","title":"Has Password"},"identities":{"items":{"$ref":"#/components/schemas/IdentityRead"},"type":"array","title":"Identities"}},"additionalProperties":false,"type":"object","required":["has_password","identities"],"title":"IdentitiesRead"},"IdentityRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"$ref":"#/components/schemas/AuthProvider"},"provider_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Email"},"provider_login":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Login"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"}},"additionalProperties":false,"type":"object","required":["id","provider","provider_email","provider_login","created_at","last_login_at"],"title":"IdentityRead"},"IncidentCause":{"type":"string","enum":["TIMEOUT","DNS_FAILURE","CONNECTION_REFUSED","TLS_INVALID","HTTP_4XX","HTTP_5XX","HTTP_UNEXPECTED_STATUS","KEYWORD_MISSING","TOO_MANY_REDIRECTS","TARGET_BLOCKED","PORT_STATE_MISMATCH","INVALID_TARGET","HEARTBEAT_MISSED","HEARTBEAT_FAILED","UNKNOWN"],"title":"IncidentCause","description":"Structured cause of an incident, across both incident sources.\n\nA superset of the worker's wire ``FailureKind``: every value the worker can\nreport is storable here, plus the causes only the core can observe (a\nheartbeat that never pinged, a client that reported its own failure). The\ntwo enums are declared separately so the worker contract does not grow\nvalues the worker never emits — ``test_enums.py`` guards the subset\nrelation, which is what keeps ``process_check_result`` able to store any\nincoming ``failure_kind``.\n\nThe raw human-readable reason lives in ``Incident.cause_detail``."},"IncidentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"monitor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Monitor Id"},"heartbeat_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Heartbeat Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"cause":{"$ref":"#/components/schemas/IncidentCause"},"cause_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cause Detail"},"last_notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Notified At"},"acknowledged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Acknowledged At"},"acknowledged_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Acknowledged By"},"renotify_count":{"type":"integer","title":"Renotify Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"notification_logs":{"items":{"$ref":"#/components/schemas/NotificationLogRead"},"type":"array","title":"Notification Logs"}},"additionalProperties":false,"type":"object","required":["id","started_at","resolved_at","cause","cause_detail","last_notified_at","acknowledged_at","acknowledged_by","renotify_count","created_at","updated_at"],"title":"IncidentRead","description":"Response model for an open or resolved incident."},"IncidentStatusFilter":{"type":"string","enum":["open","resolved"],"title":"IncidentStatusFilter","description":"Status filter accepted by the incidents listing endpoint.\n\n``OPEN`` keeps only ongoing incidents (``resolved_at IS NULL``);\n``RESOLVED`` keeps only closed ones. Omitting the filter returns both."},"IncidentSummaryRead":{"properties":{"total":{"type":"integer","minimum":0.0,"title":"Total"},"open":{"type":"integer","minimum":0.0,"title":"Open"},"resolved":{"type":"integer","minimum":0.0,"title":"Resolved"}},"additionalProperties":false,"type":"object","required":["total","open","resolved"],"title":"IncidentSummaryRead","description":"Counts for the incident summary card.\n\nThe three fields come from one query's conditional aggregates, so\n``total == open + resolved`` holds by construction. The use case logs a\nwarning if it ever does not — a read model must not fail serialisation\nover slightly inconsistent counters."},"IncidentUpdateRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus"},"body":{"type":"string","title":"Body"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","status","body","created_by","created_at"],"title":"IncidentUpdateRead","description":"One timeline entry on a public incident. ``created_by=None`` = system."},"InvitationCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"$ref":"#/components/schemas/OrgRole"}},"additionalProperties":false,"type":"object","required":["email","role"],"title":"InvitationCreate","description":"Request body for inviting an email at a role (OWNER rejected)."},"InvitationPreview":{"properties":{"organization_name":{"type":"string","title":"Organization Name"},"email":{"type":"string","format":"email","title":"Email"},"role":{"$ref":"#/components/schemas/OrgRole"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["organization_name","email","role","expires_at"],"title":"InvitationPreview","description":"Public preview of an invitation for the accept page."},"InvitationRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"role":{"$ref":"#/components/schemas/OrgRole"},"status":{"$ref":"#/components/schemas/InvitationStatus"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["id","email","role","status","expires_at"],"title":"InvitationRead","description":"A pending invitation shown to admins."},"InvitationStatus":{"type":"string","enum":["PENDING","ACCEPTED","REVOKED","EXPIRED"],"title":"InvitationStatus","description":"Lifecycle of an organization invitation.\n\nPENDING — sent, awaiting acceptance. ACCEPTED — redeemed into a membership.\nREVOKED — cancelled by an admin. EXPIRED — TTL elapsed before acceptance.\nMember name == value (UPPER) to match the persisted DB labels."},"LayoutComponentWrite":{"properties":{"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"display_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Display Name"}},"additionalProperties":false,"type":"object","required":["monitor_id"],"title":"LayoutComponentWrite","description":"One monitor placed on the page, with its public alias."},"LayoutGroupWrite":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"components":{"items":{"$ref":"#/components/schemas/LayoutComponentWrite"},"type":"array","title":"Components"}},"additionalProperties":false,"type":"object","required":["name"],"title":"LayoutGroupWrite","description":"One section of the page. Order is the array order."},"LinkIdentityRequest":{"properties":{"password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Password"}},"additionalProperties":false,"type":"object","title":"LinkIdentityRequest"},"LinkStartResponse":{"properties":{"authorization_url":{"type":"string","title":"Authorization Url"}},"additionalProperties":false,"type":"object","required":["authorization_url"],"title":"LinkStartResponse"},"LoginUserModel":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"additionalProperties":false,"type":"object","required":["email","password"],"title":"LoginUserModel"},"LogoutRequestModel":{"properties":{"terminate_all_sessions":{"type":"boolean","title":"Terminate All Sessions","default":false}},"additionalProperties":false,"type":"object","title":"LogoutRequestModel"},"MaintenanceScope":{"type":"string","enum":["MONITOR","ORG"],"title":"MaintenanceScope","description":"What a window targets. ``ORG`` covers every monitor in the org;\n``MONITOR`` covers the explicitly linked monitors only."},"MaintenanceSortOption":{"type":"string","enum":["name","created_at"],"title":"MaintenanceSortOption","description":"Ordering for the windows listing endpoint."},"MaintenanceWindowCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"enabled":{"type":"boolean","title":"Enabled","default":true},"scope":{"$ref":"#/components/schemas/MaintenanceScope"},"dtstart":{"type":"string","format":"date-time","title":"Dtstart"},"duration_minutes":{"type":"integer","maximum":40320.0,"exclusiveMinimum":0.0,"title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Rrule"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Monitor Ids"}},"additionalProperties":false,"type":"object","required":["name","scope","dtstart","duration_minutes"],"title":"MaintenanceWindowCreate","description":"Create payload for a maintenance window."},"MaintenanceWindowDetailRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"enabled":{"type":"boolean","title":"Enabled"},"scope":{"$ref":"#/components/schemas/MaintenanceScope"},"dtstart":{"type":"string","format":"date-time","title":"Dtstart"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rrule"},"timezone":{"type":"string","title":"Timezone"},"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Monitor Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"next_occurrences":{"items":{"$ref":"#/components/schemas/OccurrenceRead"},"type":"array","title":"Next Occurrences"}},"additionalProperties":false,"type":"object","required":["id","name","enabled","scope","dtstart","duration_minutes","rrule","timezone","created_at"],"title":"MaintenanceWindowDetailRead","description":"One window with its next occurrences.\n\nOnly the single read computes them, so the field lives here: on list and\nwrite responses it used to come back always empty."},"MaintenanceWindowPreviewRequest":{"properties":{"dtstart":{"type":"string","format":"date-time","title":"Dtstart"},"duration_minutes":{"type":"integer","maximum":40320.0,"exclusiveMinimum":0.0,"title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Rrule"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"}},"additionalProperties":false,"type":"object","required":["dtstart","duration_minutes"],"title":"MaintenanceWindowPreviewRequest","description":"Draft schedule for the preview endpoint (no persistence)."},"MaintenanceWindowRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"enabled":{"type":"boolean","title":"Enabled"},"scope":{"$ref":"#/components/schemas/MaintenanceScope"},"dtstart":{"type":"string","format":"date-time","title":"Dtstart"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rrule"},"timezone":{"type":"string","title":"Timezone"},"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Monitor Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","name","enabled","scope","dtstart","duration_minutes","rrule","timezone","created_at"],"title":"MaintenanceWindowRead","description":"Response model for a maintenance window."},"MaintenanceWindowRevisionRead":{"properties":{"effective_from":{"type":"string","format":"date-time","title":"Effective From"},"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/MaintenanceScope"},"dtstart":{"type":"string","format":"date-time","title":"Dtstart"},"duration_minutes":{"type":"integer","title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rrule"},"timezone":{"type":"string","title":"Timezone"},"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Monitor Ids"},"edited_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Edited By"}},"additionalProperties":false,"type":"object","required":["effective_from","name","scope","dtstart","duration_minutes","rrule","timezone","edited_by"],"title":"MaintenanceWindowRevisionRead","description":"A historical snapshot of a window's schedule."},"MaintenanceWindowUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"scope":{"anyOf":[{"$ref":"#/components/schemas/MaintenanceScope"},{"type":"null"}]},"dtstart":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Dtstart"},"duration_minutes":{"anyOf":[{"type":"integer","maximum":40320.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Duration Minutes"},"rrule":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Rrule"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"monitor_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Monitor Ids"}},"additionalProperties":false,"type":"object","title":"MaintenanceWindowUpdate","description":"Partial update payload — every field optional."},"MemberRoleUpdate":{"properties":{"role":{"$ref":"#/components/schemas/OrgRole"}},"additionalProperties":false,"type":"object","required":["role"],"title":"MemberRoleUpdate","description":"Request body for changing a member's role (OWNER rejected)."},"MonitorBulkChanges":{"properties":{"interval_seconds":{"type":"integer","maximum":86400.0,"minimum":30.0,"title":"Interval Seconds"},"timeout_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout Seconds"},"regions":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Regions"},"channel_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Channel Ids"},"confirmation_threshold":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Confirmation Threshold"},"notification_cooldown_seconds":{"type":"integer","maximum":86400.0,"minimum":60.0,"title":"Notification Cooldown Seconds"}},"additionalProperties":false,"type":"object","minProperties":1,"title":"MonitorBulkChanges","description":"The fields a bulk update may set; the same value goes to every monitor.\n\nOnly fields that mean the same thing for every monitor type. ``config``\nis type-specific, ``name`` is per monitor and ``tags`` has its own bulk\nendpoint. Omit a field to leave it unchanged; ``null`` is a 422."},"MonitorCompactRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/CheckType"},"target":{"type":"string","title":"Target"},"status":{"$ref":"#/components/schemas/MonitorStatus"},"is_active":{"type":"boolean","title":"Is Active"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"ssl_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ssl Expires At"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"}},"additionalProperties":false,"type":"object","required":["id","name","type","target","status","is_active","interval_seconds","ssl_expires_at","last_checked_at"],"title":"MonitorCompactRead","description":"One monitor as a list row: identity, state and the fields agents filter on.\n\nNo ``config``, no history and no region detail — those are what made a\n100-monitor page several hundred kilobytes. ``GET /v1/monitors/{id}``\nstill returns everything."},"MonitorCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/CheckType"},"target":{"type":"string","maxLength":2048,"minLength":1,"title":"Target"},"interval_seconds":{"type":"integer","maximum":86400.0,"minimum":30.0,"title":"Interval Seconds"},"timeout_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout Seconds"},"regions":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Regions"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"confirmation_threshold":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Confirmation Threshold"},"notification_cooldown_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":60.0},{"type":"null"}],"title":"Notification Cooldown Seconds"},"channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"additionalProperties":false,"type":"object","required":["name","type","target","interval_seconds","timeout_seconds","regions"],"title":"MonitorCreate","description":"Request body for ``POST /v1/monitors``."},"MonitorListRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/CheckType"},"target":{"type":"string","title":"Target"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds"},"regions":{"items":{"type":"string"},"type":"array","title":"Regions"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"status":{"$ref":"#/components/schemas/MonitorStatus"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"confirmation_threshold":{"type":"integer","title":"Confirmation Threshold"},"notification_cooldown_seconds":{"type":"integer","title":"Notification Cooldown Seconds"},"ssl_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ssl Expires At"},"ssl_cert_info":{"anyOf":[{"$ref":"#/components/schemas/SslCertInfo"},{"type":"null"}]},"is_active":{"type":"boolean","title":"Is Active"},"badge_enabled":{"type":"boolean","title":"Badge Enabled","default":false},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"channel_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Channel Ids"},"uptime_daily":{"items":{"$ref":"#/components/schemas/UptimeDayPoint"},"type":"array","title":"Uptime Daily"},"region_statuses":{"items":{"$ref":"#/components/schemas/RegionStatusRead"},"type":"array","title":"Region Statuses","description":"Per-region latest status, sorted by region name.\n\nBuilt from ``region_snapshots``; ``job_id`` is dropped (internal\ndedup key) and malformed/partial snapshot rows are skipped rather\nthan failing the read.","readOnly":true}},"additionalProperties":false,"type":"object","required":["id","user_id","name","type","target","interval_seconds","timeout_seconds","regions","config","status","last_checked_at","next_run_at","confirmation_threshold","notification_cooldown_seconds","ssl_expires_at","is_active","created_at","updated_at","region_statuses"],"title":"MonitorListRead","description":"A full list row: the monitor plus its 30-day uptime strip.\n\nOnly the list fills the strip (one bulk aggregation for the page), so it\nlives here rather than on ``MonitorRead``: a single read used to carry it\nalways empty, which looked like \"no data\". One monitor's days come from\n``/uptime-daily``."},"MonitorListView":{"type":"string","enum":["full","compact"],"title":"MonitorListView","description":"Shape of a monitors-list page: the full card or a compact row."},"MonitorMinimalRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/CheckType"},"status":{"$ref":"#/components/schemas/MonitorStatus"}},"additionalProperties":false,"type":"object","required":["id","name","type","status"],"title":"MonitorMinimalRead","description":"Compact monitor payload for organization-scoped selector controls."},"MonitorPrecheckRequest":{"properties":{"type":{"$ref":"#/components/schemas/CheckType"},"target":{"type":"string","maxLength":2048,"minLength":1,"title":"Target"},"config":{"additionalProperties":true,"type":"object","title":"Config"}},"additionalProperties":false,"type":"object","required":["type","target"],"title":"MonitorPrecheckRequest","description":"Request body for ``POST /v1/monitors/precheck``.\n\nThe pre-check probes a target once before a monitor is created. The same\ntype-aware normalization (and SSRF / non-global reject) as monitor creation\nruns here, so a target the API would reject on create fails fast with 422\nrather than being dispatched to the worker fleet."},"MonitorPrecheckResponse":{"properties":{"status":{"$ref":"#/components/schemas/PrecheckOutcome"},"region":{"type":"string","title":"Region"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"failure_kind":{"anyOf":[{"$ref":"#/components/schemas/FailureKind"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["status","region"],"title":"MonitorPrecheckResponse","description":"Advisory result of a pre-check, returned to the create-monitor form.\n\n``status`` is ``up``/``down``/``error`` from the probing region, or\n``unknown`` when the core could not get a definite answer (no worker,\ntimeout, kill switch) — the form treats ``unknown`` as \"proceed without a\nwarning\". ``region`` names the single probing region so the UI can say\n\"seems down from <region>\"."},"MonitorRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/CheckType"},"target":{"type":"string","title":"Target"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds"},"regions":{"items":{"type":"string"},"type":"array","title":"Regions"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"status":{"$ref":"#/components/schemas/MonitorStatus"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"confirmation_threshold":{"type":"integer","title":"Confirmation Threshold"},"notification_cooldown_seconds":{"type":"integer","title":"Notification Cooldown Seconds"},"ssl_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ssl Expires At"},"ssl_cert_info":{"anyOf":[{"$ref":"#/components/schemas/SslCertInfo"},{"type":"null"}]},"is_active":{"type":"boolean","title":"Is Active"},"badge_enabled":{"type":"boolean","title":"Badge Enabled","default":false},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"channel_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Channel Ids"},"region_statuses":{"items":{"$ref":"#/components/schemas/RegionStatusRead"},"type":"array","title":"Region Statuses","description":"Per-region latest status, sorted by region name.\n\nBuilt from ``region_snapshots``; ``job_id`` is dropped (internal\ndedup key) and malformed/partial snapshot rows are skipped rather\nthan failing the read.","readOnly":true}},"additionalProperties":false,"type":"object","required":["id","user_id","name","type","target","interval_seconds","timeout_seconds","regions","config","status","last_checked_at","next_run_at","confirmation_threshold","notification_cooldown_seconds","ssl_expires_at","is_active","created_at","updated_at","region_statuses"],"title":"MonitorRead","description":"Response model for monitor reads and creates."},"MonitorResponseTimeByRegionResponse":{"properties":{"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"window":{"type":"string","title":"Window"},"bucket_seconds":{"type":"integer","title":"Bucket Seconds"},"regions":{"items":{"$ref":"#/components/schemas/RegionResponseSeries"},"type":"array","title":"Regions"}},"additionalProperties":false,"type":"object","required":["monitor_id","window","bucket_seconds","regions"],"title":"MonitorResponseTimeByRegionResponse","description":"Per-region response-time series for a monitor over one time window (У7).\n\nEach region is plotted on its own auto-scaled axis on the frontend, so a\nfast ``eu`` probe and a slow ``us`` probe each render readably instead of\nas one saw-tooth line on a shared axis. The per-region latest status the\ncard's switcher shows is joined client-side from the monitor's\n``region_statuses`` — this payload is purely the time series."},"MonitorSortOption":{"type":"string","enum":["status","up_first","name","newest","oldest","ssl_expiry"],"title":"MonitorSortOption","description":"Ordering options for the monitors list endpoint.\n\n``STATUS`` is the default and surfaces actionable monitors first\n(PENDING → DOWN → DEGRADED → UP → PAUSED), then by name, then newest.\n``UP_FIRST`` inverts the severity so healthy monitors lead. ``NAME``,\n``NEWEST`` and ``OLDEST`` are plain orderings.\n\n``SSL_EXPIRY`` orders by certificate expiry, soonest first; monitors with\nno known expiry (non-SSL types, not yet probed) come last."},"MonitorStatsResponse":{"properties":{"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"windows":{"additionalProperties":{"$ref":"#/components/schemas/MonitorStatsWindow"},"type":"object","title":"Windows"}},"additionalProperties":false,"type":"object","required":["monitor_id","windows"],"title":"MonitorStatsResponse","description":"Per-window uptime statistics for a monitor.\n\n``windows`` is keyed by the window label (``24h`` / ``7d`` / ``30d``); the\nkeys are JSON strings rather than model attributes because Pydantic field\nnames cannot begin with a digit."},"MonitorStatsWindow":{"properties":{"uptime_percentage":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Uptime Percentage"},"total_checks":{"type":"integer","minimum":0.0,"title":"Total Checks"},"up_checks":{"type":"integer","minimum":0.0,"title":"Up Checks"},"down_checks":{"type":"integer","minimum":0.0,"title":"Down Checks"},"degraded_checks":{"type":"integer","minimum":0.0,"title":"Degraded Checks","default":0},"incident_count":{"type":"integer","minimum":0.0,"title":"Incident Count"},"avg_response_time_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Avg Response Time Ms"}},"additionalProperties":false,"type":"object","required":["uptime_percentage","total_checks","up_checks","down_checks","incident_count","avg_response_time_ms"],"title":"MonitorStatsWindow","description":"Aggregated uptime statistics for a single time window.\n\n``uptime_percentage`` folds DEGRADED into the numerator — a degraded check\ncounts as up and does not penalise uptime. ``degraded_checks`` is reported\nseparately so the UI can render degradation distinctly while uptime stays\ngreen."},"MonitorStatus":{"type":"string","enum":["PENDING","UP","DEGRADED","DOWN","PAUSED"],"title":"MonitorStatus","description":"Aggregated state of a monitor as derived by the results state machine."},"MonitorUpdate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"interval_seconds":{"type":"integer","maximum":86400.0,"minimum":30.0,"title":"Interval Seconds"},"timeout_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Timeout Seconds"},"regions":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Regions"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"confirmation_threshold":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Confirmation Threshold"},"notification_cooldown_seconds":{"type":"integer","maximum":86400.0,"minimum":60.0,"title":"Notification Cooldown Seconds"},"channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Channel Ids"},"badge_enabled":{"type":"boolean","title":"Badge Enabled"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"additionalProperties":false,"type":"object","title":"MonitorUpdate","description":"Request body for ``PATCH /v1/monitors/{id}`` — all fields optional."},"MonitorUptimeBatchItem":{"properties":{"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"windows":{"$ref":"#/components/schemas/MonitorUptimeBatchWindows"}},"additionalProperties":false,"type":"object","required":["monitor_id","windows"],"title":"MonitorUptimeBatchItem"},"MonitorUptimeBatchRequest":{"properties":{"monitor_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Monitor Ids"}},"additionalProperties":false,"type":"object","required":["monitor_ids"],"title":"MonitorUptimeBatchRequest"},"MonitorUptimeBatchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MonitorUptimeBatchItem"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["items"],"title":"MonitorUptimeBatchResponse"},"MonitorUptimeBatchWindows":{"properties":{"24h":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"24H"},"7d":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"7D"},"30d":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"30D"}},"additionalProperties":false,"type":"object","required":["24h","7d","30d"],"title":"MonitorUptimeBatchWindows"},"MonitorUptimeDailyResponse":{"properties":{"monitor_id":{"type":"string","format":"uuid","title":"Monitor Id"},"days":{"items":{"$ref":"#/components/schemas/UptimeDayPoint"},"type":"array","title":"Days"}},"additionalProperties":false,"type":"object","required":["monitor_id","days"],"title":"MonitorUptimeDailyResponse","description":"Dense per-day uptime series for a monitor over the last N UTC days.\n\n``days`` always holds exactly the requested number of points, ordered\noldest-first and ending on today (UTC); days without data are present as\nexplicit no-data points so the frontend never has to invent the axis."},"MonitorsSummaryResponse":{"properties":{"total":{"type":"integer","minimum":0.0,"title":"Total"},"status_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Status Counts"},"uptime_30d":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Uptime 30D"}},"additionalProperties":false,"type":"object","required":["total","status_counts"],"title":"MonitorsSummaryResponse","description":"Account-wide monitor summary for the dashboard KPI cards.\n\n``status_counts`` is exhaustive over ``MonitorStatus`` (every status present,\nzero-filled). ``uptime_30d`` is the weighted account-wide uptime percentage\nover the trailing 30 days, or ``null`` when no checks were recorded in the\nwindow. ``total`` is the count of the account's non-deleted monitors."},"MultiRegionCheckRequest":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url"}},"type":"object","required":["url"],"title":"MultiRegionCheckRequest","description":"Body of ``POST /public/tools/multi-region-check``."},"MultiRegionCheckResponse":{"properties":{"url":{"type":"string","title":"Url"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"regions":{"items":{"$ref":"#/components/schemas/RegionCheckResult"},"type":"array","title":"Regions"}},"type":"object","required":["url","checked_at","regions"],"title":"MultiRegionCheckResponse"},"NotificationChannelCreate":{"properties":{"type":{"$ref":"#/components/schemas/ChannelType","default":"TELEGRAM"},"destination":{"type":"string","maxLength":255,"minLength":1,"title":"Destination"},"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"}},"additionalProperties":false,"type":"object","required":["destination"],"title":"NotificationChannelCreate","description":"Request body for ``POST /v1/channels``.\n\nTELEGRAM, WEBHOOK, SLACK, and DISCORD channels can be created through the API.\nEMAIL is the account email, exposed read-only by the list endpoint and never\ncreated here. For WEBHOOK, ``destination`` is the https delivery URL\n(SSRF-checked) and the signing secret is generated server-side and returned once\non create. For SLACK and DISCORD, ``destination`` is the incoming-webhook URL\n(stored encrypted; a masked display string is returned on reads)."},"NotificationChannelCreatedRead":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"type":{"$ref":"#/components/schemas/ChannelType"},"destination":{"type":"string","title":"Destination"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_verified":{"type":"boolean","title":"Is Verified"},"is_active":{"type":"boolean","title":"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"}},"additionalProperties":false,"type":"object","required":["id","type","destination","label","is_verified","is_active","created_at","updated_at"],"title":"NotificationChannelCreatedRead","description":"Create response.\n\n``secret`` is the plaintext webhook signing key, shown EXACTLY ONCE (only for\nWEBHOOK channels); ``None`` for EMAIL/TELEGRAM/SLACK/DISCORD. It is never\nreturned by GET or PATCH — store it on receipt."},"NotificationChannelDirectoryRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"$ref":"#/components/schemas/ChannelType"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_verified":{"type":"boolean","title":"Is Verified"},"is_active":{"type":"boolean","title":"Is Active"},"destination_hint":{"type":"string","title":"Destination Hint"}},"additionalProperties":false,"type":"object","required":["id","type","label","is_verified","is_active","destination_hint"],"title":"NotificationChannelDirectoryRead","description":"One stored channel as an API key sees it: enough to pick it, nothing secret.\n\n``destination_hint`` never carries a delivery secret: a WEBHOOK URL is cut to\nits scheme and host, SLACK/DISCORD already store a masked display string,\nTELEGRAM stores a chat id."},"NotificationChannelRead":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"type":{"$ref":"#/components/schemas/ChannelType"},"destination":{"type":"string","title":"Destination"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_verified":{"type":"boolean","title":"Is Verified"},"is_active":{"type":"boolean","title":"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"}},"additionalProperties":false,"type":"object","required":["id","type","destination","label","is_verified","is_active","created_at","updated_at"],"title":"NotificationChannelRead","description":"Response model for a notification channel.\n\nEMAIL rows returned by ``GET /v1/channels`` are synthesised from the\nauthenticated user's email and carry a null ``id`` — they are not stored\nin the database."},"NotificationChannelUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"additionalProperties":false,"type":"object","title":"NotificationChannelUpdate","description":"Request body for ``PATCH /v1/channels/{id}``."},"NotificationEvent":{"type":"string","enum":["TRIGGERED","RESOLVED","SSL_EXPIRY"],"title":"NotificationEvent","description":"Lifecycle event that triggered an outgoing notification."},"NotificationLogRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"channel_type":{"$ref":"#/components/schemas/ChannelType"},"destination":{"type":"string","title":"Destination"},"event":{"$ref":"#/components/schemas/NotificationEvent"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"},"status":{"$ref":"#/components/schemas/NotificationStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"additionalProperties":false,"type":"object","required":["id","channel_type","destination","event","sent_at","status","error"],"title":"NotificationLogRead","description":"One delivery attempt in an incident's notification timeline."},"NotificationStatus":{"type":"string","enum":["PENDING","SENT","FAILED"],"title":"NotificationStatus","description":"Delivery outcome for an outgoing notification."},"OccurrenceRead":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"end":{"type":"string","format":"date-time","title":"End"}},"additionalProperties":false,"type":"object","required":["start","end"],"title":"OccurrenceRead","description":"A single materialized occurrence, tz-aware in the window timezone."},"OrgRole":{"type":"string","enum":["OWNER","ADMIN","MEMBER","VIEWER"],"title":"OrgRole","description":"Membership role of a user within an organization.\n\nDistinct from the dormant global ``UserRole`` (account-level template seam).\nOWNER ⊇ ADMIN plus exclusive actions (delete org, transfer ownership); those\nexclusive endpoints are enforced in A2. MEMBER = operational CRUD; VIEWER =\nread-only. Member name == value (UPPER) to match the project enum convention\nand the persisted DB labels."},"OrganizationMemberRead":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","format":"email","title":"Email"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"role":{"$ref":"#/components/schemas/OrgRole"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"}},"additionalProperties":false,"type":"object","required":["user_id","email","first_name","last_name","role","joined_at"],"title":"OrganizationMemberRead","description":"A member row for the Team page."},"OrganizationMembershipRead":{"properties":{"role":{"$ref":"#/components/schemas/OrgRole"},"organization":{"$ref":"#/components/schemas/OrganizationRead"}},"additionalProperties":false,"type":"object","required":["role","organization"],"title":"OrganizationMembershipRead","description":"The caller's membership: which org and what role."},"OrganizationRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"timezone":{"type":"string","title":"Timezone"},"plan":{"$ref":"#/components/schemas/PlanTier"}},"additionalProperties":false,"type":"object","required":["id","name","timezone","plan"],"title":"OrganizationRead","description":"Public view of an organization.\n\n``plan`` is here so the dashboard can badge every membership in the org\nswitcher without a per-org subscription call. It is the tier and nothing\nelse — billing identifiers and subscription state stay on\n``GET /v1/users/me/subscription``."},"OrganizationUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"}},"additionalProperties":false,"type":"object","title":"OrganizationUpdate","description":"Request body for updating the active organization.\n\nBoth fields are optional; at least one must be present. ``timezone`` is an\nIANA name validated against the system timezone database."},"PageIncidentCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus","default":"INVESTIGATING"},"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"},"component_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Component Ids"}},"additionalProperties":false,"type":"object","required":["title","body"],"title":"PageIncidentCreate","description":"Create payload for a manual public incident."},"PageIncidentPatch":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"}},"additionalProperties":false,"type":"object","required":["title"],"title":"PageIncidentPatch","description":"Metadata-only patch — renaming a public incident triggers no email."},"PageIncidentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus"},"is_auto":{"type":"boolean","title":"Is Auto"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Notified At"},"component_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Component Ids"},"updates":{"items":{"$ref":"#/components/schemas/IncidentUpdateRead"},"type":"array","title":"Updates"}},"additionalProperties":false,"type":"object","required":["id","title","status","is_auto","started_at","resolved_at","notified_at","component_ids","updates"],"title":"PageIncidentRead","description":"Editor view of a public incident and its timeline."},"PageIncidentUpdateCreate":{"properties":{"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus"},"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"}},"additionalProperties":false,"type":"object","required":["status","body"],"title":"PageIncidentUpdateCreate","description":"Payload for a new timeline entry on an existing public incident."},"PageStatus":{"type":"string","enum":["ALL_OPERATIONAL","DEGRADED","PARTIAL_OUTAGE","MAJOR_OUTAGE","MAINTENANCE","UNKNOWN"],"title":"PageStatus","description":"Rollup status shown in the page banner."},"PaginatedResponse_ApiKeyRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKeyRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[ApiKeyRead]"},"PaginatedResponse_CheckResultRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CheckResultRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[CheckResultRead]"},"PaginatedResponse_HeartbeatRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/HeartbeatRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[HeartbeatRead]"},"PaginatedResponse_IncidentRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IncidentRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[IncidentRead]"},"PaginatedResponse_MaintenanceWindowRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MaintenanceWindowRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[MaintenanceWindowRead]"},"PaginatedResponse_MonitorCompactRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MonitorCompactRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[MonitorCompactRead]"},"PaginatedResponse_MonitorListRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MonitorListRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[MonitorListRead]"},"PaginatedResponse_PageIncidentRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PageIncidentRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[PageIncidentRead]"},"PaginatedResponse_StatusPageRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/StatusPageRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[StatusPageRead]"},"PaginatedResponse_SubscriberRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SubscriberRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"additionalProperties":false,"type":"object","required":["items","total","page","size","pages"],"title":"PaginatedResponse[SubscriberRead]"},"PlanLimitsRead":{"properties":{"tier":{"$ref":"#/components/schemas/PlanTier"},"max_monitors":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Monitors"},"min_interval_seconds":{"type":"integer","title":"Min Interval Seconds"},"max_fast_monitors":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Fast Monitors"},"fast_interval_threshold_seconds":{"type":"integer","title":"Fast Interval Threshold Seconds"},"max_regions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Regions"},"history_retention_days":{"type":"integer","title":"History Retention Days"},"allowed_channel_types":{"items":{"$ref":"#/components/schemas/ChannelType"},"type":"array","title":"Allowed Channel Types"},"max_channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Channels"},"max_heartbeats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Heartbeats"},"max_maintenance_windows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Maintenance Windows"},"max_status_pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Status Pages"},"max_status_page_subscribers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Status Page Subscribers"},"renotify_interval_seconds":{"type":"integer","title":"Renotify Interval Seconds"},"renotify_max_count":{"type":"integer","title":"Renotify Max Count"},"max_api_keys":{"type":"integer","title":"Max Api Keys"},"api_rate_limit_per_minute":{"type":"integer","title":"Api Rate Limit Per Minute"},"allowed_regions":{"items":{"type":"string"},"type":"array","title":"Allowed Regions"}},"additionalProperties":false,"type":"object","required":["tier","max_monitors","min_interval_seconds","max_fast_monitors","fast_interval_threshold_seconds","max_regions","history_retention_days","allowed_channel_types","max_channels","max_heartbeats","max_maintenance_windows","max_status_pages","max_status_page_subscribers","renotify_interval_seconds","renotify_max_count","max_api_keys","api_rate_limit_per_minute","allowed_regions"],"title":"PlanLimitsRead","description":"Public view of a single plan's limits."},"PlanTier":{"type":"string","enum":["FREE","PLUS","PRO","MAX","ENTERPRISE"],"title":"PlanTier","description":"Subscription tier of an organization; gates feature/usage limits."},"PlanUsageRead":{"properties":{"monitors":{"type":"integer","minimum":0.0,"title":"Monitors","description":"Monitors, paused ones included."},"fast_monitors":{"type":"integer","minimum":0.0,"title":"Fast Monitors","description":"Monitors with an interval below the fast threshold."},"heartbeats":{"type":"integer","minimum":0.0,"title":"Heartbeats"}},"additionalProperties":false,"type":"object","required":["monitors","fast_monitors","heartbeats"],"title":"PlanUsageRead","description":"How much of its plan an organization uses right now."},"PlanUsageResponse":{"properties":{"plan":{"$ref":"#/components/schemas/PlanTier"},"limits":{"$ref":"#/components/schemas/PlanLimitsRead"},"usage":{"$ref":"#/components/schemas/PlanUsageRead"}},"additionalProperties":false,"type":"object","required":["plan","limits","usage"],"title":"PlanUsageResponse","description":"The organization's plan, its limits and its current usage."},"PlansLimitsResponse":{"properties":{"plans":{"items":{"$ref":"#/components/schemas/PlanLimitsRead"},"type":"array","title":"Plans"}},"additionalProperties":false,"type":"object","required":["plans"],"title":"PlansLimitsResponse","description":"All plan tiers and their limits — drives the pricing page."},"PrecheckOutcome":{"type":"string","enum":["up","down","error","unknown"],"title":"PrecheckOutcome","description":"Advisory outcome of a У2 pre-check, returned to the create-monitor form.\n\n``UP``/``DOWN``/``ERROR`` map from the worker's ``CheckResultStatus``;\n``UNKNOWN`` is the fail-open value used whenever the core cannot get a\ndefinite reply (no worker in the region, request timeout, malformed reply,\nor the pre-check kill switch). Only ``DOWN``/``ERROR`` should gate the form\nwith a modal; ``UP``/``UNKNOWN`` proceed to create directly."},"ProbeResponse":{"properties":{"status":{"type":"string","const":"ok","title":"Status","default":"ok"}},"additionalProperties":false,"type":"object","title":"ProbeResponse","description":"Minimal payload for Kubernetes liveness/readiness probes."},"PublicComponentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/ComponentStatus"},"uptime_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 24H"},"uptime_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 7D"},"uptime_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime 30D"},"uptime_history":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime History"},"history":{"items":{"$ref":"#/components/schemas/UptimeDayPoint"},"type":"array","title":"History"}},"additionalProperties":false,"type":"object","required":["id","name","status","uptime_24h","uptime_7d","uptime_30d","uptime_history","history"],"title":"PublicComponentRead","description":"Anonymous view of a component. Carries no monitor identifier."},"PublicGroupRead":{"properties":{"name":{"type":"string","title":"Name"},"position":{"type":"integer","title":"Position"},"components":{"items":{"$ref":"#/components/schemas/PublicComponentRead"},"type":"array","title":"Components"}},"additionalProperties":false,"type":"object","required":["name","position","components"],"title":"PublicGroupRead","description":"Anonymous view of a section."},"PublicIncidentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"component_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Component Ids"},"updates":{"items":{"$ref":"#/components/schemas/PublicIncidentUpdateRead"},"type":"array","title":"Updates"}},"additionalProperties":false,"type":"object","required":["id","title","status","started_at","resolved_at","component_ids","updates"],"title":"PublicIncidentRead","description":"Anonymous view of a public incident and its timeline.\n\nDeliberately excludes ``notified_at``, ``is_auto`` and any reference to\nthe internal incident that may have auto-created the row — the internal\n``Incident.cause``/``cause_detail`` must never reach this payload."},"PublicIncidentUpdateRead":{"properties":{"status":{"$ref":"#/components/schemas/StatusPageIncidentStatus"},"body":{"type":"string","title":"Body"},"posted_at":{"type":"string","format":"date-time","title":"Posted At"}},"additionalProperties":false,"type":"object","required":["status","body","posted_at"],"title":"PublicIncidentUpdateRead","description":"One timeline entry on a public incident, as served anonymously."},"PulsePoint":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"response_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Ms"}},"additionalProperties":false,"type":"object","required":["bucket_start","response_ms"],"title":"PulsePoint","description":"One bucket of the response-time sparkline.\n\n``response_ms`` is ``None`` for a bucket with no contributing checks, so\nthe chart can break the line instead of interpolating over a gap."},"PulsePublicRead":{"properties":{"name":{"type":"string","title":"Name"},"check_type":{"$ref":"#/components/schemas/CheckType"},"interval_seconds":{"type":"integer","title":"Interval Seconds"},"status":{"$ref":"#/components/schemas/MonitorStatus"},"regions":{"items":{"$ref":"#/components/schemas/PulseRegion"},"type":"array","title":"Regions"},"series":{"items":{"$ref":"#/components/schemas/PulsePoint"},"type":"array","title":"Series"},"uptime_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Percentage"},"uptime_window_days":{"type":"integer","title":"Uptime Window Days"},"regions_up":{"type":"integer","title":"Regions Up"},"regions_total":{"type":"integer","title":"Regions Total"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["name","check_type","interval_seconds","status","regions","series","uptime_percentage","uptime_window_days","regions_up","regions_total","updated_at"],"title":"PulsePublicRead","description":"The anonymous landing-hero payload.\n\n``uptime_percentage`` is ``None`` rather than ``1.0`` when the window holds no\nnon-maintenance checks. ``regions_total`` is the monitor's configured\nregion count, so the card stops carrying \"3/3\" as a literal.\n``updated_at`` is when this payload was assembled — data freshness."},"PulseRegion":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"status":{"$ref":"#/components/schemas/MonitorStatus"},"response_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Ms"}},"additionalProperties":false,"type":"object","required":["code","label","status","response_ms"],"title":"PulseRegion","description":"One probe region's current verdict and latency.\n\n``response_ms`` is ``None`` when the region has no fresh rollup cell —\na silent region, rendered as silence rather than as a number."},"RegionCheckResult":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/PrecheckOutcome"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"failure_kind":{"anyOf":[{"$ref":"#/components/schemas/FailureKind"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["code","name","status"],"title":"RegionCheckResult","description":"One region's answer. ``unknown`` means no definite reply arrived."},"RegionRead":{"properties":{"code":{"type":"string","title":"Code"},"display_name":{"type":"string","title":"Display Name"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"group":{"type":"string","title":"Group"},"group_display_name":{"type":"string","title":"Group Display Name"}},"additionalProperties":false,"type":"object","required":["code","display_name","city","country_code","group","group_display_name"],"title":"RegionRead","description":"A single active check region exposed by ``GET /v1/regions``.\n\n``code`` is the stable identifier (DB value, NATS subject, worker env);\neverything else is display text. The wave-2 transition shim ``name``,\nwhich duplicated ``code``, was removed on 2026-08-04 once the deployed\nfrontend stopped requiring it."},"RegionResponsePoint":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"avg_response_time_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Avg Response Time Ms"},"sample_count":{"type":"integer","minimum":0.0,"title":"Sample Count"}},"additionalProperties":false,"type":"object","required":["bucket_start","sample_count"],"title":"RegionResponsePoint","description":"Average response time for one region in one fixed-width time bucket.\n\n``avg_response_time_ms`` is ``None`` for a bucket with no successful check\n(a gap, or only failed probes) — the frontend renders those as a break in\nthe line rather than a fabricated value, the same honest-data rule the\ndaily uptime strip follows."},"RegionResponseSeries":{"properties":{"region":{"type":"string","title":"Region"},"display_name":{"type":"string","title":"Display Name"},"points":{"items":{"$ref":"#/components/schemas/RegionResponsePoint"},"type":"array","title":"Points"}},"additionalProperties":false,"type":"object","required":["region","display_name","points"],"title":"RegionResponseSeries","description":"One region's dense response-time series over the requested window.\n\n``points`` always holds exactly the window's bucket count, ordered\noldest-first and ending on the bucket the request fell in. Every region the\nmonitor is configured for gets a series, even one with no data yet (a full\nline of no-data points) so the card's region switcher lists them all."},"RegionStatusRead":{"properties":{"region":{"type":"string","title":"Region"},"status":{"$ref":"#/components/schemas/CheckResultStatus"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"},"display_name":{"type":"string","title":"Display Name"}},"additionalProperties":false,"type":"object","required":["region","status","checked_at","display_name"],"title":"RegionStatusRead","description":"Latest probe outcome for one region, derived from a monitor's snapshots.\n\nDrives the dashboard region grid and the per-region status dots. The\nstatus is a per-region :class:`CheckStatus` (``UP`` / ``DOWN`` / ``ERROR``);\nthe aggregate ``DEGRADED`` / ``PAUSED`` states live on the monitor itself,\nnot on a single region."},"RegionsResponse":{"properties":{"regions":{"items":{"$ref":"#/components/schemas/RegionRead"},"type":"array","title":"Regions"}},"additionalProperties":false,"type":"object","required":["regions"],"title":"RegionsResponse","description":"Region listing response."},"ResendVerificationModel":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"additionalProperties":false,"type":"object","required":["email"],"title":"ResendVerificationModel"},"ResetPasswordModel":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"additionalProperties":false,"type":"object","required":["token","password"],"title":"ResetPasswordModel"},"SendResetPasswordRequestModel":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"additionalProperties":false,"type":"object","required":["email"],"title":"SendResetPasswordRequestModel"},"SlugAvailabilityRead":{"properties":{"slug":{"type":"string","title":"Slug"},"available":{"type":"boolean","title":"Available"}},"additionalProperties":false,"type":"object","required":["slug","available"],"title":"SlugAvailabilityRead","description":"Answer for the editor's live slug check."},"SslCertInfo":{"properties":{"issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"not_before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Not Before"},"not_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Not After"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid"}},"type":"object","title":"SslCertInfo","description":"Latest TLS certificate snapshot for an SSL monitor (У8).\n\nPromoted from an SSL probe's ``CheckResult.details`` onto the monitor row\nso the card/detail render \"what cert, valid until, issued by/when\" without\na per-check query. All fields are nullable — a partial worker blob or a\nnot-yet-probed monitor leaves them ``None``.\n\n``not_before`` / ``not_after`` are kept as the raw RFC3339 strings the\nworker reported (display echo). The canonical, typed expiry is the\nmonitor's top-level ``ssl_expires_at``; \"expires in N days\" is recomputed\nclient-side from it, never the worker's stale ``days_left``."},"SslChainLink":{"properties":{"subject_common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Common Name"},"issuer_common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer Common Name"},"not_after":{"type":"string","format":"date-time","title":"Not After"}},"type":"object","required":["not_after"],"title":"SslChainLink"},"SslCheckRequest":{"properties":{"host":{"type":"string","maxLength":253,"minLength":1,"title":"Host"},"port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Port","default":443}},"type":"object","required":["host"],"title":"SslCheckRequest","description":"Body of ``POST /public/tools/ssl-check``."},"SslCheckResponse":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port"},"resolved_ip":{"type":"string","title":"Resolved Ip"},"reachable":{"type":"boolean","title":"Reachable"},"valid":{"type":"boolean","title":"Valid"},"probe_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Probe Error"},"verify_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify Error"},"tls_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tls Version"},"cipher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cipher"},"subject_common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Common Name"},"subject_alternative_names":{"items":{"type":"string"},"type":"array","title":"Subject Alternative Names"},"issuer":{"anyOf":[{"$ref":"#/components/schemas/SslIssuer"},{"type":"null"}]},"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_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Left"},"chain":{"items":{"$ref":"#/components/schemas/SslChainLink"},"type":"array","title":"Chain"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"}},"type":"object","required":["host","port","resolved_ip","reachable","valid","checked_at"],"title":"SslCheckResponse","description":"Certificate facts for one host, or an honest \"no handshake\" answer."},"SslIssuer":{"properties":{"common_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"}},"type":"object","title":"SslIssuer"},"StatusPageCreate":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"is_published":{"type":"boolean","title":"Is Published","default":false},"history_days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"History Days","default":90}},"additionalProperties":false,"type":"object","required":["slug","name"],"title":"StatusPageCreate","description":"Create payload for a status page."},"StatusPageIncidentStatus":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"],"title":"StatusPageIncidentStatus","description":"Lifecycle of a public incident on a status page. Persisted."},"StatusPageLayoutWrite":{"properties":{"ungrouped_components":{"items":{"$ref":"#/components/schemas/LayoutComponentWrite"},"type":"array","title":"Ungrouped Components"},"groups":{"items":{"$ref":"#/components/schemas/LayoutGroupWrite"},"type":"array","title":"Groups"}},"additionalProperties":false,"type":"object","title":"StatusPageLayoutWrite","description":"The complete desired layout — replaces whatever the page holds today."},"StatusPagePublicRead":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"$ref":"#/components/schemas/PageStatus"},"branding_removable":{"type":"boolean","title":"Branding Removable"},"history_days":{"type":"integer","title":"History Days"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"groups":{"items":{"$ref":"#/components/schemas/PublicGroupRead"},"type":"array","title":"Groups"},"ungrouped_components":{"items":{"$ref":"#/components/schemas/PublicComponentRead"},"type":"array","title":"Ungrouped Components"},"active_incidents":{"items":{"$ref":"#/components/schemas/PublicIncidentRead"},"type":"array","title":"Active Incidents"},"past_incidents":{"items":{"$ref":"#/components/schemas/PublicIncidentRead"},"type":"array","title":"Past Incidents"},"subscriptions_enabled":{"type":"boolean","title":"Subscriptions Enabled"}},"additionalProperties":false,"type":"object","required":["slug","name","description","status","branding_removable","history_days","updated_at","groups","ungrouped_components","active_incidents","past_incidents","subscriptions_enabled"],"title":"StatusPagePublicRead","description":"The anonymous status-page payload.\n\n``history_days`` is the **effective** strip length after clamping by the\nplan's retention, so the frontend renders the axis it was actually served.\n``branding_removable`` is false on FREE, PLUS and PRO, where the mandatory\nfettle.sh backlink is rendered by the frontend. The core does not own the\nbacklink copy, so this description deliberately does not quote it.\n``updated_at`` is when this payload was assembled — data freshness, safe to\nrender as \"Last updated\" — not when the page was last edited.\n``active_incidents`` and ``past_incidents`` are the public incident\ntimelines: every open incident, and resolved incidents within a trailing\nwindow (see ``PAST_INCIDENTS_WINDOW_DAYS``/``PAST_INCIDENTS_LIMIT`` in the\nuse case). ``subscriptions_enabled`` mirrors the plan's status-page\nsubscriber cap, so the frontend can hide the subscribe form on a FREE org."},"StatusPageRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_published":{"type":"boolean","title":"Is Published"},"history_days":{"type":"integer","title":"History Days"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"groups":{"items":{"$ref":"#/components/schemas/GroupRead"},"type":"array","title":"Groups"},"ungrouped_components":{"items":{"$ref":"#/components/schemas/ComponentRead"},"type":"array","title":"Ungrouped Components"}},"additionalProperties":false,"type":"object","required":["id","slug","name","description","is_published","history_days","created_at","groups","ungrouped_components"],"title":"StatusPageRead","description":"Editor view of a status page and its layout."},"StatusPageSortOption":{"type":"string","enum":["name","created_at"],"title":"StatusPageSortOption","description":"Ordering for the status-pages listing endpoint."},"StatusPageSubscriberStatus":{"type":"string","enum":["PENDING","CONFIRMED"],"title":"StatusPageSubscriberStatus","description":"Double-opt-in state of a status-page email subscriber. Persisted."},"StatusPageUpdate":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"history_days":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":1.0},{"type":"null"}],"title":"History Days"}},"additionalProperties":false,"type":"object","title":"StatusPageUpdate","description":"Partial update payload — every field optional.\n\n``None`` is the \"field absent\" marker for every field except\n``description``, the one column that is actually nullable: sending an\nexplicit ``null`` for any other field is a client error, not a request to\nwrite ``NULL``."},"SubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"additionalProperties":false,"type":"object","required":["email"],"title":"SubscribeRequest","description":"Body for the public double-opt-in subscribe endpoint."},"SubscriberRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"status":{"$ref":"#/components/schemas/StatusPageSubscriberStatus"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","email","status","confirmed_at","created_at"],"title":"SubscriberRead","description":"Editor view of a status page's email subscriber."},"SubscriptionStatus":{"type":"string","enum":["ACTIVE","TRIALING","PAST_DUE","CANCELED","INCOMPLETE","INCOMPLETE_EXPIRED","UNPAID"],"title":"SubscriptionStatus","description":"Lifecycle state of a user's paid subscription.\n\nMember name == value (UPPER_SNAKE_CASE) to match the project's enum\nconvention and the persisted DB labels. Polar emits lowercase status\nstrings on the wire; that translation lives in ``SubscriptionService``."},"SubscriptionSummary":{"properties":{"plan":{"$ref":"#/components/schemas/PlanTier"},"status":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionStatus"},{"type":"null"}]},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","default":false},"renews_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Renews At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"trial_ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Ends At"},"billing_period":{"anyOf":[{"$ref":"#/components/schemas/BillingPeriod"},{"type":"null"}]},"amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"additionalProperties":false,"type":"object","required":["plan"],"title":"SubscriptionSummary","description":"Current subscription state for the authenticated user.\n\n``status`` is ``null`` for accounts that never subscribed (free tier).\n``renews_at`` is set while the subscription auto-renews; ``expires_at`` is\nset instead once a cancellation is scheduled for period end.\n\nOverrides ``Base``'s ``use_enum_values``: this keeps ``billing_period`` as\nan actual ``BillingPeriod`` instance instead of a pre-coerced string, so\nthe declared response model stays the contract for what gets serialized.\nA ``StrEnum`` member serializes to the same JSON value either way."},"SubscriptionTokenRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"title":"Token"}},"additionalProperties":false,"type":"object","required":["token"],"title":"SubscriptionTokenRequest","description":"Body for the confirm/unsubscribe endpoints — an opaque bearer token."},"SuccessResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"additionalProperties":false,"type":"object","required":["success"],"title":"SuccessResponse"},"TagCountRead":{"properties":{"tag":{"type":"string","title":"Tag"},"monitor_count":{"type":"integer","minimum":0.0,"title":"Monitor Count"},"heartbeat_count":{"type":"integer","minimum":0.0,"title":"Heartbeat Count"}},"additionalProperties":false,"type":"object","required":["tag","monitor_count","heartbeat_count"],"title":"TagCountRead","description":"One tag and how many monitors and heartbeats carry it."},"TagDeleteResponse":{"properties":{"from":{"type":"string","title":"From"},"monitors_updated":{"type":"integer","minimum":0.0,"title":"Monitors Updated"},"heartbeats_updated":{"type":"integer","minimum":0.0,"title":"Heartbeats Updated"}},"additionalProperties":false,"type":"object","required":["from","monitors_updated","heartbeats_updated"],"title":"TagDeleteResponse","description":"What a delete actually touched.\n\nWire contract is ``{\"from\": ..., \"monitors_updated\": ...,\n\"heartbeats_updated\": ...}`` — matching the rename request's own ``from``\nnaming. There is deliberately no ``to``: a delete has no destination tag, so\npublishing a nullable one would let a generated client permit a ``null``\nthat never occurs on this route."},"TagKind":{"type":"string","enum":["monitor","heartbeat","all"],"title":"TagKind","description":"Which aggregate's tags a listing should include.\n\nFilters which tags appear, not which counts are reported: every row always\ncarries both counts, so one cached response serves the monitor form's\nautocomplete, the heartbeat form's autocomplete and both filter dropdowns."},"TagListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TagCountRead"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["items"],"title":"TagListResponse","description":"The organization's tag dictionary, most-used first."},"TagMatchMode":{"type":"string","enum":["all","any"],"title":"TagMatchMode","description":"How a multi-tag filter combines: every tag (``ALL``) or any of them."},"TagMutationResponse":{"properties":{"from":{"type":"string","title":"From"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"},"monitors_updated":{"type":"integer","minimum":0.0,"title":"Monitors Updated"},"heartbeats_updated":{"type":"integer","minimum":0.0,"title":"Heartbeats Updated"}},"additionalProperties":false,"type":"object","required":["from","monitors_updated","heartbeats_updated"],"title":"TagMutationResponse","description":"What a rename actually touched.\n\nWire contract is ``{\"from\": ..., \"to\": ..., \"monitors_updated\": ...,\n\"heartbeats_updated\": ...}`` — matching the request's own ``from``/``to``\nnaming."},"TagRenameRequest":{"properties":{"from":{"type":"string","minLength":1,"title":"From"},"to":{"type":"string","minLength":1,"title":"To"}},"additionalProperties":false,"type":"object","required":["from","to"],"title":"TagRenameRequest","description":"Rename one tag across every taggable aggregate of the organization.\n\nThe tag travels in the body, never in the path: ``/`` is a legal tag\ncharacter, and a ``%2F`` path segment is normalized or rejected by nginx and\nthe k3s ingress before FastAPI sees it."},"TelegramLinkResponse":{"properties":{"deep_link":{"type":"string","title":"Deep Link","description":"Open this URL to bind your Telegram account."},"token":{"type":"string","title":"Token","description":"Raw token (also embedded in deep_link)."},"ttl_seconds":{"type":"integer","exclusiveMinimum":0.0,"title":"Ttl Seconds","description":"Lifetime of the token in seconds."}},"additionalProperties":false,"type":"object","required":["deep_link","token","ttl_seconds"],"title":"TelegramLinkResponse","description":"Response body for ``POST /v1/integrations/telegram/link``."},"TransferOwnershipRequest":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"}},"additionalProperties":false,"type":"object","required":["user_id"],"title":"TransferOwnershipRequest","description":"Request body for handing ownership to another member."},"UnlinkIdentityRequest":{"properties":{"password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Password"}},"additionalProperties":false,"type":"object","title":"UnlinkIdentityRequest"},"UptimeDayPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"uptime_percentage":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Uptime Percentage"},"total_checks":{"type":"integer","minimum":0.0,"title":"Total Checks"},"up_checks":{"type":"integer","minimum":0.0,"title":"Up Checks"},"down_checks":{"type":"integer","minimum":0.0,"title":"Down Checks"},"degraded_checks":{"type":"integer","minimum":0.0,"title":"Degraded Checks","default":0},"maintenance_checks":{"type":"integer","minimum":0.0,"title":"Maintenance Checks","default":0}},"additionalProperties":false,"type":"object","required":["date","uptime_percentage","total_checks","up_checks","down_checks"],"title":"UptimeDayPoint","description":"Uptime for a single UTC calendar day in the daily strip.\n\n``uptime_percentage`` is ``None`` for a day with no checks (before the\nmonitor existed, or any gap) — the frontend renders those as \"no data\"\nrather than full uptime, which is the whole point of serving a real\nper-day series instead of fabricating one from an aggregate window.\n\n``uptime_percentage`` folds DEGRADED into the numerator (a degraded check\ncounts as up). ``degraded_checks`` is reported separately so the strip can\ncolour a day as degraded (amber) while its uptime stays green.\n\n``maintenance_checks`` counts checks that were stamped ``in_maintenance``\nand excluded from up/down/degraded. A day where every check was in\nmaintenance renders as no-data (``uptime_percentage = None``) rather than\n0% or 100%, since there is no non-maintenance signal to report."},"UserNewPassword":{"properties":{"password":{"type":"string","title":"Password"},"current_password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Current Password"}},"additionalProperties":false,"type":"object","required":["password"],"title":"UserNewPassword"},"UserProfileUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Last Name"}},"additionalProperties":false,"type":"object","title":"UserProfileUpdate","description":"Request body for ``PATCH /v1/users/me`` — editable profile fields.\n\nEmail is managed elsewhere (recovery / uniqueness-sensitive) and is\nintentionally not editable here. At least one field is required."},"UserProfileViewModel":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"role":{"$ref":"#/components/schemas/UserRole"},"email":{"type":"string","format":"email","title":"Email"},"is_verified":{"type":"boolean","title":"Is Verified"}},"additionalProperties":false,"type":"object","required":["id","first_name","last_name","role","email","is_verified"],"title":"UserProfileViewModel"},"UserRole":{"type":"string","enum":["admin","editor","viewer"],"title":"UserRole"},"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"},"WebhookTestResult":{"properties":{"success":{"type":"boolean","title":"Success"},"http_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"additionalProperties":false,"type":"object","required":["success","http_status","error"],"title":"WebhookTestResult","description":"Result of a synchronous ``POST /v1/channels/{id}/test``."}},"securitySchemes":{"refresh-token":{"type":"apiKey","in":"header","name":"Authorization"},"access-token":{"type":"apiKey","in":"header","name":"Authorization"},"access-token-optional":{"type":"apiKey","in":"header","name":"Authorization"}}}}