{"openapi":"3.1.0","info":{"title":"Sheaf","description":"Open-source plural system tracking","version":"1.0.2"},"paths":{"/v1/version":{"get":{"tags":["version"],"summary":"Get Version","operationId":"get_version_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Response Get Version V1 Version Get"}}}}}}},"/v1/shield-mode/status":{"get":{"tags":["shield mode"],"summary":"Shield Mode Status","operationId":"shield_mode_status_v1_shield_mode_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShieldModeStatus"}}}}}}},"/v1/internal/shield-mode/state":{"post":{"tags":["shield mode"],"summary":"Shield Mode Transition","operationId":"shield_mode_transition_v1_internal_shield_mode_state_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShieldModeStatus"}}}}}}},"/v1/auth/config":{"get":{"tags":["auth"],"summary":"Get Auth Config","description":"Public endpoint returning registration settings for the login UI.","operationId":"get_auth_config_v1_auth_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/captcha/challenge":{"get":{"tags":["auth"],"summary":"Get Captcha Challenge","description":"Issue a captcha challenge for the login/register widget.","operationId":"get_captcha_challenge_v1_auth_captcha_challenge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email","description":"Verify email address using the token from the verification email.","operationId":"verify_email_v1_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Resend the email verification link.","operationId":"resend_verification_v1_auth_resend_verification_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/revalidate-email":{"post":{"tags":["auth"],"summary":"Revalidate Email","description":"Re-send a verification link to clear a deliverability block.\n\nFor a signed-in user whose current address has been flagged\nundeliverable (hard bounce, complaint, or the soft-bounce\nthreshold). The verification send uses force=True so it reaches the\nblocked address, and completing the link clears the block (see\nverify_email + clear_delivery_state). This is the self-service exit\nfrom what would otherwise be a permanent, admin-only lockout.\n\nRefuses with 400 when the address isn't flagged, so it can't be used\nas an unmetered mail trigger; throttled the same way as\nresend-verification on top of the per-user rate limit.","operationId":"revalidate_email_v1_auth_revalidate_email_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/request-password-reset":{"post":{"tags":["auth"],"summary":"Request Password Reset","description":"Request a password reset email.\n\nAlways returns 200 to avoid leaking whether the email exists. The\nactual send is deferred to a background task so the response time is\nthe same whether or not the address matched an account.","operationId":"request_password_reset_v1_auth_request_password_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using a token from the password reset email.","operationId":"reset_password_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordReset"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Change the signed-in user's password.\n\nGated on the current password and, if TOTP is enabled, a fresh TOTP or\nrecovery code. On success all other sessions are revoked so a stolen\ncookie elsewhere can't survive the change; the calling session stays\nalive.","operationId":"change_password_v1_auth_change_password_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChange"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/change-email":{"post":{"tags":["auth"],"summary":"Change Email","description":"Change the signed-in user's email.\n\nGated on the current password and, if TOTP is enabled, a fresh TOTP or\nrecovery code. The new address is verified again — verification status\nis reset to false and a verification email is sent. Pre-apply\nverification doesn't actually defend against session compromise (the\nattacker controls the destination inbox); the password+TOTP gate is\nthe real protection. The re-verification is a typo safety net.\nOther sessions are revoked, same as change-password.","operationId":"change_email_v1_auth_change_email_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailChange"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_v1_auth_login_post","parameters":[{"name":"sheaf_trusted_device","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Trusted Device"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_v1_auth_logout_post","parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}},{"name":"sheaf_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Refresh"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions":{"get":{"tags":["auth"],"summary":"Get Sessions","description":"List all active sessions for the current user.\n\n`id` is an opaque handle, not the raw session token - the raw value\nis the `sheaf_session` cookie credential, and listing it here let\nany caller lift a sibling session's cookie and replay it. The\nrename/revoke endpoints below address sessions by this handle.\n\nis_current uses the request-state session id, which is populated\nfor cookie auth and session-bound JWTs alike, so mobile clients get\na correct marker too.","operationId":"get_sessions_v1_auth_sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions/{target_session_handle}":{"patch":{"tags":["auth"],"summary":"Update Session","description":"Rename a session, addressed by its opaque handle from /sessions.\n\nHandle resolution walks the caller's own session set, so ownership\nis enforced by construction.","operationId":"update_session_v1_auth_sessions__target_session_handle__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_session_handle","in":"path","required":true,"schema":{"type":"string","title":"Target Session Handle"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Revoke Session","description":"Revoke a session, addressed by its opaque handle from /sessions.\n\nCannot revoke the current session (use /logout).","operationId":"revoke_session_v1_auth_sessions__target_session_handle__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_session_handle","in":"path","required":true,"schema":{"type":"string","title":"Target Session Handle"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions/revoke-others":{"post":{"tags":["auth"],"summary":"Revoke Other Sessions","description":"Revoke all sessions except the current one.","operationId":"revoke_other_sessions_v1_auth_sessions_revoke_others_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions/secondary":{"post":{"tags":["auth"],"summary":"Create Secondary Session","description":"Mint a child session + refresh token for a paired companion device.\n\nUse case: an iOS app pairing a watchOS app. Both devices used to share\none refresh token, which serialised them through the one-shot rotation\nand made the watch's offline-then-refresh path collide with the phone's.\nThe phone now calls this endpoint after login and ships the returned\ntokens to the watch via WatchConnectivity, so each device rotates\nindependently.\n\nThe new session is registered as a child of the caller's session: when\nthe parent is revoked (logout, /sessions DELETE, change-password) the\nchild is cascaded automatically, matching the user expectation that\n\"kicking out my phone also kicks out its watch.\"","operationId":"create_secondary_session_v1_auth_sessions_secondary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SecondarySessionRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecondarySessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/trusted-devices":{"get":{"tags":["auth"],"summary":"Get Trusted Devices","description":"List the user's non-expired trusted devices.\n\n`is_current` is true for the device whose cookie is on this request.","operationId":"get_trusted_devices_v1_auth_trusted_devices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_trusted_device","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Trusted Device"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/trusted-devices/{device_id}":{"patch":{"tags":["auth"],"summary":"Rename Trusted Device","description":"Rename a trusted device.","operationId":"rename_trusted_device_v1_auth_trusted_devices__device_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Device Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedDeviceRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Revoke Trusted Device Endpoint","description":"Revoke a trusted device. If the caller revoked the device tied to\nthis browser, also clear the cookie so the next login requires TOTP\nagain.","operationId":"revoke_trusted_device_endpoint_v1_auth_trusted_devices__device_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Device Id"}},{"name":"sheaf_trusted_device","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Trusted Device"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/trusted-devices/revoke-all":{"post":{"tags":["auth"],"summary":"Revoke All Trusted Devices Endpoint","description":"Revoke every trusted device for the user. Clears this browser's\ncookie too.","operationId":"revoke_all_trusted_devices_endpoint_v1_auth_trusted_devices_revoke_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_v1_auth_refresh_post","parameters":[{"name":"sheaf_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Refresh"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TokenRefresh"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","operationId":"get_me_v1_auth_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["auth"],"summary":"Update Me","operationId":"update_me_v1_auth_me_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/totp/setup":{"post":{"tags":["auth"],"summary":"Totp Setup","description":"Begin TOTP enrolment. Requires the account password.\n\nWithout the password gate, a session-only attacker could enrol an\nattacker-controlled secret + recovery codes and turn a stolen session\ninto durable account capture (change-password / change-email / disable\nwould then demand a code only the attacker has). Enabling a factor is\nheld to the same re-auth standard as disabling one.","operationId":"totp_setup_v1_auth_totp_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TOTPSetupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TOTPSetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/totp/verify":{"post":{"tags":["auth"],"summary":"Totp Verify","operationId":"totp_verify_v1_auth_totp_verify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TOTPVerify"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/totp/disable":{"post":{"tags":["auth"],"summary":"Totp Disable","description":"Disable TOTP. Requires password + current TOTP code for confirmation.","operationId":"totp_disable_v1_auth_totp_disable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/totp/regenerate-recovery-codes":{"post":{"tags":["auth"],"summary":"Regenerate Recovery Codes","description":"Regenerate recovery codes. Requires a valid TOTP code to authorize.","operationId":"regenerate_recovery_codes_v1_auth_totp_regenerate_recovery_codes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TOTPVerify"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/keys":{"get":{"tags":["auth"],"summary":"List Api Keys","description":"List the current user's API keys (never returns plaintext key).","operationId":"list_api_keys_v1_auth_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyRead"},"title":"Response List Api Keys V1 Auth Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Create Api Key","description":"Create a new API key. The plaintext key is returned once — save it.","operationId":"create_api_key_v1_auth_keys_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/keys/{key_id}":{"delete":{"tags":["auth"],"summary":"Revoke Api Key","description":"Revoke an API key. Only the owning user can revoke their own keys.","operationId":"revoke_api_key_v1_auth_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/delete-account":{"post":{"tags":["auth"],"summary":"Request Account Deletion","description":"Request account deletion with a grace period.","operationId":"request_account_deletion_v1_auth_delete_account_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/cancel-deletion":{"post":{"tags":["auth"],"summary":"Cancel Account Deletion","description":"Cancel a pending account deletion.","operationId":"cancel_account_deletion_v1_auth_cancel_deletion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/auth":{"get":{"tags":["admin"],"summary":"Get Admin Auth Status","description":"Return the configured step-up level and whether this user has completed it.","operationId":"get_admin_auth_status_v1_admin_auth_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Verify Admin Step Up","description":"Complete admin step-up authentication for the calling session.","operationId":"verify_admin_step_up_v1_admin_auth_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStepUpVerify"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Get Stats","description":"Aggregate system stats. Requires admin:read scope or is_admin.","operationId":"get_stats_v1_admin_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/pushover-usage":{"get":{"tags":["admin"],"summary":"Get Pushover Usage","description":"Current month's shared-app Pushover delivery count vs the configured\nmonthly cap. Channels with a BYO destination_config.app_token aren't\ncounted here — they hit the recipient's own Pushover quota.","operationId":"get_pushover_usage_v1_admin_pushover_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users with member counts. Requires admin:read scope or is_admin.\n\n`signup_ip` filters to users whose recorded signup IP matches exactly.\nUseful for abuse triage when one IP shows up across multiple complaints.\nExact-match only — partial / CIDR matching is intentionally absent so\noperators don't accidentally surface broad swaths of accounts that just\nhappened to be behind the same NAT.","operationId":"list_users_v1_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"signup_ip","in":"query","required":false,"schema":{"type":"string","default":"","title":"Signup Ip"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminUserRead"},"title":"Response List Users V1 Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}":{"patch":{"tags":["admin"],"summary":"Update User","description":"Update a user's tier, is_admin, or member limit. Requires admin:write scope or is_admin.","operationId":"update_user_v1_admin_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/approvals":{"get":{"tags":["admin"],"summary":"List Pending Approvals","description":"List all users with pending_approval status.","operationId":"list_pending_approvals_v1_admin_approvals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PendingUserRead"},"title":"Response List Pending Approvals V1 Admin Approvals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/approve":{"post":{"tags":["admin"],"summary":"Approve User","description":"Approve a pending user account.","operationId":"approve_user_v1_admin_users__user_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/reject":{"post":{"tags":["admin"],"summary":"Reject User","description":"Reject a pending user account. Deletes the user and their system.","operationId":"reject_user_v1_admin_users__user_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/retention/run":{"post":{"tags":["admin"],"summary":"Run Retention","description":"Manually trigger front history retention pruning. Admin only.","operationId":"run_retention_v1_admin_retention_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/cleanup/run":{"post":{"tags":["admin"],"summary":"Run Cleanup","description":"Clean up orphaned files for all users. Admin only.","operationId":"run_cleanup_v1_admin_cleanup_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/storage/stats":{"get":{"tags":["admin"],"summary":"Get Storage Stats","description":"Storage statistics from uploaded_files table. Admin only.","operationId":"get_storage_stats_v1_admin_storage_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/member-limit":{"put":{"tags":["admin"],"summary":"Set Member Limit","description":"Set or reset a user's member limit override. Admin only.","operationId":"set_member_limit_v1_admin_users__user_id__member_limit_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberLimitOverride"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/invites":{"get":{"tags":["admin"],"summary":"List Invites","description":"List all invite codes. Admin only.","operationId":"list_invites_v1_admin_invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Invite","description":"Create a new invite code. Admin only.","operationId":"create_invite_v1_admin_invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCodeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/invites/{invite_id}":{"delete":{"tags":["admin"],"summary":"Delete Invite","description":"Delete an invite code. Admin only.","operationId":"delete_invite_v1_admin_invites__invite_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invite Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs":{"get":{"tags":["admin"],"summary":"List Jobs","description":"List all registered jobs with their status and last run info.","operationId":"list_jobs_v1_admin_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_name}/run":{"post":{"tags":["admin"],"summary":"Trigger Job","description":"Manually trigger a scheduled job. Requires admin:write.","operationId":"trigger_job_v1_admin_jobs__job_name__run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_name","in":"path","required":true,"schema":{"type":"string","title":"Job Name"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs/{job_name}/logs":{"get":{"tags":["admin"],"summary":"Get Job Logs","description":"Get recent run history for a job. Requires admin:read.","operationId":"get_job_logs_v1_admin_jobs__job_name__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_name","in":"path","required":true,"schema":{"type":"string","title":"Job Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/reset-password":{"post":{"tags":["admin"],"summary":"Admin Reset Password","description":"Reset a user's password. Returns the new password once. Requires\nadmin:write, a reason, and a non-admin target.\n\nRevokes all the user's sessions to force re-login. Writes an audit\nrow; the new password is never logged anywhere.","operationId":"admin_reset_password_v1_admin_users__user_id__reset_password_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminResetPasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/change-email":{"post":{"tags":["admin"],"summary":"Admin Change Email","description":"Change a user's email address. Requires admin:write, a reason,\nand a non-admin target.\n\nUpdates the encrypted email and blind index. Marks email as verified\n(admin-initiated change is trusted). Checks for conflicts. Writes an\naudit row carrying the new address (the user sees this row on their\nown account activity page, which is the point).","operationId":"admin_change_email_v1_admin_users__user_id__change_email_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminChangeEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/disable-totp":{"post":{"tags":["admin"],"summary":"Admin Disable Totp","description":"Disable TOTP 2FA on a user's account. Requires admin:write, a\nreason, and a non-admin target.\n\nClears the TOTP secret and recovery codes. The user can re-enrol later.","operationId":"admin_disable_totp_v1_admin_users__user_id__disable_totp_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/verify-email":{"post":{"tags":["admin"],"summary":"Admin Verify Email","description":"Force-verify a user's email address. Requires admin:write and a\nreason. Admin targets are allowed - this grants nothing that could\ncapture an account, it only clears a verification gate.","operationId":"admin_verify_email_v1_admin_users__user_id__verify_email_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/cancel-deletion":{"post":{"tags":["admin"],"summary":"Admin Cancel Deletion","description":"Cancel a user's pending account deletion. Requires admin:write\nand a reason. Admin targets are allowed - restoring a colleague's\naccount state grants no access to it.","operationId":"admin_cancel_deletion_v1_admin_users__user_id__cancel_deletion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/audit-events":{"get":{"tags":["admin audit"],"summary":"List Admin Audit Events","description":"Paginated admin audit log. Filters on target user, acting\nadmin, or action type — all optional. Most-recent first.","operationId":"list_admin_audit_events_v1_admin_audit_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target User Id"}},{"name":"admin_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Admin User Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminAuditEventRead"},"title":"Response List Admin Audit Events V1 Admin Audit Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/audit-events/{event_id}":{"get":{"tags":["admin audit"],"summary":"Get Admin Audit Event","operationId":"get_admin_audit_event_v1_admin_audit_events__event_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Event Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAuditEventRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/admin-activity":{"get":{"tags":["admin audit"],"summary":"List Admin Activity On Self","description":"List admin actions taken against the caller's account.\n\nReturns rows where `target_user_id == self.id`. Visible to every\nauthenticated user with no admin gate — this is the user-facing\ntransparency layer over the audit log.","operationId":"list_admin_activity_on_self_v1_auth_admin_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserAdminActivityRead"},"title":"Response List Admin Activity On Self V1 Auth Admin Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/reset-safety":{"post":{"tags":["admin emergency"],"summary":"Reset System Safety","description":"Clear all System Safety category toggles, zero the grace period,\nand set delete_confirmation back to NONE on the target user's\nsystem. Future destructive actions on the account are no longer\nsafeguarded; the user can re-enable safeguards at any time from\nSettings > Safety. Already-queued pending actions are NOT touched\nhere — call bypass-pending for those.","operationId":"reset_system_safety_v1_admin_users__user_id__reset_safety_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_emergency__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/bypass-pending":{"post":{"tags":["admin emergency"],"summary":"Bypass Pending Actions","description":"Finalize every pending System Safety action queued on the target\nuser's system immediately, bypassing the grace period. Idempotent\nif the queue is empty.\n\nWrites one user-level USER_PENDING_BYPASS audit row plus one row\nper finalized pending_action so the per-action history is\nrecoverable.","operationId":"bypass_pending_actions_v1_admin_users__user_id__bypass_pending_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_emergency__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/import-jobs":{"get":{"tags":["admin emergency"],"summary":"List User Import Jobs","description":"List import jobs for a target user, most-recent first. Browse\nonly — events are NOT returned and no audit row is written here.","operationId":"list_user_import_jobs_v1_admin_users__user_id__import_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_ImportJobSummary"},"title":"Response List User Import Jobs V1 Admin Users  User Id  Import Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/import-jobs/{job_id}":{"post":{"tags":["admin emergency"],"summary":"View Import Job Detail","description":"Read the full event log of a single import job.\n\nPOST + body rather than GET + query so the reason is captured in\na request body, not a URL that ends up in proxy / browser-history\nlogs. Writes an `import_log_view` audit row so the user can see\nwhen an admin looked at their import history.\n\nImporter events are mostly structural (counts, importer state,\nPluralKit HIDs / SP `_id`s as `record_ref`) but exception-text\nbranches in `build_member`-style paths can in pathological cases\nquote a value that failed Pydantic validation. Treating them as\nprivacy-sensitive on read keeps the user's account transparent.","operationId":"view_import_job_detail_v1_admin_import_jobs__job_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_emergency__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ImportJobDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/explain":{"get":{"tags":["admin small actions"],"summary":"Explain Account","description":"Dossier view for triage. Read-only — does not write an audit row.\n\nAggregates information that would otherwise require five separate\nadmin endpoints to assemble. Deliberately omits anything the user\nhasn't already exposed to the system (no decrypted content from\nmembers / journals / messages, only counts and structural state).","operationId":"explain_account_v1_admin_users__user_id__explain_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/rate-limit-history":{"get":{"tags":["admin small actions"],"summary":"Rate Limit History","description":"Recent rate-limit hits attributed to this account.\n\nThe aggregate Prometheus counters answer \"is the instance being\nhammered\"; this answers the triage question \"what has THIS account\ntripped recently\". Sourced from the capped per-user Redis list the\nlimiter writes on blocked checks - covers per-user limits always,\nand per-IP limits when the request carried resolved auth. The\nanonymous global backstop is not attributable and not included.\n\nRead-only; not logged (matches /explain and the session list:\noperational metadata, no user content).","operationId":"rate_limit_history_v1_admin_users__user_id__rate_limit_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/sessions":{"get":{"tags":["admin small actions"],"summary":"List User Sessions Endpoint","description":"List a target user's active sessions. Read-only; not logged.\n\nCompanion to /terminate so the admin can see what's in the session\nset before deciding which one to kill. Same shape as the\nuser-facing /auth/sessions response, except sourced from another\nuser's id rather than the request's own JWT.","operationId":"list_user_sessions_endpoint_v1_admin_users__user_id__sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/_SessionRow"},"title":"Response List User Sessions Endpoint V1 Admin Users  User Id  Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/sessions/{target_session_id}/terminate":{"post":{"tags":["admin small actions"],"summary":"Terminate User Session","description":"Revoke one of a user's sessions out-of-band.\n\nThe session id must already belong to the target user — otherwise\nthe request 404s without revealing which side of the mismatch was\nwrong. Writes a USER_SESSION_REVOKE audit row with the captured\nuser_agent / created_at / ip (whatever the session record had).\n\nPath param is `target_session_id` rather than `session_id` to\navoid colliding with the `session_id` cookie alias resolved\ntransitively through the auth dependency chain — FastAPI raises if\nthe same name appears as both a path param and a `Cookie(...)` in\nthe dep tree.\n\nAddressed by the opaque handle the session list returns; the raw\ntoken never crosses the API boundary in either direction, and the\naudit row stores the handle for the same reason.","operationId":"terminate_user_session_v1_admin_users__user_id__sessions__target_session_id__terminate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"target_session_id","in":"path","required":true,"schema":{"type":"string","title":"Target Session Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/api-keys/rotate-all":{"post":{"tags":["admin small actions"],"summary":"Force Rotate Api Keys","description":"Revoke every API key on the target account.\n\nIdempotent: if the user has zero keys, returns revoked_count=0 and\nstill writes an audit row (so the operator's attempt is recorded\neven when there was nothing to rotate). Does NOT mint replacement\nkeys — the user reissues from their own settings page after the\nrotation, so admins never touch fresh secret material.","operationId":"force_rotate_api_keys_v1_admin_users__user_id__api_keys_rotate_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/approvals/bulk-approve":{"post":{"tags":["admin small actions"],"summary":"Bulk Approve","description":"Approve a batch of pending users in one request.\n\nPer-user errors (not found, not in pending_approval state) are\nreported in `results` rather than 4xx-ing the whole request — the\noperator usually wants partial success when one row in their\nselection has gone stale. Writes one USER_APPROVE row per\nsuccessful approval; failures do not write rows.\n\nApproval emails are dispatched best-effort, same as the\nsingle-approve endpoint. A delivery failure does not roll back the\nDB-side approval.","operationId":"bulk_approve_v1_admin_approvals_bulk_approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkApproveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkApproveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/suspend":{"post":{"tags":["admin small actions"],"summary":"Suspend User","description":"Soft-ban an account.\n\nSets `account_status=SUSPENDED`, stamps `suspended_until` from the\noptional duration, captures the reason, and revokes all of the\nuser's Redis sessions so they're locked out instantly. The auth\ndep + login endpoint both refuse SUSPENDED users with a detail\nstring that includes the reason and expiry, so the user knows\nwhat happened at next login.\n\nIf the user is already SUSPENDED, this re-stamps with the new\nexpiry / reason and writes a new audit row. Useful for extending\na ban after new evidence.","operationId":"suspend_user_v1_admin_users__user_id__suspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuspendBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/unsuspend":{"post":{"tags":["admin small actions"],"summary":"Unsuspend User","description":"Lift a soft-ban early.\n\nIdempotent: if the user is already ACTIVE, returns ok=True with\nno state change and writes no audit row (the `before == after`\ncase the audit log already skips for routine updates). Use this\nfor the \"actually they're fine, lift it now\" support path.","operationId":"unsuspend_user_v1_admin_users__user_id__unsuspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/ban":{"post":{"tags":["admin small actions"],"summary":"Ban User","description":"Permanently ban an account.\n\nSets `account_status=BANNED` and revokes all sessions atomically.\nDiffers from suspend in two ways: there is no auto-restore sweep,\nand the auth detail string is just \"Account banned\" with no\nreason / expiry surfaced to the user (the reason lives in the\naudit row for operator reference). Lift via /unban; lifting is\ndeliberately a separate explicit endpoint rather than a state\nthat decays.\n\nAdmins are refused with 409 just like suspend, on the same\n\"operators shouldn't be able to lock each other out of the\ninstance via this surface\" principle.","operationId":"ban_user_v1_admin_users__user_id__ban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/unban":{"post":{"tags":["admin small actions"],"summary":"Unban User","description":"Lift a permanent ban.\n\nReturns the user to ACTIVE. No-op on accounts that aren't BANNED\n(mirrors unsuspend's behaviour for the non-suspended case).","operationId":"unban_user_v1_admin_users__user_id__unban_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/dossier":{"post":{"tags":["admin small actions"],"summary":"Export User Dossier","description":"GDPR Article 15 (right of access) metadata bundle for a target\naccount, returned as a JSON file download.\n\nDistinct from `/v1/export`, which is Article 20 (data portability)\nand ships member / journal / front / message *content* in an\nimport-friendly shape. This endpoint ships *metadata*: identity,\nflags, counts, structural state, admin trail. For DSAR cases where\nthe user can't request portability themselves (locked-out account,\ndeceased user with next-of-kin asking).\n\nPrivacy-sensitive read; reason required; writes a\nUSER_DOSSIER_EXPORT audit row before the response goes out so an\naborted-mid-stream request still leaves a trail.\n\nDeliberately does NOT include: member bios / journal entries /\nmessage bodies / front history with content / decrypted blobs.\nThose are the user's own data, served only by their own\nportability export — admins don't get a backdoor to it via DSAR.","operationId":"export_user_dossier_v1_admin_users__user_id__dossier_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/sheaf__api__v1__admin_small_actions__AdminReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/data":{"post":{"tags":["account"],"summary":"Get Account Data","description":"Article 15 (right of access) — everything Sheaf holds about the\nrequesting user account.\n\nDistinct from `/v1/export`, which is Article 20 (data portability) and\nonly includes plural-system content. This endpoint adds account\nidentity, sessions, IPs, API key audit metadata, email delivery\nstate, and other server-derived data that should NEVER ride along\nwith a portable export (info-leak hazard if shared or imported\nelsewhere).\n\nAlways requires password (and TOTP if enrolled), regardless of the\nsystem's `delete_confirmation` setting — this is the highest-value\nread endpoint for an attacker with a hijacked session, so we don't\nlet users opt out of the gate. Method is POST because it carries\ncredentials in the body; semantically it's a read.\n\nExcluded by design (would defeat their security purpose):\n- Password hash\n- TOTP secret\n- Recovery code hashes\n- API key plaintext or hash\n- Session tokens (only metadata)\n- Trusted device tokens (only metadata)","operationId":"get_account_data_v1_account_data_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDataRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/announcements":{"get":{"tags":["admin"],"summary":"List All Announcements","description":"List all announcements (including inactive). Requires admin:read.","operationId":"list_all_announcements_v1_admin_announcements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnnouncementRead"},"title":"Response List All Announcements V1 Admin Announcements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Announcement","description":"Create a new announcement. Requires admin:write.","operationId":"create_announcement_v1_admin_announcements_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/announcements/{announcement_id}":{"patch":{"tags":["admin"],"summary":"Update Announcement","description":"Update an announcement. Requires admin:write.","operationId":"update_announcement_v1_admin_announcements__announcement_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"announcement_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Announcement Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Announcement","description":"Delete an announcement. Requires admin:write.","operationId":"delete_announcement_v1_admin_announcements__announcement_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"announcement_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Announcement Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/announcements":{"get":{"tags":["announcements"],"summary":"Get Active Announcements","description":"Get active announcements for authenticated users.","operationId":"get_active_announcements_v1_announcements_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnnouncementPublic"},"title":"Response Get Active Announcements V1 Announcements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/announcements/public":{"get":{"tags":["announcements"],"summary":"Get Logged Out Announcements","description":"Active announcements flagged visible_while_logged_out — no auth.","operationId":"get_logged_out_announcements_v1_announcements_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AnnouncementPublic"},"type":"array","title":"Response Get Logged Out Announcements V1 Announcements Public Get"}}}}}}},"/v1/settings/client":{"get":{"tags":["client-settings"],"summary":"List Client Settings","description":"List all stored client settings for the current user.","operationId":"list_client_settings_v1_settings_client_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/settings/client/{client_id}":{"get":{"tags":["client-settings"],"summary":"Get Client Settings","description":"Get settings for a specific client. Returns 404 if none stored.","operationId":"get_client_settings_v1_settings_client__client_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["client-settings"],"summary":"Put Client Settings","description":"Store settings for a specific client. Overwrites any existing settings.","operationId":"put_client_settings_v1_settings_client__client_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientSettingsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["client-settings"],"summary":"Patch Client Settings","description":"Merge the given keys into the stored settings for a client.\n\nUnlike PUT (which replaces the whole blob), this does an atomic\ntop-level key merge in a single statement, so independent callers\neach writing their own key can't clobber one another.","operationId":"patch_client_settings_v1_settings_client__client_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientSettingsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["client-settings"],"summary":"Delete Client Settings","description":"Delete stored settings for a specific client.","operationId":"delete_client_settings_v1_settings_client__client_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/systems/me":{"get":{"tags":["systems"],"summary":"Get Own System","operationId":"get_own_system_v1_systems_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["systems"],"summary":"Update Own System","operationId":"update_own_system_v1_systems_me_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/systems/me/delete-confirmation":{"put":{"tags":["systems"],"summary":"Update Delete Confirmation","description":"Update delete confirmation level. Requires password (+ TOTP if enabled).","operationId":"update_delete_confirmation_v1_systems_me_delete_confirmation_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteConfirmationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/systems/{system_id}":{"get":{"tags":["systems"],"summary":"Get System","description":"Fetch a system by id. Owner-only.\n\nThis endpoint used to honour `privacy=public` by returning the full\nowner view of any public system to any authenticated caller — which\nleaked the decrypted private `note` and the `delete_confirmation`\ntier cross-tenant. Nothing consumes a public read path today (the\nweb client only uses /systems/me and there is no discovery surface),\nso cross-tenant reads are closed entirely until public profiles ship\nas a designed feature with a dedicated, fail-closed public schema.\nThe `privacy` field itself is kept and remains user-settable; it just\ngrants nothing yet.","operationId":"get_system_v1_systems__system_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"system_id","in":"path","required":true,"schema":{"type":"string","title":"System Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/system/safety":{"get":{"tags":["system-safety"],"summary":"Get System Safety","operationId":"get_system_safety_v1_system_safety_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSafetyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["system-safety"],"summary":"Update System Safety","operationId":"update_system_safety_v1_system_safety_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSafetyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSafetyUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/system/safety/pending-actions/{pending_id}":{"delete":{"tags":["system-safety"],"summary":"Cancel Pending Action","operationId":"cancel_pending_action_v1_system_safety_pending_actions__pending_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pending Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/system/safety/pending-changes/{change_id}":{"delete":{"tags":["system-safety"],"summary":"Cancel Pending Change","operationId":"cancel_pending_change_v1_system_safety_pending_changes__change_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"change_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Change Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members":{"get":{"tags":["members"],"summary":"List Members","operationId":"list_members_v1_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response List Members V1 Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["members"],"summary":"Create Member","operationId":"create_member_v1_members_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/limit":{"get":{"tags":["members"],"summary":"Member Limit","description":"Effective member cap and current usage for the account.\n\n`limit` of 0 means unlimited (and `remaining` is null). Used by the\nimport flows to warn before an import would blow the cap.","operationId":"member_limit_v1_members_limit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/top-fronters":{"get":{"tags":["members"],"summary":"Top Fronters","description":"Members ranked for a quick-switch list.\n\nPinned members (quick_switch_pin set) come first, in pin order;\neveryone else follows by a recency-weighted fronting score\n(exponential decay, 30-day half-life). Useful for autopopulating a\nstart-front shortcut or a member picker. Returns at most `limit`.","operationId":"top_fronters_v1_members_top_fronters_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":8,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response Top Fronters V1 Members Top Fronters Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}":{"get":{"tags":["members"],"summary":"Get Member","operationId":"get_member_v1_members__member_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["members"],"summary":"Update Member","operationId":"update_member_v1_members__member_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["members"],"summary":"Delete Member","operationId":"delete_member_v1_members__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/tags":{"get":{"tags":["members"],"summary":"Get Member Tags","description":"List the tags this member is currently labelled with.","operationId":"get_member_tags_v1_members__member_id__tags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagRead"},"title":"Response Get Member Tags V1 Members  Member Id  Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["members"],"summary":"Set Member Tags","description":"Replace this member's full tag set with the body-supplied list.\n\nMirrors `PUT /v1/tags/{tag_id}/members` from the other side. Either\nendpoint can be used to manage the m2m; pick whichever matches the\nUI you're in (member-edit form vs tag-management page).","operationId":"set_member_tags_v1_members__member_id__tags_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberTagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagRead"},"title":"Response Set Member Tags V1 Members  Member Id  Tags Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/revisions":{"get":{"tags":["members"],"summary":"List Bio Revisions","operationId":"list_bio_revisions_v1_members__member_id__revisions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentRevisionRead"},"title":"Response List Bio Revisions V1 Members  Member Id  Revisions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/restore-revision":{"post":{"tags":["members"],"summary":"Restore Bio Revision","operationId":"restore_bio_revision_v1_members__member_id__restore_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/pin-revision":{"post":{"tags":["members"],"summary":"Pin Bio Revision","operationId":"pin_bio_revision_v1_members__member_id__pin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentRevisionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/unpin-revision":{"post":{"tags":["members"],"summary":"Unpin Bio Revision","operationId":"unpin_bio_revision_v1_members__member_id__unpin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fronts":{"get":{"tags":["fronts"],"summary":"List Fronts","description":"List front entries newest-first.\n\nPagination: cursor-based (preferred) or offset-based (legacy). When\nmore entries exist beyond the current page, the response carries:\n\n- `X-Sheaf-Has-More: true|false`\n- `X-Sheaf-Next-Cursor: <opaque>` (only when `Has-More` is true)\n\nDetection uses a `limit + 1` probe rather than a separate `COUNT(*)`,\nso the response time stays flat regardless of total history length.","operationId":"list_fronts_v1_fronts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque pagination cursor. Pass the value of `X-Sheaf-Next-Cursor` from the previous response to fetch the next page. When set, `offset` is ignored. Callers should treat the value as a black box.","title":"Cursor"},"description":"Opaque pagination cursor. Pass the value of `X-Sheaf-Next-Cursor` from the previous response to fetch the next page. When set, `offset` is ignored. Callers should treat the value as a black box."},{"name":"include_total","in":"query","required":false,"schema":{"type":"boolean","description":"Opt-in: include `X-Sheaf-Total-Count` header with the total number of entries in the system. Costs one extra COUNT query; set true only when the UI actually renders page numbers.","default":false,"title":"Include Total"},"description":"Opt-in: include `X-Sheaf-Total-Count` header with the total number of entries in the system. Costs one extra COUNT query; set true only when the UI actually renders page numbers."},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FrontRead"},"title":"Response List Fronts V1 Fronts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["fronts"],"summary":"Create Front","operationId":"create_front_v1_fronts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fronts/current":{"get":{"tags":["fronts"],"summary":"Get Current Fronts","operationId":"get_current_fronts_v1_fronts_current_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FrontRead"},"title":"Response Get Current Fronts V1 Fronts Current Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fronts/{front_id}":{"patch":{"tags":["fronts"],"summary":"Update Front","operationId":"update_front_v1_fronts__front_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"front_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Front Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["fronts"],"summary":"Delete Front","operationId":"delete_front_v1_fronts__front_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"front_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Front Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fronts/{front_id}/audit":{"get":{"tags":["fronts"],"summary":"List Front Audit","description":"Return audit rows for a front entry, newest first.\n\nGated by `fronts:read` (router-level dep). The audit log is\nsystem-internal; same caller can read the live entry, so the audit\nrows reveal nothing further. Hard-deleted with the entry via\nON DELETE CASCADE on front_id.","operationId":"list_front_audit_v1_fronts__front_id__audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"front_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Front Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FrontAuditEventRead"},"title":"Response List Front Audit V1 Fronts  Front Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics/fronting":{"get":{"tags":["analytics"],"summary":"Fronting Analytics","description":"Per-member fronting summary over the requested window.\n\nDefaults: `until` = now, `since` = until - 30 days, `tz` = UTC.\nThe window is clamped to 5 years; past that, paginate by year and\ncombine client-side.\n\nCo-fronting double-counts: if Alice and Bob co-front for an hour,\nboth see +3600 seconds. This matches the reading users expect for\n\"how much did Alice front this month\".","operationId":"fronting_analytics_v1_analytics_fronting_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"UTC","title":"Tz"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontingAnalytics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/groups":{"get":{"tags":["groups"],"summary":"List Groups","operationId":"list_groups_v1_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupRead"},"title":"Response List Groups V1 Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["groups"],"summary":"Create Group","operationId":"create_group_v1_groups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/groups/{group_id}":{"get":{"tags":["groups"],"summary":"Get Group","operationId":"get_group_v1_groups__group_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["groups"],"summary":"Update Group","operationId":"update_group_v1_groups__group_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["groups"],"summary":"Delete Group","operationId":"delete_group_v1_groups__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/groups/{group_id}/members":{"get":{"tags":["groups"],"summary":"Get Group Members","operationId":"get_group_members_v1_groups__group_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response Get Group Members V1 Groups  Group Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["groups"],"summary":"Set Group Members","operationId":"set_group_members_v1_groups__group_id__members_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response Set Group Members V1 Groups  Group Id  Members Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags":{"get":{"tags":["tags"],"summary":"List Tags","operationId":"list_tags_v1_tags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagRead"},"title":"Response List Tags V1 Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tags"],"summary":"Create Tag","operationId":"create_tag_v1_tags_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags/{tag_id}":{"get":{"tags":["tags"],"summary":"Get Tag","operationId":"get_tag_v1_tags__tag_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tags"],"summary":"Update Tag","operationId":"update_tag_v1_tags__tag_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tags"],"summary":"Delete Tag","operationId":"delete_tag_v1_tags__tag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags/{tag_id}/members":{"get":{"tags":["tags"],"summary":"Get Tag Members","operationId":"get_tag_members_v1_tags__tag_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response Get Tag Members V1 Tags  Tag Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tags"],"summary":"Set Tag Members","description":"Replace the tag's full member set with the body-supplied list.\n\nMirrors `PUT /v1/groups/{group_id}/members` — full-replace semantics\nkeep the API symmetric and avoid subtle bugs around partial updates.\nFor a single add/remove, the caller should fetch first and re-PUT.","operationId":"set_tag_members_v1_tags__tag_id__members_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberRead"},"title":"Response Set Tag Members V1 Tags  Tag Id  Members Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fields":{"get":{"tags":["custom fields"],"summary":"List Fields","operationId":"list_fields_v1_fields_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldRead"},"title":"Response List Fields V1 Fields Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["custom fields"],"summary":"Create Field","operationId":"create_field_v1_fields_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fields/{field_id}":{"get":{"tags":["custom fields"],"summary":"Get Field","operationId":"get_field_v1_fields__field_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Field Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["custom fields"],"summary":"Update Field","operationId":"update_field_v1_fields__field_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Field Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["custom fields"],"summary":"Delete Field","operationId":"delete_field_v1_fields__field_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"field_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Field Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{member_id}/fields":{"get":{"tags":["custom fields"],"summary":"Get Member Field Values","operationId":"get_member_field_values_v1_members__member_id__fields_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueRead"},"title":"Response Get Member Field Values V1 Members  Member Id  Fields Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["custom fields"],"summary":"Set Member Field Values","operationId":"set_member_field_values_v1_members__member_id__fields_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueSet"},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueRead"},"title":"Response Set Member Field Values V1 Members  Member Id  Fields Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals":{"get":{"tags":["journals"],"summary":"List Journals","description":"Cursor-paginated list of journal entries.\n\nFilter rules:\n  - system_only=true → only entries with member_id IS NULL\n  - member_id=<uuid> → only that member's entries\n  - neither → all entries owned by the user's system\n\nPagination uses an opaque (created_at, id) cursor so entries sharing\na created_at can't be skipped or duplicated across page boundaries.","operationId":"list_journals_v1_journals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Member Id"}},{"name":"system_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"System Only"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["journals"],"summary":"Create Entry","operationId":"create_entry_v1_journals_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals/{entry_id}":{"get":{"tags":["journals"],"summary":"Get Entry","operationId":"get_entry_v1_journals__entry_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryReadWithCount"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["journals"],"summary":"Patch Entry","operationId":"patch_entry_v1_journals__entry_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["journals"],"summary":"Delete Entry","operationId":"delete_entry_v1_journals__entry_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/JournalEntryDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals/{entry_id}/revisions":{"get":{"tags":["journals"],"summary":"List Revisions","operationId":"list_revisions_v1_journals__entry_id__revisions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentRevisionRead"},"title":"Response List Revisions V1 Journals  Entry Id  Revisions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals/{entry_id}/restore-revision":{"post":{"tags":["journals"],"summary":"Restore Revision","operationId":"restore_revision_v1_journals__entry_id__restore_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalEntryRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals/{entry_id}/pin-revision":{"post":{"tags":["journals"],"summary":"Pin Journal Revision","operationId":"pin_journal_revision_v1_journals__entry_id__pin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentRevisionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/journals/{entry_id}/unpin-revision":{"post":{"tags":["journals"],"summary":"Unpin Journal Revision","operationId":"unpin_journal_revision_v1_journals__entry_id__unpin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/retention":{"get":{"tags":["retention"],"summary":"Get Retention","operationId":"get_retention_v1_retention_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["retention"],"summary":"Update Retention","operationId":"update_retention_v1_retention_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/retention/trim-notice/{notice_id}":{"delete":{"tags":["retention"],"summary":"Cancel Trim Notice","description":"Cancel a pending trim notice. Rare — usually cancelled implicitly by\nre-upgrade (`on_tier_change`).","operationId":"cancel_trim_notice_v1_retention_trim_notice__notice_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notice Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export":{"get":{"tags":["export"],"summary":"Export All","description":"Export the user's plural-system content as JSON. Article 20 — data\nportability. Re-importable into another Sheaf instance.\n\nExcludes account-identity data (email, sessions, API keys, IPs) — that\nlives in the separate /v1/account/data endpoint (Article 15).","operationId":"export_all_v1_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export/jobs":{"post":{"tags":["export"],"summary":"Create Export Job","description":"Enqueue an async export job. Worker builds the zip in the\nbackground; the user polls or waits for the email/banner.\n\nStep-up requires password (and TOTP if enrolled) regardless of the\nsystem's `delete_confirmation` setting — async export is the highest-\nvolume read endpoint we have, and the build worker delivers the file\nto whatever session ends up downloading it. Refuses API-key auth so\na leaked key can't trigger an unattended bulk extraction.","operationId":"create_export_job_v1_export_jobs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJobRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["export"],"summary":"List Export Jobs","description":"List the caller's export jobs, newest first.","operationId":"list_export_jobs_v1_export_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export/jobs/{job_id}":{"get":{"tags":["export"],"summary":"Get Export Job","operationId":"get_export_job_v1_export_jobs__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export/jobs/{job_id}/download":{"get":{"tags":["export"],"summary":"Download Export Job","description":"Stream the export artefact (filesystem) or 302 to a presigned URL\n(S3). Job must belong to the caller and be DONE + not yet expired.\n\nDownload is gated by the normal session/JWT auth — the step-up at\nenqueue time is what protects against drive-by extraction; the\ndownload itself is just retrieving an already-built artefact.","operationId":"download_export_job_v1_export_jobs__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/upload":{"post":{"tags":["files"],"summary":"Upload File","operationId":"upload_file_v1_files_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"purpose","in":"query","required":false,"schema":{"type":"string","pattern":"^(avatar|bio|banner)$","default":"avatar","title":"Purpose"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_v1_files_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/usage":{"get":{"tags":["files"],"summary":"Get Usage","description":"Return the user's current storage usage and quota.","operationId":"get_usage_v1_files_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/list":{"get":{"tags":["files"],"summary":"List Files","description":"List all uploaded files for the current user.","operationId":"list_files_v1_files_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/{file_id}/references":{"get":{"tags":["files"],"summary":"Get File References","description":"List everywhere an uploaded file is currently referenced (member\navatars/bios, system avatar, journal entries, and edit history). An empty\nlist means the file is an orphan. Lets the owner see what a delete would\nbreak before confirming it.","operationId":"get_file_references_v1_files__file_id__references_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/{file_id}":{"delete":{"tags":["files"],"summary":"Delete File","description":"Delete a specific uploaded file. Subject to System Safety image-delete\ngrace + re-auth when the `images` category is enabled.","operationId":"delete_file_v1_files__file_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/cleanup":{"post":{"tags":["files"],"summary":"Cleanup Files","description":"Delete orphaned files and reclaim storage quota.","operationId":"cleanup_files_v1_files_cleanup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/cleanup/dry-run":{"post":{"tags":["files"],"summary":"Cleanup Dry Run","description":"Preview what would be cleaned up without deleting anything.","operationId":"cleanup_dry_run_v1_files_cleanup_dry_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/simplyplural/preview":{"post":{"tags":["import"],"summary":"Preview Import","description":"Parse an SP export file and return a summary of importable data.","operationId":"preview_import_v1_import_simplyplural_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_import_v1_import_simplyplural_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SPPreviewSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/pluralkit/preview":{"post":{"tags":["import"],"summary":"Preview File Import","description":"Parse a PK export file and return a summary.","operationId":"preview_file_import_v1_import_pluralkit_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_file_import_v1_import_pluralkit_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PKPreviewSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/pluralkit-api/preview":{"post":{"tags":["import"],"summary":"Preview Api Import","description":"Preview an import by reading from the PluralKit API directly.\n\nThe token is request-scoped: we use it for a single round-trip to\nfetch the system + members + groups + a single page of switches, and\ndrop it on response. Nothing is logged, nothing persisted.","operationId":"preview_api_import_v1_import_pluralkit_api_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PKApiPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PKPreviewSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/sheaf/preview":{"post":{"tags":["import"],"summary":"Preview Import","description":"Parse a Sheaf export (JSON or with-images zip) and summarise it.","operationId":"preview_import_v1_import_sheaf_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_import_v1_import_sheaf_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/tupperbox/preview":{"post":{"tags":["import"],"summary":"Preview File Import","description":"Parse a Tupperbox export file and return a summary.","operationId":"preview_file_import_v1_import_tupperbox_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_file_import_v1_import_tupperbox_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TBPreviewSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/pluralspace/preview":{"post":{"tags":["import"],"summary":"Preview Pluralspace Import","description":"Open a PluralSpace export zip and return a counts summary.","operationId":"preview_pluralspace_import_v1_import_pluralspace_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_pluralspace_import_v1_import_pluralspace_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/prism/preview":{"post":{"tags":["import"],"summary":"Preview Prism Import","description":"Decrypt a PRISM1 envelope and return a counts summary.\n\nFailures (wrong passphrase, malformed envelope, truncated file)\nsurface as 400 with the parser's user-facing message.","operationId":"preview_prism_import_v1_import_prism_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_prism_import_v1_import_prism_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/imports/file":{"post":{"tags":["imports"],"summary":"Create File Import","description":"Enqueue a file-based import. Returns 202 + the newly-created\njob row (or the existing one if `idempotency_key` matches).\n\nThe file is read into memory once, sanity-checked for size, and\nhanded to the storage backend under the imports/ prefix. The\nrunner picks the job up on its next tick and walks the payload.\n\n`options` is a JSON-encoded form field — source-specific shape.\n\n`credential` is an optional per-source secret (currently only used\nby Prism's PRISM1 envelope passphrase). When set, it is encrypted\nat rest in `payload_metadata.encrypted_credential` using\nSHEAF_ENCRYPTION_KEY and wiped by the runner at terminal state,\nmirroring the PluralKit API token flow.","operationId":"create_file_import_v1_imports_file_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_file_import_v1_imports_file_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/imports/api":{"post":{"tags":["imports"],"summary":"Create Api Import","description":"Enqueue a credential-based import (currently PluralKit API).\n\nThe token is encrypted at rest in payload_metadata while the job\nruns and gets wiped at finalize time, so a post-completion DB dump\ncan't leak it.","operationId":"create_api_import_v1_imports_api_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportApiCreateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/imports":{"get":{"tags":["imports"],"summary":"List Imports","description":"List the current user's imports, most-recent first.\n\nExcludes archived rows by default — the UI shows them via a\nseparate \"show archived\" toggle.\n\nCursor pagination: when the response carries a `next_cursor`, pass\nit back as the `cursor` query param to fetch the next page. The\ncursor is the ISO timestamp of the last row on the current page;\nthe next page is everything strictly older than it.","operationId":"list_imports_v1_imports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/imports/{job_id}":{"get":{"tags":["imports"],"summary":"Get Import","operationId":"get_import_v1_imports__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["imports"],"summary":"Cancel Or Archive Import","description":"For pending jobs: cancel before the runner picks them up.\nFor terminal jobs (complete / failed / cancelled): archive — they\ndrop out of the default history list. Running jobs can't be\ncancelled mid-flight in v1; user has to wait for the runner to\nfinish or fail.","operationId":"cancel_or_archive_import_v1_imports__job_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/sendgrid/events":{"post":{"tags":["webhooks"],"summary":"Sendgrid Events","description":"Receive SendGrid Event Webhook callbacks for bounces and complaints.\n\nAuthentication: when `sendgrid_webhook_public_key` is configured the\nrequest must carry a valid Signed Event Webhook signature with a fresh\ntimestamp (replay defence). Otherwise it falls back to the legacy\nquery-string shared-secret token — deprecated; enable signing instead.","operationId":"sendgrid_events_v1_webhooks_sendgrid_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks/smtp2go/events":{"post":{"tags":["webhooks"],"summary":"Smtp2Go Events","description":"Receive SMTP2GO webhook callbacks for delivery/bounce/spam events.\n\nSMTP2GO does not sign payloads (no HMAC), so the endpoint is guarded\nby a shared secret in the URL: configure the SMTP2GO webhook to POST\nto /v1/webhooks/smtp2go/events?token=<secret> with JSON output.\nWhen no secret is configured the endpoint returns 404. Feeds the\nsame deliverability lifecycle (apply_bounce / apply_complaint /\napply_delivered) as the SES and SendGrid handlers.\n\nAccepts either webhook output type: JSON (single object or array) or\nform-encoded (a single event). SMTP2GO usually posts one event per\nrequest.","operationId":"smtp2go_events_v1_webhooks_smtp2go_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/systems/{system_id}/watch-tokens":{"post":{"tags":["notifications"],"summary":"Create Watch Token","operationId":"create_watch_token_v1_systems__system_id__watch_tokens_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"system_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"System Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchTokenCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchTokenRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["notifications"],"summary":"List Watch Tokens","operationId":"list_watch_tokens_v1_systems__system_id__watch_tokens_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"system_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"System Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WatchTokenRead"},"title":"Response List Watch Tokens V1 Systems  System Id  Watch Tokens Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watch-tokens/{token_id}":{"get":{"tags":["notifications"],"summary":"Get Watch Token","operationId":"get_watch_token_v1_watch_tokens__token_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchTokenRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["notifications"],"summary":"Update Watch Token","operationId":"update_watch_token_v1_watch_tokens__token_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchTokenUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchTokenRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notifications"],"summary":"Revoke Watch Token","description":"Soft-revoke. Channels remain in the DB but the dispatcher will skip\nthem. Owner can revoke and re-issue a fresh token if a recipient\nrelationship has gone bad.","operationId":"revoke_watch_token_v1_watch_tokens__token_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/WatchTokenRevokeConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watch-tokens/{token_id}/channels":{"post":{"tags":["notifications"],"summary":"Create Channel","operationId":"create_channel_v1_watch_tokens__token_id__channels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["notifications"],"summary":"List Channels","operationId":"list_channels_v1_watch_tokens__token_id__channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Token Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelRead"},"title":"Response List Channels V1 Watch Tokens  Token Id  Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels":{"get":{"tags":["notifications"],"summary":"List All Channels","description":"Flat list of every notification channel in the user's system.\n\nThe per-token list endpoint above is the right shape for the\nnotifications UI (which is grouped by watch token); this flat view\nis the right shape for the reminders UI, which doesn't care about\ntokens — it just needs to pick a destination. Same auth model:\nyou only see channels under your own non-revoked watch tokens.","operationId":"list_all_channels_v1_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelRead"},"title":"Response List All Channels V1 Channels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}":{"get":{"tags":["notifications"],"summary":"Get Channel","operationId":"get_channel_v1_channels__channel_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["notifications"],"summary":"Update Channel","operationId":"update_channel_v1_channels__channel_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notifications"],"summary":"Delete Channel","operationId":"delete_channel_v1_channels__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChannelDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/enable":{"post":{"tags":["notifications"],"summary":"Enable Channel","description":"Re-activate a disabled channel.\n\nRe-enable on a `pending_registration` channel is a no-op (the activation\nflow is what flips it to active). Disabled channels (whether unsubscribed\nby the recipient, paused by the owner, or auto-disabled after a permanent\ndelivery failure) flip back to active.","operationId":"enable_channel_v1_channels__channel_id__enable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/disable":{"post":{"tags":["notifications"],"summary":"Disable Channel","description":"Pause a channel without deleting it. Stops dispatch immediately;\nre-enable later to resume.","operationId":"disable_channel_v1_channels__channel_id__disable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/duplicate":{"post":{"tags":["notifications"],"summary":"Duplicate Channel","operationId":"duplicate_channel_v1_channels__channel_id__duplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/reissue-activation":{"post":{"tags":["notifications"],"summary":"Reissue Activation","operationId":"reissue_activation_v1_channels__channel_id__reissue_activation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReissueActivationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/test":{"post":{"tags":["notifications"],"summary":"Send Test","operationId":"send_test_v1_channels__channel_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestDispatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/preview":{"post":{"tags":["notifications"],"summary":"Preview Channel","description":"Resolve every member of the system against the channel's filter and\nreturn the included/excluded split with attribution.\n\nIf `body` is provided, it overrides the channel's stored config in-memory\nonly, used by the frontend's live preview while the owner edits.","operationId":"preview_channel_v1_channels__channel_id__preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChannelUpdate"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/group-rules":{"post":{"tags":["notifications"],"summary":"Add Group Rule","operationId":"add_group_rule_v1_channels__channel_id__group_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupRuleSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/group-rules/{group_id}":{"delete":{"tags":["notifications"],"summary":"Remove Group Rule","operationId":"remove_group_rule_v1_channels__channel_id__group_rules__group_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/member-rules":{"post":{"tags":["notifications"],"summary":"Add Member Rule","operationId":"add_member_rule_v1_channels__channel_id__member_rules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRuleSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/channels/{channel_id}/member-rules/{member_id}":{"delete":{"tags":["notifications"],"summary":"Remove Member Rule","operationId":"remove_member_rule_v1_channels__channel_id__member_rules__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/server-config":{"get":{"tags":["notifications"],"summary":"Get Notifications Server Config","description":"Public-shape config the channel-creation UI needs to render correctly.\n\nSurfaces the shared-app debounce floor + whether a deployment-wide\nPushover app token is configured. The UI uses this to set the\ndebounce_seconds input's minimum and decide whether to require a BYO\napp_token. No secrets here — just operator-set policy that recipients\nwill hit at submit time anyway.","operationId":"get_notifications_server_config_v1_notifications_server_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/pushover-usage":{"get":{"tags":["notifications"],"summary":"Get My Pushover Usage","description":"Current month's shared-app Pushover usage for the calling user.\n\nCounts only deliveries that hit the deployment's shared app token.\nBYO channels (recipient supplied their own destination_config.app_token)\naren't tracked here — they're on the recipient's own Pushover quota.","operationId":"get_my_pushover_usage_v1_notifications_pushover_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/receiving":{"get":{"tags":["notifications"],"summary":"List Receiving","description":"List channels currently delivering to this account.","operationId":"list_receiving_v1_notifications_receiving_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReceivingChannelView"},"title":"Response List Receiving V1 Notifications Receiving Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/receiving/{channel_id}/unsubscribe":{"post":{"tags":["notifications"],"summary":"Unsubscribe Receiving","description":"Disable a channel that delivers to this account.\n\nSame effect as the capability-URL unsubscribe (`destination_state =\n'disabled'`), but the auth check is the user's session matching\n`redeemed_by_account_id`. The owner sees the channel disabled but isn't\ntold who unsubscribed or when.","operationId":"unsubscribe_receiving_v1_notifications_receiving__channel_id__unsubscribe_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/redeem-preview":{"get":{"tags":["notifications-public"],"summary":"Preview Activation","description":"Read-only preview of the channel a code would redeem.\n\nUsed by the public redeem page to branch its UI on destination_type\n(web push runs the in-browser permission + subscribe flow; mobile\npush hands off to the native app via the `sheaf://` deep link). Does\nnot consume the code; the next POST /redeem still works.\n\nReveals strictly less information than redemption itself — anyone\nholding the code can redeem the channel, so leaking the channel\nname and system label to the same caller is fine.","operationId":"preview_activation_v1_notifications_redeem_preview_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/redeem":{"post":{"tags":["notifications-public"],"summary":"Redeem Activation","operationId":"redeem_activation_v1_notifications_redeem_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/manage/{mgmt_token}":{"get":{"tags":["notifications-public"],"summary":"View Managed","operationId":"view_managed_v1_notifications_manage__mgmt_token__get","parameters":[{"name":"mgmt_token","in":"path","required":true,"schema":{"type":"string","title":"Mgmt Token"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageChannelView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/manage/{mgmt_token}/unsubscribe":{"post":{"tags":["notifications-public"],"summary":"Unsubscribe","operationId":"unsubscribe_v1_notifications_manage__mgmt_token__unsubscribe_post","parameters":[{"name":"mgmt_token","in":"path","required":true,"schema":{"type":"string","title":"Mgmt Token"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reminders":{"get":{"tags":["reminders"],"summary":"List Reminders","operationId":"list_reminders_v1_reminders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReminderRead"},"title":"Response List Reminders V1 Reminders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["reminders"],"summary":"Create Reminder","operationId":"create_reminder_v1_reminders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reminders/{reminder_id}":{"get":{"tags":["reminders"],"summary":"Get Reminder","operationId":"get_reminder_v1_reminders__reminder_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Reminder Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["reminders"],"summary":"Update Reminder","operationId":"update_reminder_v1_reminders__reminder_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Reminder Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReminderRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["reminders"],"summary":"Delete Reminder","description":"Delete a reminder.\n\nReuses the System Safety machinery for delete protection: when the\nnotifications safety category is enabled with a non-zero grace\nperiod, the delete is queued as a pending action and executed by\nthe background finalizer. Step-up auth (password / TOTP) gates the\nrequest via `verify_destructive_auth`, matching the behaviour of\nnotification channel deletion.","operationId":"delete_reminder_v1_reminders__reminder_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Reminder Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reminders/{reminder_id}/next-fire":{"get":{"tags":["reminders"],"summary":"Get Next Fire","description":"Return the next scheduled fire time, useful for UI previews\nof cron expressions and structured schedules.","operationId":"get_next_fire_v1_reminders__reminder_id__next_fire_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reminder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Reminder Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Next Fire V1 Reminders  Reminder Id  Next Fire Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/devices/push":{"post":{"tags":["devices"],"summary":"Register Push Device","description":"Register or refresh a push token for the calling account.\n\nThree update paths, in priority order:\n\n1. Exact match on (account, platform, token): bump last_seen_at\n   and update app_version / install_id. Idempotent.\n2. install_id match with a stale token: treat as rotation —\n   overwrite the existing row's token in place. This avoids\n   leaking dead rows when the platform issues a fresh token for\n   the same install (FCM `onNewToken`, APNs delegate re-register).\n3. Otherwise: insert a new row, evicting the oldest-`last_seen_at`\n   row first if the per-account soft cap is hit.","operationId":"register_push_device_v1_devices_push_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDeviceRegisterRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDeviceRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["devices"],"summary":"Delete Push Device","description":"Drop a push token. Called by the client on logout.\n\nIdempotent: deleting a token that doesn't exist (already evicted by\nthe LRU cap, lazily reaped via 410, etc.) returns 204 anyway. We\ndelete by (account_id, token) regardless of platform, so a single\nDELETE clears all platforms for the same token (in practice tokens\nare platform-specific so this is just defense-in-depth).","operationId":"delete_push_device_v1_devices_push_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDeviceDeleteRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["devices"],"summary":"List Push Devices","description":"List the calling account's registered push devices.\n\nTokens are NOT returned — the client gets metadata only (platform,\ninstall_id, app_version, timestamps), enough to render a \"your\ndevices\" list with a remove button.","operationId":"list_push_devices_v1_devices_push_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PushDeviceRead"},"title":"Response List Push Devices V1 Devices Push Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/devices/push/{device_id}":{"patch":{"tags":["devices"],"summary":"Update Push Device","description":"Update a device's `enabled` flag or `label`. Recipient-facing —\nedited from the Receiving tab's device list. Other fields (token,\nplatform, install_id) come from the mobile app at registration and\naren't user-editable.\n\nAccount-scoped: a device row belonging to another user 404s,\nmatching the rest of the per-account ownership pattern.","operationId":"update_push_device_v1_devices_push__device_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Device Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDeviceUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushDeviceRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["devices"],"summary":"Delete Push Device By Id","description":"Recipient-side: drop a device by its id (from the Receiving\ntab's device list). The token-based DELETE above stays for the\nmobile app's logout flow; this one is for the web UI which has\nno access to the raw token.","operationId":"delete_push_device_by_id_v1_devices_push__device_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Device Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls/server-config":{"get":{"tags":["polls"],"summary":"Get Server Config","description":"Effective per-tier limits for the calling user.\n\nSurfaces the values the backend will enforce on `POST /polls` so\nthe frontend can clamp the create form inputs (max close window,\nmax retention days, max concurrent open polls) and decide when to\nshow upsell hints. Mirrors the shape of `/notifications/server-config`.","operationId":"get_server_config_v1_polls_server_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls":{"get":{"tags":["polls"],"summary":"List Polls","operationId":"list_polls_v1_polls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PollRead"},"title":"Response List Polls V1 Polls Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["polls"],"summary":"Create Poll","operationId":"create_poll_v1_polls_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls/{poll_id}":{"get":{"tags":["polls"],"summary":"Get Poll","operationId":"get_poll_v1_polls__poll_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"poll_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Poll Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["polls"],"summary":"Delete Poll","description":"Delete a poll.\n\nMirrors the destructive-action pattern used elsewhere: step-up auth\nvia `verify_destructive_auth`, optional pending-action queue when\nSystem Safety has the polls category turned on with a non-zero grace\nperiod.","operationId":"delete_poll_v1_polls__poll_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"poll_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Poll Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls/{poll_id}/votes":{"post":{"tags":["polls"],"summary":"Cast Vote","operationId":"cast_vote_v1_polls__poll_id__votes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"poll_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Poll Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteCast"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollVoteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls/{poll_id}/votes/{voted_as_member_id}":{"delete":{"tags":["polls"],"summary":"Withdraw Vote Endpoint","operationId":"withdraw_vote_endpoint_v1_polls__poll_id__votes__voted_as_member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"poll_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Poll Id"}},{"name":"voted_as_member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Voted As Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/polls/{poll_id}/audit":{"get":{"tags":["polls"],"summary":"Get Audit Log","description":"Audit log of every cast/change/withdraw on this poll.\n\nVisibility tracks the tally: hidden until close on `end_only` polls\n(otherwise the count of `cast` events leaks the running total) and\navailable for the lifetime of the poll on `live` polls. After close\nthe log is always visible until retention expires.","operationId":"get_audit_log_v1_polls__poll_id__audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"poll_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Poll Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollAuditRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/boards":{"get":{"tags":["messages"],"summary":"Get Boards","description":"Members-tab listing: system board + every member's wall, ordered\nby most-recent message.\n\n`caller_member_id` (optional query param) is the perspective for\nunread counts. Pass the currently-fronting member's id to drive the\nin-app sidebar badge and the \"new messages on Bob's wall\" prompts.\nWithout it, unread counts are zero (the rest of the response is\nstill useful — it's the directory of boards).","operationId":"get_boards_v1_messages_boards_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"caller_member_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Caller Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BoardSummary"},"title":"Response Get Boards V1 Messages Boards Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages":{"get":{"tags":["messages"],"summary":"Get Board","description":"Paginated message list for a single board.\n\nReturns the most recent `limit` messages (default 100, capped at\n500). Use `before` for the next page — messages older than that\ntimestamp.\n\n`caller_member_id` doesn't gate access (the system owner sees\neverything regardless), but its `last_seen_at` is included in the\nresponse so the client can render unread markers without a second\nrequest.","operationId":"get_board_v1_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"board_kind","in":"query","required":true,"schema":{"type":"string","title":"Board Kind"}},{"name":"board_member_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"}},{"name":"caller_member_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Caller Member Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["messages"],"summary":"Post Message","operationId":"post_message_v1_messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/unread":{"get":{"tags":["messages"],"summary":"Get Unread","description":"Sidebar badge data — total unread count plus per-board breakdown\nfrom the supplied caller member's perspective.","operationId":"get_unread_v1_messages_unread_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"caller_member_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Caller Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCounts"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/front-start-prompt":{"get":{"tags":["messages"],"summary":"Get Front Start Prompt","description":"Returns the boards a just-fronted member should be prompted\nabout, based on their `notify_on_front_*` opt-ins. Empty list\nmeans \"no prompt to show\".","operationId":"get_front_start_prompt_v1_messages_front_start_prompt_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontStartPrompt"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/mark-seen":{"post":{"tags":["messages"],"summary":"Mark Seen","operationId":"mark_seen_v1_messages_mark_seen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkSeenRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}":{"patch":{"tags":["messages"],"summary":"Edit Message","description":"Edit a message body. Captures a content revision before\noverwriting, with the same auto-pin semantics journals/bios use.\n\nPer the v1 design, any logged-in session can edit any message —\nmembers don't have credentials, so per-author checks are a fiction.\nEdits are fully tracked in revision history regardless.","operationId":"edit_message_v1_messages__message_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["messages"],"summary":"Delete Message","description":"Delete a single message. Replies are left in place and render\nwith `[deleted]` as the parent. Use `/thread` for a cascade delete.","operationId":"delete_message_v1_messages__message_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/thread":{"delete":{"tags":["messages"],"summary":"Delete Thread","description":"Cascade-delete a message and every descendant in its reply\nchain. Separate operation from single-message delete so a future\nSystem Safety v2 can gate the two with different auth tiers.","operationId":"delete_thread_v1_messages__message_id__thread_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemberDeleteConfirm"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/revisions":{"get":{"tags":["messages"],"summary":"List Revisions","operationId":"list_revisions_v1_messages__message_id__revisions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ContentRevisionRead"},"title":"Response List Revisions V1 Messages  Message Id  Revisions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/restore-revision":{"post":{"tags":["messages"],"summary":"Restore Revision","operationId":"restore_revision_v1_messages__message_id__restore_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/pin-revision":{"post":{"tags":["messages"],"summary":"Pin Message Revision","operationId":"pin_message_revision_v1_messages__message_id__pin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentRevisionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/unpin-revision":{"post":{"tags":["messages"],"summary":"Unpin Message Revision","operationId":"unpin_message_revision_v1_messages__message_id__unpin_revision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpinRevisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/notify-settings/{member_id}":{"get":{"tags":["messages"],"summary":"Get Notify Settings","operationId":"get_notify_settings_v1_messages_notify_settings__member_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyOnFrontSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["messages"],"summary":"Set Notify Settings","operationId":"set_notify_settings_v1_messages_notify_settings__member_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}},{"name":"sheaf_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sheaf Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyOnFrontSettings"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyOnFrontSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/{path}":{"get":{"tags":["files"],"summary":"Serve File","description":"Serve a file.\n\nSigned mode (default): requires a valid HMAC token + expiry query params.\n  S3: redirects to a short-lived presigned URL (cached in Redis).\n  Filesystem: serves bytes directly after token validation.\n\nUnsigned mode: no token required.\n  S3: redirects to the direct public S3 URL (bucket must be public).\n  Filesystem: serves bytes directly.\n\nCDN mode (S3 + s3_public_url): URLs bypass this endpoint entirely —\n  resolve_avatar_url returns a CDN URL directly. This endpoint is not\n  reached in normal operation for that case.","operationId":"serve_file_v1_files__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"expires","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountDataRequest":{"properties":{"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["password"],"title":"AccountDataRequest"},"AdminAuditEventRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"admin_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Admin User Id"},"admin_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Email"},"action":{"type":"string","title":"Action"},"target_type":{"type":"string","title":"Target Type"},"target_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Id"},"target_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target User Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"before_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Before Json"},"after_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"After Json"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","admin_user_id","admin_email","action","target_type","target_id","target_user_id","reason","before_json","after_json","created_at"],"title":"AdminAuditEventRead","description":"Single audit-log row as returned by /v1/admin/audit-events."},"AdminChangeEmailRequest":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"},"new_email":{"type":"string","title":"New Email"}},"type":"object","required":["reason","new_email"],"title":"AdminChangeEmailRequest"},"AdminResetPasswordRequest":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"},"new_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Password"}},"type":"object","required":["reason"],"title":"AdminResetPasswordRequest"},"AdminStepUpVerify":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"AdminStepUpVerify"},"AdminUserRead":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier"},"is_admin":{"type":"boolean","title":"Is Admin"},"account_status":{"type":"string","title":"Account Status"},"email_verified":{"type":"boolean","title":"Email Verified"},"totp_enabled":{"type":"boolean","title":"Totp Enabled"},"signup_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Ip"},"member_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Limit"},"storage_used_bytes":{"type":"integer","title":"Storage Used Bytes"},"member_count":{"type":"integer","title":"Member Count"},"can_upload_images":{"type":"boolean","title":"Can Upload Images"},"can_upload_animated_images":{"type":"boolean","title":"Can Upload Animated Images"},"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"},"suspended_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Suspended Until"},"suspended_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspended Reason"}},"type":"object","required":["id","email","tier","is_admin","account_status","email_verified","totp_enabled","signup_ip","member_limit","storage_used_bytes","member_count","can_upload_images","can_upload_animated_images","created_at","last_login_at","suspended_until","suspended_reason"],"title":"AdminUserRead"},"AdminUserUpdate":{"properties":{"tier":{"anyOf":[{"$ref":"#/components/schemas/UserTier"},{"type":"null"}]},"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"},"member_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Limit"},"clear_member_limit":{"type":"boolean","title":"Clear Member Limit","default":false},"can_upload_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Upload Images"},"can_upload_animated_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Upload Animated Images"}},"type":"object","title":"AdminUserUpdate"},"AnnouncementCreate":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"body":{"type":"string","maxLength":2000,"title":"Body"},"severity":{"type":"string","pattern":"^(info|warning|critical)$","title":"Severity","default":"info"},"dismissible":{"type":"boolean","title":"Dismissible","default":true},"active":{"type":"boolean","title":"Active","default":true},"visible_while_logged_out":{"type":"boolean","title":"Visible While Logged Out","default":false},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["title","body"],"title":"AnnouncementCreate"},"AnnouncementPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"severity":{"type":"string","title":"Severity"},"dismissible":{"type":"boolean","title":"Dismissible"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","body","severity","dismissible","starts_at","expires_at","created_at"],"title":"AnnouncementPublic","description":"Public-facing schema — no admin metadata."},"AnnouncementRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"severity":{"type":"string","title":"Severity"},"dismissible":{"type":"boolean","title":"Dismissible"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"active":{"type":"boolean","title":"Active"},"visible_while_logged_out":{"type":"boolean","title":"Visible While Logged Out"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","title","body","severity","dismissible","starts_at","expires_at","created_at","active","visible_while_logged_out","created_by","updated_at"],"title":"AnnouncementRead","description":"Admin schema — includes internal fields."},"AnnouncementUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Body"},"severity":{"anyOf":[{"type":"string","pattern":"^(info|warning|critical)$"},{"type":"null"}],"title":"Severity"},"dismissible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dismissible"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"visible_while_logged_out":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible While Logged Out"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"clear_starts_at":{"type":"boolean","title":"Clear Starts At","default":false},"clear_expires_at":{"type":"boolean","title":"Clear Expires At","default":false}},"type":"object","title":"AnnouncementUpdate"},"ApiKeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["name","scopes"],"title":"ApiKeyCreate"},"ApiKeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","scopes","last_used_at","expires_at","created_at","key"],"title":"ApiKeyCreated"},"ApiKeyRead":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","scopes","last_used_at","expires_at","created_at"],"title":"ApiKeyRead"},"BoardSummary":{"properties":{"board_kind":{"type":"string","title":"Board Kind"},"board_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Name"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"last_message_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Message Preview"},"message_count":{"type":"integer","title":"Message Count"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["board_kind","board_member_id","member_name","last_message_at","last_message_preview","message_count","unread_count"],"title":"BoardSummary","description":"One entry in the Members tab listing on /messages."},"Body_create_file_import_v1_imports_file_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"source":{"type":"string","title":"Source"},"idempotency_key":{"type":"string","format":"uuid","title":"Idempotency Key"},"options":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Options"},"credential":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential"}},"type":"object","required":["file","source","idempotency_key"],"title":"Body_create_file_import_v1_imports_file_post"},"Body_preview_file_import_v1_import_pluralkit_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_file_import_v1_import_pluralkit_preview_post"},"Body_preview_file_import_v1_import_tupperbox_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_file_import_v1_import_tupperbox_preview_post"},"Body_preview_import_v1_import_sheaf_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_import_v1_import_sheaf_preview_post"},"Body_preview_import_v1_import_simplyplural_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_import_v1_import_simplyplural_preview_post"},"Body_preview_pluralspace_import_v1_import_pluralspace_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_preview_pluralspace_import_v1_import_pluralspace_preview_post"},"Body_preview_prism_import_v1_import_prism_preview_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"passphrase":{"type":"string","title":"Passphrase"}},"type":"object","required":["file","passphrase"],"title":"Body_preview_prism_import_v1_import_prism_preview_post"},"Body_upload_file_v1_files_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_file_v1_files_upload_post"},"BulkApproveBody":{"properties":{"user_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":200,"minItems":1,"title":"User Ids"}},"type":"object","required":["user_ids"],"title":"BulkApproveBody"},"BulkApproveResponse":{"properties":{"approved_count":{"type":"integer","title":"Approved Count"},"results":{"items":{"$ref":"#/components/schemas/_BulkApproveResult"},"type":"array","title":"Results"}},"type":"object","required":["approved_count","results"],"title":"BulkApproveResponse"},"ChannelCreate":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name"},"destination_type":{"type":"string","enum":["web_push","webhook","ntfy","pushover","mobile_push","fcm","apns_dev","apns_prod"],"title":"Destination Type"},"destination_config":{"additionalProperties":true,"type":"object","title":"Destination Config"},"webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Secret"},"base_all_members":{"type":"boolean","title":"Base All Members","default":false},"base_include_private":{"type":"boolean","title":"Base Include Private","default":false},"trigger_on_start":{"type":"boolean","title":"Trigger On Start","default":true},"trigger_on_stop":{"type":"boolean","title":"Trigger On Stop","default":false},"trigger_on_cofront_change":{"type":"boolean","title":"Trigger On Cofront Change","default":false},"cofront_redaction":{"type":"string","enum":["count","someone","suppress"],"title":"Cofront Redaction","default":"count"},"payload_sensitivity":{"type":"string","enum":["full","minimal","bare"],"title":"Payload Sensitivity","default":"full"},"debounce_seconds":{"type":"integer","maximum":86400.0,"minimum":0.0,"title":"Debounce Seconds","default":30},"aggregation_window_seconds":{"type":"integer","maximum":86400.0,"minimum":0.0,"title":"Aggregation Window Seconds","default":0},"quiet_hours":{"anyOf":[{"$ref":"#/components/schemas/QuietHours"},{"type":"null"}]},"group_rules":{"items":{"$ref":"#/components/schemas/GroupRuleSpec"},"type":"array","title":"Group Rules"},"member_rules":{"items":{"$ref":"#/components/schemas/MemberRuleSpec"},"type":"array","title":"Member Rules"}},"type":"object","required":["name","destination_type"],"title":"ChannelCreate"},"ChannelCreateResponse":{"properties":{"channel":{"$ref":"#/components/schemas/ChannelRead"},"activation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activation Url"},"activation_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activation Expires At"}},"type":"object","required":["channel"],"title":"ChannelCreateResponse","description":"For push-style destinations the owner gets a one-time activation URL.\nFor webhook/ntfy/pushover, `activation_url` is None and channel is\n`active` immediately."},"ChannelDeleteConfirm":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"ChannelDeleteConfirm"},"ChannelRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"watch_token_id":{"type":"string","format":"uuid","title":"Watch Token Id"},"name":{"type":"string","title":"Name"},"destination_type":{"type":"string","title":"Destination Type"},"destination_state":{"type":"string","title":"Destination State"},"paused_by_sender":{"type":"boolean","title":"Paused By Sender","default":false},"destination_config":{"additionalProperties":true,"type":"object","title":"Destination Config"},"event_type":{"type":"string","title":"Event Type"},"activation_code_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activation Code Expires At"},"redeemed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Redeemed At"},"redeemed_by_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Redeemed By Account Id"},"base_all_members":{"type":"boolean","title":"Base All Members"},"base_include_private":{"type":"boolean","title":"Base Include Private"},"trigger_on_start":{"type":"boolean","title":"Trigger On Start"},"trigger_on_stop":{"type":"boolean","title":"Trigger On Stop"},"trigger_on_cofront_change":{"type":"boolean","title":"Trigger On Cofront Change"},"cofront_redaction":{"type":"string","title":"Cofront Redaction"},"payload_sensitivity":{"type":"string","title":"Payload Sensitivity"},"debounce_seconds":{"type":"integer","title":"Debounce Seconds"},"aggregation_window_seconds":{"type":"integer","title":"Aggregation Window Seconds"},"quiet_hours":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Quiet Hours"},"group_rules":{"items":{"$ref":"#/components/schemas/GroupRuleSpec"},"type":"array","title":"Group Rules"},"member_rules":{"items":{"$ref":"#/components/schemas/MemberRuleSpec"},"type":"array","title":"Member Rules"},"last_delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","watch_token_id","name","destination_type","destination_state","destination_config","event_type","activation_code_expires_at","redeemed_at","redeemed_by_account_id","base_all_members","base_include_private","trigger_on_start","trigger_on_stop","trigger_on_cofront_change","cofront_redaction","payload_sensitivity","debounce_seconds","aggregation_window_seconds","quiet_hours","last_delivered_at","created_at","updated_at"],"title":"ChannelRead"},"ChannelUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"destination_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Destination Config"},"webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Secret"},"base_all_members":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Base All Members"},"base_include_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Base Include Private"},"trigger_on_start":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trigger On Start"},"trigger_on_stop":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trigger On Stop"},"trigger_on_cofront_change":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trigger On Cofront Change"},"cofront_redaction":{"anyOf":[{"type":"string","enum":["count","someone","suppress"]},{"type":"null"}],"title":"Cofront Redaction"},"payload_sensitivity":{"anyOf":[{"type":"string","enum":["full","minimal","bare"]},{"type":"null"}],"title":"Payload Sensitivity"},"debounce_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":0.0},{"type":"null"}],"title":"Debounce Seconds"},"aggregation_window_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":0.0},{"type":"null"}],"title":"Aggregation Window Seconds"},"quiet_hours":{"anyOf":[{"$ref":"#/components/schemas/QuietHours"},{"type":"null"}]},"group_rules":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroupRuleSpec"},"type":"array"},{"type":"null"}],"title":"Group Rules"},"member_rules":{"anyOf":[{"items":{"$ref":"#/components/schemas/MemberRuleSpec"},"type":"array"},{"type":"null"}],"title":"Member Rules"}},"type":"object","title":"ChannelUpdate"},"ClientSettingsBody":{"properties":{"settings":{"additionalProperties":true,"type":"object","title":"Settings"}},"type":"object","required":["settings"],"title":"ClientSettingsBody"},"ContentRevisionRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"target_type":{"type":"string","title":"Target Type"},"target_id":{"type":"string","format":"uuid","title":"Target Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"editor_member_ids":{"items":{"type":"string"},"type":"array","title":"Editor Member Ids"},"editor_member_names":{"items":{"type":"string"},"type":"array","title":"Editor Member Names"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"type":"string","title":"Body"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"pinned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pinned At"}},"type":"object","required":["id","target_type","target_id","user_id","editor_member_ids","editor_member_names","title","body","created_at"],"title":"ContentRevisionRead"},"CustomFieldCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"field_type":{"$ref":"#/components/schemas/FieldType"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"order":{"type":"integer","title":"Order","default":0},"privacy":{"$ref":"#/components/schemas/PrivacyLevel","default":"private"}},"type":"object","required":["name","field_type"],"title":"CustomFieldCreate"},"CustomFieldRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"name":{"type":"string","title":"Name"},"field_type":{"$ref":"#/components/schemas/FieldType"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"order":{"type":"integer","title":"Order"},"privacy":{"$ref":"#/components/schemas/PrivacyLevel"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","name","field_type","options","order","privacy","created_at","updated_at"],"title":"CustomFieldRead"},"CustomFieldUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"},"privacy":{"anyOf":[{"$ref":"#/components/schemas/PrivacyLevel"},{"type":"null"}]}},"type":"object","title":"CustomFieldUpdate"},"CustomFieldValueRead":{"properties":{"field_id":{"type":"string","format":"uuid","title":"Field Id"},"member_id":{"type":"string","format":"uuid","title":"Member Id"},"value":{"title":"Value"}},"type":"object","required":["field_id","member_id","value"],"title":"CustomFieldValueRead"},"CustomFieldValueSet":{"properties":{"field_id":{"type":"string","format":"uuid","title":"Field Id"},"value":{"title":"Value"}},"type":"object","required":["field_id","value"],"title":"CustomFieldValueSet"},"DateFormat":{"type":"string","enum":["dmy","mdy","ymd"],"title":"DateFormat"},"DeleteAccountRequest":{"properties":{"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["password"],"title":"DeleteAccountRequest"},"DeleteConfirmation":{"type":"string","enum":["none","password","totp","both"],"title":"DeleteConfirmation"},"DeleteConfirmationUpdate":{"properties":{"level":{"$ref":"#/components/schemas/DeleteConfirmation"},"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["level","password"],"title":"DeleteConfirmationUpdate"},"EmailChange":{"properties":{"new_email":{"type":"string","format":"email","title":"New Email"},"current_password":{"type":"string","title":"Current Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["new_email","current_password"],"title":"EmailChange"},"ExplainAccountResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier"},"is_admin":{"type":"boolean","title":"Is Admin"},"account_status":{"type":"string","title":"Account Status"},"email_verified":{"type":"boolean","title":"Email Verified"},"totp_enabled":{"type":"boolean","title":"Totp Enabled"},"signup_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Ip"},"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"},"active_session_count":{"type":"integer","title":"Active Session Count"},"api_key_count":{"type":"integer","title":"Api Key Count"},"system":{"anyOf":[{"$ref":"#/components/schemas/_ExplainSystem"},{"type":"null"}]},"recent_admin_audit":{"items":{"$ref":"#/components/schemas/_ExplainRecentAudit"},"type":"array","title":"Recent Admin Audit"}},"type":"object","required":["user_id","email","tier","is_admin","account_status","email_verified","totp_enabled","signup_ip","created_at","last_login_at","active_session_count","api_key_count","system","recent_admin_audit"],"title":"ExplainAccountResponse"},"ExportJobRequest":{"properties":{"include_images":{"type":"boolean","title":"Include Images","default":false},"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["password"],"title":"ExportJobRequest"},"FieldType":{"type":"string","enum":["text","number","date","boolean","select","multiselect"],"title":"FieldType"},"FrontAuditEventRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"front_id":{"type":"string","format":"uuid","title":"Front Id"},"actor_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor User Id"},"fronting_member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Fronting Member Ids"},"before":{"$ref":"#/components/schemas/FrontSnapshot"},"after":{"$ref":"#/components/schemas/FrontSnapshot"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","front_id","actor_user_id","fronting_member_ids","before","after","created_at"],"title":"FrontAuditEventRead"},"FrontCreate":{"properties":{"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"replace_fronts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Replace Fronts"},"custom_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Status"}},"type":"object","required":["member_ids"],"title":"FrontCreate"},"FrontRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids"},"custom_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Status"},"member_since":{"additionalProperties":{"type":"string","format":"date-time"},"type":"object","title":"Member Since","default":{}},"member_since_capped":{"items":{"type":"string"},"type":"array","title":"Member Since Capped","default":[]},"has_audit_history":{"type":"boolean","title":"Has Audit History","default":false},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","started_at","ended_at","member_ids"],"title":"FrontRead"},"FrontSnapshot":{"properties":{"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids"},"custom_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Status"}},"type":"object","required":["started_at","ended_at","member_ids"],"title":"FrontSnapshot","description":"Pre- or post-edit state captured in a FrontAuditEvent row."},"FrontStartPrompt":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"summaries":{"items":{"$ref":"#/components/schemas/BoardSummary"},"type":"array","title":"Summaries"},"total_unread":{"type":"integer","title":"Total Unread"}},"type":"object","required":["member_id","summaries","total_unread"],"title":"FrontStartPrompt","description":"Returned by GET /messages/front-start-prompt for the just-fronted\nmember. Empty list = nothing to prompt about. The frontend renders a\ntoast/modal pointing at /messages."},"FrontUpdate":{"properties":{"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"member_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Member Ids"},"custom_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Status"}},"type":"object","title":"FrontUpdate"},"FrontingAnalytics":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"tz":{"type":"string","title":"Tz"},"window_seconds":{"type":"integer","title":"Window Seconds"},"members":{"items":{"$ref":"#/components/schemas/MemberFrontingStats"},"type":"array","title":"Members"}},"type":"object","required":["since","until","tz","window_seconds","members"],"title":"FrontingAnalytics","description":"Aggregated fronting statistics for the user's system."},"GroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id"}},"type":"object","required":["name"],"title":"GroupCreate"},"GroupMemberUpdate":{"properties":{"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids"}},"type":"object","required":["member_ids"],"title":"GroupMemberUpdate"},"GroupRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","name","description","color","parent_id","created_at","updated_at"],"title":"GroupRead"},"GroupRuleSpec":{"properties":{"group_id":{"type":"string","format":"uuid","title":"Group Id"},"rule":{"type":"string","enum":["include","exclude"],"title":"Rule"},"include_private":{"type":"string","enum":["inherit","yes","no"],"title":"Include Private","default":"inherit"}},"type":"object","required":["group_id","rule"],"title":"GroupRuleSpec"},"GroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id"}},"type":"object","title":"GroupUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportApiCreateRequest":{"properties":{"source":{"type":"string","const":"pluralkit_api","title":"Source"},"idempotency_key":{"type":"string","format":"uuid","title":"Idempotency Key"},"pk_token":{"type":"string","maxLength":128,"minLength":1,"title":"Pk Token"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"}},"additionalProperties":false,"type":"object","required":["source","idempotency_key","pk_token"],"title":"ImportApiCreateRequest","description":"Credential-based imports (currently PluralKit API).\n\nThe credential field (`pk_token` for PK) is encrypted at rest in\npayload_metadata while the job runs, and wiped at finalize time."},"ImportJobEvent":{"properties":{"level":{"type":"string","enum":["info","warning","error"],"title":"Level"},"stage":{"type":"string","title":"Stage"},"message":{"type":"string","title":"Message"},"record_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Ref"}},"additionalProperties":true,"type":"object","required":["level","stage","message"],"title":"ImportJobEvent","description":"One entry from the events JSONB array — surfaced unchanged to\nthe UI so it can render the per-record warnings / errors table.\n\n`record_ref` is source-specific (PK HID, TB tupper id, member\ndisplay name, ...). When set, the UI can render it as a clickable\npointer; when null, the event is general (parse-level, schema-level)\nand just gets shown with its message."},"ImportJobList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ImportJobSummary"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"ImportJobList"},"ImportJobRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source":{"$ref":"#/components/schemas/ImportJobSource"},"status":{"$ref":"#/components/schemas/ImportJobStatus"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"events":{"items":{"$ref":"#/components/schemas/ImportJobEvent"},"type":"array","title":"Events"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","source","status","created_at","updated_at"],"title":"ImportJobRead","description":"Full user-visible state of one import job."},"ImportJobSource":{"type":"string","enum":["pluralkit_file","pluralkit_api","tupperbox_file","simplyplural_file","sheaf_file","sheaf_archive","pluralspace_file","prism_file"],"title":"ImportJobSource"},"ImportJobStatus":{"type":"string","enum":["pending","running","complete","failed","cancelled"],"title":"ImportJobStatus"},"ImportJobSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source":{"$ref":"#/components/schemas/ImportJobSource"},"status":{"$ref":"#/components/schemas/ImportJobStatus"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","source","status","created_at"],"title":"ImportJobSummary","description":"Lighter shape for the history list — drops the events array\nwhich can be 10k entries long. Detail view fetches the full record\nvia /v1/imports/{id}."},"InviteCodeCreate":{"properties":{"max_uses":{"type":"integer","title":"Max Uses","default":0},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","title":"InviteCodeCreate"},"JournalEntryCreate":{"properties":{"member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Member Id"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"body":{"type":"string","minLength":1,"title":"Body"},"visibility":{"type":"string","maxLength":16,"title":"Visibility","default":"system"},"author_member_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Author Member Ids"}},"type":"object","required":["body"],"title":"JournalEntryCreate"},"JournalEntryDeleteConfirm":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"JournalEntryDeleteConfirm"},"JournalEntryRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Member Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"type":"string","title":"Body"},"visibility":{"type":"string","title":"Visibility"},"author_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author User Id"},"author_member_ids":{"items":{"type":"string"},"type":"array","title":"Author Member Ids"},"author_member_names":{"items":{"type":"string"},"type":"array","title":"Author Member Names"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","member_id","title","body","visibility","author_user_id","author_member_ids","author_member_names","created_at","updated_at"],"title":"JournalEntryRead"},"JournalEntryReadWithCount":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Member Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"body":{"type":"string","title":"Body"},"visibility":{"type":"string","title":"Visibility"},"author_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author User Id"},"author_member_ids":{"items":{"type":"string"},"type":"array","title":"Author Member Ids"},"author_member_names":{"items":{"type":"string"},"type":"array","title":"Author Member Names"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"},"revision_count":{"type":"integer","title":"Revision Count","default":0}},"type":"object","required":["id","system_id","member_id","title","body","visibility","author_user_id","author_member_ids","author_member_names","created_at","updated_at"],"title":"JournalEntryReadWithCount"},"JournalEntryUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Body"},"visibility":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Visibility"},"author_member_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Author Member Ids"}},"type":"object","title":"JournalEntryUpdate"},"JournalListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JournalEntryRead"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"JournalListResponse"},"ManageChannelView":{"properties":{"channel_id":{"type":"string","format":"uuid","title":"Channel Id"},"channel_name":{"type":"string","title":"Channel Name"},"system_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Label"},"destination_type":{"type":"string","title":"Destination Type"},"destination_state":{"type":"string","title":"Destination State"},"paused_by_sender":{"type":"boolean","title":"Paused By Sender","default":false}},"type":"object","required":["channel_id","channel_name","destination_type","destination_state"],"title":"ManageChannelView"},"MarkSeenRequest":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"board_kind":{"type":"string","enum":["system","member"],"title":"Board Kind"},"board_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"}},"type":"object","required":["member_id","board_kind"],"title":"MarkSeenRequest","description":"Mark a board as seen by a specific member."},"MemberCreate":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name"},"display_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"pronouns":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Pronouns"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"banner_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Banner Url"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"birthday":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Birthday"},"pluralkit_id":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Pluralkit Id"},"emoji":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Emoji"},"is_custom_front":{"type":"boolean","title":"Is Custom Front","default":false},"privacy":{"$ref":"#/components/schemas/PrivacyLevel","default":"private"},"note":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Note"},"quick_switch_pin":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Quick Switch Pin"}},"type":"object","required":["name"],"title":"MemberCreate"},"MemberDeleteConfirm":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"MemberDeleteConfirm"},"MemberFrontingStats":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"is_custom_front":{"type":"boolean","title":"Is Custom Front"},"total_seconds":{"type":"integer","title":"Total Seconds","default":0},"percent_of_window":{"type":"number","title":"Percent Of Window","default":0.0},"session_count":{"type":"integer","title":"Session Count","default":0},"longest_session_seconds":{"type":"integer","title":"Longest Session Seconds","default":0},"hour_of_day_seconds":{"items":{"type":"integer"},"type":"array","maxItems":24,"minItems":24,"title":"Hour Of Day Seconds"}},"type":"object","required":["member_id","is_custom_front"],"title":"MemberFrontingStats","description":"Per-member fronting summary over the requested window.\n\nAll `*_seconds` fields are integer seconds. Co-fronting counts toward\neach member individually — if Alice and Bob co-front for an hour, both\nAlice and Bob get +3600 to their `total_seconds`.\n\n`hour_of_day_seconds` is a 24-element array indexed 0..23, expressed\nin the timezone supplied to the endpoint. Front intervals that cross\nhour boundaries are split proportionally."},"MemberLimitOverride":{"properties":{"member_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Limit"}},"type":"object","title":"MemberLimitOverride"},"MemberRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"name":{"type":"string","title":"Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"pronouns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pronouns"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Url"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"birthday":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Birthday"},"pluralkit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pluralkit Id"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"is_custom_front":{"type":"boolean","title":"Is Custom Front"},"privacy":{"$ref":"#/components/schemas/PrivacyLevel"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"quick_switch_pin":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quick Switch Pin"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"has_bio_revisions":{"type":"boolean","title":"Has Bio Revisions","default":false},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","name","display_name","description","pronouns","avatar_url","banner_url","color","birthday","pluralkit_id","emoji","is_custom_front","privacy","note","created_at","updated_at"],"title":"MemberRead"},"MemberRuleSpec":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"rule":{"type":"string","enum":["include","exclude"],"title":"Rule"}},"type":"object","required":["member_id","rule"],"title":"MemberRuleSpec"},"MemberTagUpdate":{"properties":{"tag_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Tag Ids"}},"type":"object","required":["tag_ids"],"title":"MemberTagUpdate"},"MemberUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"display_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"pronouns":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Pronouns"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"banner_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Banner Url"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"birthday":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Birthday"},"pluralkit_id":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Pluralkit Id"},"emoji":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Emoji"},"is_custom_front":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Custom Front"},"privacy":{"anyOf":[{"$ref":"#/components/schemas/PrivacyLevel"},{"type":"null"}]},"note":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Note"},"quick_switch_pin":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Quick Switch Pin"}},"type":"object","title":"MemberUpdate"},"MessageCreate":{"properties":{"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"},"board_kind":{"type":"string","enum":["system","member"],"title":"Board Kind"},"board_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"},"author_member_id":{"type":"string","format":"uuid","title":"Author Member Id"},"parent_message_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Message Id"}},"type":"object","required":["body","board_kind","author_member_id"],"title":"MessageCreate"},"MessageRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"board_kind":{"type":"string","title":"Board Kind"},"board_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"},"author_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author Member Id"},"author_member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Member Name"},"parent_message_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Message Id"},"parent_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Preview"},"parent_author_member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Author Member Name"},"body":{"type":"string","title":"Body"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","board_kind","board_member_id","author_member_id","author_member_name","parent_message_id","parent_preview","parent_author_member_name","body","created_at","updated_at"],"title":"MessageRead"},"MessageUpdate":{"properties":{"body":{"type":"string","maxLength":5000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"MessageUpdate"},"MessagesPage":{"properties":{"board_kind":{"type":"string","title":"Board Kind"},"board_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Board Member Id"},"messages":{"items":{"$ref":"#/components/schemas/MessageRead"},"type":"array","title":"Messages"},"caller_last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Caller Last Seen At"}},"type":"object","required":["board_kind","board_member_id","messages"],"title":"MessagesPage","description":"Paginated message list response."},"NotifyOnFrontSettings":{"properties":{"notify_on_front_global":{"type":"boolean","title":"Notify On Front Global","default":false},"notify_on_front_self":{"type":"boolean","title":"Notify On Front Self","default":false},"notify_on_front_member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Notify On Front Member Ids"}},"type":"object","title":"NotifyOnFrontSettings","description":"Per-member opt-in toggles for the on-front-start prompt."},"PKApiPreviewRequest":{"properties":{"token":{"type":"string","maxLength":128,"minLength":1,"title":"Token"}},"type":"object","required":["token"],"title":"PKApiPreviewRequest"},"PKPreviewMember":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"PKPreviewMember"},"PKPreviewSummary":{"properties":{"system_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Name"},"member_count":{"type":"integer","title":"Member Count","default":0},"members":{"items":{"$ref":"#/components/schemas/PKPreviewMember"},"type":"array","title":"Members","default":[]},"group_count":{"type":"integer","title":"Group Count","default":0},"switch_count":{"type":"integer","title":"Switch Count","default":0},"earliest_switch":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Earliest Switch"},"latest_switch":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Switch"}},"type":"object","title":"PKPreviewSummary"},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChange"},"PasswordReset":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordReset"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PendingActionRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"action_type":{"type":"string","title":"Action Type"},"target_id":{"type":"string","format":"uuid","title":"Target Id"},"target_label":{"type":"string","title":"Target Label"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"requested_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requested By User Id"},"finalize_after":{"type":"string","format":"date-time","title":"Finalize After"},"fronting_member_ids":{"items":{"type":"string"},"type":"array","title":"Fronting Member Ids"},"fronting_member_names":{"items":{"type":"string"},"type":"array","title":"Fronting Member Names"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","action_type","target_id","target_label","requested_at","requested_by_user_id","finalize_after","fronting_member_ids","fronting_member_names","status"],"title":"PendingActionRead"},"PendingUserRead":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"email_verified":{"type":"boolean","title":"Email Verified"},"signup_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Ip"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","email_verified","signup_ip","created_at"],"title":"PendingUserRead"},"PinRevisionRequest":{"properties":{"revision_id":{"type":"string","format":"uuid","title":"Revision Id"}},"type":"object","required":["revision_id"],"title":"PinRevisionRequest"},"PollAuditRead":{"properties":{"poll_id":{"type":"string","format":"uuid","title":"Poll Id"},"is_visible":{"type":"boolean","title":"Is Visible"},"events":{"items":{"$ref":"#/components/schemas/VoteEventRead"},"type":"array","title":"Events"}},"type":"object","required":["poll_id","is_visible","events"],"title":"PollAuditRead","description":"Audit log for a poll. Same visibility rule as tally — hidden\nuntil closed when results_visibility=end_only, otherwise live."},"PollCreate":{"properties":{"question":{"type":"string","maxLength":500,"minLength":1,"title":"Question"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"kind":{"type":"string","enum":["single_choice","multi_choice"],"title":"Kind"},"results_visibility":{"type":"string","enum":["live","end_only"],"title":"Results Visibility"},"closes_at":{"type":"string","format":"date-time","title":"Closes At"},"retention_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Retention Days"},"include_custom_fronts":{"type":"boolean","title":"Include Custom Fronts","default":false},"restrict_voting_to_fronters":{"type":"boolean","title":"Restrict Voting To Fronters","default":false},"options":{"items":{"$ref":"#/components/schemas/PollOptionCreate"},"type":"array","maxItems":20,"minItems":2,"title":"Options"}},"type":"object","required":["question","kind","results_visibility","closes_at","options"],"title":"PollCreate"},"PollOptionCreate":{"properties":{"text":{"type":"string","maxLength":200,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"PollOptionCreate"},"PollOptionRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"text":{"type":"string","title":"Text"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","text","position"],"title":"PollOptionRead"},"PollRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"question":{"type":"string","title":"Question"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"kind":{"type":"string","title":"Kind"},"results_visibility":{"type":"string","title":"Results Visibility"},"closes_at":{"type":"string","format":"date-time","title":"Closes At"},"retention_days":{"type":"integer","title":"Retention Days"},"include_custom_fronts":{"type":"boolean","title":"Include Custom Fronts"},"restrict_voting_to_fronters":{"type":"boolean","title":"Restrict Voting To Fronters"},"options":{"items":{"$ref":"#/components/schemas/PollOptionRead"},"type":"array","title":"Options"},"is_closed":{"type":"boolean","title":"Is Closed"},"closed_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed Since"},"purges_at":{"type":"string","format":"date-time","title":"Purges At"},"total_votes":{"type":"integer","title":"Total Votes"},"tally":{"anyOf":[{"items":{"$ref":"#/components/schemas/PollTallyEntry"},"type":"array"},{"type":"null"}],"title":"Tally"},"votes":{"anyOf":[{"items":{"$ref":"#/components/schemas/PollVoteRead"},"type":"array"},{"type":"null"}],"title":"Votes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","question","description","kind","results_visibility","closes_at","retention_days","include_custom_fronts","restrict_voting_to_fronters","options","is_closed","closed_since","purges_at","total_votes","created_at","updated_at"],"title":"PollRead"},"PollTallyEntry":{"properties":{"option_id":{"type":"string","format":"uuid","title":"Option Id"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["option_id","count"],"title":"PollTallyEntry"},"PollVoteRead":{"properties":{"voted_as_member_id":{"type":"string","format":"uuid","title":"Voted As Member Id"},"option_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Option Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["voted_as_member_id","option_ids","created_at","updated_at"],"title":"PollVoteRead"},"PreviewMember":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private"},"attribution":{"type":"string","title":"Attribution"}},"type":"object","required":["member_id","name","is_private","attribution"],"title":"PreviewMember"},"PreviewResponse":{"properties":{"included":{"items":{"$ref":"#/components/schemas/PreviewMember"},"type":"array","title":"Included"},"excluded":{"items":{"$ref":"#/components/schemas/PreviewMember"},"type":"array","title":"Excluded"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["included","excluded"],"title":"PreviewResponse"},"PrivacyLevel":{"type":"string","enum":["public","friends","private"],"title":"PrivacyLevel"},"PushDeviceDeleteRequest":{"properties":{"token":{"type":"string","maxLength":4096,"minLength":1,"title":"Token"}},"type":"object","required":["token"],"title":"PushDeviceDeleteRequest"},"PushDeviceRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"platform":{"$ref":"#/components/schemas/PushPlatform"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"enabled":{"type":"boolean","title":"Enabled"},"install_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Install Id"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","platform","label","enabled","install_id","app_version","last_seen_at","created_at"],"title":"PushDeviceRead"},"PushDeviceRegisterRequest":{"properties":{"platform":{"$ref":"#/components/schemas/PushPlatform"},"token":{"type":"string","maxLength":4096,"minLength":1,"title":"Token"},"install_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Install Id"},"app_version":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"App Version"},"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"}},"type":"object","required":["platform","token"],"title":"PushDeviceRegisterRequest"},"PushDeviceUpdateRequest":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"}},"type":"object","title":"PushDeviceUpdateRequest","description":"PATCH body for /v1/devices/push/{id}. Owner-only fields the\nrecipient toggles from the Receiving tab — does not accept token\nor platform (those rotate via the register endpoint)."},"PushPlatform":{"type":"string","enum":["fcm","apns_dev","apns_prod"],"title":"PushPlatform","description":"Stored in `push_device_token.platform`. APNs is split because\nApple uses two distinct host endpoints (sandbox vs prod) — see\n`DestinationType` for the same rationale."},"PushSubscription":{"properties":{"endpoint":{"type":"string","title":"Endpoint"},"keys":{"additionalProperties":{"type":"string"},"type":"object","title":"Keys"}},"type":"object","required":["endpoint","keys"],"title":"PushSubscription"},"QuietHours":{"properties":{"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"},"tz":{"type":"string","title":"Tz","default":"UTC"}},"type":"object","required":["start","end"],"title":"QuietHours"},"RateLimitHistoryResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"retention_hours":{"type":"integer","title":"Retention Hours"},"summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Summary"},"entries":{"items":{"$ref":"#/components/schemas/_RateLimitHit"},"type":"array","title":"Entries"}},"type":"object","required":["enabled","retention_hours","summary","entries"],"title":"RateLimitHistoryResponse"},"ReceivingChannelView":{"properties":{"channel_id":{"type":"string","format":"uuid","title":"Channel Id"},"channel_name":{"type":"string","title":"Channel Name"},"system_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Label"},"destination_type":{"type":"string","title":"Destination Type"},"destination_state":{"type":"string","title":"Destination State"},"paused_by_sender":{"type":"boolean","title":"Paused By Sender","default":false},"redeemed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Redeemed At"},"last_delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivered At"}},"type":"object","required":["channel_id","channel_name","destination_type","destination_state","redeemed_at","last_delivered_at"],"title":"ReceivingChannelView","description":"An account-bound channel from the recipient's perspective.\n\nReturned by `GET /v1/notifications/receiving` and lists every channel\nwhere `redeemed_by_account_id` matches the authenticated user. Lets the\nrecipient see and manage subscriptions across systems without juggling\ncapability URLs."},"RedeemPreview":{"properties":{"destination_type":{"type":"string","title":"Destination Type"},"channel_name":{"type":"string","title":"Channel Name"},"system_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Label"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["destination_type","channel_name"],"title":"RedeemPreview","description":"Read-only summary returned by `/notifications/redeem-preview`.\n\nLets the recipient-facing redeem UI branch on destination type\nbefore doing anything destructive (registering a service worker,\nasking for notification permission, etc.). Reveals strictly less\nthan redemption — anyone who already has the code can redeem; the\npreview just tells them what to render."},"RedeemRequest":{"properties":{"activation_code":{"type":"string","title":"Activation Code"},"push_subscription":{"anyOf":[{"$ref":"#/components/schemas/PushSubscription"},{"type":"null"}]}},"type":"object","required":["activation_code"],"title":"RedeemRequest"},"RedeemResponse":{"properties":{"management_url":{"type":"string","title":"Management Url"},"channel_name":{"type":"string","title":"Channel Name"},"system_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Label"}},"type":"object","required":["management_url","channel_name"],"title":"RedeemResponse"},"ReissueActivationResponse":{"properties":{"activation_url":{"type":"string","title":"Activation Url"},"activation_expires_at":{"type":"string","format":"date-time","title":"Activation Expires At"}},"type":"object","required":["activation_url","activation_expires_at"],"title":"ReissueActivationResponse"},"ReminderCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Body"},"enabled":{"type":"boolean","title":"Enabled","default":true},"channel_id":{"type":"string","format":"uuid","title":"Channel Id"},"trigger_type":{"type":"string","enum":["automated","repeated"],"title":"Trigger Type"},"trigger_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Trigger Member Id"},"trigger_event":{"anyOf":[{"type":"string","enum":["start","stop","any"]},{"type":"null"}],"title":"Trigger Event"},"delay_seconds":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Delay Seconds"},"schedule_kind":{"anyOf":[{"type":"string","enum":["daily","weekly","monthly"]},{"type":"null"}],"title":"Schedule Kind"},"schedule_time":{"anyOf":[{"type":"string","pattern":"^[0-2]\\d:[0-5]\\d$"},{"type":"null"}],"title":"Schedule Time"},"schedule_dow_mask":{"anyOf":[{"type":"integer","maximum":127.0,"minimum":0.0},{"type":"null"}],"title":"Schedule Dow Mask"},"schedule_dom":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Schedule Dom"},"schedule_tz":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Schedule Tz"},"cron_expression":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Cron Expression"},"scope":{"type":"string","enum":["system","member"],"title":"Scope","default":"system"},"scope_member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Scope Member Ids"},"digest_when_absent":{"type":"boolean","title":"Digest When Absent","default":true}},"type":"object","required":["name","title","channel_id","trigger_type"],"title":"ReminderCreate"},"ReminderRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"channel_id":{"type":"string","format":"uuid","title":"Channel Id"},"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"enabled":{"type":"boolean","title":"Enabled"},"trigger_type":{"type":"string","title":"Trigger Type"},"trigger_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Trigger Member Id"},"trigger_event":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Event"},"delay_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delay Seconds"},"schedule_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Kind"},"schedule_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Time"},"schedule_dow_mask":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Dow Mask"},"schedule_dom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schedule Dom"},"schedule_tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Tz"},"cron_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expression"},"scope":{"type":"string","title":"Scope"},"scope_member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Scope Member Ids"},"digest_when_absent":{"type":"boolean","title":"Digest When Absent"},"last_fired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fired At"},"pending_count":{"type":"integer","title":"Pending Count"},"next_fire_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Fire At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","channel_id","name","title","body","enabled","trigger_type","trigger_member_id","trigger_event","delay_seconds","schedule_kind","schedule_time","schedule_dow_mask","schedule_dom","schedule_tz","cron_expression","scope","scope_member_ids","digest_when_absent","last_fired_at","pending_count","next_fire_at","created_at","updated_at"],"title":"ReminderRead"},"ReminderUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Body"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"channel_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Channel Id"},"trigger_type":{"anyOf":[{"type":"string","enum":["automated","repeated"]},{"type":"null"}],"title":"Trigger Type"},"trigger_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Trigger Member Id"},"trigger_event":{"anyOf":[{"type":"string","enum":["start","stop","any"]},{"type":"null"}],"title":"Trigger Event"},"delay_seconds":{"anyOf":[{"type":"integer","maximum":604800.0,"minimum":0.0},{"type":"null"}],"title":"Delay Seconds"},"schedule_kind":{"anyOf":[{"type":"string","enum":["daily","weekly","monthly"]},{"type":"null"}],"title":"Schedule Kind"},"schedule_time":{"anyOf":[{"type":"string","pattern":"^[0-2]\\d:[0-5]\\d$"},{"type":"null"}],"title":"Schedule Time"},"schedule_dow_mask":{"anyOf":[{"type":"integer","maximum":127.0,"minimum":0.0},{"type":"null"}],"title":"Schedule Dow Mask"},"schedule_dom":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Schedule Dom"},"schedule_tz":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Schedule Tz"},"cron_expression":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Cron Expression"},"scope":{"anyOf":[{"type":"string","enum":["system","member"]},{"type":"null"}],"title":"Scope"},"scope_member_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Scope Member Ids"},"digest_when_absent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Digest When Absent"}},"type":"object","title":"ReminderUpdate","description":"Partial update — only the fields that are explicitly supplied\nare written. Member rules are replaced wholesale when supplied;\nomit `scope_member_ids` to leave them alone."},"RestoreRevisionRequest":{"properties":{"revision_id":{"type":"string","format":"uuid","title":"Revision Id"}},"type":"object","required":["revision_id"],"title":"RestoreRevisionRequest"},"RetentionResponse":{"properties":{"effective_max_revisions":{"type":"integer","title":"Effective Max Revisions"},"effective_max_days":{"type":"integer","title":"Effective Max Days"},"tier_max_revisions":{"type":"integer","title":"Tier Max Revisions"},"tier_max_days":{"type":"integer","title":"Tier Max Days"},"override_revisions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Override Revisions"},"override_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Override Days"},"trim_notice":{"anyOf":[{"$ref":"#/components/schemas/RetentionTrimNoticeRead"},{"type":"null"}]}},"type":"object","required":["effective_max_revisions","effective_max_days","tier_max_revisions","tier_max_days","override_revisions","override_days"],"title":"RetentionResponse","description":"Effective + tier-max + override caps, plus any active trim notice.\n\nCaps semantics: a value of 0 means \"unlimited\" (selfhosted tier default)."},"RetentionTrimNoticeRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"effective_at":{"type":"string","format":"date-time","title":"Effective At"},"from_tier":{"type":"string","title":"From Tier"},"to_tier":{"type":"string","title":"To Tier"},"reason":{"type":"string","title":"Reason"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","requested_at","effective_at","from_tier","to_tier","reason","status"],"title":"RetentionTrimNoticeRead"},"RetentionUpdate":{"properties":{"max_revisions":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Max Revisions"},"max_revision_days":{"anyOf":[{"type":"integer","maximum":36500.0,"minimum":0.0},{"type":"null"}],"title":"Max Revision Days"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"RetentionUpdate","description":"Caller sends only the fields they want to change.\n\nReductions (lowering caps) route through SafetyChangeRequest as a\nloosening change — see split_safety_changes. Setting a field to null\nclears the override and falls back to the tier max."},"SPPreviewCustomFront":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"SPPreviewCustomFront"},"SPPreviewMember":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"SPPreviewMember"},"SPPreviewSummary":{"properties":{"system_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Name"},"member_count":{"type":"integer","title":"Member Count","default":0},"members":{"items":{"$ref":"#/components/schemas/SPPreviewMember"},"type":"array","title":"Members","default":[]},"custom_front_count":{"type":"integer","title":"Custom Front Count","default":0},"custom_fronts":{"items":{"$ref":"#/components/schemas/SPPreviewCustomFront"},"type":"array","title":"Custom Fronts","default":[]},"front_history_count":{"type":"integer","title":"Front History Count","default":0},"group_count":{"type":"integer","title":"Group Count","default":0},"custom_field_count":{"type":"integer","title":"Custom Field Count","default":0},"note_count":{"type":"integer","title":"Note Count","default":0},"message_count":{"type":"integer","title":"Message Count","default":0}},"type":"object","title":"SPPreviewSummary"},"SafetyChangeRequestRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"requested_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requested By User Id"},"finalize_after":{"type":"string","format":"date-time","title":"Finalize After"},"changes":{"additionalProperties":true,"type":"object","title":"Changes"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","requested_at","requested_by_user_id","finalize_after","changes","status"],"title":"SafetyChangeRequestRead"},"SecondarySessionRequest":{"properties":{"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"}},"type":"object","title":"SecondarySessionRequest","description":"Optional metadata for a wearable/companion session.\n\n`client_name` mirrors the X-Sheaf-Client header semantics — it's what\nsurfaces in /sessions UI as the device label."},"SecondarySessionResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["access_token","refresh_token","session_id"],"title":"SecondarySessionResponse","description":"Tokens plus the session id, so the caller (typically a phone minting\na wearable companion session) can track the child for later management."},"SessionRename":{"properties":{"nickname":{"type":"string","title":"Nickname"}},"type":"object","required":["nickname"],"title":"SessionRename"},"ShieldModeStatus":{"properties":{"feature_enabled":{"type":"boolean","title":"Feature Enabled"},"active":{"type":"boolean","title":"Active"},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},"type":"object","required":["feature_enabled","active"],"title":"ShieldModeStatus","description":"Public status payload.\n\n`feature_enabled` mirrors the operator-side config and lets the\nfrontend hide the user-facing toggle on instances that aren't wired\nto a cf-shield setup. `active` is always truthful regardless: it\nreflects whatever Redis says, defaulting to false."},"SuspendBody":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"},"duration_days":{"anyOf":[{"type":"integer","maximum":1825.0,"minimum":1.0},{"type":"null"}],"title":"Duration Days"}},"type":"object","required":["reason"],"title":"SuspendBody"},"SystemRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"privacy":{"$ref":"#/components/schemas/PrivacyLevel"},"delete_confirmation":{"$ref":"#/components/schemas/DeleteConfirmation"},"date_format":{"$ref":"#/components/schemas/DateFormat"},"replace_fronts_default":{"type":"boolean","title":"Replace Fronts Default"},"coalesce_contiguous_fronts":{"type":"boolean","title":"Coalesce Contiguous Fronts"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","description","note","tag","avatar_url","color","privacy","delete_confirmation","date_format","replace_fronts_default","coalesce_contiguous_fronts","created_at","updated_at"],"title":"SystemRead"},"SystemSafetyResponse":{"properties":{"settings":{"$ref":"#/components/schemas/SystemSafetySettings"},"pending_actions":{"items":{"$ref":"#/components/schemas/PendingActionRead"},"type":"array","title":"Pending Actions"},"pending_changes":{"items":{"$ref":"#/components/schemas/SafetyChangeRequestRead"},"type":"array","title":"Pending Changes"}},"type":"object","required":["settings","pending_actions","pending_changes"],"title":"SystemSafetyResponse"},"SystemSafetySettings":{"properties":{"grace_period_days":{"type":"integer","title":"Grace Period Days"},"auth_tier":{"$ref":"#/components/schemas/DeleteConfirmation"},"applies_to_members":{"type":"boolean","title":"Applies To Members"},"applies_to_groups":{"type":"boolean","title":"Applies To Groups"},"applies_to_tags":{"type":"boolean","title":"Applies To Tags"},"applies_to_fields":{"type":"boolean","title":"Applies To Fields"},"applies_to_fronts":{"type":"boolean","title":"Applies To Fronts"},"applies_to_journals":{"type":"boolean","title":"Applies To Journals"},"applies_to_images":{"type":"boolean","title":"Applies To Images"},"applies_to_revisions":{"type":"boolean","title":"Applies To Revisions"},"applies_to_notifications":{"type":"boolean","title":"Applies To Notifications"},"applies_to_reminders":{"type":"boolean","title":"Applies To Reminders"},"applies_to_polls":{"type":"boolean","title":"Applies To Polls"},"applies_to_messages":{"type":"boolean","title":"Applies To Messages"},"auto_pin_first_revision":{"type":"boolean","title":"Auto Pin First Revision"}},"type":"object","required":["grace_period_days","auth_tier","applies_to_members","applies_to_groups","applies_to_tags","applies_to_fields","applies_to_fronts","applies_to_journals","applies_to_images","applies_to_revisions","applies_to_notifications","applies_to_reminders","applies_to_polls","applies_to_messages","auto_pin_first_revision"],"title":"SystemSafetySettings"},"SystemSafetyUpdate":{"properties":{"grace_period_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Grace Period Days"},"auth_tier":{"anyOf":[{"$ref":"#/components/schemas/DeleteConfirmation"},{"type":"null"}]},"applies_to_members":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Members"},"applies_to_groups":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Groups"},"applies_to_tags":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Tags"},"applies_to_fields":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Fields"},"applies_to_fronts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Fronts"},"applies_to_journals":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Journals"},"applies_to_images":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Images"},"applies_to_revisions":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Revisions"},"applies_to_notifications":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Notifications"},"applies_to_reminders":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Reminders"},"applies_to_polls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Polls"},"applies_to_messages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applies To Messages"},"auto_pin_first_revision":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Pin First Revision"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"SystemSafetyUpdate","description":"All fields optional — caller sends only the fields they want to change."},"SystemSafetyUpdateResponse":{"properties":{"settings":{"$ref":"#/components/schemas/SystemSafetySettings"},"applied":{"items":{"type":"string"},"type":"array","title":"Applied"},"deferred":{"items":{"type":"string"},"type":"array","title":"Deferred"},"pending_change":{"anyOf":[{"$ref":"#/components/schemas/SafetyChangeRequestRead"},{"type":"null"}]}},"type":"object","required":["settings","applied","deferred"],"title":"SystemSafetyUpdateResponse"},"SystemUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"note":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Note"},"tag":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Tag"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"},"privacy":{"anyOf":[{"$ref":"#/components/schemas/PrivacyLevel"},{"type":"null"}]},"date_format":{"anyOf":[{"$ref":"#/components/schemas/DateFormat"},{"type":"null"}]},"replace_fronts_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Replace Fronts Default"},"coalesce_contiguous_fronts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Coalesce Contiguous Fronts"}},"type":"object","title":"SystemUpdate"},"TBPreviewMember":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"TBPreviewMember"},"TBPreviewSummary":{"properties":{"member_count":{"type":"integer","title":"Member Count","default":0},"members":{"items":{"$ref":"#/components/schemas/TBPreviewMember"},"type":"array","title":"Members","default":[]},"group_count":{"type":"integer","title":"Group Count","default":0}},"type":"object","title":"TBPreviewSummary"},"TOTPSetupRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"TOTPSetupRequest"},"TOTPSetupResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"provisioning_uri":{"type":"string","title":"Provisioning Uri"},"recovery_codes":{"items":{"type":"string"},"type":"array","title":"Recovery Codes"}},"type":"object","required":["secret","provisioning_uri","recovery_codes"],"title":"TOTPSetupResponse"},"TOTPVerify":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"}},"type":"object","required":["code"],"title":"TOTPVerify"},"TagCreate":{"properties":{"name":{"type":"string","maxLength":50,"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"}},"type":"object","required":["name"],"title":"TagCreate"},"TagMemberUpdate":{"properties":{"member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Member Ids"}},"type":"object","required":["member_ids"],"title":"TagMemberUpdate"},"TagRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","name","color","created_at","updated_at"],"title":"TagRead"},"TagUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":7},{"type":"null"}],"title":"Color"}},"type":"object","title":"TagUpdate"},"TestDispatchResponse":{"properties":{"delivered":{"type":"boolean","title":"Delivered"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["delivered"],"title":"TestDispatchResponse"},"TokenRefresh":{"properties":{"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","title":"TokenRefresh"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token","refresh_token"],"title":"TokenResponse"},"TrustedDeviceRename":{"properties":{"nickname":{"type":"string","title":"Nickname"}},"type":"object","required":["nickname"],"title":"TrustedDeviceRename"},"UnpinRevisionRequest":{"properties":{"revision_id":{"type":"string","format":"uuid","title":"Revision Id"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","required":["revision_id"],"title":"UnpinRevisionRequest"},"UnpinRevisionResponse":{"properties":{"revision":{"anyOf":[{"$ref":"#/components/schemas/ContentRevisionRead"},{"type":"null"}]},"pending_action_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Pending Action Id"},"finalize_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finalize After"}},"type":"object","title":"UnpinRevisionResponse","description":"Returned from /unpin-revision.\n\n`pending_action` is set when the system has revision-safety enabled with\na positive grace period. Otherwise the unpin is immediate and `revision`\nis the now-unpinned row."},"UnreadCounts":{"properties":{"member_id":{"type":"string","format":"uuid","title":"Member Id"},"total":{"type":"integer","title":"Total"},"by_board":{"items":{"$ref":"#/components/schemas/BoardSummary"},"type":"array","title":"By Board"}},"type":"object","required":["member_id","total","by_board"],"title":"UnreadCounts","description":"Sidebar badge data for one member's perspective."},"UserAdminActivityRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"admin_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Email"},"action":{"type":"string","title":"Action"},"target_type":{"type":"string","title":"Target Type"},"target_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"before_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Before Json"},"after_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"After Json"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","admin_email","action","target_type","target_id","reason","before_json","after_json","created_at"],"title":"UserAdminActivityRead","description":"User-facing view: an admin action affecting the caller's\naccount. Same row as `AdminAuditEventRead` minus the admin's\nuser id (not a useful identifier outside the admin surface) and\nminus the target_user_id (always self when shown to the user)."},"UserLogin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"},"captcha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha"},"remember_device":{"type":"boolean","title":"Remember Device","default":false},"device_nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Nickname"}},"type":"object","required":["email","password"],"title":"UserLogin"},"UserRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"totp_enabled":{"type":"boolean","title":"Totp Enabled"},"is_admin":{"type":"boolean","title":"Is Admin"},"tier":{"type":"string","title":"Tier"},"account_status":{"type":"string","title":"Account Status"},"email_verified":{"type":"boolean","title":"Email Verified"},"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"},"deletion_requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Requested At"},"deletion_scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Scheduled For"},"newsletter_opt_in":{"type":"boolean","title":"Newsletter Opt In","default":false},"email_delivery_status":{"type":"string","title":"Email Delivery Status","default":"ok"},"email_revalidation_required":{"type":"boolean","title":"Email Revalidation Required","default":false},"disable_cdn_during_ddos":{"type":"boolean","title":"Disable Cdn During Ddos","default":false},"uploads_allowed":{"type":"boolean","title":"Uploads Allowed","default":true},"bio_uploads_allowed":{"type":"boolean","title":"Bio Uploads Allowed","default":true},"external_images_allowed":{"type":"boolean","title":"External Images Allowed","default":true},"animated_uploads_allowed":{"type":"boolean","title":"Animated Uploads Allowed","default":false}},"type":"object","required":["id","email","totp_enabled","is_admin","tier","account_status","email_verified","created_at","last_login_at"],"title":"UserRead"},"UserRegister":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"invite_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Code"},"newsletter_opt_in":{"type":"boolean","title":"Newsletter Opt In","default":false},"captcha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha"}},"type":"object","required":["email","password"],"title":"UserRegister"},"UserTier":{"type":"string","enum":["free","plus","self_hosted"],"title":"UserTier"},"UserUpdate":{"properties":{"newsletter_opt_in":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Newsletter Opt In"},"disable_cdn_during_ddos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Cdn During Ddos"}},"type":"object","title":"UserUpdate"},"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"},"VoteCast":{"properties":{"voted_as_member_id":{"type":"string","format":"uuid","title":"Voted As Member Id"},"option_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":20,"minItems":1,"title":"Option Ids"}},"type":"object","required":["voted_as_member_id","option_ids"],"title":"VoteCast"},"VoteEventRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"voted_as_member_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Voted As Member Id"},"action":{"type":"string","enum":["cast","change","withdraw"],"title":"Action"},"option_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Option Ids"},"fronting_member_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Fronting Member Ids"},"actor_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","voted_as_member_id","action","option_ids","fronting_member_ids","actor_user_id","created_at"],"title":"VoteEventRead"},"WatchTokenCreate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"}},"type":"object","title":"WatchTokenCreate"},"WatchTokenRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"system_id":{"type":"string","format":"uuid","title":"System Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"channel_count":{"type":"integer","title":"Channel Count","default":0},"pending_delete_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pending Delete At"}},"type":"object","required":["id","system_id","label","revoked_at","created_at","updated_at"],"title":"WatchTokenRead"},"WatchTokenRevokeConfirm":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"totp_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Totp Code"}},"type":"object","title":"WatchTokenRevokeConfirm"},"WatchTokenUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"}},"type":"object","title":"WatchTokenUpdate"},"_BulkApproveResult":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"approved":{"type":"boolean","title":"Approved"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["user_id","approved"],"title":"_BulkApproveResult"},"_ExplainRecentAudit":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"action":{"type":"string","title":"Action"},"target_type":{"type":"string","title":"Target Type"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","action","target_type","reason","created_at"],"title":"_ExplainRecentAudit"},"_ExplainSystem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"member_count":{"type":"integer","title":"Member Count"},"delete_confirmation":{"type":"string","title":"Delete Confirmation"},"grace_period_days":{"type":"integer","title":"Grace Period Days"}},"type":"object","required":["id","name","member_count","delete_confirmation","grace_period_days"],"title":"_ExplainSystem"},"_ImportJobDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Events"}},"type":"object","required":["id","source","status","created_at","started_at","finished_at","counts","last_error","events"],"title":"_ImportJobDetail"},"_ImportJobSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"type":"object","required":["id","source","status","created_at","started_at","finished_at","counts","last_error"],"title":"_ImportJobSummary"},"_RateLimitHit":{"properties":{"at":{"type":"string","format":"date-time","title":"At"},"bucket":{"type":"string","title":"Bucket"},"scope":{"type":"string","title":"Scope"},"route":{"type":"string","title":"Route"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"}},"type":"object","required":["at","bucket","scope","route"],"title":"_RateLimitHit"},"_SessionRow":{"properties":{"id":{"type":"string","title":"Id"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"}},"type":"object","required":["id"],"title":"_SessionRow"},"sheaf__api__v1__admin_emergency__AdminReasonBody":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"AdminReasonBody","description":"Free-form reason for the audit log. Required, non-empty."},"sheaf__api__v1__admin_small_actions__AdminReasonBody":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"AdminReasonBody","description":"Required free-form reason captured on every audit row."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}