{"openapi":"3.1.0","info":{"title":"VoiceApp API","description":"Messagerie vocale ephemere securisee - Production Backend v5.0","version":"5.0.0"},"paths":{"/api/v1/auth/register":{"post":{"tags":["Authentication"],"summary":"Register","description":"Register a new user. Creates Matrix-style opaque token.","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"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/username + password. Creates Matrix-style opaque token per device.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh Token Endpoint","description":"Rotate token: invalidate current token, create new one (Matrix-style).\n\nSecurity: rate limited to 1 refresh/second per token to prevent replay attacks.","operationId":"refresh_token_endpoint_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Logout: delete token from DB = immediate revocation (Matrix-style).","operationId":"logout_api_v1_auth_logout_post","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout-all":{"post":{"tags":["Authentication"],"summary":"Logout All","description":"Logout from all devices: delete all tokens from DB (Matrix-style global revocation).","operationId":"logout_all_api_v1_auth_logout_all_post","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeAllSessionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sessions":{"get":{"tags":["Authentication"],"summary":"List Sessions","description":"List all active sessions/devices (Matrix-style: from access_tokens table).","operationId":"list_sessions_api_v1_auth_sessions_get","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeviceSessionResponse"},"title":"Response List Sessions Api V1 Auth Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/sessions/{session_id}":{"delete":{"tags":["Authentication"],"summary":"Revoke Specific Session","description":"Revoke a specific session/device token (Matrix-style).","operationId":"revoke_specific_session_api_v1_auth_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/change-password":{"post":{"tags":["Authentication"],"summary":"Change Password","operationId":"change_password_api_v1_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email":{"get":{"tags":["Authentication"],"summary":"Verify Email","description":"Verify email via activation link (clicked from email).","operationId":"verify_email_api_v1_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email-code":{"post":{"tags":["Authentication"],"summary":"Verify Email By Code","description":"Verify email using 6-digit code (entered in app).","operationId":"verify_email_by_code_api_v1_auth_verify_email_code_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/resend-verification":{"post":{"tags":["Authentication"],"summary":"Resend Verification","description":"Resend verification email with new code and link.","operationId":"resend_verification_api_v1_auth_resend_verification_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/qr/generate":{"post":{"tags":["Authentication"],"summary":"Generate Qr Code","operationId":"generate_qr_code_api_v1_auth_qr_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QRCodeResponse"}}}}}}},"/api/v1/auth/qr/validate":{"post":{"tags":["Authentication"],"summary":"Validate Qr Code","operationId":"validate_qr_code_api_v1_auth_qr_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QRCodeValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/qr/check":{"post":{"tags":["Authentication"],"summary":"Check Qr Login","description":"Check QR login and create Matrix-style token for the new device.","operationId":"check_qr_login_api_v1_auth_qr_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QRCodeLoginCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/send":{"post":{"tags":["Voice Messages"],"summary":"Send Voice Message","description":"Send a voice message. max_listens is always 2 (not configurable).\n\nAnti-abuse checks:\n- Rate limit: MAX_MESSAGES_PER_MINUTE per minute\n- Spam detection: rapid-fire sending detection\n- Bulk send limit: MAX_UNIQUE_RECIPIENTS_PER_HOUR unique recipients/hour\n- Auto-ban: after AUTO_BAN_VIOLATION_THRESHOLD violations","operationId":"send_voice_message_api_v1_messages_send_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_send_voice_message_api_v1_messages_send_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceMessageSentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/inbox":{"get":{"tags":["Voice Messages"],"summary":"Get Inbox","description":"Get inbox with received voice messages.","operationId":"get_inbox_api_v1_messages_inbox_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxResponse"}}}}}}},"/api/v1/messages/sent":{"get":{"tags":["Voice Messages"],"summary":"Get Sent","operationId":"get_sent_api_v1_messages_sent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SentMessagesResponse"}}}}}}},"/api/v1/messages/{message_id}/listen":{"post":{"tags":["Voice Messages"],"summary":"Listen Message","description":"Listen to a voice message. Strict expiration rules apply.","operationId":"listen_message_api_v1_messages__message_id__listen_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/messages/{message_id}":{"delete":{"tags":["Voice Messages"],"summary":"Delete Message","operationId":"delete_message_api_v1_messages__message_id__delete","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["Users"],"summary":"Get My Profile","operationId":"get_my_profile_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}}}},"put":{"tags":["Users"],"summary":"Update Profile","operationId":"update_profile_api_v1_users_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Users"],"summary":"Delete Account","description":"Soft-delete account (GDPR compliant).","operationId":"delete_account_api_v1_users_me_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/users/search":{"get":{"tags":["Users"],"summary":"Search Users","operationId":"search_users_api_v1_users_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":50,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}":{"get":{"tags":["Users"],"summary":"Get User Profile","operationId":"get_user_profile_api_v1_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/{user_id}/status":{"get":{"tags":["Users"],"summary":"Get User Status","description":"Get user real-time status: online, last_seen, recording indicator.","operationId":"get_user_status_api_v1_users__user_id__status_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/privacy":{"put":{"tags":["Users"],"summary":"Update Privacy","operationId":"update_privacy_api_v1_users_me_privacy_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacySettingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacySettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/request":{"post":{"tags":["Friends"],"summary":"Send Friend Request","operationId":"send_friend_request_api_v1_friends_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/{friendship_id}/accept":{"post":{"tags":["Friends"],"summary":"Accept Friend","operationId":"accept_friend_api_v1_friends__friendship_id__accept_post","parameters":[{"name":"friendship_id","in":"path","required":true,"schema":{"type":"string","title":"Friendship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/{friendship_id}/reject":{"post":{"tags":["Friends"],"summary":"Reject Friend","operationId":"reject_friend_api_v1_friends__friendship_id__reject_post","parameters":[{"name":"friendship_id","in":"path","required":true,"schema":{"type":"string","title":"Friendship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/{friend_id}":{"delete":{"tags":["Friends"],"summary":"Remove Friend","operationId":"remove_friend_api_v1_friends__friend_id__delete","parameters":[{"name":"friend_id","in":"path","required":true,"schema":{"type":"string","title":"Friend Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/block":{"post":{"tags":["Friends"],"summary":"Block User","operationId":"block_user_api_v1_friends_block_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/unblock":{"post":{"tags":["Friends"],"summary":"Unblock User","operationId":"unblock_user_api_v1_friends_unblock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friends/list":{"get":{"tags":["Friends"],"summary":"List Friends","operationId":"list_friends_api_v1_friends_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendListResponse"}}}}}}},"/api/v1/friends/suggestions":{"get":{"tags":["Friends"],"summary":"Friend Suggestions","description":"Get friend suggestions based on mutual friends (friends of friends).\n\nReturns users who are friends with your friends but not yet your friend.","operationId":"friend_suggestions_api_v1_friends_suggestions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/friends/pending":{"get":{"tags":["Friends"],"summary":"Pending Requests","operationId":"pending_requests_api_v1_friends_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingRequestsResponse"}}}}}}},"/api/v1/reactions":{"post":{"tags":["Reactions"],"summary":"Add Reaction","operationId":"add_reaction_api_v1_reactions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddReactionRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reactions/{reaction_id}":{"delete":{"tags":["Reactions"],"summary":"Remove Reaction","operationId":"remove_reaction_api_v1_reactions__reaction_id__delete","parameters":[{"name":"reaction_id","in":"path","required":true,"schema":{"type":"string","title":"Reaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reactions/message/{message_id}":{"get":{"tags":["Reactions"],"summary":"Get Message Reactions","operationId":"get_message_reactions_api_v1_reactions_message__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stories":{"post":{"tags":["Stories"],"summary":"Create Story","operationId":"create_story_api_v1_stories_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_story_api_v1_stories_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stories/friends":{"get":{"tags":["Stories"],"summary":"Get Friends Stories","operationId":"get_friends_stories_api_v1_stories_friends_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoriesListResponse"}}}}}}},"/api/v1/stories/mine":{"get":{"tags":["Stories"],"summary":"Get My Stories","operationId":"get_my_stories_api_v1_stories_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoriesListResponse"}}}}}}},"/api/v1/stories/{story_id}/view":{"post":{"tags":["Stories"],"summary":"View Story","operationId":"view_story_api_v1_stories__story_id__view_post","parameters":[{"name":"story_id","in":"path","required":true,"schema":{"type":"string","title":"Story Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stories/{story_id}/audio":{"get":{"tags":["Stories"],"summary":"Stream Story Audio","description":"Stream audio file for a story. Proxies from MinIO so phone can access it.","operationId":"stream_story_audio_api_v1_stories__story_id__audio_get","parameters":[{"name":"story_id","in":"path","required":true,"schema":{"type":"string","title":"Story Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stories/{story_id}/viewers":{"get":{"tags":["Stories"],"summary":"Get Story Viewers","operationId":"get_story_viewers_api_v1_stories__story_id__viewers_get","parameters":[{"name":"story_id","in":"path","required":true,"schema":{"type":"string","title":"Story Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryViewersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stories/{story_id}":{"delete":{"tags":["Stories"],"summary":"Delete Story","operationId":"delete_story_api_v1_stories__story_id__delete","parameters":[{"name":"story_id","in":"path","required":true,"schema":{"type":"string","title":"Story Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/streaks":{"get":{"tags":["Streaks"],"summary":"Get Streaks","operationId":"get_streaks_api_v1_streaks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreaksListResponse"}}}}}}},"/api/v1/streaks/{friend_id}":{"get":{"tags":["Streaks"],"summary":"Get Streak With Friend","operationId":"get_streak_with_friend_api_v1_streaks__friend_id__get","parameters":[{"name":"friend_id","in":"path","required":true,"schema":{"type":"string","title":"Friend Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreakResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/favorites":{"get":{"tags":["Favorites"],"summary":"List Favorites","operationId":"list_favorites_api_v1_favorites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoritesListResponse"}}}}}},"post":{"tags":["Favorites"],"summary":"Add Favorite","operationId":"add_favorite_api_v1_favorites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFavoriteRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/favorites/{favorite_id}":{"delete":{"tags":["Favorites"],"summary":"Remove Favorite","operationId":"remove_favorite_api_v1_favorites__favorite_id__delete","parameters":[{"name":"favorite_id","in":"path","required":true,"schema":{"type":"string","title":"Favorite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/favorites/reorder":{"put":{"tags":["Favorites"],"summary":"Reorder Favorites","operationId":"reorder_favorites_api_v1_favorites_reorder_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderFavoritesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports":{"post":{"tags":["Reports"],"summary":"Report User","operationId":"report_user_api_v1_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recovery/password-reset/request":{"post":{"tags":["Account Recovery"],"summary":"Request Password Reset","operationId":"request_password_reset_api_v1_recovery_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recovery/password-reset/confirm":{"post":{"tags":["Account Recovery"],"summary":"Confirm Password Reset","operationId":"confirm_password_reset_api_v1_recovery_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recovery/codes":{"get":{"tags":["Account Recovery"],"summary":"Get Recovery Codes","operationId":"get_recovery_codes_api_v1_recovery_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Recovery Codes Api V1 Recovery Codes Get"}}}}}}},"/api/v1/recovery/codes/regenerate":{"post":{"tags":["Account Recovery"],"summary":"Regenerate Recovery Codes","operationId":"regenerate_recovery_codes_api_v1_recovery_codes_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Regenerate Recovery Codes Api V1 Recovery Codes Regenerate Post"}}}}}}},"/api/v1/recovery/codes/login":{"post":{"tags":["Account Recovery"],"summary":"Login With Recovery Code","operationId":"login_with_recovery_code_api_v1_recovery_codes_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoveryCodeLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login With Recovery Code Api V1 Recovery Codes Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/2fa/setup":{"post":{"tags":["Two-Factor Authentication"],"summary":"Setup 2Fa","operationId":"setup_2fa_api_v1_2fa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Setup 2Fa Api V1 2Fa Setup Post"}}}}}}},"/api/v1/2fa/enable":{"post":{"tags":["Two-Factor Authentication"],"summary":"Enable 2Fa","operationId":"enable_2fa_api_v1_2fa_enable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Enable2FARequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/2fa/verify":{"post":{"tags":["Two-Factor Authentication"],"summary":"Verify 2Fa Login","description":"Verify 2FA code during login flow.","operationId":"verify_2fa_login_api_v1_2fa_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verify2FALoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/2fa/disable":{"post":{"tags":["Two-Factor Authentication"],"summary":"Disable 2Fa","operationId":"disable_2fa_api_v1_2fa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Disable2FARequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications":{"get":{"tags":["Notifications"],"summary":"List Notifications","operationId":"list_notifications_api_v1_notifications_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/{notification_id}/read":{"post":{"tags":["Notifications"],"summary":"Mark As Read","operationId":"mark_as_read_api_v1_notifications__notification_id__read_post","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/read-all":{"post":{"tags":["Notifications"],"summary":"Mark All As Read","operationId":"mark_all_as_read_api_v1_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/v1/notifications/{notification_id}":{"delete":{"tags":["Notifications"],"summary":"Delete Notification","operationId":"delete_notification_api_v1_notifications__notification_id__delete","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/push-token":{"post":{"tags":["Notifications"],"summary":"Register Push Token","description":"Register or update a push token for the current user (Android/iOS).","operationId":"register_push_token_api_v1_notifications_push_token_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPushTokenRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Notifications"],"summary":"Unregister Push Token","description":"Unregister a push token (e.g. on logout).","operationId":"unregister_push_token_api_v1_notifications_push_token_delete","parameters":[{"name":"push_token","in":"query","required":true,"schema":{"type":"string","minLength":10,"title":"Push Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notification-settings/{friend_id}":{"put":{"tags":["Notification Settings"],"summary":"Update Notification Setting","operationId":"update_notification_setting_api_v1_notification_settings__friend_id__put","parameters":[{"name":"friend_id","in":"path","required":true,"schema":{"type":"string","title":"Friend Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notification-settings":{"get":{"tags":["Notification Settings"],"summary":"List Notification Settings","operationId":"list_notification_settings_api_v1_notification_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationSettingResponse"},"type":"array","title":"Response List Notification Settings Api V1 Notification Settings Get"}}}}}}},"/api/v1/analytics/me":{"get":{"tags":["Analytics"],"summary":"Get My Analytics","description":"Get personal analytics: messages sent/received, listens, streaks, response rates.","operationId":"get_my_analytics_api_v1_analytics_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/analytics/global":{"get":{"tags":["Analytics"],"summary":"Get Global Metrics","description":"Get global platform metrics (from Redis counters).","operationId":"get_global_metrics_api_v1_analytics_global_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/login":{"post":{"tags":["Admin"],"summary":"Admin Login","description":"Authenticate admin and return token.","operationId":"admin_login_admin_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"tags":["Admin"],"summary":"Admin Stats","description":"Get server statistics.","operationId":"admin_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/users":{"get":{"tags":["Admin"],"summary":"Admin List Users","description":"List all users with pagination.","operationId":"admin_list_users_admin_users_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/ban":{"post":{"tags":["Admin"],"summary":"Admin Ban User","description":"Ban a user.","operationId":"admin_ban_user_admin_users__user_id__ban_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/unban":{"post":{"tags":["Admin"],"summary":"Admin Unban User","description":"Unban a user.","operationId":"admin_unban_user_admin_users__user_id__unban_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reports":{"get":{"tags":["Admin"],"summary":"Admin List Reports","description":"List reports with optional status filter.","operationId":"admin_list_reports_admin_reports_get","parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/security-logs":{"get":{"tags":["Admin"],"summary":"Admin Security Logs","description":"View recent security events.","operationId":"admin_security_logs_admin_security_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/smtp/config":{"get":{"tags":["Admin"],"summary":"Admin Get Smtp Config","description":"Get current SMTP configuration (password masked).","operationId":"admin_get_smtp_config_admin_smtp_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Admin"],"summary":"Admin Update Smtp Config","description":"Update SMTP configuration at runtime.","operationId":"admin_update_smtp_config_admin_smtp_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmtpConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/smtp/test":{"post":{"tags":["Admin"],"summary":"Admin Test Smtp","description":"Send a test email via SMTP.","operationId":"admin_test_smtp_admin_smtp_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmtpTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/smtp/send-to-user":{"post":{"tags":["Admin"],"summary":"Admin Send Email To User","description":"Send a custom email to a specific user.","operationId":"admin_send_email_to_user_admin_smtp_send_to_user_post","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"subject","in":"query","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"body","in":"query","required":true,"schema":{"type":"string","title":"Body"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"tags":["Admin"],"summary":"Admin Dashboard","description":"Serve admin dashboard HTML page.","operationId":"admin_dashboard_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api-docs":{"get":{"tags":["Documentation"],"summary":"Public Api Docs","description":"Serve comprehensive public API documentation (HTML for humans).","operationId":"public_api_docs_api_docs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api-docs/swagger":{"get":{"tags":["Documentation"],"summary":"Swagger Ui Redirect","description":"Redirect to FastAPI native Swagger UI.","operationId":"swagger_ui_redirect_api_docs_swagger_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api-docs/openapi.json":{"get":{"tags":["Documentation"],"summary":"Api Docs Json Redirect","description":"Redirect to FastAPI native OpenAPI spec (always valid, auto-generated).","operationId":"api_docs_json_redirect_api_docs_openapi_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint for monitoring.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"Landing page for voiceapp.be.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AddFavoriteRequest":{"properties":{"friend_id":{"type":"string","title":"Friend Id"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"}},"type":"object","required":["friend_id"],"title":"AddFavoriteRequest"},"AddReactionRequest":{"properties":{"message_id":{"type":"string","title":"Message Id"},"reaction_type":{"type":"string","title":"Reaction Type"}},"type":"object","required":["message_id","reaction_type"],"title":"AddReactionRequest"},"AdminLoginRequest":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"AdminLoginRequest"},"Body_create_story_api_v1_stories_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_create_story_api_v1_stories_post"},"Body_send_voice_message_api_v1_messages_send_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"recipient_ids":{"type":"string","title":"Recipient Ids","description":"Comma-separated recipient user IDs"}},"type":"object","required":["file","recipient_ids"],"title":"Body_send_voice_message_api_v1_messages_send_post"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"DeviceSessionResponse":{"properties":{"id":{"type":"string","title":"Id"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"},"device_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Info"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"created_at":{"type":"string","title":"Created At"},"is_current":{"type":"boolean","title":"Is Current","default":false}},"type":"object","required":["id","created_at"],"title":"DeviceSessionResponse"},"Disable2FARequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Disable2FARequest"},"Enable2FARequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Enable2FARequest"},"FavoriteResponse":{"properties":{"id":{"type":"string","title":"Id"},"friend_id":{"type":"string","title":"Friend Id"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"username":{"type":"string","title":"Username","default":""},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"position":{"type":"integer","title":"Position","default":0},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","friend_id"],"title":"FavoriteResponse"},"FavoritesListResponse":{"properties":{"favorites":{"items":{"$ref":"#/components/schemas/FavoriteResponse"},"type":"array","title":"Favorites"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["favorites","total"],"title":"FavoritesListResponse"},"FriendListResponse":{"properties":{"friends":{"items":{"$ref":"#/components/schemas/FriendResponse"},"type":"array","title":"Friends"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["friends","total"],"title":"FriendListResponse"},"FriendRequestBody":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"FriendRequestBody"},"FriendRequestResponse":{"properties":{"id":{"type":"string","title":"Id"},"requester_id":{"type":"string","title":"Requester Id"},"requester_username":{"type":"string","title":"Requester Username"},"requester_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Display Name"},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","requester_id","requester_username"],"title":"FriendRequestResponse"},"FriendResponse":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_online":{"type":"boolean","title":"Is Online","default":false},"friendship_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Friendship Id"},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","username"],"title":"FriendResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InboxResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/VoiceMessageResponse"},"type":"array","title":"Messages"},"total":{"type":"integer","title":"Total"},"unread":{"type":"integer","title":"Unread","default":0}},"type":"object","required":["messages","total"],"title":"InboxResponse"},"ListenResponse":{"properties":{"message_id":{"type":"string","title":"Message Id"},"listen_count":{"type":"integer","title":"Listen Count"},"max_listens":{"type":"integer","title":"Max Listens","default":2},"is_expired":{"type":"boolean","title":"Is Expired"},"audio_url":{"type":"string","title":"Audio Url"}},"type":"object","required":["message_id","listen_count","is_expired","audio_url"],"title":"ListenResponse"},"LoginRequest":{"properties":{"login":{"type":"string","title":"Login","description":"Email or username"},"password":{"type":"string","title":"Password"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["login","password"],"title":"LoginRequest"},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"NotificationResponse":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"data":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data"},"is_read":{"type":"boolean","title":"Is Read","default":false},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","type","title","body"],"title":"NotificationResponse"},"NotificationSettingRequest":{"properties":{"friend_id":{"type":"string","title":"Friend Id"},"is_muted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Muted"},"custom_sound":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Sound"}},"type":"object","required":["friend_id"],"title":"NotificationSettingRequest"},"NotificationSettingResponse":{"properties":{"id":{"type":"string","title":"Id"},"friend_id":{"type":"string","title":"Friend Id"},"friend_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Friend Username"},"is_muted":{"type":"boolean","title":"Is Muted"},"custom_sound":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Sound"}},"type":"object","required":["id","friend_id","is_muted"],"title":"NotificationSettingResponse"},"NotificationsListResponse":{"properties":{"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"total":{"type":"integer","title":"Total"},"unread":{"type":"integer","title":"Unread","default":0}},"type":"object","required":["notifications","total"],"title":"NotificationsListResponse"},"PasswordResetConfirm":{"properties":{"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["new_password"],"title":"PasswordResetConfirm"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PendingRequestsResponse":{"properties":{"requests":{"items":{"$ref":"#/components/schemas/FriendRequestResponse"},"type":"array","title":"Requests"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["requests","total"],"title":"PendingRequestsResponse"},"PrivacySettingsRequest":{"properties":{"privacy_online_status":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Privacy Online Status"},"privacy_read_receipts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Privacy Read Receipts"},"privacy_phone_visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Privacy Phone Visible"}},"type":"object","title":"PrivacySettingsRequest"},"PrivacySettingsResponse":{"properties":{"privacy_online_status":{"type":"boolean","title":"Privacy Online Status","default":true},"privacy_read_receipts":{"type":"boolean","title":"Privacy Read Receipts","default":true},"privacy_phone_visible":{"type":"boolean","title":"Privacy Phone Visible","default":false}},"type":"object","title":"PrivacySettingsResponse"},"PushTokenResponse":{"properties":{"id":{"type":"string","title":"Id"},"push_token":{"type":"string","title":"Push Token"},"platform":{"type":"string","title":"Platform"},"device_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Name"},"is_active":{"type":"boolean","title":"Is Active","default":true},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","push_token","platform"],"title":"PushTokenResponse"},"QRCodeLoginCheckRequest":{"properties":{"qr_token":{"type":"string","title":"Qr Token"}},"type":"object","required":["qr_token"],"title":"QRCodeLoginCheckRequest"},"QRCodeResponse":{"properties":{"qr_token":{"type":"string","title":"Qr Token"},"qr_image_base64":{"type":"string","title":"Qr Image Base64"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["qr_token","qr_image_base64","expires_in"],"title":"QRCodeResponse"},"QRCodeValidateRequest":{"properties":{"qr_token":{"type":"string","title":"Qr Token"}},"type":"object","required":["qr_token"],"title":"QRCodeValidateRequest"},"ReactionResponse":{"properties":{"id":{"type":"string","title":"Id"},"message_id":{"type":"string","title":"Message Id"},"user_id":{"type":"string","title":"User Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"reaction_type":{"type":"string","title":"Reaction Type"},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","message_id","user_id","reaction_type"],"title":"ReactionResponse"},"ReactionsListResponse":{"properties":{"reactions":{"items":{"$ref":"#/components/schemas/ReactionResponse"},"type":"array","title":"Reactions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["reactions","total"],"title":"ReactionsListResponse"},"RecoveryCodeLogin":{"properties":{"login":{"type":"string","title":"Login"},"recovery_code":{"type":"string","title":"Recovery Code"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["login","recovery_code"],"title":"RecoveryCodeLogin"},"RefreshTokenRequest":{"properties":{"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","title":"RefreshTokenRequest"},"RegisterPushTokenRequest":{"properties":{"push_token":{"type":"string","minLength":10,"title":"Push Token","description":"FCM push token from device"},"platform":{"type":"string","pattern":"^(android|ios)$","title":"Platform","description":"Device platform: android or ios"},"device_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Device Name","description":"Device name (e.g. iPhone 15, Pixel 8)"}},"type":"object","required":["push_token","platform"],"title":"RegisterPushTokenRequest"},"RegisterRequest":{"properties":{"username":{"type":"string","maxLength":30,"minLength":3,"pattern":"^[a-zA-Z0-9_]+$","title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"display_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Display Name"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["username","email","password"],"title":"RegisterRequest"},"ReorderFavoritesRequest":{"properties":{"favorite_ids":{"items":{"type":"string"},"type":"array","title":"Favorite Ids"}},"type":"object","required":["favorite_ids"],"title":"ReorderFavoritesRequest"},"ReportRequest":{"properties":{"reported_user_id":{"type":"string","title":"Reported User Id"},"reason":{"type":"string","title":"Reason"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"}},"type":"object","required":["reported_user_id","reason"],"title":"ReportRequest"},"RevokeAllSessionsResponse":{"properties":{"message":{"type":"string","title":"Message"},"sessions_revoked":{"type":"integer","title":"Sessions Revoked"}},"type":"object","required":["message","sessions_revoked"],"title":"RevokeAllSessionsResponse"},"SentMessagesResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/VoiceMessageSentResponse"},"type":"array","title":"Messages"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["messages","total"],"title":"SentMessagesResponse"},"SmtpConfigRequest":{"properties":{"smtp_host":{"type":"string","title":"Smtp Host","default":""},"smtp_port":{"type":"integer","title":"Smtp Port","default":587},"smtp_username":{"type":"string","title":"Smtp Username","default":""},"smtp_password":{"type":"string","title":"Smtp Password","default":""},"smtp_from_email":{"type":"string","title":"Smtp From Email","default":"noreply@voiceapp.be"},"smtp_from_name":{"type":"string","title":"Smtp From Name","default":"VoiceApp"},"smtp_tls":{"type":"boolean","title":"Smtp Tls","default":true}},"type":"object","title":"SmtpConfigRequest"},"SmtpTestRequest":{"properties":{"to_email":{"type":"string","title":"To Email"},"subject":{"type":"string","title":"Subject","default":"VoiceApp - Test SMTP"},"body":{"type":"string","title":"Body","default":"Ceci est un email de test depuis le panel admin VoiceApp."}},"type":"object","required":["to_email"],"title":"SmtpTestRequest"},"StoriesListResponse":{"properties":{"stories":{"items":{"$ref":"#/components/schemas/StoryResponse"},"type":"array","title":"Stories"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["stories","total"],"title":"StoriesListResponse"},"StoryResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"duration_seconds":{"type":"number","title":"Duration Seconds","default":0},"is_viewed":{"type":"boolean","title":"Is Viewed","default":false},"view_count":{"type":"integer","title":"View Count","default":0},"created_at":{"type":"string","title":"Created At","default":""},"expires_at":{"type":"string","title":"Expires At","default":""}},"type":"object","required":["id","user_id","username"],"title":"StoryResponse"},"StoryViewersResponse":{"properties":{"viewers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Viewers"},"total":{"type":"integer","title":"Total","default":0}},"type":"object","required":["viewers"],"title":"StoryViewersResponse"},"StreakResponse":{"properties":{"friend_id":{"type":"string","title":"Friend Id"},"friend_username":{"type":"string","title":"Friend Username"},"friend_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Friend Display Name"},"current_streak":{"type":"integer","title":"Current Streak","default":0},"longest_streak":{"type":"integer","title":"Longest Streak","default":0},"emoji":{"type":"string","title":"Emoji","default":""},"last_interaction":{"type":"string","title":"Last Interaction","default":""},"streak_started_at":{"type":"string","title":"Streak Started At","default":""}},"type":"object","required":["friend_id","friend_username"],"title":"StreakResponse"},"StreaksListResponse":{"properties":{"streaks":{"items":{"$ref":"#/components/schemas/StreakResponse"},"type":"array","title":"Streaks"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["streaks","total"],"title":"StreaksListResponse"},"TokenResponse":{"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"},"expires_in":{"type":"integer","title":"Expires In"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["access_token","expires_in","user_id","username"],"title":"TokenResponse"},"UpdateProfileRequest":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Bio"}},"type":"object","title":"UpdateProfileRequest"},"UserProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"is_online":{"type":"boolean","title":"Is Online","default":false},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"privacy_online_status":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Privacy Online Status"},"privacy_read_receipts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Privacy Read Receipts"},"created_at":{"type":"string","title":"Created At","default":""}},"type":"object","required":["id","username"],"title":"UserProfileResponse"},"UserSearchResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/UserProfileResponse"},"type":"array","title":"Users"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["users","total"],"title":"UserSearchResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Verify2FALoginRequest":{"properties":{"temp_token":{"type":"string","title":"Temp Token"},"code":{"type":"string","title":"Code"},"device_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Device Id"}},"type":"object","required":["temp_token","code"],"title":"Verify2FALoginRequest"},"VoiceMessageResponse":{"properties":{"id":{"type":"string","title":"Id"},"sender_id":{"type":"string","title":"Sender Id"},"sender_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Username"},"sender_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Display Name"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"listen_count":{"type":"integer","title":"Listen Count","default":0},"max_listens":{"type":"integer","title":"Max Listens","default":2},"is_listened":{"type":"boolean","title":"Is Listened","default":false},"created_at":{"type":"string","title":"Created At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","sender_id","duration_seconds","created_at"],"title":"VoiceMessageResponse"},"VoiceMessageSentResponse":{"properties":{"id":{"type":"string","title":"Id"},"recipient_ids":{"items":{"type":"string"},"type":"array","title":"Recipient Ids"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","recipient_ids","duration_seconds","created_at"],"title":"VoiceMessageSentResponse"}}}}