{"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.25"},"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"},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"},"403":{"description":"Sign up is disabled"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["authentication"],"summary":"Login","description":"Login with email and password.\n\nReturns an access token and user information. Legacy clients also receive\nthe refresh token in the response body; the PWA receives it only as an\nHttpOnly cookie.","operationId":"login_api_v1_auth_login_post","parameters":[{"name":"X-Journiv-Client","in":"header","required":false,"schema":{"enum":["legacy","pwa"],"type":"string","default":"legacy","title":"X-Journiv-Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"401":{"description":"Incorrect email or password"},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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\nAccepts the refresh token either in the request body (the /legacy/\nFlutter client) or via the journiv_refresh HttpOnly cookie (the React\nPWA). The cookie is refreshed on success so its Max-Age slides; the\nJWT's own exp claim is unchanged and still governs the 7-day window.\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":{"anyOf":[{"$ref":"#/components/schemas/TokenRefresh"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"401":{"description":"Invalid or expired refresh token"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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. Legacy clients receive access and refresh\ntokens; browser clients can select the PWA cookie contract.","operationId":"login_for_access_token_api_v1_auth_token_post","parameters":[{"name":"X-Journiv-Client","in":"header","required":false,"schema":{"enum":["legacy","pwa"],"type":"string","default":"legacy","title":"X-Journiv-Client"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_for_access_token_api_v1_auth_token_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"401":{"description":"Incorrect email or password"},"429":{"description":"Too many requests"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","description":"Logout user. Tokens are stateless and don't need revocation.\n\nInvariant: the only backend effect of this endpoint is to clear the\nrefresh cookie, idempotently. It never mutates a user, a session\nrecord, a token store, or anything else, and behaves identically on\nthe first call and the tenth. Authentication is used only to decide\nwhether the action can be attributed in the audit log \u2014 it is\ndeliberately callable with an expired, missing, or absent access\ntoken, which is exactly the situation after an offline logout retry\nor any 15-minute access-token expiry. If a future change gives this\nendpoint any other effect, it must stop being callable unauthenticated.\n\nClient should discard both access and refresh tokens after logout.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"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 a one-time ticket for authentication credentials.\n\nThe SPA calls this endpoint with the ticket received from the callback redirect.\nTickets are single-use and expire after 60 seconds. A missing or malformed\nbody is a 422 (FastAPI request validation); a well-formed but unknown or\nexpired ticket is a 400. Legacy clients receive the refresh token in the\nresponse body; the PWA receives it only as an HttpOnly cookie.","operationId":"oidc_exchange_api_v1_auth_oidc_exchange_post","parameters":[{"name":"X-Journiv-Client","in":"header","required":false,"schema":{"enum":["legacy","pwa"],"type":"string","default":"legacy","title":"X-Journiv-Client"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OidcTicketExchangeRequest"}}}},"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":{"$ref":"#/components/schemas/MoodStatistics"}}}},"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":{"$ref":"#/components/schemas/MoodStreak"}}}},"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 text search, category, difficulty, estimated duration, 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":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Q"}},{"name":"min_minutes","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Minutes"}},{"name":"max_minutes","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Minutes"}},{"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":"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/PromptPageResponse"}}}},"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":{"$ref":"#/components/schemas/PromptAnalyticsResponse"}}}},"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":{"$ref":"#/components/schemas/WritingStreakAnalytics"}}}},"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":{"$ref":"#/components/schemas/WritingPatterns"}}}},"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":{"$ref":"#/components/schemas/ProductivityMetrics"}}}},"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":{"$ref":"#/components/schemas/JournalAnalytics"}}}},"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":{"$ref":"#/components/schemas/AnalyticsDashboard"}}}},"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":"cursor_created_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cursor Created At"}},{"name":"cursor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cursor Id"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"const":"page","type":"string"},{"type":"null"}],"title":"Format"}},{"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":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ExportJobStatusResponse"}},{"$ref":"#/components/schemas/ExportJobListResponse"}],"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/export/{job_id}/cancel":{"post":{"tags":["import-export"],"summary":"Cancel Export Job","description":"Request cooperative cancellation of a pending or running export.","operationId":"cancel_export_job_api_v1_export__job_id__cancel_post","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":"Cancellation requested; job is now cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJobStatusResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Export job not found"},"409":{"description":"Job already finished"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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":"cursor_created_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cursor Created At"}},{"name":"cursor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cursor Id"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"const":"page","type":"string"},{"type":"null"}],"title":"Format"}},{"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":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ImportJobStatusResponse"}},{"$ref":"#/components/schemas/ImportJobListResponse"}],"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/import/{job_id}/cancel":{"post":{"tags":["import-export"],"summary":"Cancel Import Job","description":"Request cooperative cancellation of a pending or running import.","operationId":"cancel_import_job_api_v1_import__job_id__cancel_post","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":"Cancellation requested; job is now cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobStatusResponse"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"404":{"description":"Import job not found"},"409":{"description":"Job already finished"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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)."},"AnalyticsDashboard":{"properties":{"writing_streak":{"$ref":"#/components/schemas/WritingStreakAnalytics"},"writing_patterns":{"$ref":"#/components/schemas/WritingPatterns"},"productivity":{"$ref":"#/components/schemas/ProductivityMetrics"},"journals":{"$ref":"#/components/schemas/JournalAnalytics"},"summary":{"$ref":"#/components/schemas/DashboardSummary"}},"type":"object","required":["writing_streak","writing_patterns","productivity","journals","summary"],"title":"AnalyticsDashboard","description":"``GET /analytics/dashboard`` response."},"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."},"DashboardSummary":{"properties":{"total_journals":{"type":"integer","title":"Total Journals"},"total_entries":{"type":"integer","title":"Total Entries"},"current_streak":{"type":"integer","title":"Current Streak"},"longest_streak":{"type":"integer","title":"Longest Streak"}},"type":"object","required":["total_journals","total_entries","current_streak","longest_streak"],"title":"DashboardSummary","description":"The ``summary`` block of :class:`AnalyticsDashboard`."},"DeleteResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"DeleteResponse","description":"Response schema for delete operations."},"EntriesByDayPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"entry_count":{"type":"integer","title":"Entry Count"},"total_words":{"type":"integer","title":"Total Words"}},"type":"object","required":["date","entry_count","total_words"],"title":"EntriesByDayPoint","description":"One day of writing activity in :class:`WritingPatterns`."},"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 \u2014 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)"},"ExportJobListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ExportJobStatusResponse"},"type":"array","title":"Items"},"next_cursor_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor Created At","description":"Pass back as cursor_created_at; null when no more pages"},"next_cursor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor Id","description":"Pass back as cursor_id; null when no more pages"}},"type":"object","required":["items"],"title":"ExportJobListResponse","description":"A keyset-paginated page of export jobs."},"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.0,"minimum":0.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.0,"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.0,"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.0},{"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.0,"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."},"ImportJobListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ImportJobStatusResponse"},"type":"array","title":"Items"},"next_cursor_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor Created At"},"next_cursor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor Id"}},"type":"object","required":["items"],"title":"ImportJobListResponse","description":"A keyset-paginated page of import jobs."},"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.0,"minimum":0.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."},"JournalAnalytics":{"properties":{"journals":{"items":{"$ref":"#/components/schemas/JournalAnalyticsRow"},"type":"array","title":"Journals"}},"type":"object","required":["journals"],"title":"JournalAnalytics","description":"``GET /analytics/journals`` response."},"JournalAnalyticsRow":{"properties":{"journal_id":{"type":"string","format":"uuid","title":"Journal Id"},"title":{"type":"string","title":"Title"},"entry_count":{"type":"integer","title":"Entry Count"},"total_words":{"type":"integer","title":"Total Words"},"last_entry":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Entry"}},"type":"object","required":["journal_id","title","entry_count","total_words"],"title":"JournalAnalyticsRow","description":"Per-journal totals in :class:`JournalAnalytics`."},"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.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.0,"minimum":-90.0,"title":"Latitude","description":"Latitude coordinate"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"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":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"additionalProperties":true,"type":"object","title":"User"}},"type":"object","required":["access_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"},"waveform_peaks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Waveform Peaks"},"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 \u2014 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"},"MoodCount":{"properties":{"mood":{"type":"string","title":"Mood"},"category":{"type":"string","title":"Category"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["mood","category","count"],"title":"MoodCount","description":"One mood and its log count."},"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"},"MoodDailyTrend":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"category":{"type":"string","title":"Category"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","category","count"],"title":"MoodDailyTrend","description":"Per-day count of mood logs in one category."},"MoodDateRange":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"}},"type":"object","required":["start_date","end_date"],"title":"MoodDateRange","description":"The analysed window echoed back in :class:`MoodStatistics`."},"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"},"MoodPatternPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"mood_count":{"type":"integer","title":"Mood Count"}},"type":"object","required":["date","mood_count"],"title":"MoodPatternPoint","description":"Moments carrying a primary mood on a given day."},"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."},"MoodStatistics":{"properties":{"total_logs":{"type":"integer","title":"Total Logs"},"date_range":{"$ref":"#/components/schemas/MoodDateRange"},"mood_distribution":{"additionalProperties":{"type":"number"},"type":"object","title":"Mood Distribution"},"most_frequent_mood":{"anyOf":[{"$ref":"#/components/schemas/MostFrequentMood"},{"type":"null"}]},"mood_counts":{"items":{"$ref":"#/components/schemas/MoodCount"},"type":"array","title":"Mood Counts"},"daily_trends":{"items":{"$ref":"#/components/schemas/MoodDailyTrend"},"type":"array","title":"Daily Trends"}},"type":"object","required":["total_logs","date_range","mood_distribution","mood_counts","daily_trends"],"title":"MoodStatistics","description":"``GET /moods/analytics/statistics`` response."},"MoodStreak":{"properties":{"current_streak":{"type":"integer","title":"Current Streak"},"total_days_logged":{"type":"integer","title":"Total Days Logged"},"last_logged_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Logged Date"}},"type":"object","required":["current_streak","total_days_logged"],"title":"MoodStreak","description":"``GET /moods/analytics/streak`` response.\n\n``get_mood_streak`` always returns the two counters (0 when nothing is\nlogged); only ``last_logged_date`` can be absent."},"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"},"MostFrequentMood":{"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","category","count"],"title":"MostFrequentMood","description":"The single most-logged mood in the analysed window."},"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."},"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 \u2014 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."},"ProductivityMetrics":{"properties":{"current_month_entries":{"type":"integer","title":"Current Month Entries"},"current_month_words":{"type":"integer","title":"Current Month Words"},"entry_growth_percentage":{"type":"number","title":"Entry Growth Percentage"},"average_daily_entries":{"type":"number","title":"Average Daily Entries"},"average_words_per_day":{"type":"number","title":"Average Words Per Day"}},"type":"object","required":["current_month_entries","current_month_words","entry_growth_percentage","average_daily_entries","average_words_per_day"],"title":"ProductivityMetrics","description":"``GET /analytics/productivity`` response."},"PromptAnalyticsResponse":{"properties":{"prompts_answered":{"type":"integer","title":"Prompts Answered"},"total_answers":{"type":"integer","title":"Total Answers"},"current_streak":{"type":"integer","title":"Current Streak"},"favorite_categories":{"items":{"$ref":"#/components/schemas/PromptCategoryAnalytics"},"type":"array","title":"Favorite Categories"},"completion_trend":{"items":{"$ref":"#/components/schemas/PromptCompletionWeek"},"type":"array","title":"Completion Trend"},"most_used_prompt":{"anyOf":[{"$ref":"#/components/schemas/PromptMostUsedAnalytics"},{"type":"null"}]}},"type":"object","required":["prompts_answered","total_answers","current_streak","favorite_categories","completion_trend"],"title":"PromptAnalyticsResponse","description":"``GET /prompts/analytics/statistics`` response for the current writer."},"PromptCategoryAnalytics":{"properties":{"category":{"type":"string","title":"Category"},"answered_count":{"type":"integer","title":"Answered Count"}},"type":"object","required":["category","answered_count"],"title":"PromptCategoryAnalytics","description":"How often the current writer has answered one prompt category."},"PromptCompletionWeek":{"properties":{"week_start":{"type":"string","format":"date","title":"Week Start"},"answered_count":{"type":"integer","title":"Answered Count"}},"type":"object","required":["week_start","answered_count"],"title":"PromptCompletionWeek","description":"Prompt-linked Moments completed in the calendar week beginning here."},"PromptMostUsedAnalytics":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"text":{"type":"string","title":"Text"},"answered_count":{"type":"integer","title":"Answered Count"}},"type":"object","required":["id","text","answered_count"],"title":"PromptMostUsedAnalytics","description":"The current writer's most frequently answered prompt, when one exists."},"PromptPageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PromptResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Offset"},"category_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Category Counts"},"all_count":{"type":"integer","title":"All Count"}},"type":"object","required":["items","total","category_counts","all_count"],"title":"PromptPageResponse","description":"A deterministic offset page of active system prompts."},"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"},"answered_count":{"type":"integer","title":"Answered 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","answered_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.0,"minimum":-90.0,"title":"Latitude"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"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":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","title":"TokenRefresh","description":"Token refresh schema.\n\nrefresh_token is optional so a PWA client can rely on the\n`journiv_refresh` HttpOnly cookie instead of a request body; the Flutter\nclient at /legacy/ still supplies it in the body."},"TopTagCount":{"properties":{"tag_name":{"type":"string","title":"Tag Name"},"usage_count":{"type":"integer","title":"Usage Count"}},"type":"object","required":["tag_name","usage_count"],"title":"TopTagCount","description":"A tag and how often it was used in the analysed window."},"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.0,"minimum":0.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.0,"minimum":0.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.0,"minimum":0.0},{"type":"null"}],"title":"Humidity","description":"Humidity percentage"},"wind_speed":{"anyOf":[{"type":"number","minimum":0.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.0,"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.0,"minimum":-90.0,"title":"Latitude","description":"Latitude coordinate"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"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.0,"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."}},"WritingPatterns":{"properties":{"period_days":{"type":"integer","title":"Period Days"},"entries_by_day":{"items":{"$ref":"#/components/schemas/EntriesByDayPoint"},"type":"array","title":"Entries By Day"},"mood_patterns":{"items":{"$ref":"#/components/schemas/MoodPatternPoint"},"type":"array","title":"Mood Patterns"},"top_tags":{"items":{"$ref":"#/components/schemas/TopTagCount"},"type":"array","title":"Top Tags"}},"type":"object","required":["period_days","entries_by_day","mood_patterns","top_tags"],"title":"WritingPatterns","description":"``GET /analytics/writing-patterns`` response."},"WritingStreakAnalytics":{"properties":{"current_streak":{"type":"integer","title":"Current Streak"},"longest_streak":{"type":"integer","title":"Longest Streak"},"total_entries":{"type":"integer","title":"Total Entries"},"total_words":{"type":"integer","title":"Total Words"},"average_words_per_entry":{"type":"number","title":"Average Words Per Entry"},"last_entry_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Entry Date"},"streak_start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Streak Start Date"}},"type":"object","required":["current_streak","longest_streak","total_entries","total_words","average_words_per_entry"],"title":"WritingStreakAnalytics","description":"``GET /analytics/writing-streak`` response.\n\n``get_writing_analytics`` always returns the counters (0 when the user has\nwritten nothing), so they are required; only the two dates can be absent\n(dropped by ``response_model_exclude_none``). No field defaults, so the\ngenerated OpenAPI schema does not depend on how a Pydantic version\nserialises ``0.0``."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/token"}}}}}}