{"openapi":"3.1.0","info":{"title":"CariKostKita API","description":"FastAPI backend CariKostKita. Menyediakan Supabase Auth adapter, konfigurasi publik landing, katalog kost, favorit, dan validasi access token. Fitur domain lain belum tersedia sampai tercantum di OpenAPI.","version":"0.3.0"},"paths":{"/api/v1/kost":{"get":{"tags":["kost"],"summary":"List Public Kost","description":"Return approved, active listings with bounded pagination and advanced filters.","operationId":"list_public_kost_api_v1_kost_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"provinsi","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Provinsi"}},{"name":"kota","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Kota"}},{"name":"kecamatan","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Kecamatan"}},{"name":"tipe_kost","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Tipe Kost"}},{"name":"harga_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Harga Min"}},{"name":"harga_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Harga Max"}},{"name":"fasilitas","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Fasilitas"}},{"name":"hanya_tersedia","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hanya Tersedia"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"default":"TERBARU","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Kost Api V1 Kost Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/kost/{kost_id}":{"get":{"tags":["kost"],"summary":"Read Public Kost","description":"Return one approved listing; pending/rejected listings remain private.","operationId":"read_public_kost_api_v1_kost__kost_id__get","parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Public Kost Api V1 Kost  Kost Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/kost/{kost_id}/rooms":{"get":{"tags":["kost"],"summary":"List Public Kost Rooms","description":"Return room inventory for one approved listing.","operationId":"list_public_kost_rooms_api_v1_kost__kost_id__rooms_get","parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Kost Rooms Api V1 Kost  Kost Id  Rooms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/avatar":{"post":{"tags":["storage"],"summary":"Upload My Avatar","description":"Upload a JPEG into the authenticated user's own public-image folder.","operationId":"upload_my_avatar_api_v1_me_avatar_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upload My Avatar Api V1 Me Avatar Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/favorites":{"get":{"tags":["favorites"],"summary":"List Favorites","description":"List only the signed-in user's favorites, with RLS still enforced.","operationId":"list_favorites_api_v1_favorites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Favorites Api V1 Favorites Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/favorites/availability":{"get":{"tags":["favorites"],"summary":"List Favorite Availability","description":"Return availability only for this user's favorites and RLS-visible kosts.","operationId":"list_favorite_availability_api_v1_favorites_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Favorite Availability Api V1 Favorites Availability Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/favorites/{kost_id}":{"post":{"tags":["favorites"],"summary":"Add Favorite","description":"Favorite an approved listing; user_id is never accepted from the body.","operationId":"add_favorite_api_v1_favorites__kost_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Favorite Api V1 Favorites  Kost Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["favorites"],"summary":"Read Favorite","description":"Check one favorite without accepting a caller-supplied user ID.","operationId":"read_favorite_api_v1_favorites__kost_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Favorite Api V1 Favorites  Kost Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["favorites"],"summary":"Remove Favorite","description":"Remove a favorite only within the verified user's namespace.","operationId":"remove_favorite_api_v1_favorites__kost_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Remove Favorite Api V1 Favorites  Kost Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chats":{"get":{"tags":["chats"],"summary":"List Chats","description":"List only conversations visible to the caller under database RLS.","operationId":"list_chats_api_v1_chats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Kost Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Chats Api V1 Chats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["chats"],"summary":"Create Chat","description":"Start or reuse a conversation as a seeker; owner identity comes from the kost row.","operationId":"create_chat_api_v1_chats_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChatRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Chat Api V1 Chats Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chats/{chat_id}":{"get":{"tags":["chats"],"summary":"Read Chat","description":"Read a conversation; RLS decides participation, never a client user ID.","operationId":"read_chat_api_v1_chats__chat_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Chat Api V1 Chats  Chat Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chats/{chat_id}/messages":{"get":{"tags":["chats"],"summary":"List Chat Messages","description":"Page messages in chronological order, bounded by participant RLS.","operationId":"list_chat_messages_api_v1_chats__chat_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Chat Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Chat Messages Api V1 Chats  Chat Id  Messages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["chats"],"summary":"Send Chat Message","description":"Send a message as the authenticated participant; sender_id is server-derived.","operationId":"send_chat_message_api_v1_chats__chat_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Chat Message Api V1 Chats  Chat Id  Messages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chats/{chat_id}/read":{"patch":{"tags":["chats"],"summary":"Mark Chat Read","description":"Mark only the other participant's messages as read; never accepts a user ID.","operationId":"mark_chat_read_api_v1_chats__chat_id__read_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Mark Chat Read Api V1 Chats  Chat Id  Read Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","operationId":"signup_api_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupCredentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshCredentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google":{"post":{"tags":["auth"],"summary":"Google Token","operationId":"google_token_api_v1_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleToken"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/authorize":{"get":{"tags":["auth"],"summary":"Authorize Google","operationId":"authorize_google_api_v1_auth_authorize_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"google","title":"Provider"}},{"name":"redirect_to","in":"query","required":false,"schema":{"type":"string","maxLength":256,"default":"carikostkita://login-callback","title":"Redirect To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/recover":{"post":{"tags":["auth"],"summary":"Recover Password","operationId":"recover_password_api_v1_auth_recover_post","parameters":[{"name":"redirect_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Redirect To"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/user":{"get":{"tags":["auth"],"summary":"Get Auth User","operationId":"get_auth_user_api_v1_auth_user_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/password":{"put":{"tags":["auth"],"summary":"Update Password","operationId":"update_password_api_v1_auth_password_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Request"}}},"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":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/me/activity-logs":{"post":{"tags":["activity-logs"],"summary":"Create My Activity Log","description":"Append a log owned by the authenticated actor; caller cannot supply user_id.","operationId":"create_my_activity_log_api_v1_me_activity_logs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityLogCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Create My Activity Log Api V1 Me Activity Logs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/activity-logs":{"get":{"tags":["admin-activity-logs"],"summary":"List Admin Activity Logs","description":"Read recent staff-visible logs; the caller's JWT and table RLS both apply.","operationId":"list_admin_activity_logs_api_v1_admin_activity_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Activity Logs Api V1 Admin Activity Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events":{"post":{"tags":["analytics"],"summary":"Record Product Event","description":"Record a bounded event; clients cannot assign a user ID or event timestamp.","operationId":"record_product_event_api_v1_analytics_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductEvent"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Record Product Event Api V1 Analytics Events Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/me/crash-reports":{"post":{"tags":["crash-reports"],"summary":"Submit Crash Report","description":"Store a bounded crash report; client-supplied actor IDs are never accepted.","operationId":"submit_crash_report_api_v1_me_crash_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrashReportInput"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Submit Crash Report Api V1 Me Crash Reports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/auth/login":{"post":{"tags":["admin-auth"],"summary":"Admin Login","operationId":"admin_login_api_v1_admin_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credentials"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/auth/user":{"get":{"tags":["admin-auth"],"summary":"Read Admin User","operationId":"read_admin_user_api_v1_admin_auth_user_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Admin User Api V1 Admin Auth User Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/auth/password":{"post":{"tags":["admin-auth"],"summary":"Change Admin Password","description":"Verify the current credential, then update the authenticated Supabase user.","operationId":"change_admin_password_api_v1_admin_auth_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPasswordChange"}}},"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":[]}]}},"/api/v1/admin/auth/logout":{"post":{"tags":["admin-auth"],"summary":"Admin Logout","operationId":"admin_logout_api_v1_admin_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/auth/sessions/revoke-others":{"post":{"tags":["admin-auth"],"summary":"Revoke Other Admin Sessions","description":"Revoke refresh-token sessions on other devices without ending this one.","operationId":"revoke_other_admin_sessions_api_v1_admin_auth_sessions_revoke_others_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/analytics/funnel":{"get":{"tags":["admin-analytics"],"summary":"Read Admin Funnel","description":"Count allowlisted product events only within the caller's RLS visibility.","operationId":"read_admin_funnel_api_v1_admin_analytics_funnel_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Admin Funnel Api V1 Admin Analytics Funnel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/analytics/crashes":{"get":{"tags":["admin-analytics"],"summary":"Read Recent Crash Count","description":"Return an exact aggregate only; crash messages and stack traces stay private.","operationId":"read_recent_crash_count_api_v1_admin_analytics_crashes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Recent Crash Count Api V1 Admin Analytics Crashes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kosts":{"get":{"tags":["admin-kosts"],"summary":"List Admin Kosts","description":"List moderation records visible to the verified admin through Supabase RLS.","operationId":"list_admin_kosts_api_v1_admin_kosts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"verification_status","in":"query","required":false,"schema":{"anyOf":[{"enum":["PENDING","APPROVED","REJECTED","REVISION_REQUIRED"],"type":"string"},{"type":"null"}],"title":"Verification Status"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Kosts Api V1 Admin Kosts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kosts/{kost_id}":{"get":{"tags":["admin-kosts"],"summary":"Read Admin Kost","description":"Read one moderation record, bounded by both admin role and Supabase RLS.","operationId":"read_admin_kost_api_v1_admin_kosts__kost_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"string","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Admin Kost Api V1 Admin Kosts  Kost Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-kosts"],"summary":"Delete Admin Kost","description":"Delete a single kost listing and its dependent relations.","operationId":"delete_admin_kost_api_v1_admin_kosts__kost_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Admin Kost Api V1 Admin Kosts  Kost Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kosts/{kost_id}/status":{"patch":{"tags":["admin-kosts"],"summary":"Update Admin Kost Status","description":"Update listing availability or moderation verification status for active administrators/developers only.","operationId":"update_admin_kost_status_api_v1_admin_kosts__kost_id__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","title":"Kost Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminKostStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Update Admin Kost Status Api V1 Admin Kosts  Kost Id  Status Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kosts/bulk-verify":{"post":{"tags":["admin-kosts"],"summary":"Bulk Verify Admin Kosts","description":"Approve or reject multiple kost listings at once for active administrators/developers.","operationId":"bulk_verify_admin_kosts_api_v1_admin_kosts_bulk_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminKostBulkVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Verify Admin Kosts Api V1 Admin Kosts Bulk Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/kosts/bulk-delete":{"post":{"tags":["admin-kosts"],"summary":"Bulk Delete Admin Kosts","description":"Delete multiple kost listings and their dependent relations.","operationId":"bulk_delete_admin_kosts_api_v1_admin_kosts_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminKostBulkDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Delete Admin Kosts Api V1 Admin Kosts Bulk Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/kosts/import/template":{"get":{"tags":["admin-bulk-import"],"summary":"Download Import Template","description":"Download official spreadsheet template for bulk kost data import.","operationId":"download_import_template_api_v1_admin_kosts_import_template_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"enum":["xlsx","csv"],"type":"string","default":"xlsx","title":"Format"}},{"name":"delimiter","in":"query","required":false,"schema":{"enum":[";",","],"type":"string","default":";","title":"Delimiter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/kosts/import/preview":{"post":{"tags":["admin-bulk-import"],"summary":"Preview Bulk Import","description":"Validate and preview bulk import spreadsheet before committing to database.","operationId":"preview_bulk_import_api_v1_admin_kosts_import_preview_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_preview_bulk_import_api_v1_admin_kosts_import_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Bulk Import Api V1 Admin Kosts Import Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/kosts/import/commit":{"post":{"tags":["admin-bulk-import"],"summary":"Commit Bulk Import","description":"Execute validated bulk import into PostgreSQL database with audit logging.","operationId":"commit_bulk_import_api_v1_admin_kosts_import_commit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkImportCommitRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Commit Bulk Import Api V1 Admin Kosts Import Commit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/users":{"get":{"tags":["admin-users"],"summary":"List Admin Users","description":"List admin-visible users without accepting an identity or role from the client.","operationId":"list_admin_users_api_v1_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"enum":["user","owner","admin","moderator","developer"],"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"verification_status","in":"query","required":false,"schema":{"anyOf":[{"enum":["PENDING","APPROVED","REJECTED","REVISION_REQUIRED"],"type":"string"},{"type":"null"}],"title":"Verification Status"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Users Api V1 Admin Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["admin-users"],"summary":"Read Admin User","description":"Read one user record via the current administrator's JWT/RLS context.","operationId":"read_admin_user_api_v1_admin_users__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":{"type":"object","additionalProperties":true,"title":"Response Read Admin User Api V1 Admin Users  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin-users"],"summary":"Moderate Admin User","description":"Change one supported user field through an audited, identity-bound RPC.","operationId":"moderate_admin_user_api_v1_admin_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserModeration"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Moderate Admin User Api V1 Admin Users  User Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/overview":{"get":{"tags":["admin-overview"],"summary":"Read Admin Overview","description":"Return aggregate counts only; rows and authorization remain RLS-scoped.","operationId":"read_admin_overview_api_v1_admin_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Admin Overview Api V1 Admin Overview Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/ads":{"get":{"tags":["admin-ads"],"summary":"List Admin Ads","description":"Return only verified advertisement columns; authorization and rows obey RLS.","operationId":"list_admin_ads_api_v1_admin_ads_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Ads Api V1 Admin Ads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reports":{"get":{"tags":["admin-reports"],"summary":"List Admin Reports","description":"List a bounded moderation queue; admin role and table RLS both apply.","operationId":"list_admin_reports_api_v1_admin_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["BARU","DITINJAU","SELESAI","DITOLAK"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"kost_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Kost Id"}},{"name":"reporter_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Reporter Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Reports Api V1 Admin Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reports/pending-count":{"get":{"tags":["admin-reports"],"summary":"Read Pending Report Count","description":"Count actionable reports visible to this staff JWT through Supabase RLS.","operationId":"read_pending_report_count_api_v1_admin_reports_pending_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Pending Report Count Api V1 Admin Reports Pending Count Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/reports/{report_id}":{"patch":{"tags":["admin-reports"],"summary":"Review Admin Report","description":"Review via a transaction-scoped RPC; actor identity comes from the JWT.","operationId":"review_admin_report_api_v1_admin_reports__report_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Report Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportReview"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Review Admin Report Api V1 Admin Reports  Report Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/search":{"get":{"tags":["admin-search"],"summary":"Search Admin Records","description":"Search only records visible to the authenticated staff member under RLS.","operationId":"search_admin_records_api_v1_admin_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Admin Records Api V1 Admin Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/settings":{"get":{"tags":["admin-settings"],"summary":"Read System Settings","description":"Read platform configuration and release details.\n\nThe durable store is re-read on every call so the dashboard always shows\nthe database-confirmed state. When the store cannot be reached the request\nfails loudly instead of returning built-in defaults that would look like\nan empty CMS.","operationId":"read_system_settings_api_v1_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read System Settings Api V1 Admin Settings Get"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["admin-settings"],"summary":"Update System Settings","description":"Update platform configuration and latest release (Super Admin only).","operationId":"update_system_settings_api_v1_admin_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update System Settings Api V1 Admin Settings Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/public/settings":{"get":{"tags":["public"],"summary":"Read Full Public Settings","description":"Public platform configuration consumed dynamically by the landing page.","operationId":"read_full_public_settings_api_v1_public_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Full Public Settings Api V1 Public Settings Get"}}}}}}},"/api/v1/public/settings/version":{"get":{"tags":["public"],"summary":"Read Public Settings Version","description":"Lightweight revision pointer for realtime fallback version checks.\n\nClients with a live Supabase Realtime subscription never need to call this;\nit exists only so disconnected clients can detect a change with a tiny\npayload instead of refetching the full settings document.","operationId":"read_public_settings_version_api_v1_public_settings_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Public Settings Version Api V1 Public Settings Version Get"}}}}}}},"/api/v1/public/settings/realtime":{"get":{"tags":["public"],"summary":"Read Public Realtime Config","description":"Public Realtime wiring info (no secrets).\n\nReturns the channel/event names landing clients must subscribe to, the\ncurrent revision, and - when it can be proven to be browser-safe - the\n``anon`` Supabase credentials. Publishing the ``anon`` key here means the\nlanding page and the admin dashboard do not depend on build-time\n``NEXT_PUBLIC_SUPABASE_*`` variables being present, which is the single\nreason the realtime push path was previously dormant.\n\nA service-role key can never be returned: the role claim must be exactly\n``anon``.","operationId":"read_public_realtime_config_api_v1_public_settings_realtime_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Public Realtime Config Api V1 Public Settings Realtime Get"}}}}}}},"/api/v1/public/settings/ads":{"get":{"tags":["public"],"summary":"Read Public Ads","description":"Public advertisements / banners for website promotion.","operationId":"read_public_ads_api_v1_public_settings_ads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Public Ads Api V1 Public Settings Ads Get"}}}}}}},"/api/v1/me/profile":{"get":{"tags":["profile"],"summary":"Read My Profile","description":"Read only the caller's profile; Supabase RLS remains active.","operationId":"read_my_profile_api_v1_me_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read My Profile Api V1 Me Profile Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["profile"],"summary":"Provision My Profile","description":"Idempotently provision a missing profile without accepting identity or role claims.","operationId":"provision_my_profile_api_v1_me_profile_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Provision My Profile Api V1 Me Profile Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["profile"],"summary":"Update My Profile","description":"Update a strict allowlist on the caller's own profile only.","operationId":"update_my_profile_api_v1_me_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update My Profile Api V1 Me Profile Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reports":{"post":{"tags":["reports"],"summary":"Create Report","description":"Submit a report against an existing listing; reporter identity is server-derived.","operationId":"create_report_api_v1_reports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Report Api V1 Reports Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/me/blocks/{other_user_id}":{"get":{"tags":["user-blocks"],"summary":"Read Block Status","description":"Return both block directions for a participant-visible user pair.","operationId":"read_block_status_api_v1_me_blocks__other_user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"other_user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Other User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Read Block Status Api V1 Me Blocks  Other User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["user-blocks"],"summary":"Block User","description":"Create or reuse the caller's block relation; self/cross-user blocks are denied.","operationId":"block_user_api_v1_me_blocks__other_user_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"other_user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Other User Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Block User Api V1 Me Blocks  Other User Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["user-blocks"],"summary":"Unblock User","description":"Delete only the caller-owned block relation; the blocked user cannot undo it.","operationId":"unblock_user_api_v1_me_blocks__other_user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"other_user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Other User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Unblock User Api V1 Me Blocks  Other User Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/owners/{owner_id}":{"get":{"tags":["user-lookup"],"summary":"Read Public Owner","description":"Return a non-sensitive owner card only for an active approved listing.","operationId":"read_public_owner_api_v1_public_owners__owner_id__get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Public Owner Api V1 Public Owners  Owner Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/contacts/{user_id}":{"get":{"tags":["user-lookup"],"summary":"Read Chat Contact","description":"Read only a participant-visible profile; Supabase RLS enforces chat relation.","operationId":"read_chat_contact_api_v1_me_contacts__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Chat Contact Api V1 Me Contacts  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/user-reports/{chat_id}":{"post":{"tags":["user-reports"],"summary":"Create User Report","description":"Accept reports only from a chat participant; reporter identity is JWT-derived.","operationId":"create_user_report_api_v1_me_user_reports__chat_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReportCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Create User Report Api V1 Me User Reports  Chat Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/surveys":{"get":{"tags":["surveys"],"summary":"List Surveys","description":"List only rows RLS exposes to the verified caller; scope never accepts a user ID.","operationId":"list_surveys_api_v1_surveys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"enum":["seeker","owner","all"],"type":"string","default":"all","title":"Scope"}},{"name":"kost_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Kost Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Surveys Api V1 Surveys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["surveys"],"summary":"Create Survey","description":"Create a survey as the verified seeker; owner ID is read from the approved kost.","operationId":"create_survey_api_v1_surveys_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurveyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Survey Api V1 Surveys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/surveys/eligibility/{kost_id}":{"get":{"tags":["surveys"],"summary":"Survey Review Eligibility","description":"Return whether the authenticated seeker completed a survey for this kost.","operationId":"survey_review_eligibility_api_v1_surveys_eligibility__kost_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Survey Review Eligibility Api V1 Surveys Eligibility  Kost Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/surveys/{survey_id}":{"patch":{"tags":["surveys"],"summary":"Update Survey Status","description":"Update status only; database trigger validates participant-specific transitions.","operationId":"update_survey_status_api_v1_surveys__survey_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"survey_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Survey Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurveyStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Survey Status Api V1 Surveys  Survey Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/{kost_id}":{"get":{"tags":["reviews"],"summary":"List Public Reviews","description":"Read projected reviews only for an approved, active listing.","operationId":"list_public_reviews_api_v1_reviews__kost_id__get","parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Kost Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Public Reviews Api V1 Reviews  Kost Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["reviews"],"summary":"Submit Review","description":"Upsert a review through a fixed RPC; user ID and public name are server-derived.","operationId":"submit_review_api_v1_reviews__kost_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Kost Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSubmit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Review Api V1 Reviews  Kost Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/roommates":{"get":{"tags":["roommates"],"summary":"List Roommates","description":"List public roommate search posts with student criteria filters.","operationId":"list_roommates_api_v1_roommates_get","parameters":[{"name":"campus","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Campus"}},{"name":"gender","in":"query","required":false,"schema":{"anyOf":[{"enum":["PUTRA","PUTRI"],"type":"string"},{"type":"null"}],"title":"Gender"}},{"name":"max_budget","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":100000},{"type":"null"}],"title":"Max Budget"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Q"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Roommates Api V1 Roommates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["roommates"],"summary":"Create Roommate","description":"Create a new roommate search post.","operationId":"create_roommate_api_v1_roommates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoommatePostCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Roommate Api V1 Roommates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/roommates/{post_id}":{"get":{"tags":["roommates"],"summary":"Get Roommate","description":"Get detail of a single roommate post.","operationId":"get_roommate_api_v1_roommates__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Roommate Api V1 Roommates  Post Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/owner-verification":{"post":{"tags":["owner-verification"],"summary":"Submit Owner Verification","description":"Submit an owner application without accepting a user ID, role, or status.","operationId":"submit_owner_verification_api_v1_me_owner_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerVerificationSubmission"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Submit Owner Verification Api V1 Me Owner Verification Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/owner-verifications":{"get":{"tags":["admin-owner-verifications"],"summary":"List Owner Verifications","description":"List applications and safe owner identity fields through caller JWT/RLS.","operationId":"list_owner_verifications_api_v1_admin_owner_verifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["PENDING","APPROVED","REJECTED","REVISION_REQUIRED"],"type":"string"},{"type":"null"}],"default":"PENDING","title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Owner Verifications Api V1 Admin Owner Verifications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/owner-verifications/{application_id}":{"patch":{"tags":["admin-owner-verifications"],"summary":"Review Owner Verification","description":"Review one active application; user ID/role changes remain server-side.","operationId":"review_owner_verification_api_v1_admin_owner_verifications__application_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerVerificationReview"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Review Owner Verification Api V1 Admin Owner Verifications  Application Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/owner-kosts":{"get":{"tags":["owner-kosts"],"summary":"List My Owner Kosts","description":"List a bounded status projection for listings owned by the caller only.","operationId":"list_my_owner_kosts_api_v1_me_owner_kosts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":100,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List My Owner Kosts Api V1 Me Owner Kosts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/owner-kosts/{kost_id}/resubmit":{"post":{"tags":["owner-kosts"],"summary":"Resubmit My Kost","description":"Move only the caller's rejected/revision-requested kost back to review.","operationId":"resubmit_my_kost_api_v1_me_owner_kosts__kost_id__resubmit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","title":"Kost Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Resubmit My Kost Api V1 Me Owner Kosts  Kost Id  Resubmit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/owner-kosts/{kost_id}/status":{"patch":{"tags":["owner-kosts"],"summary":"Update My Kost Status","description":"Change availability only on a listing owned by the active owner.","operationId":"update_my_kost_status_api_v1_me_owner_kosts__kost_id__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kost_id","in":"path","required":true,"schema":{"type":"integer","title":"Kost Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerKostStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"boolean"},"title":"Response Update My Kost Status Api V1 Me Owner Kosts  Kost Id  Status Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/owner-stats/favorites":{"get":{"tags":["owner-stats"],"summary":"Read My Favorite Count","description":"Count favorites on listings owned by the caller; never accepts an owner ID.","operationId":"read_my_favorite_count_api_v1_me_owner_stats_favorites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read My Favorite Count Api V1 Me Owner Stats Favorites Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/me/unread-messages":{"get":{"tags":["notifications"],"summary":"Read My Unread Messages","description":"Count unread messages from other participants under caller JWT/RLS.","operationId":"read_my_unread_messages_api_v1_me_unread_messages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read My Unread Messages Api V1 Me Unread Messages Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/contract":{"get":{"tags":["contract"],"summary":"Read Contract","description":"Kontrak API publik beserta versinya saat ini.","operationId":"read_contract_api_v1_contract_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Contract Api V1 Contract Get"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Public liveness probe without database, storage, or configuration detail.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/ready":{"get":{"tags":["health"],"summary":"Ready","description":"Readiness probe distinguishing application health from database connectivity.","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ready Ready Get"}}}}}}},"/settings":{"get":{"tags":["public"],"summary":"Public Settings","description":"Public, non-sensitive settings consumed by the landing page.","operationId":"public_settings_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public Settings Settings Get"}}}}}}},"/latest-release":{"get":{"tags":["public"],"summary":"Latest Release","description":"Public APK download location consumed by the landing page.","operationId":"latest_release_latest_release_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Latest Release Latest Release Get"}}}}}}},"/api/v1/me":{"get":{"tags":["profile"],"summary":"Read Current User","description":"Return the identity verified by Supabase Auth Project A.","operationId":"read_current_user_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Current User Api V1 Me Get"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"ActivityLogCreate":{"properties":{"action_type":{"type":"string","maxLength":80,"minLength":1,"title":"Action Type"},"description":{"type":"string","maxLength":1000,"minLength":1,"title":"Description"},"target_type":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Target Type"},"target_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Target Id"},"actor_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Actor Name"}},"additionalProperties":false,"type":"object","required":["action_type","description"],"title":"ActivityLogCreate"},"AdminKostBulkDeleteRequest":{"properties":{"kost_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Kost Ids"},"delete_all":{"type":"boolean","title":"Delete All","default":false},"confirm":{"type":"boolean","title":"Confirm","default":false},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"AdminKostBulkDeleteRequest"},"AdminKostBulkVerifyRequest":{"properties":{"kost_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Kost Ids"},"verification_status":{"type":"string","enum":["PENDING","APPROVED","REJECTED","REVISION_REQUIRED"],"title":"Verification Status","default":"APPROVED"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"AdminKostBulkVerifyRequest"},"AdminKostStatusUpdate":{"properties":{"status":{"anyOf":[{"type":"string","enum":["TERSEDIA","PENUH"]},{"type":"null"}],"title":"Status"},"verification_status":{"anyOf":[{"type":"string","enum":["PENDING","APPROVED","REJECTED","REVISION_REQUIRED"]},{"type":"null"}],"title":"Verification Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"AdminKostStatusUpdate"},"AdminPasswordChange":{"properties":{"currentPassword":{"type":"string","maxLength":1024,"minLength":1,"title":"Currentpassword"},"newPassword":{"type":"string","maxLength":1024,"minLength":8,"title":"Newpassword"},"confirmPassword":{"type":"string","maxLength":1024,"minLength":1,"title":"Confirmpassword"}},"type":"object","required":["currentPassword","newPassword","confirmPassword"],"title":"AdminPasswordChange"},"Body_preview_bulk_import_api_v1_admin_kosts_import_preview_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_preview_bulk_import_api_v1_admin_kosts_import_preview_post"},"BulkImportCommitRequest":{"properties":{"batch_rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":1000,"minItems":1,"title":"Batch Rows"},"duplicate_action":{"type":"string","enum":["skip","update"],"title":"Duplicate Action","default":"skip"},"file_name":{"type":"string","maxLength":200,"title":"File Name","default":"import_data.csv"}},"type":"object","required":["batch_rows"],"title":"BulkImportCommitRequest"},"CrashReportInput":{"properties":{"app_version":{"type":"string","maxLength":100,"minLength":1,"title":"App Version"},"platform":{"type":"string","const":"android","title":"Platform"},"error_message":{"type":"string","maxLength":1000,"minLength":1,"title":"Error Message"},"stack_trace":{"type":"string","maxLength":20000,"minLength":1,"title":"Stack Trace"},"device_info":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object","maxProperties":3},{"type":"null"}],"title":"Device Info"}},"additionalProperties":false,"type":"object","required":["app_version","platform","error_message","stack_trace"],"title":"CrashReportInput"},"CreateChatRequest":{"properties":{"kost_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Kost Id"}},"additionalProperties":false,"type":"object","required":["kost_id"],"title":"CreateChatRequest"},"Credentials":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":1024,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"Credentials"},"GoogleToken":{"properties":{"provider":{"type":"string","title":"Provider","default":"google"},"id_token":{"type":"string","maxLength":8192,"minLength":1,"title":"Id Token"}},"type":"object","required":["id_token"],"title":"GoogleToken"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OwnerKostStatusUpdate":{"properties":{"status":{"type":"string","enum":["TERSEDIA","PENUH"],"title":"Status"}},"additionalProperties":false,"type":"object","required":["status"],"title":"OwnerKostStatusUpdate"},"OwnerVerificationReview":{"properties":{"status":{"type":"string","enum":["APPROVED","REJECTED","REVISION_REQUIRED"],"title":"Status"},"review_note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Review Note"}},"additionalProperties":false,"type":"object","required":["status"],"title":"OwnerVerificationReview"},"OwnerVerificationSubmission":{"properties":{"submission_note":{"type":"string","maxLength":4000,"minLength":1,"title":"Submission Note"}},"additionalProperties":false,"type":"object","required":["submission_note"],"title":"OwnerVerificationSubmission"},"PlatformSettingsUpdate":{"properties":{"app_name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"App Name"},"appName":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Appname"},"tagline":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Tagline"},"contact_whatsapp":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contact Whatsapp"},"whatsapp":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Whatsapp"},"apk_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Apk Url"},"apkUrl":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Apkurl"},"version_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Version Name"},"versionName":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Versionname"},"version_code":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Version Code"},"release_notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Release Notes"},"releaseNotes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Releasenotes"},"support_email":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Support Email"},"supportEmail":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Supportemail"},"contact_phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contact Phone"},"contactPhone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contactphone"},"office_address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Office Address"},"address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address"},"instagram":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Instagram"},"facebook":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Facebook"},"tiktok":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Tiktok"},"youtube":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Youtube"},"linkedin":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Linkedin"},"site_title":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Site Title"},"siteTitle":{"anyOf":[{"type":"string","maxLength":150},{"type":"null"}],"title":"Sitetitle"},"site_description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Site Description"},"siteDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Sitedescription"},"meta_keywords":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Meta Keywords"},"metaKeywords":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Metakeywords"},"target_city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Target City"},"targetCity":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Targetcity"},"apk_size":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Apk Size"},"apkSize":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Apksize"},"min_android":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Min Android"},"minAndroid":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Minandroid"},"hero_badge_1":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Hero Badge 1"},"heroBadge1":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Herobadge1"},"hero_badge_2":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Hero Badge 2"},"heroBadge2":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Herobadge2"},"banner_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Banner Active"},"bannerActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Banneractive"},"banner_text":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Banner Text"},"bannerText":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Bannertext"},"banner_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Banner Link"},"bannerLink":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Bannerlink"},"banner_type":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Banner Type"},"bannerType":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Bannertype"},"hero_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Image Url"},"heroImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroimageurl"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logourl"},"footer_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Logo Url"},"footerLogoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footerlogourl"},"app_icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Icon Url"},"appIconUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appiconurl"},"favicon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon Url"},"faviconUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Faviconurl"},"og_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image Url"},"ogImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ogimageurl"},"github_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Github Url"},"githubUrl":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Githuburl"},"brand_color":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Brand Color"},"brandColor":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Brandcolor"},"popup_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Popup Active"},"popupActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Popupactive"},"popup_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Title"},"popupTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popuptitle"},"popup_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Content"},"popupContent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popupcontent"},"popup_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Image Url"},"popupImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popupimageurl"},"popup_button_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Button Label"},"popupButtonLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popupbuttonlabel"},"popup_button_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popup Button Url"},"popupButtonUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Popupbuttonurl"},"nav_links":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Nav Links"},"navLinks":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Navlinks"},"trust_items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Trust Items"},"trustItems":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Trustitems"},"feature_items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Feature Items"},"featureItems":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Featureitems"},"install_steps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Install Steps"},"installSteps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Installsteps"},"owner_steps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Owner Steps"},"ownerSteps":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Ownersteps"},"faq_items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Faq Items"},"faqItems":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Faqitems"},"hero_headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Headline"},"heroHeadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroheadline"},"hero_subheadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Subheadline"},"heroSubheadline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Herosubheadline"},"hero_cta_primary_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Cta Primary Label"},"heroCtaPrimaryLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroctaprimarylabel"},"hero_cta_secondary_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Cta Secondary Label"},"heroCtaSecondaryLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroctasecondarylabel"},"hero_cta_secondary_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Cta Secondary Link"},"heroCtaSecondaryLink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroctasecondarylink"},"hero_ad_free_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Ad Free Text"},"heroAdFreeText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Heroadfreetext"},"hero_trust_badge_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Trust Badge 1"},"heroTrustBadge1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Herotrustbadge1"},"hero_trust_badge_2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Trust Badge 2"},"heroTrustBadge2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Herotrustbadge2"},"hero_trust_badge_3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Trust Badge 3"},"heroTrustBadge3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Herotrustbadge3"},"owner_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Title"},"ownerTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownertitle"},"owner_intro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Intro"},"ownerIntro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownerintro"},"owner_wa_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Wa Label"},"ownerWaLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownerwalabel"},"about_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About Title"},"aboutTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abouttitle"},"about_story":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About Story"},"aboutStory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aboutstory"},"feedback_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Feedback Active"},"feedbackActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Feedbackactive"},"feedback_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Title"},"feedbackTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedbacktitle"},"feedback_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Desc"},"feedbackDesc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedbackdesc"},"feedback_button_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Button Label"},"feedbackButtonLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedbackbuttonlabel"},"final_cta_eyebrow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Cta Eyebrow"},"finalCtaEyebrow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finalctaeyebrow"},"final_cta_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Cta Title"},"finalCtaTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finalctatitle"},"final_cta_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Cta Desc"},"finalCtaDesc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finalctadesc"},"final_cta_button_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Cta Button Label"},"finalCtaButtonLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finalctabuttonlabel"},"footer_tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Tagline"},"footerTagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footertagline"},"footer_copyright":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Copyright"},"footerCopyright":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footercopyright"},"security_modal_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Security Modal Active"},"securityModalActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Securitymodalactive"},"security_modal_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Modal Title"},"securityModalTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Securitymodaltitle"},"security_modal_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Modal Desc"},"securityModalDesc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Securitymodaldesc"},"security_modal_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Modal Note"},"securityModalNote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Securitymodalnote"},"legal_privacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Privacy"},"legalPrivacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legalprivacy"},"legal_terms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Terms"},"legalTerms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legalterms"}},"additionalProperties":true,"type":"object","title":"PlatformSettingsUpdate"},"ProductEvent":{"properties":{"event":{"type":"string","enum":["search","view_detail","chat_start","survey_request","favorite_add"],"title":"Event"},"kost_id":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Kost Id"}},"additionalProperties":false,"type":"object","required":["event"],"title":"ProductEvent"},"ProfileUpdate":{"properties":{"nama":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Nama"},"no_hp":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"No Hp"},"bio":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Bio"},"avatar_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Avatar Url"}},"additionalProperties":false,"type":"object","title":"ProfileUpdate","description":"Editable self-profile fields; identity, role, and account status are immutable here."},"RecoveryRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"RecoveryRequest"},"RefreshCredentials":{"properties":{"refresh_token":{"type":"string","maxLength":4096,"minLength":1,"title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshCredentials"},"ReportCreate":{"properties":{"kost_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Kost Id"},"reason":{"type":"string","maxLength":100,"minLength":1,"title":"Reason"},"description":{"type":"string","maxLength":4000,"minLength":1,"title":"Description"}},"additionalProperties":false,"type":"object","required":["kost_id","reason","description"],"title":"ReportCreate"},"ReportReview":{"properties":{"status":{"type":"string","enum":["DITINJAU","SELESAI","DITOLAK"],"title":"Status"},"admin_action":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Admin Action"}},"additionalProperties":false,"type":"object","required":["status"],"title":"ReportReview"},"ReviewSubmit":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating"},"komentar":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Komentar"}},"additionalProperties":false,"type":"object","required":["rating"],"title":"ReviewSubmit"},"RoommatePostCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":2,"title":"Name"},"campus":{"type":"string","maxLength":100,"minLength":2,"title":"Campus"},"faculty":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Faculty"},"gender":{"type":"string","enum":["PUTRA","PUTRI"],"title":"Gender"},"budget":{"type":"integer","maximum":10000000.0,"minimum":100000.0,"title":"Budget"},"target_area":{"type":"string","maxLength":150,"minLength":3,"title":"Target Area"},"room_type":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Room Type"},"description":{"type":"string","maxLength":1000,"minLength":10,"title":"Description"},"contact_whatsapp":{"type":"string","maxLength":20,"minLength":8,"title":"Contact Whatsapp"}},"additionalProperties":false,"type":"object","required":["name","campus","gender","budget","target_area","description","contact_whatsapp"],"title":"RoommatePostCreate"},"SendMessageRequest":{"properties":{"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"}},"additionalProperties":false,"type":"object","required":["message"],"title":"SendMessageRequest"},"SignupCredentials":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":1024,"minLength":1,"title":"Password"},"data":{"additionalProperties":{"type":"string"},"type":"object","title":"Data"}},"type":"object","required":["email","password"],"title":"SignupCredentials"},"SurveyCreate":{"properties":{"kost_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Kost Id"},"jadwal":{"type":"string","format":"date-time","title":"Jadwal"},"catatan":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Catatan"}},"additionalProperties":false,"type":"object","required":["kost_id","jadwal"],"title":"SurveyCreate"},"SurveyStatusUpdate":{"properties":{"status":{"type":"string","enum":["DIKONFIRMASI","DITOLAK","DIBATALKAN","SELESAI"],"title":"Status"},"alasan":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Alasan"}},"additionalProperties":false,"type":"object","required":["status"],"title":"SurveyStatusUpdate"},"UserModeration":{"properties":{"role":{"anyOf":[{"type":"string","enum":["user","moderator"]},{"type":"null"}],"title":"Role"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"reason":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"UserModeration"},"UserReportCreate":{"properties":{"reported_user_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Reported User Id"},"reason":{"type":"string","maxLength":200,"minLength":1,"title":"Reason"},"details":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Details"}},"additionalProperties":false,"type":"object","required":["reported_user_id","reason"],"title":"UserReportCreate"},"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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"health","description":"Pemeriksaan ketersediaan layanan."},{"name":"public","description":"Konfigurasi publik untuk Landing Page."},{"name":"auth","description":"Adapter autentikasi Supabase yang dibatasi ke operasi eksplisit."},{"name":"kost","description":"Katalog listing publik yang disetujui."},{"name":"favorites","description":"Favorit pengguna terikat token dan RLS."},{"name":"chats","description":"Kontrak baca chat; dinonaktifkan sampai Auth UUID terpetakan aman ke ID numerik aplikasi."},{"name":"admin-auth","description":"Login/session admin dengan role dari public.users."},{"name":"analytics","description":"Ingestion event produk; identitas pengguna diturunkan dari bearer token."},{"name":"crash-reports","description":"Ingestion crash Android terbatas dengan actor dari identity bridge."},{"name":"admin-kosts","description":"Pembacaan data moderasi dengan role admin dan RLS Supabase."},{"name":"admin-users","description":"Direktori hanya admin; moderasi ter-audit memeriksa role staf dan RPC."},{"name":"admin-overview","description":"Agregat jumlah data untuk admin/developer aktif melalui JWT dan RLS Supabase."},{"name":"admin-analytics","description":"Agregat telemetry untuk admin/developer aktif; detail crash tidak pernah dikembalikan."},{"name":"admin-ads","description":"Inventaris iklan read-only untuk admin/developer melalui JWT dan RLS Supabase."},{"name":"profile","description":"Identitas pengguna dengan token Supabase tervalidasi."},{"name":"surveys","description":"Permintaan survei peserta dengan identitas dan transisi status terikat RLS."},{"name":"reviews","description":"Baca ulasan kost publik dan kirim ulasan setelah survei selesai."},{"name":"roommates","description":"Fitur pencarian teman sekamar (Roommate Matchmaker) mahasiswa kampus Pekanbaru."},{"name":"owner-verification","description":"Pengajuan verifikasi pemilik dengan user ID dan status ditentukan server."},{"name":"owner-kosts","description":"Status listing kost yang hanya dimiliki pengguna aktif berdasarkan identity bridge dan RLS."},{"name":"owner-stats","description":"Agregat favorit listing pemilik; owner diturunkan dari identity bridge, bukan parameter klien."},{"name":"notifications","description":"Ringkasan notifikasi pesan yang dibatasi ke peserta melalui JWT dan RLS."},{"name":"admin-owner-verifications","description":"Antrean dan moderasi permohonan pemilik dengan role admin tepercaya dan RLS."},{"name":"contract","description":"Kontrak API publik: versi kontrak, versi API, dan daftar endpoint publik."}]}