{"openapi":"3.1.0","info":{"title":"Jirani MVP API","description":"Nairobi Housing Recommendation Platform","version":"1.0.0"},"paths":{"/users/hunters":{"get":{"tags":["Users"],"summary":"Get Hunters","operationId":"get_hunters_users_hunters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/users/{user_id}/profile":{"put":{"tags":["Users"],"summary":"Update User Profile","description":"Update user profile information","operationId":"update_user_profile_users__user_id__profile_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/owner-profile":{"put":{"tags":["Users"],"summary":"Update Owner Profile","description":"Update owner profile information (phone_number, whatsapp_number, national_id).\nSets verification_status to 'pending' for manual review by admin.","operationId":"update_owner_profile_users__user_id__owner_profile_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/preferences":{"put":{"tags":["Users"],"summary":"Update User Preferences","description":"Update user housing preferences","operationId":"update_user_preferences_users__user_id__preferences_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferencesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Users"],"summary":"Get User Preferences","description":"Get user preferences","operationId":"get_user_preferences_users__user_id__preferences_get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/users/{user_id}/preferences/onboarding":{"post":{"tags":["Users"],"summary":"Create Preferences Onboarding","description":"Create complete preferences during onboarding.\n\nNEW FORMAT: preferred_locations is stored as array of objects with coordinates:\n[{\"name\": \"South B\", \"lat\": -1.31, \"lon\": 36.83}, ...]\n\nThis enables coordinate-based radius search instead of ward name matching.","operationId":"create_preferences_onboarding_users__user_id__preferences_onboarding_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferencesCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/activities":{"post":{"tags":["Users"],"summary":"Create Activity","description":"Create a single activity","operationId":"create_activity_users__user_id__activities_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Users"],"summary":"Get User Activities","description":"Get all activities for a user","operationId":"get_user_activities_users__user_id__activities_get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/users/{user_id}/activities/batch":{"post":{"tags":["Users"],"summary":"Create Activities Batch","description":"Create multiple activities at once (for onboarding)","operationId":"create_activities_batch_users__user_id__activities_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActivityCreate"},"title":"Activities"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/activities/{activity_id}":{"put":{"tags":["Users"],"summary":"Update Activity","description":"Update a specific activity","operationId":"update_activity_users__user_id__activities__activity_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","title":"Activity Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Users"],"summary":"Delete Activity","description":"Delete a specific activity","operationId":"delete_activity_users__user_id__activities__activity_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"activity_id","in":"path","required":true,"schema":{"type":"string","title":"Activity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/onboarding/complete":{"post":{"tags":["Users"],"summary":"Mark Onboarding Complete","description":"Mark user onboarding as complete","operationId":"mark_onboarding_complete_users__user_id__onboarding_complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingComplete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/onboarding/skip":{"post":{"tags":["Users"],"summary":"Skip Onboarding","description":"Mark onboarding as skipped (temporary)","operationId":"skip_onboarding_users__user_id__onboarding_skip_post","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/users/{user_id}/onboarding/reset":{"post":{"tags":["Users"],"summary":"Reset Onboarding","description":"Reset onboarding status to allow user to go through onboarding again","operationId":"reset_onboarding_users__user_id__onboarding_reset_post","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/users/{user_id}/export-data":{"get":{"tags":["Users"],"summary":"Export User Data","description":"Export all user data as a JSON file. Rate limited to once every 24 hours.","operationId":"export_user_data_users__user_id__export_data_get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/users/{user_id}":{"delete":{"tags":["Users"],"summary":"Delete User Account","description":"Permanently delete a user account and all associated data.","operationId":"delete_user_account_users__user_id__delete","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/recommendations/local/{user_id}":{"get":{"tags":["Recommendations"],"summary":"Local Recommendation","description":"Get local recommendations for a user based on their preferred locations.\n\nOPTIMIZED VERSION (v3):\n- Uses 'get_local_recommendations_optimized' PostGIS RPC.\n- Single DB round-trip for search, filtering, and media fetch.\n- Python only handles Commute Scoring (CPU-bound) and Sorting.","operationId":"local_recommendation_recommendations_local__user_id__get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/recommendations/global/{user_id}":{"get":{"tags":["Recommendations"],"summary":"Global Recommendation","description":"Get global recommendations for a user (not restricted to preferred locations).\nSearches entire database but still optimizes by commute score.\n\nv2: Backed by get_global_recommendations_optimized SQL RPC.\n    Replaces 6+ sequential round-trips with 1 SQL call + commute scoring.\nUses EXACT bedrooms matching (studio=0 matches only studios).","operationId":"global_recommendation_recommendations_global__user_id__get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/recommendations/listings":{"get":{"tags":["Recommendations"],"summary":"Get Listings","description":"Get all active listings with optional filters for the Explore page.\nThis endpoint does not require authentication and is public.\nOPTIMIZED: Uses server-side SQL function get_explore_listings.","operationId":"get_listings_recommendations_listings_get","parameters":[{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Price"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Price"}},{"name":"bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":300,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/projects":{"get":{"tags":["Recommendations"],"summary":"Get Projects","description":"Get sale/project inventory for Explore Buy mode.\n\nThis intentionally returns building/project cards, not rental listings.\nRental Explore remains backed by /recommendations/listings.","operationId":"get_projects_recommendations_projects_get","parameters":[{"name":"location","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Price"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Price"}},{"name":"bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":120,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/listing/{listing_id}":{"get":{"tags":["Recommendations"],"summary":"Get Listing By Id","description":"Get a single listing by ID with full details.\nOPTIMIZED: Single SQL RPC replaces 5-7 sequential DB queries (N+1 fix).\nIf user is authenticated, includes commute score based on their activities.","operationId":"get_listing_by_id_recommendations_listing__listing_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/building/{building_id}":{"get":{"tags":["Recommendations"],"summary":"Get Building Profile","description":"Get building profile with active listings (public endpoint).\nOPTIMIZED: Uses server-side SQL aggregation (get_building_profile_complete).","operationId":"get_building_profile_recommendations_building__building_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/location-stats":{"get":{"tags":["Recommendations"],"summary":"Get Location Activity Stats Endpoint","description":"Get aggregated listing activity stats (added vs removed) per location over the last N hours.\nUsed for showing +X / -Y indicators on location pills.","operationId":"get_location_activity_stats_endpoint_recommendations_location_stats_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/":{"post":{"tags":["Viewing Requests"],"summary":"Create Viewing Request","description":"Create a viewing request for a property.\nHunter can contact owner immediately after booking.","operationId":"create_viewing_request_viewing_requests__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateViewingRequestInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/viewing-requests/hunter/{hunter_id}":{"get":{"tags":["Viewing Requests"],"summary":"Get Hunter Requests","description":"Get all viewing requests for a hunter.\nOnly the hunter themselves can view their requests.","operationId":"get_hunter_requests_viewing_requests_hunter__hunter_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunter_id","in":"path","required":true,"schema":{"type":"string","title":"Hunter Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/owner/{owner_id}":{"get":{"tags":["Viewing Requests"],"summary":"Get Owner Requests","description":"Get all viewing requests for an owner's properties.\nOnly the owner can view requests for their properties.","operationId":"get_owner_requests_viewing_requests_owner__owner_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/{request_id}/confirm":{"post":{"tags":["Viewing Requests"],"summary":"Confirm Viewing Request","description":"Owner confirms a viewing request.\nThis unlocks owner's ability to contact hunter.","operationId":"confirm_viewing_request_viewing_requests__request_id__confirm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmViewingRequestInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/{request_id}/reject":{"post":{"tags":["Viewing Requests"],"summary":"Reject Viewing Request","description":"Owner rejects a viewing request.","operationId":"reject_viewing_request_viewing_requests__request_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectViewingRequestInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/{request_id}/cancel":{"post":{"tags":["Viewing Requests"],"summary":"Cancel Viewing Request","description":"Cancel a viewing request (can be done by hunter or owner).","operationId":"cancel_viewing_request_viewing_requests__request_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelViewingRequestInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/viewing-requests/cancel-for-delisted-unit":{"post":{"tags":["Viewing Requests"],"summary":"Cancel Requests For Delisted Unit","description":"Cancel all active viewing requests when a unit is delisted.\nCalled automatically when owner delists a unit.","operationId":"cancel_requests_for_delisted_unit_viewing_requests_cancel_for_delisted_unit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelForDelistedUnitInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/notifications/user/{user_id}":{"get":{"tags":["Notifications"],"summary":"Get User Notifications","description":"Get all notifications for a user.\nOnly the user themselves can view their notifications.","operationId":"get_user_notifications_notifications_user__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"is_read","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Read"}},{"name":"notification_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/user/{user_id}/unread-count":{"get":{"tags":["Notifications"],"summary":"Get Unread Count","description":"Get count of unread notifications for a user.\nUsed for badge counter in UI.","operationId":"get_unread_count_notifications_user__user_id__unread_count_get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/notifications/{notification_id}/read":{"post":{"tags":["Notifications"],"summary":"Mark Notification Read","description":"Mark a single notification as read.","operationId":"mark_notification_read_notifications__notification_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/user/{user_id}/read-all":{"post":{"tags":["Notifications"],"summary":"Mark All Notifications Read","description":"Mark all notifications as read for a user.","operationId":"mark_all_notifications_read_notifications_user__user_id__read_all_post","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/notifications/create":{"post":{"tags":["Notifications"],"summary":"Create Notification","description":"Create a notification programmatically.\nUsed for viewing request status changes and other events.\nNote: In production, this should be restricted to service role or specific permissions.","operationId":"create_notification_notifications_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNotificationInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/notifications/{notification_id}":{"delete":{"tags":["Notifications"],"summary":"Delete Notification","description":"Delete a notification.","operationId":"delete_notification_notifications__notification_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cron/reverse-geocode":{"post":{"tags":["Cron"],"summary":"Cron Reverse Geocode","description":"Run one batch of reverse geocoding: buildings with lat/lon but empty resolved_area.\nRetry on failure, continue with next. Only process empty.\nOn Vercel (VERCEL=1) default batch_size=5 to stay under serverless timeout; else 20.\nCall from cron (e.g. every 5 min): curl -X POST \"http://localhost:8000/internal/cron/reverse-geocode?batch_size=20\"\nOptional: set CRON_SECRET and pass -H \"X-Cron-Secret: <secret>\".","operationId":"cron_reverse_geocode_internal_cron_reverse_geocode_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max buildings to process; default 5 on Vercel, 20 elsewhere","title":"Batch Size"},"description":"Max buildings to process; default 5 on Vercel, 20 elsewhere"},{"name":"X-Cron-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Cron"],"summary":"Cron Reverse Geocode Get","description":"Same as POST, for easy browser/debugging. GET so you can hit from browser or curl without -X POST.","operationId":"cron_reverse_geocode_get_internal_cron_reverse_geocode_get","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"title":"Batch Size"}},{"name":"X-Cron-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cron/local-intelligence":{"post":{"tags":["Cron"],"summary":"Cron Local Intelligence","description":"Generate cached building local intelligence from OSM/Overpass.\nKeep batches small: this endpoint calls an external public service and stores results.","operationId":"cron_local_intelligence_internal_cron_local_intelligence_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Batch Size"}},{"name":"radius_m","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":500,"default":1500,"title":"Radius M"}},{"name":"include_demo","in":"query","required":false,"schema":{"type":"boolean","description":"Include synthetic/demo buildings.","default":false,"title":"Include Demo"},"description":"Include synthetic/demo buildings."},{"name":"require_active_listing","in":"query","required":false,"schema":{"type":"boolean","description":"Only generate for buildings with an active listing.","default":true,"title":"Require Active Listing"},"description":"Only generate for buildings with an active listing."},{"name":"include_wiki","in":"query","required":false,"schema":{"type":"boolean","description":"Also allow published/claimed wiki buildings even without active listings.","default":true,"title":"Include Wiki"},"description":"Also allow published/claimed wiki buildings even without active listings."},{"name":"X-Cron-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Cron"],"summary":"Cron Local Intelligence Get","description":"GET variant for browser/debugging.","operationId":"cron_local_intelligence_get_internal_cron_local_intelligence_get","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Batch Size"}},{"name":"radius_m","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":500,"default":1500,"title":"Radius M"}},{"name":"include_demo","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Demo"}},{"name":"require_active_listing","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Require Active Listing"}},{"name":"include_wiki","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Wiki"}},{"name":"X-Cron-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cron-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buildings/{building_id}/media":{"get":{"tags":["Building Media"],"summary":"List Building Media","description":"List all media for a building (header + per unit-type), ordered by unit_type NULLS FIRST, sort_order.","operationId":"list_building_media_buildings__building_id__media_get","parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Building Media"],"summary":"Upload Building Media","description":"Upload a media file for a building. unit_type null = building header (sort_order 1);\nunit_type e.g. '2br_2ba' = unit-type image (sort_order 1-5, max 5 per type).","operationId":"upload_building_media_buildings__building_id__media_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_building_media_buildings__building_id__media_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buildings/{building_id}/media/{media_id}":{"delete":{"tags":["Building Media"],"summary":"Delete Building Media","description":"Delete a media row. Optionally remove object from Storage (path can be derived from image_url).","operationId":"delete_building_media_buildings__building_id__media__media_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buildings/local-intelligence/processed":{"get":{"tags":["Building Local Intelligence"],"summary":"Get Processed Local Intelligence","description":"List recently processed local intelligence rows for admin/QA views.","operationId":"get_processed_local_intelligence_buildings_local_intelligence_processed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/buildings/{building_id}/local-intelligence":{"get":{"tags":["Building Local Intelligence"],"summary":"Get Building Local Intelligence","description":"Return stored local intelligence for one building.\n\nBy default this is a cheap DB read. Passing generate=true will call Overpass\nif the row is missing/stale; cron should normally do that work ahead of time.","operationId":"get_building_local_intelligence_buildings__building_id__local_intelligence_get","parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}},{"name":"generate","in":"query","required":false,"schema":{"type":"boolean","description":"Generate if missing/stale. Intended for internal/admin use.","default":false,"title":"Generate"},"description":"Generate if missing/stale. Intended for internal/admin use."},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force regeneration from source.","default":false,"title":"Force"},"description":"Force regeneration from source."},{"name":"radius_m","in":"query","required":false,"schema":{"type":"integer","maximum":3000,"minimum":500,"default":1500,"title":"Radius M"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/v1/health":{"get":{"tags":["Public Agent Tools"],"summary":"Health","operationId":"health_api_public_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicToolHealth"}}}}}}},"/api/public/v1":{"get":{"tags":["Public Agent Tools"],"summary":"Public Tool Index","operationId":"public_tool_index_api_public_v1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicToolIndex"}}}}}}},"/api/public/v1/resolve-place":{"post":{"tags":["Public Agent Tools"],"summary":"Resolve Place","operationId":"resolve_place_api_public_v1_resolve_place_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePlaceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePlaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/v1/commute-score":{"post":{"tags":["Public Agent Tools"],"summary":"Commute Score","operationId":"commute_score_api_public_v1_commute_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommuteScoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommuteScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/v1/search-homes":{"post":{"tags":["Public Agent Tools"],"summary":"Search Homes","operationId":"search_homes_api_public_v1_search_homes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomesSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HomesSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/v1/recommend-homes":{"post":{"tags":["Public Agent Tools"],"summary":"Recommend Homes","operationId":"recommend_homes_api_public_v1_recommend_homes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendHomesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendHomesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/v1/buildings/{slug_or_id}":{"get":{"tags":["Public Agent Tools"],"summary":"Get Public Building","operationId":"get_public_building_api_public_v1_buildings__slug_or_id__get","parameters":[{"name":"slug_or_id","in":"path","required":true,"schema":{"type":"string","title":"Slug Or Id"}},{"name":"include_local_intelligence","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Local Intelligence"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBuildingProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/v2/summary/{listing_id}":{"get":{"tags":["Community Notes"],"summary":"Get Listing Notes Summary V2","operationId":"get_listing_notes_summary_v2_community_notes_v2_summary__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/v2/thread/{listing_id}":{"get":{"tags":["Community Notes"],"summary":"Get Listing Notes Thread V2","operationId":"get_listing_notes_thread_v2_community_notes_v2_thread__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"replies_limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":0,"default":2,"title":"Replies Limit"}},{"name":"cursor_created_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Created At"}},{"name":"cursor_note_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/v2/replies/{note_id}":{"get":{"tags":["Community Notes"],"summary":"Get Note Replies V2","operationId":"get_note_replies_v2_community_notes_v2_replies__note_id__get","parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"cursor_created_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Created At"}},{"name":"cursor_reply_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Reply Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/v2/notes":{"post":{"tags":["Community Notes"],"summary":"Create Note V2","operationId":"create_note_v2_community_notes_v2_notes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNoteV2Input"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/community-notes/v2/replies":{"post":{"tags":["Community Notes"],"summary":"Create Reply V2","operationId":"create_reply_v2_community_notes_v2_replies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReplyV2Input"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/community-notes/v2/notes/{note_id}":{"delete":{"tags":["Community Notes"],"summary":"Delete Note V2","operationId":"delete_note_v2_community_notes_v2_notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"X-Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/v2/replies/{reply_id}":{"delete":{"tags":["Community Notes"],"summary":"Delete Reply V2","operationId":"delete_reply_v2_community_notes_v2_replies__reply_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reply_id","in":"path","required":true,"schema":{"type":"string","title":"Reply Id"}},{"name":"X-Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Idempotency-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/listings/{listing_id}":{"get":{"tags":["Community Notes"],"summary":"Get Listing Notes","description":"Fetch visible community notes + 1-level replies for a listing.\nPublic read: only status='visible' rows are returned (RLS can also enforce this).","operationId":"get_listing_notes_community_notes_listings__listing_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Community Notes"],"summary":"Create Note","description":"Create a visible community note on an active listing.","operationId":"create_note_community_notes_listings__listing_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNoteInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/note-replies/{note_id}":{"post":{"tags":["Community Notes"],"summary":"Create Reply","description":"Create a visible reply on an active listing.","operationId":"create_reply_community_notes_note_replies__note_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReplyInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/notes/{note_id}":{"delete":{"tags":["Community Notes"],"summary":"Delete Note","description":"Soft-delete own note. We keep the row so replies can remain attached.","operationId":"delete_note_community_notes_notes__note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/replies/{reply_id}":{"delete":{"tags":["Community Notes"],"summary":"Delete Reply","description":"Soft-delete own reply.","operationId":"delete_reply_community_notes_replies__reply_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reply_id","in":"path","required":true,"schema":{"type":"string","title":"Reply Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/community-notes/reports":{"post":{"tags":["Community Notes"],"summary":"Create Report","description":"Internal report submission for moderation (users never see report records).","operationId":"create_report_community_notes_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/analytics/impression/{listing_id}":{"post":{"tags":["Analytics"],"summary":"Record Impression","description":"Record a view/impression for a listing.\nThis endpoint is designed to be fast and returns immediately,\nprocessing the DB write in the background.","operationId":"record_impression_analytics_impression__listing_id__post","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analytics/client-performance":{"post":{"tags":["Analytics"],"summary":"Ingest Client Performance","description":"Lightweight ingestion endpoint for client-side perf diagnostics.\nIntended for dev/staging QA visibility; ignored in production.","operationId":"ingest_client_performance_analytics_client_performance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientPerformanceMetric"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/waitlist/join":{"post":{"tags":["Waitlist"],"summary":"Join Waitlist","description":"Add email to waitlist. Returns queue position.\nIf email already exists, returns existing position.","operationId":"join_waitlist_waitlist_join_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistEntry"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/waitlist/stats":{"get":{"tags":["Waitlist"],"summary":"Get Waitlist Stats","description":"Get waitlist statistics. Useful for admin dashboard.","operationId":"get_waitlist_stats_waitlist_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/system-settings/{key}":{"get":{"tags":["System Settings"],"summary":"Get Setting","operationId":"get_setting_system_settings__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["System Settings"],"summary":"Update Setting","operationId":"update_setting_system_settings__key__post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"X-Admin-Secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/community-reports":{"get":{"tags":["Admin"],"summary":"Get Community Reports","description":"Internal: fetch community report queue (minimal view).","operationId":"get_community_reports_admin_community_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/community-reports/{report_id}/resolve":{"post":{"tags":["Admin"],"summary":"Resolve Community Report","description":"Internal: resolve a report with binary action_taken.\n- action_taken=true:\n  - note/reply => hide target\n  - listing/building => auto-delist listing(s) (MVP: building delists listings under building)\n- action_taken=false:\n  - no content changes\nAlways notifies the reporter with binary outcome.","operationId":"resolve_community_report_admin_community_reports__report_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveCommunityReportInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/owners/pending":{"get":{"tags":["Admin"],"summary":"Get Pending Owners","description":"List all owners with verification_status = 'pending' using optimized RPC.","operationId":"get_pending_owners_admin_owners_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/owners/verified":{"get":{"tags":["Admin"],"summary":"Get Verified Owners","description":"List all verified owners using optimized RPC.","operationId":"get_verified_owners_admin_owners_verified_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/owners/{owner_id}/verify":{"post":{"tags":["Admin"],"summary":"Verify Owner","description":"Verify an account: set verification_status = 'verified', verified_listing_party, verified_at = NOW().","operationId":"verify_owner_admin_owners__owner_id__verify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyOwnerBody","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/owners/{owner_id}/reject":{"post":{"tags":["Admin"],"summary":"Reject Owner","description":"Reject an owner verification request.","operationId":"reject_owner_admin_owners__owner_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/owners/{owner_id}/revoke":{"post":{"tags":["Admin"],"summary":"Revoke Owner","description":"Revoke a verified owner — resets to 'pending'.","operationId":"revoke_owner_admin_owners__owner_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/buildings/pending":{"get":{"tags":["Admin"],"summary":"Get Pending Buildings","description":"List all buildings with verification_status = 'pending' using optimized RPC.","operationId":"get_pending_buildings_admin_buildings_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/buildings/verified":{"get":{"tags":["Admin"],"summary":"Get Verified Buildings","description":"List all verified buildings using optimized RPC.","operationId":"get_verified_buildings_admin_buildings_verified_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/buildings/{building_id}/verify":{"post":{"tags":["Admin"],"summary":"Verify Building","description":"Verify a building: set verification_status = 'verified', verified_at = NOW().","operationId":"verify_building_admin_buildings__building_id__verify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/buildings/{building_id}/reject":{"post":{"tags":["Admin"],"summary":"Reject Building","description":"Reject a building verification request.","operationId":"reject_building_admin_buildings__building_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/buildings/{building_id}/revoke":{"post":{"tags":["Admin"],"summary":"Revoke Building","description":"Revoke a verified building — resets to 'pending'.","operationId":"revoke_building_admin_buildings__building_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"building_id","in":"path","required":true,"schema":{"type":"string","title":"Building Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/v2/local/{user_id}":{"get":{"tags":["Recommendations V2"],"summary":"Get Recommendations Sql","description":"Get personalized recommendations with SQL-based commute scoring and pagination.\n\n**Performance:** 10-100x faster than Python implementation\n\n**Pagination:**\n- First page: Don't provide cursor parameters\n- Next pages: Use `next_cursor_score` and `next_cursor_id` from previous response\n\n**Example:**\n```\n# First page\nGET /recommendations/v2/local/{user_id}?page_size=20\n\n# Next page (use cursors from response)\nGET /recommendations/v2/local/{user_id}?page_size=20&cursor_score=8.5&cursor_id=abc-123\n```","operationId":"get_recommendations_sql_recommendations_v2_local__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Page Size"},"description":"Items per page"},{"name":"cursor_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Last commute score from previous page","title":"Cursor Score"},"description":"Last commute score from previous page"},{"name":"cursor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last listing ID from previous page","title":"Cursor Id"},"description":"Last listing ID from previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/recommendations/v2/local/{user_id}/simple":{"get":{"tags":["Recommendations V2"],"summary":"Get Recommendations Sql Simple","description":"Get personalized recommendations with SQL-based commute scoring (no pagination).\n\n**Performance:** 10-100x faster than Python implementation\n\nUse this endpoint if you don't need pagination (simpler response).","operationId":"get_recommendations_sql_simple_recommendations_v2_local__user_id__simple_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results","default":20,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["Root"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ActivityCreate":{"properties":{"activity_type":{"type":"string","maxLength":50,"title":"Activity Type","description":"Type of activity"},"place_name":{"type":"string","maxLength":100,"title":"Place Name","description":"Place name"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat","description":"Latitude between -90 and 90"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Longitude between -180 and 180"},"frequency":{"type":"string","title":"Frequency","description":"Frequency: daily, weekly, monthly, occasional"}},"type":"object","required":["activity_type","place_name","lat","lon","frequency"],"title":"ActivityCreate","description":"Activity model for onboarding"},"ActivityUpdate":{"properties":{"activity_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Activity Type","description":"Type of activity"},"place_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Place Name","description":"Place name"},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat","description":"Latitude between -90 and 90"},"lon":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lon","description":"Longitude between -180 and 180"},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency","description":"Frequency: daily, weekly, monthly, occasional"}},"type":"object","title":"ActivityUpdate","description":"Activity update model"},"Body_upload_building_media_buildings__building_id__media_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"unit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type"},"unit_type_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type Key"},"sort_order":{"type":"integer","title":"Sort Order","default":1}},"type":"object","required":["file"],"title":"Body_upload_building_media_buildings__building_id__media_post"},"CancelForDelistedUnitInput":{"properties":{"listing_id":{"type":"string","title":"Listing Id"}},"type":"object","required":["listing_id"],"title":"CancelForDelistedUnitInput"},"CancelViewingRequestInput":{"properties":{"cancellation_reason":{"type":"string","title":"Cancellation Reason","default":"hunter_cancelled"}},"type":"object","title":"CancelViewingRequestInput"},"ClientPerformanceMetric":{"properties":{"page":{"type":"string","title":"Page"},"listingId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listingid"},"status":{"type":"string","title":"Status"},"authMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Authms"},"requestMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requestms"},"totalMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Totalms"},"httpStatus":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Httpstatus"},"timeoutMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeoutms"},"hasAuthHeader":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hasauthheader"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["page","status"],"title":"ClientPerformanceMetric"},"CommuteScoreRequest":{"properties":{"origin":{"$ref":"#/components/schemas/CoordinateInput"},"destinations":{"items":{"$ref":"#/components/schemas/DestinationInput"},"type":"array","maxItems":5,"minItems":1,"title":"Destinations"}},"type":"object","required":["origin","destinations"],"title":"CommuteScoreRequest"},"CommuteScoreResponse":{"properties":{"origin":{"$ref":"#/components/schemas/CoordinateInput"},"score":{"type":"number","title":"Score"},"distances":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Distances"},"method":{"type":"string","title":"Method"}},"type":"object","required":["origin","score","distances","method"],"title":"CommuteScoreResponse"},"ConfirmViewingRequestInput":{"properties":{"confirmed_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed Date"},"confirmed_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed Time"},"owner_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Notes"}},"type":"object","title":"ConfirmViewingRequestInput"},"CoordinateInput":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Name"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon"}},"type":"object","required":["lat","lon"],"title":"CoordinateInput"},"CreateNoteInput":{"properties":{"body":{"type":"string","maxLength":1000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CreateNoteInput"},"CreateNoteV2Input":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"body":{"type":"string","maxLength":1000,"minLength":1,"title":"Body"},"idempotency_key":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Idempotency Key"}},"type":"object","required":["listing_id","body"],"title":"CreateNoteV2Input"},"CreateNotificationInput":{"properties":{"user_id":{"type":"string","title":"User Id"},"notification_type":{"type":"string","title":"Notification Type"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"concierge_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concierge Message"},"building_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Id"},"listing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Id"},"viewing_request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewing Request Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["user_id","notification_type","title","message"],"title":"CreateNotificationInput","description":"For creating notifications programmatically (e.g., from viewing request flows)"},"CreateReplyInput":{"properties":{"body":{"type":"string","maxLength":1000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"CreateReplyInput"},"CreateReplyV2Input":{"properties":{"note_id":{"type":"string","title":"Note Id"},"body":{"type":"string","maxLength":1000,"minLength":1,"title":"Body"},"idempotency_key":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Idempotency Key"}},"type":"object","required":["note_id","body"],"title":"CreateReplyV2Input"},"CreateViewingRequestInput":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"preferred_date":{"type":"string","title":"Preferred Date"},"preferred_time":{"type":"string","title":"Preferred Time"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["listing_id","preferred_date","preferred_time"],"title":"CreateViewingRequestInput"},"DestinationInput":{"properties":{"activity_type":{"type":"string","maxLength":80,"minLength":1,"title":"Activity Type","default":"destination"},"place_name":{"type":"string","maxLength":160,"minLength":1,"title":"Place Name"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon"},"frequency":{"type":"string","enum":["daily","weekly","monthly","occasional"],"title":"Frequency","default":"daily"},"priority":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Priority","default":5}},"type":"object","required":["place_name","lat","lon"],"title":"DestinationInput"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HomesSearchRequest":{"properties":{"area":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Area"},"bedrooms":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"min_price_ksh":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Price Ksh"},"max_price_ksh":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Price Ksh"},"limit":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Limit","default":10}},"type":"object","title":"HomesSearchRequest"},"HomesSearchResponse":{"properties":{"query":{"additionalProperties":true,"type":"object","title":"Query"},"results":{"items":{"$ref":"#/components/schemas/PublicHomeResult"},"type":"array","title":"Results"},"fallback_results":{"items":{"$ref":"#/components/schemas/PublicHomeResult"},"type":"array","title":"Fallback Results"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"suggestions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Suggestions"}},"type":"object","required":["query","results","summary"],"title":"HomesSearchResponse"},"LocationWithCoords":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"Location name"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat","description":"Latitude between -90 and 90"},"lon":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lon","description":"Longitude between -180 and 180"}},"type":"object","required":["name","lat","lon"],"title":"LocationWithCoords","description":"Location with coordinates for precise searching"},"OnboardingComplete":{"properties":{"completed":{"type":"boolean","title":"Completed","default":true}},"type":"object","title":"OnboardingComplete","description":"Mark onboarding as complete"},"OwnerProfileUpdate":{"properties":{"phone_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone Number","description":"Phone number (max 20 chars)"},"whatsapp_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Whatsapp Number","description":"WhatsApp number (max 20 chars)"},"national_id":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"National Id","description":"National ID (max 20 chars)"},"declared_listing_party":{"anyOf":[{"type":"string","enum":["owner","representative"]},{"type":"null"}],"title":"Declared Listing Party","description":"Whether this account lists as the property owner or as a listing representative"},"owner_attest_legal_authority":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Owner Attest Legal Authority","description":"Required when declaring owner until attestation is on file: user is owner or authorised lessor"},"owner_attest_accuracy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Owner Attest Accuracy","description":"Required when declaring owner until attestation is on file: information is truthful"}},"type":"object","title":"OwnerProfileUpdate"},"PlaceMatch":{"properties":{"name":{"type":"string","title":"Name"},"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence"},"source":{"type":"string","title":"Source"}},"type":"object","required":["name","lat","lon","confidence","source"],"title":"PlaceMatch"},"PreferencesCreate":{"properties":{"budget_min":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Budget Min","description":"Minimum budget (0-10M)"},"budget_max":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Budget Max","description":"Maximum budget (0-10M)"},"preferred_locations":{"items":{"$ref":"#/components/schemas/LocationWithCoords"},"type":"array","maxItems":10,"minItems":1,"title":"Preferred Locations","description":"1-10 preferred locations"},"bedrooms":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Bedrooms","description":"Number of bedrooms (0-10)"},"property_type":{"type":"string","maxLength":50,"title":"Property Type","description":"Type of property"},"furnished":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Furnished","description":"Furnished status"},"pets_allowed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pets Allowed","description":"Pets allowed"},"parking_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Parking Required","description":"Parking required"}},"type":"object","required":["budget_min","budget_max","preferred_locations","bedrooms","property_type"],"title":"PreferencesCreate","description":"Full preferences model for onboarding - NEW FORMAT with coordinates"},"PreferencesUpdate":{"properties":{"budget_min":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Budget Min","description":"Minimum budget (0-10M)"},"budget_max":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Budget Max","description":"Maximum budget (0-10M)"},"bedrooms":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Bedrooms","description":"Number of bedrooms (0-10)"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type","description":"Type of property"},"preferred_locations":{"anyOf":[{"items":{"$ref":"#/components/schemas/LocationWithCoords"},"type":"array","maxItems":10},{"type":"null"}],"title":"Preferred Locations","description":"Up to 10 preferred locations"},"preferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preferences","description":"Nested preferences object"}},"type":"object","title":"PreferencesUpdate"},"PublicBuildingProfileResponse":{"properties":{"building":{"$ref":"#/components/schemas/PublicHomeResult"},"units":{"items":{"$ref":"#/components/schemas/UnitSummaryItem"},"type":"array","title":"Units"},"local_intelligence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Local Intelligence"}},"type":"object","required":["building"],"title":"PublicBuildingProfileResponse"},"PublicHomeResult":{"properties":{"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank"},"result_type":{"type":"string","enum":["wiki_building","live_listing"],"title":"Result Type"},"availability":{"type":"string","enum":["knowledge_base","available_now","unknown","unavailable"],"title":"Availability"},"building_id":{"type":"string","title":"Building Id"},"building_name":{"type":"string","title":"Building Name"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"building_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Type"},"building_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Building Description"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"rent_signal":{"$ref":"#/components/schemas/RentSignal"},"unit_summary":{"items":{"$ref":"#/components/schemas/UnitSummaryItem"},"type":"array","title":"Unit Summary"},"verification":{"$ref":"#/components/schemas/VerificationSummary"},"url":{"type":"string","title":"Url"},"listing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Id"},"unit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Id"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"rent_ksh":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rent Ksh"},"commute_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Commute Score"},"distance_to_destination_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance To Destination Km"}},"type":"object","required":["result_type","availability","building_id","building_name","rent_signal","verification","url"],"title":"PublicHomeResult"},"PublicToolHealth":{"properties":{"status":{"type":"string","const":"ok","title":"Status"},"version":{"type":"string","title":"Version"},"mode":{"type":"string","title":"Mode"}},"type":"object","required":["status","version","mode"],"title":"PublicToolHealth"},"PublicToolIndex":{"properties":{"name":{"type":"string","title":"Name"},"version":{"type":"string","title":"Version"},"mode":{"type":"string","title":"Mode"},"docs_url":{"type":"string","title":"Docs Url"},"tools":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tools"},"semantics":{"additionalProperties":{"type":"string"},"type":"object","title":"Semantics"}},"type":"object","required":["name","version","mode","docs_url","tools","semantics"],"title":"PublicToolIndex"},"RecommendHomesRequest":{"properties":{"area":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Area"},"bedrooms":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Bedrooms"},"min_price_ksh":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Price Ksh"},"max_price_ksh":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Price Ksh"},"limit":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Limit","default":10},"destination":{"type":"string","maxLength":120,"minLength":1,"title":"Destination"},"destination_frequency":{"type":"string","enum":["daily","weekly","monthly","occasional"],"title":"Destination Frequency","default":"daily"},"destination_priority":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Destination Priority","default":5}},"type":"object","required":["destination"],"title":"RecommendHomesRequest"},"RecommendHomesResponse":{"properties":{"query":{"additionalProperties":true,"type":"object","title":"Query"},"destination":{"$ref":"#/components/schemas/PlaceMatch"},"results":{"items":{"$ref":"#/components/schemas/PublicHomeResult"},"type":"array","title":"Results"},"fallback_results":{"items":{"$ref":"#/components/schemas/PublicHomeResult"},"type":"array","title":"Fallback Results"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"suggestions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Suggestions"}},"type":"object","required":["query","destination","results","summary"],"title":"RecommendHomesResponse"},"RejectViewingRequestInput":{"properties":{"owner_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Notes"}},"type":"object","title":"RejectViewingRequestInput"},"RentSignal":{"properties":{"status":{"type":"string","title":"Status"},"from_price_ksh":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"From Price Ksh"},"price_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Text"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["status"],"title":"RentSignal"},"ReportInput":{"properties":{"target_type":{"type":"string","enum":["listing","note","reply","building"],"title":"Target Type"},"target_id":{"type":"string","title":"Target Id"},"reason":{"type":"string","maxLength":80,"minLength":2,"title":"Reason"},"reason_other_text":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Reason Other Text"},"details":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Details"}},"type":"object","required":["target_type","target_id","reason"],"title":"ReportInput"},"ResolveCommunityReportInput":{"properties":{"action_taken":{"type":"boolean","title":"Action Taken"}},"type":"object","required":["action_taken"],"title":"ResolveCommunityReportInput","description":"MVP moderation closure:\n- action_taken=true  => hide/remove target content (or auto-delist listing)\n- action_taken=false => dismiss report (no visibility changes)"},"ResolvePlaceRequest":{"properties":{"query":{"type":"string","maxLength":120,"minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Limit","default":5}},"type":"object","required":["query"],"title":"ResolvePlaceRequest"},"ResolvePlaceResponse":{"properties":{"query":{"type":"string","title":"Query"},"matches":{"items":{"$ref":"#/components/schemas/PlaceMatch"},"type":"array","title":"Matches"}},"type":"object","required":["query","matches"],"title":"ResolvePlaceResponse"},"SystemSettingUpdate":{"properties":{"value":{"additionalProperties":true,"type":"object","title":"Value"}},"type":"object","required":["value"],"title":"SystemSettingUpdate"},"UnitSummaryItem":{"properties":{"label":{"type":"string","title":"Label"},"price_ksh":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Ksh"},"status":{"type":"string","title":"Status"},"unit_type_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type Key"}},"type":"object","required":["label","status"],"title":"UnitSummaryItem"},"UserProfileUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"First Name","description":"First name (max 50 chars)"},"last_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Last Name","description":"Last name (max 50 chars)"},"phone_number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone Number","description":"Phone number (max 20 chars)"},"age":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":18.0},{"type":"null"}],"title":"Age","description":"Age must be between 18 and 120"},"occupation":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Occupation","description":"Occupation (max 100 chars)"}},"type":"object","title":"UserProfileUpdate"},"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"},"VerificationSummary":{"properties":{"wiki_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wiki Status"},"building_verified":{"type":"boolean","title":"Building Verified","default":false}},"type":"object","title":"VerificationSummary"},"VerifyOwnerBody":{"properties":{"verified_listing_party":{"anyOf":[{"type":"string","enum":["owner","representative"]},{"type":"null"}],"title":"Verified Listing Party"}},"type":"object","title":"VerifyOwnerBody","description":"Optional override when the verified role differs from what they declared at KYC."},"WaitlistEntry":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"user_type":{"type":"string","enum":["hunter","lister"],"title":"User Type"}},"type":"object","required":["email","user_type"],"title":"WaitlistEntry"},"WaitlistResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"position":{"type":"integer","title":"Position"}},"type":"object","required":["success","message","position"],"title":"WaitlistResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}