{"openapi":"3.1.0","info":{"title":"Journiv Service","description":"A self-hosted private journal app with mood tracking, prompts, and analytics","version":"0.1.0-beta.24"},"paths":{"/api/v1/auth/register":{"post":{"tags":["authentication"],"summary":"Register","description":"Register a new user account.\n\nCreates a new user with email and password. Email must be unique.","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Email already registered or invalid data"},"403":{"description":"Sign up is disabled"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"}}}},"/api/v1/auth/login":{"post":{"tags":["authentication"],"summary":"Login","description":"Login with email and password.\n\nReturns access token, refresh token, and user information.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"Incorrect email or password"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"}}}},"/api/v1/auth/refresh":{"post":{"tags":["authentication"],"summary":"Refresh Token","description":"Refresh access token using refresh token.\n\nReturns a new access token only. The refresh token is NOT rotated - client should continue\nusing the same refresh token until it expires. This ensures\nusers must re-login periodically, improving security for self-hosted deployments.\n\nThe client should:\n1. Keep using the same refresh token\n2. Use the new access token for API requests\n3. Re-login when the refresh token expires","operationId":"refresh_token_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRefresh"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"401":{"description":"Invalid or expired refresh token"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/auth/token":{"post":{"tags":["authentication"],"summary":"Login For Access Token","description":"OAuth2 compatible login endpoint for Swagger UI.\n\nUse email in username field. Returns access and refresh tokens.","operationId":"login_for_access_token_api_v1_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_for_access_token_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"401":{"description":"Incorrect email or password"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"}}}},"/api/v1/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","description":"Logout user. Tokens are stateless and don't need revocation.\n\nClient should discard both access and refresh tokens after logout.","operationId":"logout_api_v1_auth_logout_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/auth/oidc/login":{"get":{"tags":["authentication"],"summary":"Oidc Login","description":"Initiate OIDC login flow.\n\nRedirects to the OIDC provider's authorization endpoint with PKCE challenge.","operationId":"oidc_login_api_v1_auth_oidc_login_get","responses":{"302":{"description":"Redirect to the OIDC provider authorization endpoint"},"404":{"description":"OIDC authentication is not enabled"}}}},"/api/v1/auth/oidc/callback":{"get":{"tags":["authentication"],"summary":"Oidc Callback","description":"OIDC callback endpoint.\n\nHandles the redirect from the OIDC provider, exchanges the authorization code for tokens,\nvalidates the ID token, and creates a Journiv session with access and refresh tokens.","operationId":"oidc_callback_api_v1_auth_oidc_callback_get","responses":{"307":{"description":"Redirect to the SPA with a one-time login ticket"},"400":{"description":"Invalid or expired state parameter, token exchange failed, invalid nonce, or missing OIDC claims"},"403":{"description":"User provisioning failed"},"404":{"description":"OIDC authentication is not enabled"}}}},"/api/v1/auth/oidc/exchange":{"post":{"tags":["authentication"],"summary":"Oidc Exchange","description":"Exchange one-time ticket for access/refresh tokens.\n\nThe SPA calls this endpoint with the ticket received from the callback redirect.\nTickets are single-use and expire after 60 seconds.","operationId":"oidc_exchange_api_v1_auth_oidc_exchange_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OidcTicketExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"400":{"description":"Invalid or expired ticket"},"404":{"description":"OIDC authentication is not enabled"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/oidc/logout":{"get":{"tags":["authentication"],"summary":"Oidc Logout","description":"OIDC logout endpoint with Single Sign-Out (SSO).\n\nRedirects to the OIDC provider's end_session_endpoint to clear the provider's session,\nthen redirects back to Journiv's post-logout page.","operationId":"oidc_logout_api_v1_auth_oidc_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"OIDC authentication is not enabled"},"500":{"description":"OIDC logout failed"}}}},"/api/v1/users/me":{"get":{"tags":["users"],"summary":"Get Current User Info","description":"Get current authenticated user profile.\n\nReturns complete user information including account status and timestamps.","operationId":"get_current_user_info_api_v1_users_me_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["users"],"summary":"Update Current User","description":"Update current user profile.\n\nSupports updating name, profile picture, and password. Password changes\nrequire current password verification and will revoke all active sessions.","operationId":"update_current_user_api_v1_users_me_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Invalid data, incorrect password, or no fields to update"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["users"],"summary":"Delete Current User","description":"Delete current user account and all associated data.\n\nUsers can delete their own accounts regardless of role.\nThis bypasses admin protection (users can delete themselves even if they're the last admin).","operationId":"delete_current_user_api_v1_users_me_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Deletion failed"}}}},"/api/v1/users/me/settings":{"get":{"tags":["users"],"summary":"Get Current User Settings","description":"Get current user's settings.\n\nReturns all user preferences including timezone, notifications, theme, etc.","operationId":"get_current_user_settings_api_v1_users_me_settings_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponse"}}}},"401":{"description":"Not authenticated"},"404":{"description":"Settings not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["users"],"summary":"Update Current User Settings","description":"Update current user's settings.\n\nSupports updating timezone, theme, notifications, daily goals, etc.\nFrontend should call this after detecting device timezone change.","operationId":"update_current_user_settings_api_v1_users_me_settings_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSettingsResponse"}}}},"400":{"description":"Invalid data or no fields to update"},"401":{"description":"Not authenticated"},"404":{"description":"Settings not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/":{"post":{"tags":["journals"],"summary":"Create Journal","description":"Create a new journal.","operationId":"create_journal_api_v1_journals__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"400":{"description":"Invalid journal data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"get":{"tags":["journals"],"summary":"Get User Journals","description":"Get all journals for the current user.\n\nBy default excludes archived journals. Set include_archived=true to include them.","operationId":"get_user_journals_api_v1_journals__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JournalResponse"},"title":"Response Get User Journals Api V1 Journals Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/favorites":{"get":{"tags":["journals"],"summary":"Get Favorite Journals","description":"Get all journals marked as favorites.","operationId":"get_favorite_journals_api_v1_journals_favorites_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/JournalResponse"},"title":"Response Get Favorite Journals Api V1 Journals Favorites Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/reorder":{"put":{"tags":["journals"],"summary":"Reorder Journals","description":"Reorder journals for the current user.\n\nUpdates the position field for multiple journals in a single transaction.\nJournals are ordered by: is_favorite DESC, position ASC NULLS LAST, created_at DESC.","operationId":"reorder_journals_api_v1_journals_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found or not owned by user"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/{journal_id}":{"get":{"tags":["journals"],"summary":"Get Journal","description":"Get a specific journal by ID.","operationId":"get_journal_api_v1_journals__journal_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"put":{"tags":["journals"],"summary":"Update Journal","description":"Update a journal's name, description, or other properties.","operationId":"update_journal_api_v1_journals__journal_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"400":{"description":"Invalid journal data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["journals"],"summary":"Delete Journal","description":"Delete a journal.","operationId":"delete_journal_api_v1_journals__journal_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/{journal_id}/favorite":{"post":{"tags":["journals"],"summary":"Toggle Favorite","description":"Toggle favorite status of a journal (on/off).","operationId":"toggle_favorite_api_v1_journals__journal_id__favorite_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/{journal_id}/archive":{"post":{"tags":["journals"],"summary":"Archive Journal","description":"Archive a journal.\n\nArchived journals are hidden from default listings but remain accessible.","operationId":"archive_journal_api_v1_journals__journal_id__archive_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/journals/{journal_id}/unarchive":{"post":{"tags":["journals"],"summary":"Unarchive Journal","description":"Unarchive a journal to restore it to active listings.","operationId":"unarchive_journal_api_v1_journals__journal_id__unarchive_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JournalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/":{"post":{"tags":["entries"],"summary":"Create Entry","description":"Create a new journal entry.","operationId":"create_entry_api_v1_entries__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryResponse"}}}},"400":{"description":"Invalid entry data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"get":{"tags":["entries"],"summary":"Get User Entries","description":"Get all entries for the current user.\n\nSupports pagination via limit and offset parameters.\nEntries are sorted by created_at in descending order (newest first).\nSearch/date filtering is handled by /moments.","operationId":"get_user_entries_api_v1_entries__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EntryResponse"},"title":"Response Get User Entries Api V1 Entries Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/draft":{"post":{"tags":["entries"],"summary":"Create Draft Entry","description":"Create a new draft entry.","operationId":"create_draft_entry_api_v1_entries_draft_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryDraftCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryResponse"}}}},"400":{"description":"Invalid entry data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/drafts":{"get":{"tags":["entries"],"summary":"Get User Drafts","description":"Get all draft entries for the current user.","operationId":"get_user_drafts_api_v1_entries_drafts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"journal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EntryResponse"},"title":"Response Get User Drafts Api V1 Entries Drafts Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/journal/{journal_id}":{"get":{"tags":["entries"],"summary":"Get Journal Entries","description":"Get entries for a specific journal.","operationId":"get_journal_entries_api_v1_entries_journal__journal_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"journal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Journal Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}},{"name":"include_pinned","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Pinned"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EntryResponse"},"title":"Response Get Journal Entries Api V1 Entries Journal Journal Id Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Journal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/{entry_id}":{"get":{"tags":["entries"],"summary":"Get Entry","description":"Get a specific entry by ID.","operationId":"get_entry_api_v1_entries__entry_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Entry not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"put":{"tags":["entries"],"summary":"Update Entry","description":"Update an entry's content, title, or other properties.","operationId":"update_entry_api_v1_entries__entry_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryResponse"}}}},"400":{"description":"Invalid entry data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Entry not found"},"409":{"description":"The entry changed since `expected_updated_at`; saving would discard that other edit"},"422":{"description":"Validation error (e.g., cannot move to archived journal)"},"500":{"description":"Internal server error"}}},"delete":{"tags":["entries"],"summary":"Delete Entry","description":"Delete an entry.","operationId":"delete_entry_api_v1_entries__entry_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Entry not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/entries/{entry_id}/pdf":{"get":{"tags":["entries"],"summary":"Download Entry Pdf","description":"Download an entry as PDF.","operationId":"download_entry_pdf_api_v1_entries__entry_id__pdf_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moments":{"post":{"tags":["moments"],"summary":"Create Moment","operationId":"create_moment_api_v1_moments_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentResponse"}}}},"400":{"description":"Invalid moment data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"get":{"tags":["moments"],"summary":"Get Moments","operationId":"get_moments_api_v1_moments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor_logged_at_utc","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cursor Logged At Utc"}},{"name":"cursor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cursor Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"include_media","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include Media"}},{"name":"journal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Journal Id"}},{"name":"mood_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"title":"Mood Ids"}},{"name":"person_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"title":"Person Ids"}},{"name":"people_match","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PeopleMatch"},{"type":"null"}],"title":"People Match"}},{"name":"tag_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"title":"Tag Ids"}},{"name":"activity_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","format":"uuid"},"title":"Activity Ids"}},{"name":"goal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Goal Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"include_drafts","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Drafts"}},{"name":"include_empty","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Empty"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentPageResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/calendar":{"get":{"tags":["moments"],"summary":"Get Moment Calendar","operationId":"get_moment_calendar_api_v1_moments_calendar_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"journal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Journal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MomentCalendarItem"},"title":"Response Get Moment Calendar Api V1 Moments Calendar Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/media":{"get":{"tags":["moments"],"summary":"Get Moment Media","description":"Get all media attached to a moment.","operationId":"get_moment_media_api_v1_moments__moment_id__media_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MomentMediaResponse"},"title":"Response Get Moment Media Api V1 Moments Moment Id Media Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/tags":{"get":{"tags":["moments"],"summary":"Get Moment Tags","operationId":"get_moment_tags_api_v1_moments__moment_id__tags_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Get Moment Tags Api V1 Moments Moment Id Tags Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"post":{"tags":["moments"],"summary":"Bulk Add Tags To Moment","operationId":"bulk_add_tags_to_moment_api_v1_moments__moment_id__tags_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Tag Names"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Bulk Add Tags To Moment Api V1 Moments Moment Id Tags Post"}}}},"400":{"description":"Invalid tag names or empty list"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/tags/{tag_id}":{"delete":{"tags":["moments"],"summary":"Remove Tag From Moment","operationId":"remove_tag_from_moment_api_v1_moments__moment_id__tags__tag_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment or tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/people":{"get":{"tags":["moments"],"summary":"Get Moment People","operationId":"get_moment_people_api_v1_moments__moment_id__people_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PersonResponse"},"title":"Response Get Moment People Api V1 Moments Moment Id People Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"put":{"tags":["moments"],"summary":"Replace Moment People","operationId":"replace_moment_people_api_v1_moments__moment_id__people_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentPeopleReplaceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PersonResponse"},"title":"Response Replace Moment People Api V1 Moments Moment Id People Put"}}}},"400":{"description":"Invalid people payload"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/people/{person_id}":{"delete":{"tags":["moments"],"summary":"Remove Person From Moment","operationId":"remove_person_from_moment_api_v1_moments__moment_id__people__person_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment or person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}/people/suggestions/immich":{"post":{"tags":["moments"],"summary":"Get Immich People Suggestions","operationId":"get_immich_people_suggestions_api_v1_moments__moment_id__people_suggestions_immich_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentImmichPeopleSuggestionsResponse"}}}},"400":{"description":"Immich integration not connected or invalid request"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/memories":{"get":{"tags":["moments"],"summary":"Get Memories","operationId":"get_memories_api_v1_moments_memories_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MemoriesFilter"},{"type":"null"}],"title":"Filter"}},{"name":"include_media","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"thumbnails","title":"Include Media"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentMemoriesResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/moments/{moment_id}":{"get":{"tags":["moments"],"summary":"Get Moment","operationId":"get_moment_api_v1_moments__moment_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"put":{"tags":["moments"],"summary":"Update Moment","operationId":"update_moment_api_v1_moments__moment_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentResponse"}}}},"400":{"description":"Invalid moment data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"409":{"description":"The entry changed since `entry_update.expected_updated_at`; saving would discard that other edit"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["moments"],"summary":"Delete Moment","operationId":"delete_moment_api_v1_moments__moment_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/goals":{"get":{"tags":["goals"],"summary":"Get Goals","operationId":"get_goals_api_v1_goals_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoalWithProgressResponse"},"title":"Response Get Goals Api V1 Goals Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["goals"],"summary":"Create Goal","operationId":"create_goal_api_v1_goals_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalResponse"}}}},"400":{"description":"Invalid goal data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/reorder":{"put":{"tags":["goals"],"summary":"Reorder Goals","operationId":"reorder_goals_api_v1_goals_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/{goal_id}":{"put":{"tags":["goals"],"summary":"Update Goal","operationId":"update_goal_api_v1_goals__goal_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalResponse"}}}},"400":{"description":"Invalid goal data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["goals"],"summary":"Delete Goal Permanently","operationId":"delete_goal_permanently_api_v1_goals__goal_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/{goal_id}/archive":{"patch":{"tags":["goals"],"summary":"Archive Goal","operationId":"archive_goal_api_v1_goals__goal_id__archive_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/{goal_id}/unarchive":{"post":{"tags":["goals"],"summary":"Unarchive Goal","operationId":"unarchive_goal_api_v1_goals__goal_id__unarchive_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/{goal_id}/toggle":{"post":{"tags":["goals"],"summary":"Toggle Goal Completion","operationId":"toggle_goal_completion_api_v1_goals__goal_id__toggle_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalToggleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goals/{goal_id}/logs":{"get":{"tags":["goals"],"summary":"Get Goal Logs","operationId":"get_goal_logs_api_v1_goals__goal_id__logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Goal Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":12,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoalLogResponse"},"title":"Response Get Goal Logs Api V1 Goals Goal Id Logs Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Goal not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goal-categories":{"get":{"tags":["goals"],"summary":"Get Goal Categories","operationId":"get_goal_categories_api_v1_goal_categories_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoalCategoryResponse"},"title":"Response Get Goal Categories Api V1 Goal Categories Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["goals"],"summary":"Create Goal Category","operationId":"create_goal_category_api_v1_goal_categories_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCategoryCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCategoryResponse"}}}},"400":{"description":"Invalid category data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goal-categories/reorder":{"put":{"tags":["goals"],"summary":"Reorder Goal Categories","operationId":"reorder_goal_categories_api_v1_goal_categories_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCategoryReorderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/goal-categories/{category_id}":{"put":{"tags":["goals"],"summary":"Update Goal Category","operationId":"update_goal_category_api_v1_goal_categories__category_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Category Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoalCategoryResponse"}}}},"400":{"description":"Invalid category data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Category not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["goals"],"summary":"Delete Goal Category","operationId":"delete_goal_category_api_v1_goal_categories__category_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Category Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Category not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/":{"get":{"tags":["moods"],"summary":"Get All Moods","description":"Get moods visible to the current user, optionally filtered by category.\n\nCategories: positive, negative, neutral.","operationId":"get_all_moods_api_v1_moods__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MoodResponse"},"title":"Response Get All Moods Api V1 Moods Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["moods"],"summary":"Create Mood","description":"Create a user-defined mood.","operationId":"create_mood_api_v1_moods__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodResponse"}}}},"400":{"description":"Invalid input"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/reorder":{"put":{"tags":["moods"],"summary":"Reorder Moods","description":"Reorder the unified mood list for the current user.","operationId":"reorder_moods_api_v1_moods_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"400":{"description":"Invalid input"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/groups":{"get":{"tags":["moods"],"summary":"Get Mood Groups","description":"Get all mood groups for the current user, including nested moods.","operationId":"get_mood_groups_api_v1_moods_groups_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MoodGroupWithMoodsResponse"},"title":"Response Get Mood Groups Api V1 Moods Groups Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["moods"],"summary":"Create Mood Group","operationId":"create_mood_group_api_v1_moods_groups_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupWithMoodsResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/groups/reorder":{"put":{"tags":["moods"],"summary":"Reorder Mood Groups","operationId":"reorder_mood_groups_api_v1_moods_groups_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"400":{"description":"Invalid input"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/groups/{group_id}/moods/reorder":{"put":{"tags":["moods"],"summary":"Reorder Mood Group Moods","operationId":"reorder_mood_group_moods_api_v1_moods_groups__group_id__moods_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupMoodReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"400":{"description":"Invalid input"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/groups/{group_id}":{"put":{"tags":["moods"],"summary":"Update Mood Group","operationId":"update_mood_group_api_v1_moods_groups__group_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodGroupWithMoodsResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["moods"],"summary":"Delete Mood Group","operationId":"delete_mood_group_api_v1_moods_groups__group_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/analytics/statistics":{"get":{"tags":["moods"],"summary":"Get Mood Statistics","description":"Get mood statistics for the current user.","operationId":"get_mood_statistics_api_v1_moods_analytics_statistics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Mood Statistics Api V1 Moods Analytics Statistics Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/analytics/streak":{"get":{"tags":["moods"],"summary":"Get Mood Streak","description":"Get mood logging streak for the current user.","operationId":"get_mood_streak_api_v1_moods_analytics_streak_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Mood Streak Api V1 Moods Analytics Streak Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/moods/{mood_id}":{"put":{"tags":["moods"],"summary":"Update Mood","description":"Update a user-defined mood.","operationId":"update_mood_api_v1_moods__mood_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mood_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mood Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["moods"],"summary":"Get Mood","description":"Get a specific mood by ID.","operationId":"get_mood_api_v1_moods__mood_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mood_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mood Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoodResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["moods"],"summary":"Delete Mood","description":"Soft delete a user-defined mood.","operationId":"delete_mood_api_v1_moods__mood_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mood_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mood Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Mood not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/":{"get":{"tags":["prompts"],"summary":"Get System Prompts","description":"Get system prompts with optional filters.\n\nSupports filtering by category, difficulty level, and pagination.","operationId":"get_system_prompts_api_v1_prompts__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"difficulty_level","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Difficulty Level"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PromptResponse"},"title":"Response Get System Prompts Api V1 Prompts Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/random":{"get":{"tags":["prompts"],"summary":"Get Random Prompt","description":"Get a random system prompt.\n\nRandomly selects from available system prompts, optionally filtered by category or difficulty.","operationId":"get_random_prompt_api_v1_prompts_random_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"difficulty_level","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5,"minimum":1},{"type":"null"}],"title":"Difficulty Level"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"No prompts available"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/daily":{"get":{"tags":["prompts"],"summary":"Get Daily Prompt","description":"Get a daily prompt for the current user.\n\nReturns a new prompt each day. Tracks answered prompts to avoid repetition.","operationId":"get_daily_prompt_api_v1_prompts_daily_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Daily prompt available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponse"}}}},"204":{"description":"No daily prompt available"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/search":{"get":{"tags":["prompts"],"summary":"Search Prompts","description":"Search system prompts by text content.\n\nSearches both prompt text and categories.","operationId":"search_prompts_api_v1_prompts_search_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PromptResponse"},"title":"Response Search Prompts Api V1 Prompts Search Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/analytics/statistics":{"get":{"tags":["prompts"],"summary":"Get Prompt Statistics","description":"Get prompt usage statistics for the current user.\n\nIncludes answered prompts count, favorite categories, and completion trends.","operationId":"get_prompt_statistics_api_v1_prompts_analytics_statistics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Prompt Statistics Api V1 Prompts Analytics Statistics Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/prompts/{prompt_id}":{"get":{"tags":["prompts"],"summary":"Get Prompt","description":"Get a specific prompt by ID.","operationId":"get_prompt_api_v1_prompts__prompt_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"prompt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Prompt Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Prompt not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tags/":{"post":{"tags":["tags"],"summary":"Create Tag","description":"Create a new tag.","operationId":"create_tag_api_v1_tags__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"400":{"description":"Invalid tag data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tags"],"summary":"Get User Tags","description":"Get tags for the current user.\n\nSupports pagination and optional search filtering.","operationId":"get_user_tags_api_v1_tags__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Get User Tags Api V1 Tags Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tags/popular":{"get":{"tags":["tags"],"summary":"Get Popular Tags","description":"Get most popular tags for the current user.\n\nReturns tags ordered by usage count (descending).","operationId":"get_popular_tags_api_v1_tags_popular_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Get Popular Tags Api V1 Tags Popular Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tags/search":{"get":{"tags":["tags"],"summary":"Search Tags","description":"Search tags by name.","operationId":"search_tags_api_v1_tags_search_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"include_unused","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Unused"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TagResponse"},"title":"Response Search Tags Api V1 Tags Search Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tags/unused":{"delete":{"tags":["tags"],"summary":"Delete Unused Tags","description":"Delete every tag that is not attached to any moment.\n\nHard delete, like deleting a single tag. Returns the number removed.","operationId":"delete_unused_tags_api_v1_tags_unused_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnusedTagsCleanupResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/tags/analytics":{"get":{"tags":["tags","plus"],"summary":"Get Tag Analytics","description":"Get detailed tag analytics.\n\nReturns detailed analytics with required time-series data (usage_over_time),\ntag distribution, and all statistics.\n\n**Requires:** Valid Journiv Plus license","operationId":"get_tag_analytics_api_v1_tags_analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagAnalyticsResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Plus license required or invalid"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Plus features not available in this build"}}}},"/api/v1/tags/{tag_id}/analytics":{"get":{"tags":["tags","plus"],"summary":"Get Tag Detail Analytics","description":"Get detailed analytics for a specific tag.\n\nReturns trend analysis, peak month, growth rate, and usage over time\nfor the specified tag.\n\n**Requires:** Valid Journiv Plus license","operationId":"get_tag_detail_analytics_api_v1_tags__tag_id__analytics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"description":"Number of days to analyze","default":365,"title":"Days"},"description":"Number of days to analyze"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagDetailAnalyticsResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Plus license required or invalid"},"404":{"description":"Tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Plus features not available in this build"}}}},"/api/v1/tags/{tag_id}":{"get":{"tags":["tags"],"summary":"Get Tag","description":"Get a specific tag by ID.","operationId":"get_tag_api_v1_tags__tag_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tags"],"summary":"Update Tag","description":"Update a tag.","operationId":"update_tag_api_v1_tags__tag_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"400":{"description":"Invalid tag data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["tags"],"summary":"Delete Tag","description":"Delete a tag.","operationId":"delete_tag_api_v1_tags__tag_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/tags/{source_id}/merge/{target_id}":{"post":{"tags":["tags"],"summary":"Merge Tags","description":"Merge source tag into target tag.\n\nMoves all moment-tag links from source to target, then deletes source tag.\nEnforces case-normalization: prevents merging tags that differ only by case.","operationId":"merge_tags_api_v1_tags__source_id__merge__target_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source Id"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Target Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"400":{"description":"Invalid merge operation (e.g., merging into self)"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Source or target tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/tags/{tag_id}/moments":{"get":{"tags":["tags"],"summary":"Get Moments By Tag","description":"Get moments that have a specific tag.\n\nReturns moment summaries.","operationId":"get_moments_by_tag_api_v1_tags__tag_id__moments_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"include_media","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include Media"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaggedMomentSummary"},"title":"Response Get Moments By Tag Api V1 Tags Tag Id Moments Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Tag not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people/":{"post":{"tags":["people"],"summary":"Create Person","operationId":"create_person_api_v1_people__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"400":{"description":"Invalid person data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["people"],"summary":"Get People","operationId":"get_people_api_v1_people__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PersonResponse"},"title":"Response Get People Api V1 People Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people/{person_id}":{"get":{"tags":["people"],"summary":"Get Person","operationId":"get_person_api_v1_people__person_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["people"],"summary":"Update Person","operationId":"update_person_api_v1_people__person_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"400":{"description":"Invalid person data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["people"],"summary":"Archive Person","operationId":"archive_person_api_v1_people__person_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people/{person_id}/profile-image":{"post":{"tags":["people"],"summary":"Upload Person Profile Image","operationId":"upload_person_profile_image_api_v1_people__person_id__profile_image_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_person_profile_image_api_v1_people__person_id__profile_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"400":{"description":"Invalid image data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"413":{"description":"Image too large"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["people"],"summary":"Remove Person Profile Image","operationId":"remove_person_profile_image_api_v1_people__person_id__profile_image_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people/{person_id}/restore":{"post":{"tags":["people"],"summary":"Restore Person","operationId":"restore_person_api_v1_people__person_id__restore_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"person_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Person Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people/{source_id}/merge/{target_id}":{"post":{"tags":["people"],"summary":"Merge People","operationId":"merge_people_api_v1_people__source_id__merge__target_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source Id"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Target Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonResponse"}}}},"400":{"description":"Invalid merge request"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Person not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people-groups/":{"post":{"tags":["people-groups"],"summary":"Create Person Group","description":"Create a new person group.","operationId":"create_person_group_api_v1_people_groups__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["people-groups"],"summary":"Get Person Groups","description":"Get all person groups for the current user, including grouped people.","operationId":"get_person_groups_api_v1_people_groups__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PersonGroupWithPeopleResponse"},"title":"Response Get Person Groups Api V1 People Groups Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people-groups/{group_id}":{"get":{"tags":["people-groups"],"summary":"Get Person Group","description":"Get a specific person group.","operationId":"get_person_group_api_v1_people_groups__group_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupWithPeopleResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["people-groups"],"summary":"Update Person Group","description":"Update a person group.","operationId":"update_person_group_api_v1_people_groups__group_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["people-groups"],"summary":"Delete Person Group","description":"Delete a person group. People remain and are simply removed from this group.","operationId":"delete_person_group_api_v1_people_groups__group_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/people-groups/reorder":{"put":{"tags":["people-groups"],"summary":"Reorder Person Groups","description":"Reorder person groups for the current user.","operationId":"reorder_person_groups_api_v1_people_groups_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonGroupReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"400":{"description":"Bad request - invalid reorder data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/writing-streak":{"get":{"tags":["analytics"],"summary":"Get Writing Streak","description":"Get writing streak analytics.\n\nReturns current streak, longest streak, and total entries written.","operationId":"get_writing_streak_api_v1_analytics_writing_streak_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Writing Streak Api V1 Analytics Writing Streak Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/analytics/writing-patterns":{"get":{"tags":["analytics"],"summary":"Get Writing Patterns","description":"Get writing patterns over time.\n\nAnalyzes writing frequency, peak times, and trends for the specified period.","operationId":"get_writing_patterns_api_v1_analytics_writing_patterns_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Writing Patterns Api V1 Analytics Writing Patterns Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/analytics/productivity":{"get":{"tags":["analytics"],"summary":"Get Productivity Metrics","description":"Get productivity metrics.\n\nReturns entries per day, words per entry, and consistency scores.","operationId":"get_productivity_metrics_api_v1_analytics_productivity_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Productivity Metrics Api V1 Analytics Productivity Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/analytics/journals":{"get":{"tags":["analytics"],"summary":"Get Journal Analytics","description":"Get analytics for all journals.\n\nReturns entry counts, activity breakdown, and statistics per journal.","operationId":"get_journal_analytics_api_v1_analytics_journals_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Journal Analytics Api V1 Analytics Journals Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/analytics/dashboard":{"get":{"tags":["analytics"],"summary":"Get Analytics Dashboard","description":"Get comprehensive analytics dashboard.\n\nCombines all analytics data into a single response with summary statistics.","operationId":"get_analytics_dashboard_api_v1_analytics_dashboard_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Analytics Dashboard Api V1 Analytics Dashboard Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/media/upload":{"post":{"tags":["media"],"summary":"Upload Media","description":"Upload a media file to a moment.\n\nSupports images, videos, and audio. Files are validated and processed in background.","operationId":"upload_media_api_v1_media_upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media_api_v1_media_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MomentMediaResponse"}}}},"400":{"description":"Invalid file or validation failed"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"413":{"description":"File too large"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/media/{media_id}":{"delete":{"tags":["media"],"summary":"Delete Media","description":"Delete a media file by ID.","operationId":"delete_media_api_v1_media__media_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive or permission denied"},"404":{"description":"Media not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to delete media"}}}},"/api/v1/media/{media_id}/sign":{"get":{"tags":["media"],"summary":"Sign Media Url","description":"Generate a short-lived signed URL for media playback.","operationId":"sign_media_url_api_v1_media__media_id__sign_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSignedUrlResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive or forbidden"},"404":{"description":"Media not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/batch-sign":{"post":{"tags":["media"],"summary":"Batch Sign Media","description":"Batch sign media URLs for moment-owned media IDs.","operationId":"batch_sign_media_api_v1_media_batch_sign_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaBatchSignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaBatchSignResponse"}}}},"400":{"description":"Invalid request"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive or forbidden"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/{media_id}/signed":{"get":{"tags":["media"],"summary":"Get Media Signed","description":"Get media file by ID using a short-lived signed URL.","operationId":"get_media_signed_api_v1_media__media_id__signed_get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}},{"name":"range","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"Invalid or expired signature"},"404":{"description":"Media not found"},"416":{"description":"Range Not Satisfiable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/{media_id}/thumbnail/signed":{"get":{"tags":["media"],"summary":"Get Media Thumbnail Signed","description":"Get media thumbnail by ID using a short-lived signed URL.","operationId":"get_media_thumbnail_signed_api_v1_media__media_id__thumbnail_signed_get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"Invalid or expired signature"},"404":{"description":"Thumbnail not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/{media_id}/info":{"get":{"tags":["media"],"summary":"Get Media Info","description":"Get media information and metadata by ID.","operationId":"get_media_info_api_v1_media__media_id__info_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive or forbidden"},"404":{"description":"Media not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/formats":{"get":{"tags":["media"],"summary":"Get Supported Formats","description":"Get supported file formats.\n\nReturns lists of supported image, video, and audio formats.","operationId":"get_supported_formats_api_v1_media_formats_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media":{"get":{"tags":["media"],"summary":"Get Media Library","description":"A flat, paginated view of the user's completed media across all moments.","operationId":"get_media_library_api_v1_media_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}},{"name":"cursor_logged_at_utc","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cursor Logged At Utc"}},{"name":"cursor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cursor Id"}},{"name":"journal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Journal Id"}},{"name":"media_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/MediaType"},{"type":"null"}],"title":"Media Type"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaLibraryPageResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/media/import-from-immich-async":{"post":{"tags":["media"],"summary":"Import From Immich Async","description":"Start an import job for Immich assets (supports both link-only and copy modes).\n\nBehavior depends on integration.import_mode:\n- LINK_ONLY: Creates placeholder media and processes metadata asynchronously\n- COPY: Creates placeholder media and processes downloads asynchronously","operationId":"import_from_immich_async_api_v1_media_import_from_immich_async_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichImportRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichImportStartResponse"}}}},"400":{"description":"Invalid request or Immich not connected"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/import-jobs/{job_id}":{"get":{"tags":["media"],"summary":"Get Import Job Status","description":"Get the status of an import job.\n\nPoll this endpoint to track progress of an async import.","operationId":"get_import_job_status_api_v1_media_import_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichImportJobResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Job not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/immich/repair-thumbnails":{"post":{"tags":["media"],"summary":"Repair missing thumbnails for Immich media","description":"Manually trigger a background job to repair missing thumbnails for Immich media.","operationId":"repair_immich_thumbnails_api_v1_media_immich_repair_thumbnails_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/media/process/moment/{moment_id}":{"post":{"tags":["media"],"summary":"Process Moment Media","description":"Trigger media processing for a moment.\n\nGenerates thumbnails for images and videos that don't have them yet.","operationId":"process_moment_media_api_v1_media_process_moment__moment_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"moment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Moment Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Moment not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Processing failed"}}}},"/api/v1/export/":{"post":{"tags":["import-export"],"summary":"Create Export","description":"Create a new export job.\n\nThe export will be processed asynchronously. Use the job ID to check status\nand download the file when completed.\n\n**Export Types:**\n- `full`: Export all user data (journals, entries, media, settings)\n- `journal`: Export specific journals (requires journal_ids)","operationId":"create_export_api_v1_export__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJobCreateRequest"}}}},"responses":{"202":{"description":"Export job created and queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJobStatusResponse"}}}},"400":{"description":"Invalid export request"},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"501":{"description":"Not implemented"}}},"get":{"tags":["import-export"],"summary":"List Exports","description":"List export jobs for current user.\n\nReturns recent export jobs ordered by creation date (newest first).","operationId":"list_exports_api_v1_export__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"List of export jobs","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExportJobStatusResponse"},"title":"Response List Exports Api V1 Export Get"}}}},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/export/{job_id}":{"get":{"tags":["import-export"],"summary":"Get Export Status","description":"Get export job status.\n\nCheck the progress and status of an export job. When status is 'completed',\nuse the download endpoint to retrieve the file.","operationId":"get_export_status_api_v1_export__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Export job status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJobStatusResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Export job not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["import-export"],"summary":"Delete Export Job","description":"Delete an export job record.\n\nThis deletes the job record and the associated export file if it exists.\nCannot delete a job that is currently running.","operationId":"delete_export_job_api_v1_export__job_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Export job deleted"},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Export job not found"},"409":{"description":"Cannot delete running job"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/export/{job_id}/download":{"get":{"tags":["import-export"],"summary":"Download Export","description":"Download completed export file.\n\nReturns the ZIP archive containing the exported data and media files.\nThe file will be named `journiv_export_{timestamp}.zip`.","operationId":"download_export_api_v1_export__job_id__download_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Export file","content":{"application/json":{"schema":{}},"application/zip":{}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Export job not found or file not ready"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/export/{job_id}/sign":{"get":{"tags":["import-export"],"summary":"Sign Export Url","description":"Generate a short-lived signed URL for export download.\nUseful for browser-native downloads where Authorization header cannot be added.","operationId":"sign_export_url_api_v1_export__job_id__sign_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSignedUrlResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Export job not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export/{job_id}/download/signed":{"get":{"tags":["import-export"],"summary":"Download Export Signed","description":"Download completed export file using a signed URL.\nDoes not require Authorization header if signature is valid.","operationId":"download_export_signed_api_v1_export__job_id__download_signed_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Export file","content":{"application/json":{"schema":{}},"application/zip":{}}},"403":{"description":"Invalid signature or expired"},"404":{"description":"Export job not found or file not ready"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/import/upload":{"post":{"tags":["import-export"],"summary":"Upload Import","description":"Upload a file for import.\n\n**Supported source types:**\n- `journiv`: Journiv export ZIP file\n- `dayone`: Day One JSON export ZIP file\n- `daylio`: Daylio backup (.daylio ZIP)\n- `markdown`: Markdown files export (coming soon)\n\n**File requirements:**\n- Must be a ZIP archive\n- Maximum size: configured in IMPORT_EXPORT_MAX_FILE_SIZE_MB\n- For Journiv: Must contain data.json file\n- For Day One: Must contain Journal.json files and photos/ directory\n\nThe import will be processed asynchronously. Use the job ID to check status.","operationId":"upload_import_api_v1_import_upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_import_api_v1_import_upload_post"}}}},"responses":{"202":{"description":"Import job created and queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobStatusResponse"}}}},"400":{"description":"Invalid import file or request"},"401":{"description":"Not authenticated"},"413":{"description":"File too large"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/import/{job_id}":{"get":{"tags":["import-export"],"summary":"Get Import Status","description":"Get import job status.\n\nCheck the progress and status of an import job. When status is 'completed',\nthe data has been successfully imported into your account.","operationId":"get_import_status_api_v1_import__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Import job status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobStatusResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Import job not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["import-export"],"summary":"Delete Import Job","description":"Delete an import job record.\n\nThis only deletes the job record, not the imported data.\nCannot delete a job that is currently running.","operationId":"delete_import_job_api_v1_import__job_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Import job deleted"},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Import job not found"},"409":{"description":"Cannot delete running job"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/import/":{"get":{"tags":["import-export"],"summary":"List Imports","description":"List import jobs for current user.\n\nReturns recent import jobs ordered by creation date (newest first).","operationId":"list_imports_api_v1_import__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"List of import jobs","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImportJobStatusResponse"},"title":"Response List Imports Api V1 Import Get"}}}},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Detailed health check with database status.\n\nReturns degraded status if database is unreachable but service is running.","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check Api V1 Health Get"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/memory":{"get":{"tags":["health"],"summary":"Memory Status","description":"Get current memory usage status.\n\nReturns system and process memory metrics for monitoring.","operationId":"memory_status_api_v1_memory_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Memory Status Api V1 Memory Get"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/security/csp-report":{"post":{"tags":["security"],"summary":"Report Csp Violation","description":"Handle CSP violation reports.\n\nReceives CSP violation reports from browsers when Content Security Policy violations occur.","operationId":"report_csp_violation_api_v1_security_csp_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CSPReport"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to process CSP report"}}}},"/api/v1/security/csp-status":{"get":{"tags":["security"],"summary":"Get Csp Status","description":"Get CSP configuration status.\n\nReturns current CSP configuration and monitoring status.","operationId":"get_csp_status_api_v1_security_csp_status_get","responses":{"200":{"description":"CSP configuration status retrieved","content":{"application/json":{"schema":{}}}}}}},"/api/v1/instance/version/info":{"get":{"tags":["version"],"summary":"Get Version Info","description":"Get version information and update status.\n\nReturns cached information from the last version check without triggering a new check.","operationId":"get_version_info_api_v1_instance_version_info_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionInfoResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/instance/version/check":{"post":{"tags":["version"],"summary":"Force Version Check","description":"Force an immediate version check.\n\nTriggers a version check regardless of when the last check was performed.\nMay be rate limited by Plus server (1 request per hour per instance).","operationId":"force_version_check_api_v1_instance_version_check_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForceVersionCheckResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/instance/version/check/enabled":{"get":{"tags":["version"],"summary":"Get Version Check Enabled","description":"Get whether version checking is enabled.\n\nReturns the current admin-controlled setting for version checking.","operationId":"get_version_check_enabled_api_v1_instance_version_check_enabled_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheckEnabledResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"put":{"tags":["version"],"summary":"Update Version Check Enabled","description":"Update whether version checking is enabled.\n\nWhen enabling, triggers an immediate force version check so the user\ncan see the latest version information right away.","operationId":"update_version_check_enabled_api_v1_instance_version_check_enabled_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheckEnabledUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCheckEnabledResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/instance/config":{"get":{"tags":["instance"],"summary":"Get public instance configuration","description":"Get public instance configuration.\n\nReturns non-sensitive instance configuration settings for the frontend,\nincluding import/export file size limits, signup status, and this\ninstance's Journiv Plus capability (see ``PlusCapability``).","operationId":"get_instance_config_api_v1_instance_config_get","responses":{"200":{"description":"Instance configuration retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceConfigResponse"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users (admin only).\n\nReturns a list of all users with their roles, login type, and linked providers.","operationId":"list_users_api_v1_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminUserListResponse"},"title":"Response List Users Api V1 Admin Users Get"}}}},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"post":{"tags":["admin"],"summary":"Create User","description":"Create a new user as admin (can specify role).\n\nAdmins can create users with any role (admin or user).\nThis endpoint bypasses the signup disabled check.","operationId":"create_user_api_v1_admin_users_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Email already registered or invalid data"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/admin/users/{user_id}":{"patch":{"tags":["admin"],"summary":"Update User","description":"Update a user as admin (can change role, email, active status).\n\nAdmin protections:\n- Cannot demote the last admin\n- Can promote users to admin\n- Can change email, name, password, active status","operationId":"update_user_api_v1_admin_users__user_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"400":{"description":"Invalid data or cannot update user"},"403":{"description":"Admin access required"},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}},"delete":{"tags":["admin"],"summary":"Delete User","description":"Delete a user and all their data (admin only).\n\nAdmin protections:\n- Cannot delete the last admin\n\nAll related data (journals, entries, media, tags, mood logs, prompts,\nsettings, and writing streaks) are automatically deleted via CASCADE.","operationId":"delete_user_api_v1_admin_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Cannot delete user (e.g., last admin)"},"403":{"description":"Admin access required"},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/instance/license/register":{"post":{"tags":["license"],"summary":"Register License","description":"Register a Plus license to this installation.\n\nValidates the license key with journiv-plus, binds it to this installation's\ninstall_id, and stores the encrypted license locally.","operationId":"register_license_api_v1_instance_license_register_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseRegisterRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseRegisterResponse"}}}},"400":{"description":"Invalid license key format or validation failed"},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"}}}},"/api/v1/instance/license/info":{"get":{"tags":["license"],"summary":"Get License Info","description":"Get detailed information about the current Plus license.\n\nReturns license status, expiration date, registered email, and current tier.\nSet refresh=true to bypass cache and fetch fresh data from license server.","operationId":"get_license_info_api_v1_instance_license_info_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseInfoResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Admin access required"},"404":{"description":"No license registered for this installation"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"501":{"description":"Plus features module not available"},"503":{"description":"Plus features module missing public key"}}}},"/api/v1/instance/license/reset":{"post":{"tags":["license"],"summary":"Reset License","description":"Unbind the Plus license from this installation.\n\nThis operation:\n- Clears local license state (always, regardless of connectivity)\n- Attempts to unbind from journiv-plus server (best effort)\n- Is idempotent (safe to call multiple times)\n\nAfter unbinding, you can register the license on a different installation.\nMight require email verification (in future) to prevent unauthorized unbinding.\n\nUse cases:\n- Migrating to a new server\n- Reinstalling Journiv\n- Hardware changes that invalidate install_id","operationId":"reset_license_api_v1_instance_license_reset_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseResetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseResetResponse"}}}},"400":{"description":"Invalid request or install_id mismatch"},"401":{"description":"Not authenticated"},"403":{"description":"Email verification failed"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded"},"500":{"description":"Internal server error"}}}},"/api/v1/location/search":{"post":{"tags":["location"],"summary":"Search Location","description":"Search for locations by query string.\n\nUses Nominatim (OpenStreetMap) for geocoding.\nRate limited to respect Nominatim's usage policy.","operationId":"search_location_api_v1_location_search_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationSearchResponse"}}}},"400":{"description":"Invalid search query"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Location service unavailable"}}}},"/api/v1/location/reverse":{"post":{"tags":["location"],"summary":"Reverse Geocode","description":"Reverse geocode coordinates to location name.\n\nConverts latitude/longitude to a human-readable location name.","operationId":"reverse_geocode_api_v1_location_reverse_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReverseGeocodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationResult"}}}},"400":{"description":"Invalid coordinates"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Location not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Location service unavailable"}}}},"/api/v1/weather/fetch":{"post":{"tags":["weather"],"summary":"Fetch Weather","description":"Fetch weather data for given coordinates and entry time.\n\nUses OpenWeather API. Requires OPEN_WEATHER_API_KEY_25 or OPEN_WEATHER_API_KEY_30 to be configured.\nReturns structured error if weather service is not configured.","operationId":"fetch_weather_api_v1_weather_fetch_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeatherFetchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/WeatherFetchResponse"},{"$ref":"#/components/schemas/WeatherServiceDisabledResponse"}],"title":"Response Fetch Weather Api V1 Weather Fetch Post"}}}},"400":{"description":"Invalid coordinates"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal server error"},"503":{"description":"Weather service unavailable"}}}},"/api/v1/integrations/connect":{"post":{"tags":["integrations"],"summary":"Connect","description":"Connect or update an integration.\n\nConnect or update an integration with an external provider (e.g., Immich).\nCredentials are encrypted before storage.","operationId":"connect_api_v1_integrations_connect_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConnectResponse"}}}},"400":{"description":"Invalid provider or credentials"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to connect to provider"}}}},"/api/v1/integrations/{provider}/status":{"get":{"tags":["integrations"],"summary":"Get Status","description":"Get the status of an integration.\n\nReturns the current connection status, sync history, and activity state.","operationId":"get_status_api_v1_integrations__provider__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationStatusResponse"}}}},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to retrieve status"}}}},"/api/v1/integrations/{provider}/disconnect":{"delete":{"tags":["integrations"],"summary":"Disconnect","description":"Disconnect an integration.\n\nDeactivates the integration. Connection history and cached data are preserved.","operationId":"disconnect_api_v1_integrations__provider__disconnect_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"404":{"description":"Integration not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to disconnect"}}}},"/api/v1/integrations/{provider}/settings":{"put":{"tags":["integrations"],"summary":"Update Settings","description":"Update integration settings.\n\nUpdates settings like import mode without requiring reconnection.","operationId":"update_settings_api_v1_integrations__provider__settings_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationSettingsUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationStatusResponse"}}}},"401":{"description":"Not authenticated"},"404":{"description":"Integration not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to update settings"}}}},"/api/v1/integrations/{provider}/assets":{"get":{"tags":["integrations"],"summary":"List Assets","description":"List assets from a provider.\n\nReturns a paginated list of assets, using cached data when available.","operationId":"list_assets_api_v1_integrations__provider__assets_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"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":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force Refresh"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationAssetsListResponse"}}}},"400":{"description":"Invalid request parameters"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to retrieve assets"}}}},"/api/v1/integrations/{provider}/sync":{"post":{"tags":["integrations"],"summary":"Trigger Sync","description":"Manually trigger a sync for an integration.\n\nStarts a background task to sync data from the provider.","operationId":"trigger_sync_api_v1_integrations__provider__sync_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Sync Api V1 Integrations Provider Sync Post"}}}},"400":{"description":"Integration not connected or disabled"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to start sync"}}}},"/api/v1/integrations/immich/people":{"get":{"tags":["integrations"],"summary":"List Immich People","description":"List Immich people with Journiv mapping status.","operationId":"list_immich_people_api_v1_integrations_immich_people_get","security":[{"OAuth2PasswordBearer":[]}],"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":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"include_hidden","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Hidden"}},{"name":"mapped","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|mapped|unmapped)$","default":"all","title":"Mapped"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichPeopleListResponse"}}}},"400":{"description":"Immich integration not connected or invalid request"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to retrieve Immich people"}}}},"/api/v1/integrations/immich/people/import":{"post":{"tags":["integrations"],"summary":"Import Immich People","description":"Create/link Journiv people from selected Immich people.","operationId":"import_immich_people_api_v1_integrations_immich_people_import_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichPeopleImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichPeopleImportResponse"}}}},"400":{"description":"Immich integration not connected or invalid request"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to import Immich people"}}}},"/api/v1/integrations/immich/assets/{asset_id}/faces":{"get":{"tags":["integrations"],"summary":"Get Immich Asset Faces","description":"Fetch or read cached Immich face detections for one asset.","operationId":"get_immich_asset_faces_api_v1_integrations_immich_assets__asset_id__faces_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichAssetFacesResponse"}}}},"400":{"description":"Immich integration not connected or invalid request"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to retrieve Immich faces"}}}},"/api/v1/integrations/immich/assets/faces:batch":{"post":{"tags":["integrations"],"summary":"Get Immich Asset Faces Batch","description":"Fetch or read cached Immich face detections for several assets.","operationId":"get_immich_asset_faces_batch_api_v1_integrations_immich_assets_faces_batch_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichBatchFacesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImmichBatchFacesResponse"}}}},"400":{"description":"Immich integration not connected or invalid request"},"401":{"description":"Not authenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to retrieve Immich faces"}}}},"/api/v1/integrations/immich/proxy/people/{external_person_id}/thumbnail":{"get":{"tags":["integrations"],"summary":"Proxy Immich Person Thumbnail","description":"Proxy an Immich person thumbnail through Journiv.","operationId":"proxy_immich_person_thumbnail_api_v1_integrations_immich_proxy_people__external_person_id__thumbnail_get","parameters":[{"name":"external_person_id","in":"path","required":true,"schema":{"type":"string","title":"External Person Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Invalid signature or provider authentication failed"},"404":{"description":"Person thumbnail not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to fetch person thumbnail"}}}},"/api/v1/integrations/{provider}/proxy/{asset_id}/thumbnail":{"get":{"tags":["integrations"],"summary":"Proxy Thumbnail","description":"Proxy an asset's thumbnail from the provider.\n\nProxies the thumbnail to the browser while handling authentication\nand caching.","operationId":"proxy_thumbnail_api_v1_integrations__provider__proxy__asset_id__thumbnail_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Integration not found or inactive"},"401":{"description":"Not authenticated or provider authentication failed"},"404":{"description":"Asset not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to fetch thumbnail"}}}},"/api/v1/integrations/{provider}/proxy/{asset_id}/original":{"get":{"tags":["integrations"],"summary":"Proxy Original","description":"Proxy an asset's original file from the provider.\n\nSupports Range requests for video streaming and seeking.","operationId":"proxy_original_api_v1_integrations__provider__proxy__asset_id__original_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/IntegrationProvider"}},{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"uid","in":"query","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}},{"name":"Range","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"400":{"description":"Integration not found or inactive"},"401":{"description":"Not authenticated or provider authentication failed"},"404":{"description":"Asset not found"},"416":{"description":"Range not satisfiable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Failed to fetch original file"}}}},"/api/v1/activities":{"get":{"tags":["activities"],"summary":"Get Activities","description":"Get all activities for the current user.","operationId":"get_activities_api_v1_activities_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivityResponse"},"title":"Response Get Activities Api V1 Activities Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["activities"],"summary":"Create Activity","description":"Create a new activity.","operationId":"create_activity_api_v1_activities_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponse"}}}},"400":{"description":"Invalid activity data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activities/reorder":{"put":{"tags":["activities"],"summary":"Reorder Activities","description":"Reorder activities for the current user.","operationId":"reorder_activities_api_v1_activities_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activities/{activity_id}":{"get":{"tags":["activities"],"summary":"Get Activity","description":"Get a specific activity and usage count.","operationId":"get_activity_api_v1_activities__activity_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Activity Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityWithUsageResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Activity not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["activities"],"summary":"Update Activity","description":"Update an activity.","operationId":"update_activity_api_v1_activities__activity_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Activity Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityResponse"}}}},"400":{"description":"Invalid activity data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Activity not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activities"],"summary":"Delete Activity","description":"Delete an activity.","operationId":"delete_activity_api_v1_activities__activity_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Activity Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Activity not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activity-groups/":{"post":{"tags":["activity-groups"],"summary":"Create Activity Group","description":"Create a new activity group.","operationId":"create_activity_group_api_v1_activity_groups__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["activity-groups"],"summary":"Get Activity Groups","description":"Get all activity groups for the current user, including their activities.","operationId":"get_activity_groups_api_v1_activity_groups__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivityGroupWithActivitiesResponse"},"title":"Response Get Activity Groups Api V1 Activity Groups Get"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activity-groups/{group_id}":{"get":{"tags":["activity-groups"],"summary":"Get Activity Group","description":"Get a specific activity group.","operationId":"get_activity_group_api_v1_activity_groups__group_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupWithActivitiesResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["activity-groups"],"summary":"Update Activity Group","description":"Update an activity group.","operationId":"update_activity_group_api_v1_activity_groups__group_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupResponse"}}}},"400":{"description":"Invalid group data"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["activity-groups"],"summary":"Delete Activity Group","description":"Delete an activity group.\n\nActivities in this group will be ungrouped (group_id set to NULL).","operationId":"delete_activity_group_api_v1_activity_groups__group_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"404":{"description":"Group not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activity-groups/reorder":{"put":{"tags":["activity-groups"],"summary":"Reorder Activity Groups","description":"Reorder activity groups for the current user.","operationId":"reorder_activity_groups_api_v1_activity_groups_reorder_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityGroupReorderRequest"}}}},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Not authenticated"},"403":{"description":"Account inactive"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plus/analytics/tags":{"get":{"tags":["plus"],"summary":"Tag analytics (Plus)","description":"Return aggregate tag analytics for the authenticated user.","operationId":"get_tag_analytics_api_v1_plus_analytics_tags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlusTagAnalyticsResult"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/plus/analytics/tags/{tag_id}":{"get":{"tags":["plus"],"summary":"Per-tag detail analytics (Plus)","description":"Return detailed trend analytics for a single tag.","operationId":"get_tag_detail_analytics_api_v1_plus_analytics_tags__tag_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tag Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"description":"Number of days to analyse","default":365,"title":"Days"},"description":"Number of days to analyse"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlusTagDetailAnalyticsResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plus/entries/{entry_id}/publish":{"patch":{"tags":["plus"],"summary":"Toggle entry publish state (Plus)","description":"Publish or unpublish an entry. Generates public_id and slug on first publish.","operationId":"toggle_entry_publish_api_v1_plus_entries__entry_id__publish_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Toggle Entry Publish Api V1 Plus Entries Entry Id Publish Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plus/entries/{entry_id}/publishing-config":{"patch":{"tags":["plus"],"summary":"Update publishing configuration (Plus)","description":"Update the slug and/or search-engine indexing flag for a published entry.","operationId":"update_publishing_config_api_v1_plus_entries__entry_id__publishing_config_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishingConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Publishing Config Api V1 Plus Entries Entry Id Publishing Config Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pub/{identifier}/pdf":{"get":{"summary":"Download Published Entry Pdf","description":"Download a published entry as PDF.","operationId":"download_published_entry_pdf_pub__identifier__pdf_get","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pub/{identifier}":{"get":{"tags":["plus-public"],"summary":"Render a published entry as HTML","description":"Serve a published entry as a themed HTML page. No authentication required.","operationId":"get_published_entry_pub__identifier__get","parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pub/media/{media_id}":{"get":{"tags":["plus-public"],"summary":"Serve published media","description":"Serve media files for published entries.","operationId":"get_published_media_pub_media__media_id__get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/oembed":{"get":{"tags":["plus-public"],"summary":"oEmbed endpoint","description":"Return oEmbed JSON for embedding a published entry in third-party platforms.","operationId":"get_oembed_api_v1_oembed_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"Public URL of the entry","title":"Url"},"description":"Public URL of the entry"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Oembed Api V1 Oembed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActivityCreate":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"}},"type":"object","required":["name"],"title":"ActivityCreate","description":"Activity creation schema."},"ActivityGroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"type":"integer","title":"Position","default":0}},"type":"object","required":["name"],"title":"ActivityGroupCreate"},"ActivityGroupPositionUpdate":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"ActivityGroupPositionUpdate"},"ActivityGroupReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/ActivityGroupPositionUpdate"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"ActivityGroupReorderRequest"},"ActivityGroupResponse":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["name","id","user_id"],"title":"ActivityGroupResponse"},"ActivityGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"ActivityGroupUpdate"},"ActivityGroupWithActivitiesResponse":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"activities":{"items":{"$ref":"#/components/schemas/ActivityResponse"},"type":"array","title":"Activities","default":[]}},"type":"object","required":["name","id","user_id"],"title":"ActivityGroupWithActivitiesResponse"},"ActivityPositionUpdate":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"ActivityPositionUpdate"},"ActivityReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/ActivityPositionUpdate"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"ActivityReorderRequest"},"ActivityResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["created_at","updated_at","name","id","user_id"],"title":"ActivityResponse","description":"Activity response schema."},"ActivityUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"}},"type":"object","title":"ActivityUpdate","description":"Activity update schema."},"ActivityWithUsageResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["created_at","updated_at","name","id","user_id","usage_count"],"title":"ActivityWithUsageResponse","description":"Activity response with usage count."},"AdminUserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","title":"Name"},"password":{"type":"string","title":"Password"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}],"default":"user"}},"type":"object","required":["email","name","password"],"title":"AdminUserCreate","description":"Admin user creation schema (can specify role)."},"AdminUserListResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","title":"Name"},"role":{"$ref":"#/components/schemas/UserRole"},"is_active":{"type":"boolean","title":"Is Active"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"login_type":{"type":"string","title":"Login Type"},"linked_providers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Linked Providers"}},"type":"object","required":["id","email","name","role","is_active","created_at","login_type"],"title":"AdminUserListResponse","description":"Admin user list response with additional metadata."},"AdminUserUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"AdminUserUpdate","description":"Admin user update schema (can change role, active status)."},"AssetType":{"type":"string","enum":["IMAGE","VIDEO","AUDIO","OTHER"],"title":"AssetType","description":"Media asset types across all providers.\n\nUsed for consistent categorization of cached items."},"Body_login_for_access_token_api_v1_auth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_for_access_token_api_v1_auth_token_post"},"Body_upload_import_api_v1_import_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Import file (ZIP archive)"},"source_type":{"type":"string","title":"Source Type","description":"Source type: journiv, markdown, dayone, daylio"}},"type":"object","required":["file","source_type"],"title":"Body_upload_import_api_v1_import_upload_post"},"Body_upload_media_api_v1_media_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"}},"type":"object","required":["file","moment_id"],"title":"Body_upload_media_api_v1_media_upload_post"},"Body_upload_person_profile_image_api_v1_people__person_id__profile_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Profile image file"}},"type":"object","required":["file"],"title":"Body_upload_person_profile_image_api_v1_people__person_id__profile_image_post"},"CSPReport":{"properties":{"csp_report":{"$ref":"#/components/schemas/CSPViolationReport"}},"type":"object","required":["csp_report"],"title":"CSPReport","description":"CSP report wrapper."},"CSPViolationReport":{"properties":{"blocked_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocked Uri"},"column_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Column Number"},"document_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Uri"},"effective_directive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Directive"},"line_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Number"},"original_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Policy"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"source_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source File"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"violated_directive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Violated Directive"}},"type":"object","title":"CSPViolationReport","description":"CSP violation report model."},"DeleteResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"DeleteResponse","description":"Response schema for delete operations."},"EntryCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_delta":{"anyOf":[{"$ref":"#/components/schemas/QuillDelta"},{"type":"null"}]},"journal_id":{"type":"string","format":"uuid","title":"Journal Id"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"}},"type":"object","required":["journal_id","moment_id"],"title":"EntryCreate","description":"Entry creation schema."},"EntryDraftCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_delta":{"anyOf":[{"$ref":"#/components/schemas/QuillDelta"},{"type":"null"}]},"journal_id":{"type":"string","format":"uuid","title":"Journal Id"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"}},"type":"object","required":["journal_id","moment_id"],"title":"EntryDraftCreate","description":"Draft entry creation schema."},"EntryPreviewResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_plain_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Plain Text"},"journal_id":{"type":"string","format":"uuid","title":"Journal Id"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"word_count":{"type":"integer","title":"Word Count","default":0},"is_draft":{"type":"boolean","title":"Is Draft","default":false},"public_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Id","description":"Public URL-safe identifier (12 chars, generated on first publish)"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug","description":"URL slug generated from title (user-customizable)"},"is_published":{"type":"boolean","title":"Is Published","description":"Whether this entry is publicly published","default":false},"is_indexed":{"type":"boolean","title":"Is Indexed","description":"Whether published entry should be indexed by search engines","default":false}},"type":"object","required":["created_at","updated_at","id","journal_id","moment_id"],"title":"EntryPreviewResponse","description":"Entry preview schema for listings (truncated content)."},"EntryResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_delta":{"anyOf":[{"$ref":"#/components/schemas/QuillDelta"},{"type":"null"}]},"id":{"type":"string","format":"uuid","title":"Id"},"journal_id":{"type":"string","format":"uuid","title":"Journal Id"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"word_count":{"type":"integer","title":"Word Count"},"is_draft":{"type":"boolean","title":"Is Draft","default":false},"user_id":{"type":"string","format":"uuid","title":"User Id"},"public_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Id","description":"Public URL-safe identifier (12 chars, generated on first publish)"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug","description":"URL slug generated from title (user-customizable)"},"is_published":{"type":"boolean","title":"Is Published","description":"Whether this entry is publicly published","default":false},"is_indexed":{"type":"boolean","title":"Is Indexed","description":"Whether published entry should be indexed by search engines","default":false},"content_plain_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Plain Text"}},"type":"object","required":["created_at","updated_at","id","journal_id","moment_id","word_count","user_id"],"title":"EntryResponse","description":"Entry response schema."},"EntryUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_delta":{"anyOf":[{"$ref":"#/components/schemas/QuillDelta"},{"type":"null"}]},"journal_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Journal Id"},"is_draft":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Draft"},"expected_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Updated At","description":"The entry's `updated_at` as the client last saw it. When given, the update is refused with 409 if the entry has changed since, so a save cannot silently discard an edit made on another device. Omit it for last-write-wins."}},"type":"object","title":"EntryUpdate","description":"Entry update schema — content fields only."},"ExportJobCreateRequest":{"properties":{"export_type":{"$ref":"#/components/schemas/ExportType","description":"Export type: full, journal"},"journal_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Journal Ids","description":"Specific journal IDs for selective export"},"include_media":{"type":"boolean","title":"Include Media","description":"Whether to include media files","default":true}},"type":"object","required":["export_type"],"title":"ExportJobCreateRequest","description":"Request to create an export job.\n\nMaps to: ExportJob model (app/models/export_job.py)"},"ExportJobStatusResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Job ID (UUID)"},"status":{"$ref":"#/components/schemas/JobStatus","description":"Job status: pending, running, completed, failed, cancelled"},"progress":{"type":"integer","maximum":100,"minimum":0,"title":"Progress","description":"Progress percentage 0-100"},"total_items":{"type":"integer","title":"Total Items","description":"Total number of items to process"},"processed_items":{"type":"integer","title":"Processed Items","description":"Number of items processed so far"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When job was created (UTC)"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When job completed or failed (UTC)"},"result_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result Data","description":"Result statistics (JSON)"},"errors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Errors","description":"Error messages (JSON array)"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings","description":"Warning messages (JSON array)"},"export_type":{"$ref":"#/components/schemas/ExportType","description":"Export type: full, journal"},"include_media":{"type":"boolean","title":"Include Media","description":"Whether media is included"},"file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Path","description":"Path to export file (internal use)"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size","description":"Export file size in bytes"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url","description":"URL to download export file"}},"type":"object","required":["id","status","progress","total_items","processed_items","created_at","export_type","include_media"],"title":"ExportJobStatusResponse","description":"Export job status with download info.\n\nMaps to: ExportJob model (app/models/export_job.py)"},"ExportType":{"type":"string","enum":["full","journal"],"title":"ExportType","description":"Types of exports."},"ForceVersionCheckResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the version check succeeded"},"message":{"type":"string","title":"Message","description":"Human-readable status message"},"version_info":{"anyOf":[{"$ref":"#/components/schemas/VersionInfoResponse"},{"type":"null"}],"description":"Version information (if check succeeded)"},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Seconds","description":"Seconds to wait before retrying (if rate limited)"},"cached":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cached","description":"Whether the returned version_info is from cache (fallback after failed check)"}},"type":"object","required":["success","message"],"title":"ForceVersionCheckResponse","description":"Response from force version check endpoint.","example":{"message":"Version check completed successfully","success":true,"version_info":{"changelog_url":"https://journiv.app/changelog","current_version":"0.1.0-beta.9","install_id":"550e8400-e29b-41d4-a716-446655440000","last_check_success":true,"last_checked":"2025-12-09T10:30:00Z","latest_version":"0.1.0-beta.11","update_available":true,"update_url":"https://github.com/journiv/journiv/releases/tag/v0.1.0-beta.11"}}},"GoalCategoryCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["name"],"title":"GoalCategoryCreate"},"GoalCategoryPositionUpdate":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"GoalCategoryPositionUpdate"},"GoalCategoryReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/GoalCategoryPositionUpdate"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"GoalCategoryReorderRequest"},"GoalCategoryResponse":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["name","id","user_id"],"title":"GoalCategoryResponse"},"GoalCategoryUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"GoalCategoryUpdate"},"GoalCreate":{"properties":{"title":{"type":"string","title":"Title"},"activity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Activity Id"},"category_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Category Id"},"goal_type":{"$ref":"#/components/schemas/GoalType","default":"achieve"},"frequency_type":{"$ref":"#/components/schemas/GoalFrequency","default":"daily"},"target_count":{"type":"integer","minimum":1,"title":"Target Count","default":1},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"is_paused":{"type":"boolean","title":"Is Paused","default":false},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"type":"integer","title":"Position","default":0}},"type":"object","required":["title"],"title":"GoalCreate"},"GoalFrequency":{"type":"string","enum":["daily","weekly","monthly"],"title":"GoalFrequency","description":"Goal frequency."},"GoalLogResponse":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"goal_id":{"type":"string","format":"uuid","title":"Goal Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"logged_date":{"type":"string","format":"date","title":"Logged Date"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"status":{"$ref":"#/components/schemas/GoalLogStatus"},"count":{"type":"integer","title":"Count"},"source":{"type":"string","title":"Source"},"last_updated_at":{"type":"string","format":"date-time","title":"Last Updated At"},"moment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Moment Id"}},"type":"object","required":["id","goal_id","user_id","logged_date","period_start","period_end","status","count","source","last_updated_at"],"title":"GoalLogResponse"},"GoalLogStatus":{"type":"string","enum":["success","fail","skipped"],"title":"GoalLogStatus","description":"Goal log status for a period."},"GoalPositionUpdate":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"GoalPositionUpdate"},"GoalReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/GoalPositionUpdate"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"GoalReorderRequest"},"GoalResponse":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"title":{"type":"string","title":"Title"},"activity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Activity Id"},"category_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Category Id"},"goal_type":{"$ref":"#/components/schemas/GoalType","default":"achieve"},"frequency_type":{"$ref":"#/components/schemas/GoalFrequency","default":"daily"},"target_count":{"type":"integer","minimum":1,"title":"Target Count","default":1},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"is_paused":{"type":"boolean","title":"Is Paused","default":false},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"category":{"anyOf":[{"$ref":"#/components/schemas/GoalCategoryResponse"},{"type":"null"}]}},"type":"object","required":["title","id","user_id"],"title":"GoalResponse"},"GoalToggleRequest":{"properties":{"logged_date":{"type":"string","format":"date","title":"Logged Date"},"status":{"anyOf":[{"$ref":"#/components/schemas/GoalLogStatus"},{"type":"null"}]}},"type":"object","required":["logged_date"],"title":"GoalToggleRequest"},"GoalType":{"type":"string","enum":["achieve","avoid"],"title":"GoalType","description":"Goal direction."},"GoalUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"activity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Activity Id"},"category_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Category Id"},"goal_type":{"anyOf":[{"$ref":"#/components/schemas/GoalType"},{"type":"null"}]},"frequency_type":{"anyOf":[{"$ref":"#/components/schemas/GoalFrequency"},{"type":"null"}]},"target_count":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Target Count"},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"is_paused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Paused"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"GoalUpdate"},"GoalWithProgressResponse":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"title":{"type":"string","title":"Title"},"activity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Activity Id"},"category_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Category Id"},"goal_type":{"$ref":"#/components/schemas/GoalType","default":"achieve"},"frequency_type":{"$ref":"#/components/schemas/GoalFrequency","default":"daily"},"target_count":{"type":"integer","minimum":1,"title":"Target Count","default":1},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"is_paused":{"type":"boolean","title":"Is Paused","default":false},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"category":{"anyOf":[{"$ref":"#/components/schemas/GoalCategoryResponse"},{"type":"null"}]},"current_period_completed":{"type":"integer","title":"Current Period Completed","default":0},"status":{"anyOf":[{"$ref":"#/components/schemas/GoalLogStatus"},{"type":"null"}]}},"type":"object","required":["title","id","user_id"],"title":"GoalWithProgressResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImmichAssetFacesResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"faces":{"items":{"$ref":"#/components/schemas/ImmichFaceResponse"},"type":"array","title":"Faces"}},"type":"object","required":["asset_id","faces"],"title":"ImmichAssetFacesResponse"},"ImmichBatchFacesRequest":{"properties":{"asset_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Asset Ids"},"refresh":{"type":"boolean","title":"Refresh","default":false}},"type":"object","required":["asset_ids"],"title":"ImmichBatchFacesRequest"},"ImmichBatchFacesResponse":{"properties":{"results":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ImmichFaceResponse"},"type":"array"},"type":"object","title":"Results"},"errors":{"additionalProperties":{"type":"string"},"type":"object","title":"Errors"}},"type":"object","required":["results"],"title":"ImmichBatchFacesResponse"},"ImmichFaceResponse":{"properties":{"external_face_id":{"type":"string","title":"External Face Id"},"external_asset_id":{"type":"string","title":"External Asset Id"},"external_person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Person Id"},"person":{"anyOf":[{"$ref":"#/components/schemas/PersonSummaryResponse"},{"type":"null"}]},"suggested":{"type":"boolean","title":"Suggested","default":false},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"bounding_box_x1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounding Box X1"},"bounding_box_y1":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounding Box Y1"},"bounding_box_x2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounding Box X2"},"bounding_box_y2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bounding Box Y2"},"image_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Width"},"image_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Image Height"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"last_synced_at":{"type":"string","format":"date-time","title":"Last Synced At"}},"type":"object","required":["external_face_id","external_asset_id","last_synced_at"],"title":"ImmichFaceResponse"},"ImmichImportAsset":{"properties":{"id":{"type":"string","title":"Id"},"type":{"anyOf":[{"$ref":"#/components/schemas/AssetType"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"taken_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Taken At"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["id"],"title":"ImmichImportAsset","description":"Optional Immich asset metadata to seed placeholder media."},"ImmichImportJobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"moment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Moment Id"},"status":{"$ref":"#/components/schemas/JobStatus"},"total_items":{"type":"integer","title":"Total Items"},"processed_items":{"type":"integer","title":"Processed Items"},"failed_items":{"type":"integer","title":"Failed Items"},"result_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result Data"},"errors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Errors"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"progress_percent":{"type":"number","title":"Progress Percent","description":"Calculate progress percentage for backward compatibility or UI.","readOnly":true}},"type":"object","required":["id","status","total_items","processed_items","failed_items","created_at","progress_percent"],"title":"ImmichImportJobResponse","description":"Response schema for import job status mapping to unified ImportJob."},"ImmichImportMode":{"type":"string","enum":["create","link","ignore"],"title":"ImmichImportMode"},"ImmichImportRequest":{"properties":{"asset_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Asset Ids"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"assets":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImmichImportAsset"},"type":"array"},{"type":"null"}],"title":"Assets"}},"type":"object","required":["asset_ids","moment_id"],"title":"ImmichImportRequest","description":"Request to import assets from Immich."},"ImmichImportStartResponse":{"properties":{"job_id":{"type":"string","format":"uuid","title":"Job Id"},"status":{"type":"string","title":"Status","default":"accepted"},"message":{"type":"string","title":"Message"},"total_assets":{"type":"integer","title":"Total Assets"},"media":{"items":{"$ref":"#/components/schemas/MomentMediaResponse"},"type":"array","title":"Media"}},"type":"object","required":["job_id","message","total_assets"],"title":"ImmichImportStartResponse","description":"Response when starting an async import job."},"ImmichPeopleImportItem":{"properties":{"external_person_id":{"type":"string","title":"External Person Id"},"mode":{"$ref":"#/components/schemas/ImmichImportMode"},"person_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Person Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"group_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Group Ids"},"sync_enabled":{"type":"boolean","title":"Sync Enabled","default":true}},"type":"object","required":["external_person_id","mode"],"title":"ImmichPeopleImportItem"},"ImmichPeopleImportRequest":{"properties":{"people":{"items":{"$ref":"#/components/schemas/ImmichPeopleImportItem"},"type":"array","maxItems":100,"minItems":1,"title":"People"}},"type":"object","required":["people"],"title":"ImmichPeopleImportRequest"},"ImmichPeopleImportResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ImmichPeopleImportResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"ImmichPeopleImportResponse"},"ImmichPeopleImportResult":{"properties":{"external_person_id":{"type":"string","title":"External Person Id"},"mode":{"$ref":"#/components/schemas/ImmichImportMode"},"person":{"anyOf":[{"$ref":"#/components/schemas/PersonSummaryResponse"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["external_person_id","mode"],"title":"ImmichPeopleImportResult"},"ImmichPeopleListResponse":{"properties":{"people":{"items":{"$ref":"#/components/schemas/ImmichPersonResponse"},"type":"array","title":"People"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"total":{"type":"integer","title":"Total"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["people","page","limit","total","has_more"],"title":"ImmichPeopleListResponse"},"ImmichPersonResponse":{"properties":{"external_person_id":{"type":"string","title":"External Person Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"is_hidden":{"type":"boolean","title":"Is Hidden","default":false},"is_favorite":{"type":"boolean","title":"Is Favorite","default":false},"feature_face_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Face Asset Id"},"mapped_person":{"anyOf":[{"$ref":"#/components/schemas/PersonSummaryResponse"},{"type":"null"}]},"sync_enabled":{"type":"boolean","title":"Sync Enabled","default":false}},"type":"object","required":["external_person_id"],"title":"ImmichPersonResponse","description":"Immich person normalized for Journiv people import/link UI."},"ImportJobStatusResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Job ID (UUID)"},"status":{"$ref":"#/components/schemas/JobStatus","description":"Job status: pending, running, completed, failed, cancelled"},"progress":{"type":"integer","maximum":100,"minimum":0,"title":"Progress","description":"Progress percentage 0-100"},"total_items":{"type":"integer","title":"Total Items","description":"Total number of items to process"},"processed_items":{"type":"integer","title":"Processed Items","description":"Number of items processed so far"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When job was created (UTC)"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When job completed or failed (UTC)"},"result_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result Data","description":"Result statistics (JSON)"},"errors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Errors","description":"Error messages (JSON array)"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Warnings","description":"Warning messages (JSON array)"},"source_type":{"$ref":"#/components/schemas/ImportSourceType","description":"Source type: journiv, markdown, dayone"}},"type":"object","required":["id","status","progress","total_items","processed_items","created_at","source_type"],"title":"ImportJobStatusResponse","description":"Import job status.\n\nMaps to: ImportJob model (app/models/import_job.py)"},"ImportMode":{"type":"string","enum":["link_only","copy"],"title":"ImportMode","description":"Import mode for external assets.\n\nDetermines how assets are handled when imported from external providers."},"ImportSourceType":{"type":"string","enum":["journiv","markdown","dayone","immich","daylio"],"title":"ImportSourceType","description":"Source types for imports."},"InstanceConfigResponse":{"properties":{"import_export_max_file_size_mb":{"type":"integer","title":"Import Export Max File Size Mb"},"max_file_size_mb":{"type":"integer","title":"Max File Size Mb"},"allowed_media_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Media Types"},"allowed_file_extensions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed File Extensions"},"disable_signup":{"type":"boolean","title":"Disable Signup"},"immich_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Immich Base Url"},"oidc_enabled":{"type":"boolean","title":"Oidc Enabled"},"oidc_only":{"type":"boolean","title":"Oidc Only"},"plus":{"$ref":"#/components/schemas/PlusCapability"}},"type":"object","required":["import_export_max_file_size_mb","max_file_size_mb","disable_signup","oidc_enabled","oidc_only","plus"],"title":"InstanceConfigResponse","description":"Public instance configuration safe for frontend consumption."},"IntegrationAssetResponse":{"properties":{"id":{"type":"string","title":"Id","description":"External asset ID from the provider"},"type":{"$ref":"#/components/schemas/AssetType","description":"Asset type (IMAGE, VIDEO, AUDIO, OTHER)"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Human-readable title or filename"},"taken_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Taken At","description":"When the asset was created, taken, or watched"},"thumb_url":{"type":"string","title":"Thumb Url","description":"Relative URL to thumbnail proxy endpoint"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url","description":"Signed URL to original asset proxy endpoint"}},"type":"object","required":["id","type","thumb_url"],"title":"IntegrationAssetResponse","description":"Normalized asset data from any integration provider.\n\nThis schema provides a consistent format for assets across all providers\n(Immich, Jellyfin, Audiobookshelf, etc.), making it easy for the frontend\nto display them in a unified interface.\n\nFields:\n id: External asset ID (from the provider)\n type: Asset type (IMAGE, VIDEO, AUDIO, OTHER)\n title: Human-readable title (filename for Immich, show title for Jellyfin, etc.)\n taken_at: When the asset was created/taken/watched\n thumb_url: Relative URL to thumbnail proxy endpoint\n\nExample Response (Immich photo):\n {\n \"id\": \"abc-123\",\n \"type\": \"IMAGE\",\n \"title\": \"IMG_1234.jpg\",\n \"taken_at\": \"2025-01-01T12:00:00Z\",\n \"thumb_url\": \"/api/v1/integrations/immich/proxy/abc-123/thumbnail\"\n }\n\nFrontend Usage:\n - Use thumb_url to display thumbnails (backend proxies from provider)\n - type determines which icon/player to show\n - taken_at enables chronological sorting and \"On This Day\" features"},"IntegrationAssetsListResponse":{"properties":{"assets":{"items":{"$ref":"#/components/schemas/IntegrationAssetResponse"},"type":"array","title":"Assets","description":"List of assets on this page"},"page":{"type":"integer","title":"Page","description":"Current page number (1-indexed)"},"limit":{"type":"integer","title":"Limit","description":"Number of items per page"},"total":{"type":"integer","title":"Total","description":"Total number of assets available"},"has_more":{"type":"boolean","title":"Has More","description":"Whether there are more pages to fetch"}},"type":"object","required":["assets","page","limit","total","has_more"],"title":"IntegrationAssetsListResponse","description":"Paginated list of assets from a provider.\n\nFields:\n assets: List of normalized assets\n page: Current page number\n limit: Items per page\n total: Total number of assets available\n has_more: Whether there are more pages\n\nExample Response:\n {\n \"assets\": [...],\n \"page\": 1,\n \"limit\": 50,\n \"total\": 1234,\n \"has_more\": true\n }"},"IntegrationConnectRequest":{"properties":{"provider":{"$ref":"#/components/schemas/IntegrationProvider","description":"Integration provider to connect"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials","description":"Provider-specific authentication credentials (e.g., {'api_key': '...'})"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Override provider base URL (optional, defaults to .env value)"},"import_mode":{"anyOf":[{"$ref":"#/components/schemas/ImportMode"},{"type":"null"}],"description":"How to handle asset imports (link-only or copy). Defaults to link_only.","default":"link_only"}},"type":"object","required":["provider","credentials"],"title":"IntegrationConnectRequest","description":"Request to connect a new integration or update an existing one.\n\nFields:\n provider: Which service to connect (immich, jellyfin, audiobookshelf)\n credentials: Provider-specific authentication data (dict to support different auth methods)\n base_url: Optional override for provider's base URL (defaults to .env value)\n\nExamples:\n Immich:\n {\n \"provider\": \"immich\",\n \"credentials\": {\"api_key\": \"abc123...\"},\n \"base_url\": \"https://photos.example.com\" # optional\n }"},"IntegrationConnectResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Connection status (always 'connected' on success)","default":"connected"},"provider":{"$ref":"#/components/schemas/IntegrationProvider","description":"Integration provider that was connected"},"external_user_id":{"type":"string","title":"External User Id","description":"Verified user ID from the provider"},"connected_at":{"type":"string","format":"date-time","title":"Connected At","description":"When the integration was connected"}},"type":"object","required":["provider","external_user_id","connected_at"],"title":"IntegrationConnectResponse","description":"Response after successfully connecting an integration.\n\nFields:\n status: \"connected\" (always)\n provider: Which service was connected\n external_user_id: Verified user ID from the provider\n connected_at: Connection timestamp\n\nExample Response:\n {\n \"status\": \"connected\",\n \"provider\": \"immich\",\n \"external_user_id\": \"abc-123\",\n \"connected_at\": \"2025-01-06T12:00:00Z\"\n }\n\nSecurity Note:\n - Never include encrypted tokens or raw credentials in this response\n - Only return non-sensitive metadata"},"IntegrationProvider":{"type":"string","enum":["immich"],"title":"IntegrationProvider","description":"Supported integration providers.\n\nAdd new providers here as they are implemented.\nEach provider must have a corresponding client module in app/integrations/{provider}.py"},"IntegrationSettingsUpdateRequest":{"properties":{"import_mode":{"anyOf":[{"$ref":"#/components/schemas/ImportMode"},{"type":"null"}],"description":"Update import mode (optional)"},"album_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Album Id","description":"Update album ID for link mode (optional, Immich provider only)"}},"type":"object","title":"IntegrationSettingsUpdateRequest","description":"Request to update integration settings without reconnecting.\n\nFields:\n import_mode: Update import mode (optional)\n album_id: Update album ID for link mode (optional, Immich only)"},"IntegrationStatusResponse":{"properties":{"provider":{"$ref":"#/components/schemas/IntegrationProvider"},"status":{"type":"string","title":"Status","description":"Connection status: 'connected' or 'disconnected'. Provider issues are exposed via last_error."},"external_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id","description":"User's ID in the external provider system"},"connected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Connected At","description":"When the integration was first connected"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At","description":"Last successful sync timestamp"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error","description":"Last error message (if any)"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether the integration is currently enabled","default":true},"import_mode":{"$ref":"#/components/schemas/ImportMode","description":"Current import mode setting","default":"link_only"},"album_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Album Id","description":"Album ID for link mode (Immich provider)"},"album_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Album Error","description":"Error message if album creation/validation failed"}},"type":"object","required":["provider","status"],"title":"IntegrationStatusResponse","description":"Current status of an integration connection.\n\nFields:\n provider: Which service this is\n status: \"connected\" | \"disconnected\"; provider issues are exposed via last_error\n external_user_id: User's ID in the external system (if connected)\n connected_at: When the integration was first connected (if connected)\n last_synced_at: When we last successfully synced data (if any)\n last_error: Last error message (if any)\n is_active: Whether the integration is currently enabled\n\nExample Response:\n {\n \"provider\": \"immich\",\n \"status\": \"connected\",\n \"external_user_id\": \"abc-123-def\",\n \"connected_at\": \"2025-01-01T12:00:00Z\",\n \"last_synced_at\": \"2025-01-06T10:00:00Z\",\n \"last_error\": null,\n \"is_active\": true\n }"},"JobStatus":{"type":"string","enum":["pending","running","completed","partial","failed","cancelled"],"title":"JobStatus","description":"Status for import/export jobs."},"JournalColor":{"type":"string","enum":["#EF4444","#F97316","#F59E0B","#EAB308","#84CC16","#22C55E","#10B981","#14B8A6","#06B6D4","#0EA5E9","#3B82F6","#6366F1","#8B5CF6","#A855F7","#D946EF","#EC4899","#F43F5E","#64748B","#6B7280","#71717A","#737373","#78716C"],"title":"JournalColor","description":"Preset colors for journals."},"JournalCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"$ref":"#/components/schemas/JournalColor"},{"type":"null"}]},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","required":["title"],"title":"JournalCreate","description":"Journal creation schema."},"JournalReorderItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","minimum":0,"title":"Position","description":"New position (0-indexed)"}},"type":"object","required":["id","position"],"title":"JournalReorderItem","description":"Single journal reorder item."},"JournalReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/JournalReorderItem"},"type":"array","minItems":1,"title":"Updates","description":"List of journal ID and position pairs"}},"type":"object","required":["updates"],"title":"JournalReorderRequest","description":"Request to reorder multiple journals."},"JournalResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"$ref":"#/components/schemas/JournalColor"},{"type":"null"}]},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"is_favorite":{"type":"boolean","title":"Is Favorite"},"is_archived":{"type":"boolean","title":"Is Archived"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"entry_count":{"type":"integer","title":"Entry Count"},"total_words":{"type":"integer","title":"Total Words"},"last_entry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Entry At"}},"type":"object","required":["created_at","updated_at","title","id","user_id","is_favorite","is_archived","entry_count","total_words"],"title":"JournalResponse","description":"Journal response schema."},"JournalUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"$ref":"#/components/schemas/JournalColor"},{"type":"null"}]},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"is_favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Favorite"},"is_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Archived"}},"type":"object","title":"JournalUpdate","description":"Journal update schema."},"LicenseInfoResponse":{"properties":{"is_active":{"type":"boolean","title":"Is Active","description":"Whether license is currently active"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"License tier (none, supporter, believer)"},"license_type":{"type":"string","title":"License Type","description":"License type: 'subscription' or 'lifetime'"},"subscription_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Expires At","description":"Subscription expiration timestamp (ISO format). NULL for lifetime licenses."},"install_id":{"type":"string","title":"Install Id","description":"Hardware-bound installation identifier for license binding"},"is_cancelled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Cancelled","description":"Whether license has been cancelled (server)"},"registered_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered Email","description":"Email address on license (server)"},"discord_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Id","description":"Discord ID on license (server)"}},"type":"object","required":["is_active","license_type","install_id"],"title":"LicenseInfoResponse","description":"Detailed license information response."},"LicenseRegisterRequest":{"properties":{"license":{"type":"string","maxLength":36,"minLength":36,"title":"License","description":"Plain text license key in format 'lic_' followed by 32 alphanumeric characters (e.g., 'lic_abc123def456ghi789jkl012mno345pq')"},"email":{"type":"string","format":"email","title":"Email","description":"Admin's email address"},"discord_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discord Id","description":"Optional Discord ID to participate in the plus group"}},"type":"object","required":["license","email"],"title":"LicenseRegisterRequest","description":"Request to register a Plus license."},"LicenseRegisterResponse":{"properties":{"successful":{"type":"boolean","title":"Successful","description":"Whether registration succeeded"},"signed_license":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Signed License","description":"Signed license claim envelope (base64)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if registration failed"},"rate_limited":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rate Limited","description":"Whether the request was rate limited","default":false},"retry_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After","description":"Seconds to wait before retrying"}},"type":"object","required":["successful"],"title":"LicenseRegisterResponse","description":"Response from license registration."},"LicenseResetRequest":{"properties":{"install_id":{"type":"string","maxLength":36,"minLength":36,"title":"Install Id","description":"Current installation ID to unbind"},"email":{"type":"string","format":"email","title":"Email","description":"User's email for verification (must match license owner)"}},"type":"object","required":["install_id","email"],"title":"LicenseResetRequest","description":"Request to unbind a license from current installation."},"LicenseResetResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Operation status: 'ok'"}},"type":"object","required":["status"],"title":"LicenseResetResponse","description":"Response from license reset/unbind operation."},"LocationResult":{"properties":{"name":{"type":"string","title":"Name","description":"Display name of the location"},"latitude":{"type":"number","maximum":90,"minimum":-90,"title":"Latitude","description":"Latitude coordinate"},"longitude":{"type":"number","maximum":180,"minimum":-180,"title":"Longitude","description":"Longitude coordinate"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country name"},"admin_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Area","description":"State/Province/Region"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality","description":"City name"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone identifier"}},"type":"object","required":["name","latitude","longitude"],"title":"LocationResult","description":"Single location search result.","example":{"admin_area":"California","country":"United States","latitude":37.7749,"locality":"San Francisco","longitude":-122.4194,"name":"San Francisco, California, USA","timezone":"America/Los_Angeles"}},"LocationSearchRequest":{"properties":{"query":{"type":"string","maxLength":200,"minLength":1,"title":"Query","description":"Location search query"}},"type":"object","required":["query"],"title":"LocationSearchRequest","description":"Request schema for location search."},"LocationSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/LocationResult"},"type":"array","title":"Results"},"provider":{"type":"string","title":"Provider","description":"Location provider used (nominatim, etc.)"}},"type":"object","required":["provider"],"title":"LocationSearchResponse","description":"Response schema for location search.","example":{"provider":"nominatim","results":[{"admin_area":"California","country":"United States","latitude":37.7749,"locality":"San Francisco","longitude":-122.4194,"name":"San Francisco, California, USA"}]}},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"additionalProperties":true,"type":"object","title":"User"}},"type":"object","required":["access_token","refresh_token","user"],"title":"LoginResponse","description":"Login response schema with tokens and user info."},"MediaBatchSignError":{"properties":{"id":{"type":"string","title":"Id"},"variant":{"type":"string","title":"Variant"},"error":{"type":"string","title":"Error"}},"type":"object","required":["id","variant","error"],"title":"MediaBatchSignError","description":"Batch signing error for a single item."},"MediaBatchSignItem":{"properties":{"id":{"type":"string","title":"Id"},"variant":{"type":"string","title":"Variant"}},"type":"object","required":["id","variant"],"title":"MediaBatchSignItem","description":"Single batch signing request item."},"MediaBatchSignRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaBatchSignItem"},"type":"array","maxItems":100,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"MediaBatchSignRequest","description":"Batch signing request payload."},"MediaBatchSignResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/MediaBatchSignResult"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/MediaBatchSignError"},"type":"array","title":"Errors"}},"type":"object","title":"MediaBatchSignResponse","description":"Batch signing response payload."},"MediaBatchSignResult":{"properties":{"id":{"type":"string","title":"Id"},"variant":{"type":"string","title":"Variant"},"signed_url":{"type":"string","title":"Signed Url"},"expires_at":{"type":"integer","title":"Expires At"}},"type":"object","required":["id","variant","signed_url","expires_at"],"title":"MediaBatchSignResult","description":"Batch signing result for a single item."},"MediaLibraryItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"},"media_type":{"$ref":"#/components/schemas/MediaType"},"mime_type":{"type":"string","title":"Mime Type"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"upload_status":{"$ref":"#/components/schemas/UploadStatus"},"signed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Url"},"signed_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Thumbnail Url"},"signed_url_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Signed Url Expires At"},"signed_thumbnail_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Signed Thumbnail Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"logged_date_tz":{"type":"string","format":"date","title":"Logged Date Tz"},"logged_at_utc":{"type":"string","format":"date-time","title":"Logged At Utc"},"logged_timezone":{"type":"string","title":"Logged Timezone"}},"type":"object","required":["id","moment_id","media_type","mime_type","upload_status","created_at","logged_date_tz","logged_at_utc","logged_timezone"],"title":"MediaLibraryItem"},"MediaLibraryPageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaLibraryItem"},"type":"array","title":"Items"},"next_cursor_logged_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor Logged At Utc"},"next_cursor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next Cursor Id"}},"type":"object","required":["items"],"title":"MediaLibraryPageResponse"},"MediaOrigin":{"properties":{"source":{"type":"string","enum":["internal","immich"],"title":"Source"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"}},"type":"object","required":["source"],"title":"MediaOrigin","description":"Optional origin metadata for external media."},"MediaSignedUrlResponse":{"properties":{"signed_url":{"type":"string","title":"Signed Url"},"expires_at":{"type":"integer","title":"Expires At"}},"type":"object","required":["signed_url","expires_at"],"title":"MediaSignedUrlResponse","description":"Response schema for short-lived signed media URLs."},"MediaType":{"type":"string","enum":["image","video","audio","unknown"],"title":"MediaType","description":"Media types for journal entries."},"MemoriesAppliedFilter":{"type":"string","enum":["last_years","last_year","last_month","last_week"],"title":"MemoriesAppliedFilter"},"MemoriesFilter":{"type":"string","enum":["auto","last_years","last_year","last_month","last_week"],"title":"MemoriesFilter"},"MomentCalendarItem":{"properties":{"logged_date_tz":{"type":"string","format":"date","title":"Logged Date Tz"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"},"moment_count":{"type":"integer","title":"Moment Count","default":0},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}},"type":"object","required":["logged_date_tz"],"title":"MomentCalendarItem"},"MomentCompletedGoalResponse":{"properties":{"goal_id":{"type":"string","format":"uuid","title":"Goal Id"},"title":{"type":"string","title":"Title"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"status":{"$ref":"#/components/schemas/GoalLogStatus"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["goal_id","title","status","count"],"title":"MomentCompletedGoalResponse"},"MomentCreate":{"properties":{"entry":{"anyOf":[{"$ref":"#/components/schemas/MomentEntryCreate"},{"type":"null"}]},"logged_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Logged At Utc"},"logged_date_tz":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Logged Date Tz"},"logged_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logged Timezone"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"location_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Json"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"weather_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Weather Json"},"weather_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Summary"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false},"prompt_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Prompt Id"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"},"mood_activity":{"items":{"$ref":"#/components/schemas/MomentMoodActivityInput"},"type":"array","title":"Mood Activity"}},"type":"object","title":"MomentCreate"},"MomentEntryCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_delta":{"anyOf":[{"$ref":"#/components/schemas/QuillDelta"},{"type":"null"}]},"journal_id":{"type":"string","format":"uuid","title":"Journal Id"}},"type":"object","required":["journal_id"],"title":"MomentEntryCreate","description":"Entry content to create inline with a moment."},"MomentImmichPeopleSuggestionsResponse":{"properties":{"people":{"items":{"$ref":"#/components/schemas/PersonSummaryResponse"},"type":"array","title":"People"},"source_asset_ids":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Source Asset Ids"}},"type":"object","required":["people","source_asset_ids"],"title":"MomentImmichPeopleSuggestionsResponse"},"MomentMediaResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"media_type":{"$ref":"#/components/schemas/MediaType"},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"file_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size"},"mime_type":{"type":"string","title":"Mime Type"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"upload_status":{"$ref":"#/components/schemas/UploadStatus","default":"pending"},"file_metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Metadata"},"id":{"type":"string","format":"uuid","title":"Id"},"checksum":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum"},"processing_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processing Error"},"signed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Url"},"signed_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Thumbnail Url"},"signed_url_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Signed Url Expires At"},"signed_thumbnail_expires_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Signed Thumbnail Expires At"},"origin":{"anyOf":[{"$ref":"#/components/schemas/MediaOrigin"},{"type":"null"}]},"moment_id":{"type":"string","format":"uuid","title":"Moment Id"}},"type":"object","required":["created_at","media_type","mime_type","id","moment_id"],"title":"MomentMediaResponse","description":"Media response schema — all media is moment-owned."},"MomentMediaThumbnail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"media_type":{"$ref":"#/components/schemas/MediaType"},"signed_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signed Thumbnail Url"}},"type":"object","required":["id","media_type"],"title":"MomentMediaThumbnail"},"MomentMemoriesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MomentResponse"},"type":"array","title":"Items"},"requested_filter":{"$ref":"#/components/schemas/MemoriesFilter"},"applied_filter":{"$ref":"#/components/schemas/MemoriesAppliedFilter"}},"type":"object","required":["items","requested_filter","applied_filter"],"title":"MomentMemoriesResponse"},"MomentMoodActivityInput":{"properties":{"mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mood Id"},"activity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Activity Id"}},"type":"object","title":"MomentMoodActivityInput"},"MomentMoodActivityResponse":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"mood":{"anyOf":[{"$ref":"#/components/schemas/MoodResponse"},{"type":"null"}]},"activity":{"anyOf":[{"$ref":"#/components/schemas/ActivityResponse"},{"type":"null"}]}},"type":"object","required":["id"],"title":"MomentMoodActivityResponse"},"MomentPageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MomentResponse"},"type":"array","title":"Items"},"next_cursor_logged_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor Logged At Utc"},"next_cursor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next Cursor Id"}},"type":"object","required":["items"],"title":"MomentPageResponse"},"MomentPeopleReplaceRequest":{"properties":{"person_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Person Ids"}},"type":"object","title":"MomentPeopleReplaceRequest"},"MomentResponse":{"properties":{"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"entry":{"anyOf":[{"$ref":"#/components/schemas/EntryPreviewResponse"},{"type":"null"}]},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"},"prompt_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Prompt Id"},"logged_at_utc":{"type":"string","format":"date-time","title":"Logged At Utc"},"logged_date_tz":{"type":"string","format":"date","title":"Logged Date Tz"},"logged_timezone":{"type":"string","title":"Logged Timezone"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"location_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Json"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"weather_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Weather Json"},"weather_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Summary"},"is_pinned":{"type":"boolean","title":"Is Pinned","default":false},"mood_activity":{"items":{"$ref":"#/components/schemas/MomentMoodActivityResponse"},"type":"array","title":"Mood Activity"},"tags":{"items":{"$ref":"#/components/schemas/TagResponse"},"type":"array","title":"Tags"},"people":{"items":{"$ref":"#/components/schemas/PersonSummaryResponse"},"type":"array","title":"People"},"completed_goals":{"items":{"$ref":"#/components/schemas/MomentCompletedGoalResponse"},"type":"array","title":"Completed Goals"},"media_count":{"type":"integer","title":"Media Count","default":0},"media":{"items":{"$ref":"#/components/schemas/MomentMediaThumbnail"},"type":"array","title":"Media"}},"type":"object","required":["id","user_id","logged_at_utc","logged_date_tz","logged_timezone"],"title":"MomentResponse"},"MomentUpdate":{"properties":{"entry_update":{"anyOf":[{"$ref":"#/components/schemas/EntryUpdate"},{"type":"null"}]},"entry_create":{"anyOf":[{"$ref":"#/components/schemas/MomentEntryCreate"},{"type":"null"}]},"logged_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Logged At Utc"},"logged_date_tz":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Logged Date Tz"},"logged_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logged Timezone"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"location_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Location Json"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"weather_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Weather Json"},"weather_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Summary"},"is_pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Pinned"},"prompt_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Prompt Id"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"},"mood_activity":{"anyOf":[{"items":{"$ref":"#/components/schemas/MomentMoodActivityInput"},"type":"array"},{"type":"null"}],"title":"Mood Activity"}},"type":"object","title":"MomentUpdate"},"MoodCreate":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"score":{"type":"integer","title":"Score"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["name","score"],"title":"MoodCreate"},"MoodGroupCreate":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"mood_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Mood Ids"}},"type":"object","required":["name"],"title":"MoodGroupCreate"},"MoodGroupMoodReorderRequest":{"properties":{"mood_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Mood Ids"}},"type":"object","required":["mood_ids"],"title":"MoodGroupMoodReorderRequest"},"MoodGroupReorderItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"MoodGroupReorderItem"},"MoodGroupReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/MoodGroupReorderItem"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"MoodGroupReorderRequest"},"MoodGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"mood_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Mood Ids"}},"type":"object","title":"MoodGroupUpdate"},"MoodGroupWithMoodsResponse":{"properties":{"name":{"type":"string","title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"position":{"type":"integer","title":"Position","default":0},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"moods":{"items":{"$ref":"#/components/schemas/MoodResponse"},"type":"array","title":"Moods"}},"type":"object","required":["name","id","created_at","updated_at"],"title":"MoodGroupWithMoodsResponse"},"MoodReorderRequest":{"properties":{"mood_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Mood Ids"}},"type":"object","required":["mood_ids"],"title":"MoodReorderRequest"},"MoodResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","title":"Name"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"category":{"type":"string","title":"Category"},"score":{"type":"integer","title":"Score"},"position":{"type":"integer","title":"Position","default":0},"is_active":{"type":"boolean","title":"Is Active","default":true},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"id":{"type":"string","format":"uuid","title":"Id"}},"type":"object","required":["created_at","updated_at","name","category","score","id"],"title":"MoodResponse","description":"Mood response schema."},"MoodUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"MoodUpdate"},"PeakMonth":{"properties":{"month":{"type":"string","title":"Month"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["month","count"],"title":"PeakMonth","description":"Peak month information."},"PeakMonthResult":{"properties":{"month":{"type":"string","title":"Month"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["month","count"],"title":"PeakMonthResult","description":"Peak month information."},"PeopleMatch":{"type":"string","enum":["any","all"],"title":"PeopleMatch"},"PersonCreate":{"properties":{"name":{"type":"string","title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"group_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Group Ids"}},"type":"object","required":["name"],"title":"PersonCreate"},"PersonGroupCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","required":["name"],"title":"PersonGroupCreate"},"PersonGroupPositionUpdate":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["id","position"],"title":"PersonGroupPositionUpdate"},"PersonGroupReorderRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/PersonGroupPositionUpdate"},"type":"array","title":"Updates"}},"type":"object","required":["updates"],"title":"PersonGroupReorderRequest"},"PersonGroupResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["created_at","updated_at","name","id","user_id"],"title":"PersonGroupResponse"},"PersonGroupSummaryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","required":["id","name"],"title":"PersonGroupSummaryResponse"},"PersonGroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"PersonGroupUpdate"},"PersonGroupWithPeopleResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"color_value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Color Value"},"icon":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Icon"},"position":{"type":"integer","title":"Position","default":0},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"people":{"items":{"$ref":"#/components/schemas/PersonSummaryResponse"},"type":"array","title":"People"}},"type":"object","required":["created_at","updated_at","name","id","user_id"],"title":"PersonGroupWithPeopleResponse"},"PersonResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"profile_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Image Url"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Archived At"},"memory_count":{"type":"integer","title":"Memory Count","default":0},"last_seen_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At Utc"},"groups":{"items":{"$ref":"#/components/schemas/PersonGroupSummaryResponse"},"type":"array","title":"Groups"}},"type":"object","required":["created_at","updated_at","id","name","user_id"],"title":"PersonResponse"},"PersonSummaryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"profile_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Image Url"}},"type":"object","required":["id","name"],"title":"PersonSummaryResponse"},"PersonUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"group_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Group Ids"}},"type":"object","title":"PersonUpdate"},"PlusCapability":{"properties":{"available":{"type":"boolean","title":"Available"},"tier":{"type":"string","title":"Tier"},"upgrade_url":{"type":"string","title":"Upgrade Url"}},"type":"object","required":["available","tier","upgrade_url"],"title":"PlusCapability","description":"Public, non-sensitive summary of this instance's Journiv Plus capability.\n\nLets the frontend gate Plus-only surfaces (e.g. tag analytics) without\nprobing a protected endpoint and interpreting its error codes. Contains\nonly capability flags — never install_id, registered email, expiry or the\nsigned license blob (those stay on the admin-only /instance/license/info)."},"PlusTagAnalyticsResult":{"properties":{"total_tags":{"type":"integer","title":"Total Tags"},"used_tags":{"type":"integer","title":"Used Tags"},"unused_tags":{"type":"integer","title":"Unused Tags"},"most_used_tag":{"anyOf":[{"$ref":"#/components/schemas/PlusTagSummary"},{"type":"null"}]},"average_usage":{"type":"number","title":"Average Usage"},"tag_usage_ranking":{"items":{"$ref":"#/components/schemas/PlusTagSummary"},"type":"array","title":"Tag Usage Ranking"},"recently_created_tags":{"items":{"$ref":"#/components/schemas/PlusTagSummary"},"type":"array","title":"Recently Created Tags"},"usage_over_time":{"additionalProperties":{"type":"integer"},"type":"object","title":"Usage Over Time"},"tag_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tag Distribution"}},"type":"object","required":["total_tags","used_tags","unused_tags","most_used_tag","average_usage","tag_usage_ranking","recently_created_tags","usage_over_time","tag_distribution"],"title":"PlusTagAnalyticsResult","description":"Tag analytics computation result from Plus.\n\nThis mirrors backend's TagAnalyticsResponse but is computed\nentirely in Plus from raw data provided by backend.\n\nBackend converts this to TagAnalyticsResponse for API response."},"PlusTagDetailAnalyticsResult":{"properties":{"tag_id":{"type":"string","title":"Tag Id"},"tag_name":{"type":"string","title":"Tag Name"},"usage_count":{"type":"integer","title":"Usage Count"},"usage_over_time":{"additionalProperties":{"type":"integer"},"type":"object","title":"Usage Over Time"},"first_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Used"},"last_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used"},"peak_month":{"anyOf":[{"$ref":"#/components/schemas/PeakMonthResult"},{"type":"null"}]},"trend":{"type":"string","title":"Trend"},"growth_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Rate"},"days_analyzed":{"type":"integer","title":"Days Analyzed"}},"type":"object","required":["tag_id","tag_name","usage_count","usage_over_time","trend","days_analyzed"],"title":"PlusTagDetailAnalyticsResult","description":"Per-tag analytics computation result from Plus.\n\nContains computed analytics for a single tag including trends,\ngrowth analysis, and usage patterns."},"PlusTagSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["id","name","usage_count"],"title":"PlusTagSummary","description":"Plus-only tag summary mirroring the backend tag summary shape."},"PromptResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"text":{"type":"string","title":"Text"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"difficulty_level":{"type":"integer","title":"Difficulty Level","default":1},"estimated_time_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estimated Time Minutes"},"id":{"type":"string","format":"uuid","title":"Id"},"is_active":{"type":"boolean","title":"Is Active"},"usage_count":{"type":"integer","title":"Usage Count"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["created_at","updated_at","text","id","is_active","usage_count"],"title":"PromptResponse","description":"Prompt response schema."},"PublishUpdate":{"properties":{"publish":{"type":"boolean","title":"Publish"}},"type":"object","required":["publish"],"title":"PublishUpdate","description":"Request body for publish state updates."},"PublishingConfigUpdate":{"properties":{"slug":{"anyOf":[{"type":"string","maxLength":255,"minLength":2},{"type":"null"}],"title":"Slug","description":"Custom URL slug (lowercase alphanumeric and hyphens only)"},"is_indexed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Indexed","description":"Search engine indexing"}},"type":"object","title":"PublishingConfigUpdate","description":"Request body for publishing config updates."},"QuillDelta":{"properties":{"ops":{"items":{"$ref":"#/components/schemas/QuillOp"},"type":"array","title":"Ops"}},"type":"object","title":"QuillDelta"},"QuillOp":{"properties":{"insert":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Insert"},"attributes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Attributes"}},"type":"object","required":["insert"],"title":"QuillOp"},"ReverseGeocodeRequest":{"properties":{"latitude":{"type":"number","maximum":90,"minimum":-90,"title":"Latitude"},"longitude":{"type":"number","maximum":180,"minimum":-180,"title":"Longitude"}},"type":"object","required":["latitude","longitude"],"title":"ReverseGeocodeRequest","description":"Request schema for reverse geocoding (lat/lon to location name)."},"TagAnalyticsResponse":{"properties":{"total_tags":{"type":"integer","title":"Total Tags"},"used_tags":{"type":"integer","title":"Used Tags"},"unused_tags":{"type":"integer","title":"Unused Tags"},"most_used_tag":{"anyOf":[{"$ref":"#/components/schemas/TagSummary"},{"type":"null"}]},"average_usage":{"type":"number","title":"Average Usage"},"tag_usage_ranking":{"items":{"$ref":"#/components/schemas/TagSummary"},"type":"array","title":"Tag Usage Ranking"},"recently_created_tags":{"items":{"$ref":"#/components/schemas/TagSummary"},"type":"array","title":"Recently Created Tags"},"usage_over_time":{"additionalProperties":{"type":"integer"},"type":"object","title":"Usage Over Time"},"tag_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tag Distribution"}},"type":"object","required":["total_tags","used_tags","unused_tags","most_used_tag","average_usage","tag_usage_ranking","recently_created_tags","usage_over_time","tag_distribution"],"title":"TagAnalyticsResponse","description":"Extended tag analytics response schema with required time-series data."},"TagCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"TagCreate","description":"Tag creation schema."},"TagDetailAnalyticsResponse":{"properties":{"tag_id":{"type":"string","format":"uuid","title":"Tag Id"},"tag_name":{"type":"string","title":"Tag Name"},"usage_count":{"type":"integer","title":"Usage Count"},"usage_over_time":{"additionalProperties":{"type":"integer"},"type":"object","title":"Usage Over Time"},"first_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Used"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used"},"peak_month":{"anyOf":[{"$ref":"#/components/schemas/PeakMonth"},{"type":"null"}]},"trend":{"type":"string","title":"Trend"},"growth_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Rate"},"days_analyzed":{"type":"integer","title":"Days Analyzed"}},"type":"object","required":["tag_id","tag_name","usage_count","usage_over_time","trend","days_analyzed"],"title":"TagDetailAnalyticsResponse","description":"Per-tag analytics response.\n\nProvides detailed analytics for a specific tag including usage trends,\npeak months, and growth analysis."},"TagResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"name":{"type":"string","title":"Name"},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["created_at","updated_at","name","id","user_id","usage_count"],"title":"TagResponse","description":"Tag response schema."},"TagSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["id","name","usage_count"],"title":"TagSummary","description":"Shared tag summary model used across statistics, tag lists, and related tags."},"TagUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"TagUpdate","description":"Tag update schema."},"TaggedMomentSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"logged_at_utc":{"type":"string","format":"date-time","title":"Logged At Utc"},"logged_date_tz":{"type":"string","format":"date","title":"Logged Date Tz"},"entry":{"anyOf":[{"$ref":"#/components/schemas/EntryPreviewResponse"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"primary_mood_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Mood Id"},"media_count":{"type":"integer","title":"Media Count","default":0},"media":{"items":{"$ref":"#/components/schemas/MomentMediaThumbnail"},"type":"array","title":"Media"}},"type":"object","required":["id","logged_at_utc","logged_date_tz"],"title":"TaggedMomentSummary","description":"Summary payload for moments returned by tag lookups."},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"Token","description":"Token response schema.\n\nrefresh_token is optional - only included during login, not during token refresh.\nThis ensures refresh tokens eventually expire and require re-login."},"TokenRefresh":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"TokenRefresh","description":"Token refresh schema."},"UnusedTagsCleanupResponse":{"properties":{"deleted":{"type":"integer","title":"Deleted"}},"type":"object","required":["deleted"],"title":"UnusedTagsCleanupResponse","description":"Result of deleting every tag not attached to any moment."},"UploadStatus":{"type":"string","enum":["pending","processing","completed","failed"],"title":"UploadStatus","description":"Upload status for media files."},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","title":"Name"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","name","password"],"title":"UserCreate","description":"User creation schema."},"UserLogin":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"UserLogin","description":"User login schema."},"UserResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"email":{"type":"string","format":"email","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"id":{"type":"string","format":"uuid","title":"Id"},"role":{"$ref":"#/components/schemas/UserRole"},"is_active":{"type":"boolean","title":"Is Active"},"profile_picture_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Profile Picture Url"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone","default":"UTC"},"is_oidc_user":{"type":"boolean","title":"Is Oidc User","default":false}},"type":"object","required":["created_at","updated_at","email","id","role","is_active"],"title":"UserResponse","description":"User response schema."},"UserRole":{"type":"string","enum":["admin","user"],"title":"UserRole","description":"User roles for authorization."},"UserSettingsResponse":{"properties":{"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"daily_prompt_enabled":{"type":"boolean","title":"Daily Prompt Enabled","default":true},"time_zone":{"type":"string","title":"Time Zone","default":"UTC"},"push_notifications":{"type":"boolean","title":"Push Notifications","default":true},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"writing_goal_daily":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Writing Goal Daily"},"start_of_week_day":{"type":"integer","maximum":6,"minimum":0,"title":"Start Of Week Day","default":0},"time_format":{"type":"string","title":"Time Format","default":"system"},"theme":{"type":"string","title":"Theme","default":"light"},"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["created_at","updated_at","user_id"],"title":"UserSettingsResponse","description":"User settings response schema."},"UserSettingsUpdate":{"properties":{"daily_prompt_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Daily Prompt Enabled"},"time_zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Zone"},"push_notifications":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Push Notifications"},"reminder_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Time"},"writing_goal_daily":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Writing Goal Daily"},"start_of_week_day":{"anyOf":[{"type":"integer","maximum":6,"minimum":0},{"type":"null"}],"title":"Start Of Week Day"},"time_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Format"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","title":"UserSettingsUpdate","description":"User settings update schema."},"UserUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"profile_picture_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Profile Picture Url"},"current_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Password"},"new_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Password"}},"type":"object","title":"UserUpdate","description":"User update schema."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCheckEnabledResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"VersionCheckEnabledResponse","description":"Response for version check enabled status."},"VersionCheckEnabledUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"VersionCheckEnabledUpdate","description":"Request to update version check enabled status."},"VersionInfoResponse":{"properties":{"current_version":{"type":"string","title":"Current Version","description":"Current Journiv version"},"install_id":{"type":"string","title":"Install Id","description":"Hardware-bound installation identifier (install_id). This uniquely identifies this Journiv installation for license binding."},"latest_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Version","description":"Latest available version from Plus server"},"update_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Update Available","description":"Whether an update is available"},"update_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Update Url","description":"URL to download the update"},"changelog_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changelog Url","description":"URL to view changelog"},"last_checked":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked","description":"When the last version check was performed (UTC)"},"last_check_success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Last Check Success","description":"Whether the last check succeeded"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message from last check (if failed)"}},"type":"object","required":["current_version","install_id"],"title":"VersionInfoResponse","description":"Response from version check endpoint.","example":{"changelog_url":"https://journiv.app/changelog","current_version":"0.1.0-beta.9","install_id":"550e8400-e29b-41d4-a716-446655440000","last_check_success":true,"last_checked":"2025-12-09T10:30:00Z","latest_version":"0.1.0-beta.11","update_available":true,"update_url":"https://github.com/journiv/journiv/releases/tag/v0.1.0-beta.11"}},"WeatherData":{"properties":{"temp_c":{"type":"number","title":"Temp C","description":"Temperature in Celsius"},"temp_f":{"type":"number","title":"Temp F","description":"Temperature in Fahrenheit"},"feels_like_c":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Feels Like C","description":"Feels like temperature in Celsius"},"feels_like_f":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Feels Like F","description":"Feels like temperature in Fahrenheit"},"condition":{"type":"string","title":"Condition","description":"Weather condition (e.g., Clear, Cloudy, Rain)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Detailed weather description"},"humidity":{"anyOf":[{"type":"integer","maximum":100,"minimum":0},{"type":"null"}],"title":"Humidity","description":"Humidity percentage"},"wind_speed":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Wind Speed","description":"Wind speed in m/s"},"pressure":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pressure","description":"Atmospheric pressure in hPa"},"visibility":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Visibility","description":"Visibility in meters"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Weather icon code"},"observed_at_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At Utc","description":"Authoritative timestamp for the weather observation (UTC)"}},"type":"object","required":["temp_c","temp_f","condition"],"title":"WeatherData","description":"Weather data response.","example":{"condition":"Clear","description":"clear sky","feels_like_c":17.2,"feels_like_f":63,"humidity":65,"icon":"01d","observed_at_utc":"2025-12-05T10:30:00Z","pressure":1013,"temp_c":18.5,"temp_f":65.3,"visibility":10000,"wind_speed":3.5}},"WeatherFetchRequest":{"properties":{"latitude":{"type":"number","maximum":90,"minimum":-90,"title":"Latitude","description":"Latitude coordinate"},"longitude":{"type":"number","maximum":180,"minimum":-180,"title":"Longitude","description":"Longitude coordinate"},"entry_datetime_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Entry Datetime Utc","description":"Entry timestamp in UTC (ISO format). If provided, weather is fetched for this time."},"entry_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entry Timezone","description":"IANA timezone for the entry timestamp (e.g., America/Los_Angeles)."}},"type":"object","required":["latitude","longitude"],"title":"WeatherFetchRequest","description":"Request schema for weather data fetch."},"WeatherFetchResponse":{"properties":{"weather":{"$ref":"#/components/schemas/WeatherData"},"provider":{"type":"string","title":"Provider","description":"Weather provider used (openweather, etc.)"},"timestamp":{"type":"string","title":"Timestamp","description":"Timestamp when weather was fetched (ISO format)"}},"type":"object","required":["weather","provider","timestamp"],"title":"WeatherFetchResponse","description":"Response schema for weather fetch.","example":{"provider":"openweather","timestamp":"2025-12-05T10:30:00Z","weather":{"condition":"Clear","description":"clear sky","feels_like_c":17.2,"feels_like_f":63,"humidity":65,"icon":"01d","observed_at_utc":"2025-12-05T10:30:00Z","pressure":1013,"temp_c":18.5,"temp_f":65.3,"visibility":10000,"wind_speed":3.5}}},"WeatherServiceDisabledResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Weather service availability","default":false},"message":{"type":"string","title":"Message","description":"Explanation message"}},"type":"object","required":["message"],"title":"WeatherServiceDisabledResponse","description":"Response when weather service is disabled (no API key configured).","example":{"enabled":false,"message":"Weather service is not configured. Please set OPEN_WEATHER_API_KEY_25 or OPEN_WEATHER_API_KEY_30 in environment variables."}},"OidcTicketExchangeRequest":{"properties":{"ticket":{"type":"string","minLength":1,"title":"Ticket"}},"type":"object","required":["ticket"],"title":"OidcTicketExchangeRequest","description":"One-time ticket returned to the SPA after an OIDC callback."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/token"}}}}}}