{"openapi":"3.1.0","info":{"title":"Ndako API","version":"0.1.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"Liveness","operationId":"liveness_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/health/ready":{"get":{"tags":["health"],"summary":"Readiness","operationId":"readiness_api_v1_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthStatus"}}}}}}},"/api/v1/appointments":{"post":{"tags":["appointments"],"summary":"Create Appointment","operationId":"create_appointment_api_v1_appointments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/appointments/mine":{"get":{"tags":["appointments"],"summary":"List My Appointments","operationId":"list_my_appointments_api_v1_appointments_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AppointmentWithPropertyRead"},"type":"array","title":"Response List My Appointments Api V1 Appointments Mine Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/appointments/publisher":{"get":{"tags":["appointments"],"summary":"List Publisher Appointments","operationId":"list_publisher_appointments_api_v1_appointments_publisher_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AppointmentStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppointmentWithPropertyRead"},"title":"Response List Publisher Appointments Api V1 Appointments Publisher Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appointments/{appointment_id}/status":{"patch":{"tags":["appointments"],"summary":"Update Appointment Status","operationId":"update_appointment_status_api_v1_appointments__appointment_id__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appointment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Appointment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/platform-subscribe":{"post":{"tags":["public"],"summary":"S’abonner à la plateforme (sans compte)","description":"Pour les visiteurs : email uniquement. Pas d’inscription ni de mot de passe. Si l’email existe déjà, l’abonnement est réactivé.","operationId":"platform_subscribe_api_v1_public_platform_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPlatformSubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Nouvelle inscription ou mise à jour (voir updated_existing).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPlatformSubscribeResponse"}}}},"422":{"description":"Validation (email, champs requis)."}}}},"/api/v1/public/publish-payment-config":{"get":{"tags":["public"],"summary":"Get publish payment config","description":"Public config consumed by publisher UI before posting a listing.","operationId":"get_publish_payment_config_api_v1_public_publish_payment_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPaymentConfigRead"}}}}}}},"/api/v1/public/platform-unsubscribe":{"get":{"tags":["public"],"summary":"Se désabonner des alertes plateforme via lien email","operationId":"platform_unsubscribe_api_v1_public_platform_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPlatformUnsubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/agencies/{agency_id}":{"get":{"tags":["public"],"summary":"Get public agency profile","description":"Public agency profile used for publisher pages and property detail display.","operationId":"get_public_agency_api_v1_public_agencies__agency_id__get","parameters":[{"name":"agency_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Agency Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgencyPublicRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/owners/{owner_id}":{"get":{"tags":["public"],"summary":"Get public owner profile","description":"Public owner profile used for publisher pages and property detail display.","operationId":"get_public_owner_api_v1_public_owners__owner_id__get","parameters":[{"name":"owner_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Owner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerPublicRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/publisher-subscribe":{"post":{"tags":["public"],"summary":"S’abonner à une agence ou un propriétaire (sans compte)","operationId":"publisher_subscribe_api_v1_public_publisher_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublisherSubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublisherSubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/broadcasts":{"get":{"tags":["broadcasts"],"summary":"List platform broadcasts","description":"Public feed of announcements, newest first. French (fr) is the default filter; use `include_all_languages=true` for both fr and en.","operationId":"list_broadcasts_api_v1_broadcasts_get","parameters":[{"name":"include_all_languages","in":"query","required":false,"schema":{"type":"boolean","description":"If true, return both French and English items (ignores `language`).","default":false,"title":"Include All Languages"},"description":"If true, return both French and English items (ignores `language`)."},{"name":"language","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BroadcastLanguage","description":"When `include_all_languages` is false: `fr` (default) or `en`.","default":"fr"},"description":"When `include_all_languages` is false: `fr` (default) or `en`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_BroadcastRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"User created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Invalid role or agency rules (client/admin not allowed)"},"409":{"description":"Email already registered"},"422":{"description":"Validation error"}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Access token issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Token"}}}},"401":{"description":"Invalid email or password"},"403":{"description":"Account disabled or role cannot sign in (e.g. client)"},"422":{"description":"Validation error"}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Current user","operationId":"read_me_api_v1_auth_me_get","responses":{"200":{"description":"Authenticated user profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"401":{"description":"Missing, invalid, or expired Bearer token; or inactive user"}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["auth"],"summary":"Update current user profile","operationId":"patch_me_api_v1_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Profile updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"400":{"description":"Invalid update for this role"},"401":{"description":"Missing/invalid token"},"422":{"description":"Validation error"}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me/profile-image":{"post":{"tags":["auth"],"summary":"Upload my profile image","operationId":"upload_my_profile_image_api_v1_auth_me_profile_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_my_profile_image_api_v1_auth_me_profile_image_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadedMediaRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/me/agency-profile-image":{"post":{"tags":["auth"],"summary":"Upload my agency profile image","operationId":"upload_my_agency_profile_image_api_v1_auth_me_agency_profile_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_my_agency_profile_image_api_v1_auth_me_agency_profile_image_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadedMediaRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/favorites":{"get":{"tags":["favorites"],"summary":"List My Favorites","operationId":"list_my_favorites_api_v1_favorites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_FavoriteRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["favorites"],"summary":"Add Favorite","operationId":"add_favorite_api_v1_favorites_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoriteRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/favorites/{property_id}":{"delete":{"tags":["favorites"],"summary":"Remove Favorite","operationId":"remove_favorite_api_v1_favorites__property_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties":{"get":{"tags":["properties"],"summary":"List published properties","description":"Public catalog: only listings with status published and is_published=true. Supports query filters, sort (newest, price_asc, price_desc), and pagination.","operationId":"list_public_properties_api_v1_properties_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}},{"name":"province","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Province"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"City"}},{"name":"commune","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Commune"}},{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Neighborhood"}},{"name":"avenue","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Avenue"}},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Price"}},{"name":"bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Bedrooms"}},{"name":"bathrooms_inside","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Bathrooms Inside"}},{"name":"toilets_inside","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Toilets Inside"}},{"name":"bathrooms_outside","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Bathrooms Outside"}},{"name":"toilets_outside","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Toilets Outside"}},{"name":"toilets_inside_present","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Toilets Inside Present"}},{"name":"toilets_outside_present","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Toilets Outside Present"}},{"name":"fenced","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fenced"}},{"name":"max_families_in_plot","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Families In Plot"}},{"name":"shared_courtyard","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared Courtyard"}},{"name":"has_tiles","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Tiles"}},{"name":"has_water","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Water"}},{"name":"has_electricity","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Electricity"}},{"name":"listing_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ListingType"},{"type":"null"}],"title":"Listing Type"}},{"name":"property_category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PropertyCategory"},{"type":"null"}],"title":"Property Category"}},{"name":"publisher_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PropertyPublisherType"},{"type":"null"}],"title":"Publisher Type"}},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/PropertyListingSort","default":"newest"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PropertyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["properties"],"summary":"Create Property","operationId":"create_property_api_v1_properties_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/mine":{"get":{"tags":["properties"],"summary":"List my properties","description":"Publisher dashboard: list properties belonging to the current user (owner/agency/admin).","operationId":"list_my_properties_api_v1_properties_mine_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PropertyStatus"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PropertyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/catalog-facets":{"get":{"tags":["properties"],"summary":"Catalog location dropdown values","description":"Distinct province, city, commune, neighborhood, and avenue from published listings.","operationId":"catalog_location_facets_api_v1_properties_catalog_facets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogLocationFacets"}}}}}}},"/api/v1/properties/public-stats":{"get":{"tags":["properties"],"summary":"Public catalog aggregates","description":"Counts for the home page: published listings, media files, and photo coverage.","operationId":"public_catalog_stats_api_v1_properties_public_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCatalogStats"}}}}}}},"/api/v1/properties/feed/videos":{"get":{"tags":["properties"],"summary":"Video Feed","operationId":"video_feed_api_v1_properties_feed_videos_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PropertyVideoFeedItem"},"title":"Response Video Feed Api V1 Properties Feed Videos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/{property_id}":{"get":{"tags":["properties"],"summary":"Get Property","operationId":"get_property_api_v1_properties__property_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["properties"],"summary":"Update Property","operationId":"update_property_api_v1_properties__property_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["properties"],"summary":"Delete Property","operationId":"delete_property_api_v1_properties__property_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/{property_id}/taken":{"patch":{"tags":["properties"],"summary":"Set Property Taken","operationId":"set_property_taken_api_v1_properties__property_id__taken_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyTakenUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/{property_id}/media":{"get":{"tags":["property-media"],"summary":"List property media","description":"Same visibility as GET /properties/{id}: anonymous users only see public published listings.","operationId":"list_property_media_api_v1_properties__property_id__media_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PropertyMediaRead"},"title":"Response List Property Media Api V1 Properties  Property Id  Media Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["property-media"],"summary":"Attach media URLs","description":"Adds media rows linked to the property. Validates photo/video counts and video duration. Omit sort_order on all items to append; otherwise set sort_order on every item.","operationId":"attach_property_media_api_v1_properties__property_id__media_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyMediaAttachRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PropertyMediaRead"},"title":"Response Attach Property Media Api V1 Properties  Property Id  Media Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/media/upload-options":{"get":{"tags":["property-media"],"summary":"Property media upload strategy","description":"Returns whether the browser should upload directly to Cloudinary (unsigned preset) and the max size enforced when using the API upload endpoint.","operationId":"property_media_upload_options_api_v1_properties_media_upload_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyMediaUploadOptionsRead"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/properties/media/upload":{"post":{"tags":["property-media"],"summary":"Upload media file","description":"Upload an image/video file (multipart/form-data) and return a public URL. Videos: max 100 MiB, max 120 seconds duration when attached to a listing (duration_seconds must be sent with the property payload).","operationId":"upload_media_file_api_v1_properties_media_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media_file_api_v1_properties_media_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadedMediaRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions":{"get":{"tags":["subscriptions"],"summary":"List My Subscriptions","operationId":"list_my_subscriptions_api_v1_subscriptions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"If true (default), return only active subscriptions","default":true,"title":"Active Only"},"description":"If true (default), return only active subscriptions"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionRead"},"title":"Response List My Subscriptions Api V1 Subscriptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["subscriptions"],"summary":"Create Subscription","operationId":"create_subscription_api_v1_subscriptions_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/{subscription_id}":{"patch":{"tags":["subscriptions"],"summary":"Update Subscription","operationId":"update_subscription_api_v1_subscriptions__subscription_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/performance/mine":{"get":{"tags":["subscriptions"],"summary":"Performance Mine","operationId":"performance_mine_api_v1_subscriptions_performance_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherPerformanceRead"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions/performance/mine/timeline":{"get":{"tags":["subscriptions"],"summary":"Performance Mine Timeline","operationId":"performance_mine_timeline_api_v1_subscriptions_performance_mine_timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":14,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublisherPerformanceTimelineRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscriptions/audience/mine":{"get":{"tags":["subscriptions"],"summary":"Audience Mine","operationId":"audience_mine_api_v1_subscriptions_audience_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AudienceSubscriberRead"},"type":"array","title":"Response Audience Mine Api V1 Subscriptions Audience Mine Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/subscriptions/audience/{source}/{subscription_id}":{"patch":{"tags":["subscriptions"],"summary":"Update Audience Subscription","operationId":"update_audience_subscription_api_v1_subscriptions_audience__source___subscription_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceStateUpdate"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/moderation/pending":{"get":{"tags":["admin"],"summary":"List properties pending review","operationId":"list_pending_api_v1_admin_moderation_pending_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PropertyRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/moderation/{property_id}/approve":{"post":{"tags":["admin"],"summary":"Approve listing","description":"Sets status to published, is_published=true, and published_at.","operationId":"approve_property_api_v1_admin_moderation__property_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}},{"name":"notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Notes"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/moderation/{property_id}/reject":{"post":{"tags":["admin"],"summary":"Reject listing","operationId":"reject_property_api_v1_admin_moderation__property_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}},{"name":"notes","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Notes"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/settings/auto-publish":{"get":{"tags":["admin"],"summary":"Get auto-publish setting","description":"When enabled, new owner/agency listings are created as published immediately. When disabled, they start in pending_review for moderation.","operationId":"get_auto_publish_api_v1_admin_settings_auto_publish_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoPublishRead"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["admin"],"summary":"Update auto-publish setting","operationId":"patch_auto_publish_api_v1_admin_settings_auto_publish_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoPublishUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoPublishRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/settings/publish-payment":{"get":{"tags":["admin"],"summary":"Get publish payment setting","operationId":"get_publish_payment_setting_api_v1_admin_settings_publish_payment_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPaymentSettingRead"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["admin"],"summary":"Update publish payment setting","operationId":"patch_publish_payment_setting_api_v1_admin_settings_publish_payment_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPaymentSettingUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishPaymentSettingRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/broadcasts":{"post":{"tags":["admin"],"summary":"Publish a platform broadcast","description":"Admin-only. Stored for the public API; email/SMS fan-out can be added later.","operationId":"create_broadcast_api_v1_admin_broadcasts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/admin/users":{"get":{"tags":["admin"],"summary":"List users","operationId":"list_users_api_v1_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AdminUserRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create user","operationId":"create_user_api_v1_admin_users_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"patch":{"tags":["admin"],"summary":"Update user flags","operationId":"patch_user_api_v1_admin_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete user","operationId":"delete_user_api_v1_admin_users__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/public-subscribers":{"get":{"tags":["admin"],"summary":"List public platform subscribers","operationId":"list_public_subscribers_api_v1_admin_public_subscribers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":20,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PublicSubscriberRead_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/public-subscribers/{subscriber_id}":{"patch":{"tags":["admin"],"summary":"Update a public subscriber","operationId":"patch_public_subscriber_api_v1_admin_public_subscribers__subscriber_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscriber Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSubscriberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSubscriberRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminUserCreate":{"properties":{"full_name":{"type":"string","maxLength":255,"minLength":2,"title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"profile_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Profile Image Url"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"role":{"$ref":"#/components/schemas/UserRole","default":"owner"},"preferred_language":{"type":"string","maxLength":16,"minLength":2,"title":"Preferred Language","default":"fr"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"},"is_active":{"type":"boolean","title":"Is Active","default":true},"is_verified":{"type":"boolean","title":"Is Verified","default":false}},"type":"object","required":["full_name","email","password"],"title":"AdminUserCreate"},"AdminUserRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"profile_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Image Url"},"role":{"$ref":"#/components/schemas/UserRole"},"preferred_language":{"type":"string","title":"Preferred Language"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","full_name","email","phone","profile_image_url","role","preferred_language","is_active","is_verified","agency_id","created_at","updated_at"],"title":"AdminUserRead"},"AdminUserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":2},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"profile_image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Profile Image Url"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}]},"preferred_language":{"anyOf":[{"type":"string","maxLength":16,"minLength":2},{"type":"null"}],"title":"Preferred Language"},"password":{"anyOf":[{"type":"string","maxLength":128,"minLength":8},{"type":"null"}],"title":"Password"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"}},"type":"object","title":"AdminUserUpdate","description":"Admin user updates."},"AgencyPublicRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"public_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Phone"},"profile_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Image Url"}},"type":"object","required":["id","name","slug","description","address_line","city","province","public_phone","profile_image_url"],"title":"AgencyPublicRead","description":"Public-safe agency profile (no auth)."},"AgencyRegisterInput":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Nom de l’agence (commercial)"},"slug":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Slug","description":"Slug URL (optionnel ; dérivé du nom si absent)"},"address_line":{"type":"string","maxLength":512,"minLength":1,"title":"Address Line"},"city":{"type":"string","maxLength":128,"minLength":1,"title":"City"},"province":{"type":"string","maxLength":128,"minLength":1,"title":"Province"},"public_phone":{"type":"string","maxLength":32,"minLength":1,"title":"Public Phone","description":"Téléphone du bureau"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","address_line","city","province","public_phone"],"title":"AgencyRegisterInput","description":"Données d’organisation lorsqu’une agence s’inscrit (en plus du compte utilisateur).\n\nProfil allégé (réalités terrain RDC) : pas de raison sociale / RCCM / NIF obligatoires.\n\nCrée l’agence et rattache ce compte comme **seul** compte créé par l’API pour cette structure\n(pas de « rejoindre » une agence existante via l’inscription)."},"AgencyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"address_line":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"City"},"province":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Province"},"public_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Public Phone"}},"type":"object","title":"AgencyUpdate"},"AppointmentCreate":{"properties":{"property_id":{"type":"string","format":"uuid","title":"Property Id"},"full_name":{"type":"string","maxLength":160,"minLength":1,"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"type":"string","maxLength":64,"minLength":1,"title":"Phone"},"scheduled_for":{"type":"string","format":"date-time","title":"Scheduled For"},"message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Message"}},"type":"object","required":["property_id","full_name","phone","scheduled_for"],"title":"AppointmentCreate"},"AppointmentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_id":{"type":"string","format":"uuid","title":"Property Id"},"requester_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requester User Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"},"status":{"$ref":"#/components/schemas/AppointmentStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","property_id","requester_user_id","full_name","email","phone","scheduled_for","message","status_reason","status","created_at","updated_at"],"title":"AppointmentRead"},"AppointmentStatus":{"type":"string","enum":["pending","confirmed","cancelled","completed"],"title":"AppointmentStatus"},"AppointmentStatusUpdate":{"properties":{"status":{"$ref":"#/components/schemas/AppointmentStatus"},"reason":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Reason"}},"type":"object","required":["status"],"title":"AppointmentStatusUpdate"},"AppointmentWithPropertyRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_id":{"type":"string","format":"uuid","title":"Property Id"},"requester_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requester User Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled For"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason"},"status":{"$ref":"#/components/schemas/AppointmentStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"property_title":{"type":"string","title":"Property Title"},"property_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property City"},"property_listing_type":{"$ref":"#/components/schemas/ListingType"}},"type":"object","required":["id","property_id","requester_user_id","full_name","email","phone","scheduled_for","message","status_reason","status","created_at","updated_at","property_title","property_city","property_listing_type"],"title":"AppointmentWithPropertyRead"},"AudienceStateUpdate":{"properties":{"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["is_active"],"title":"AudienceStateUpdate"},"AudienceSubscriberRead":{"properties":{"source":{"type":"string","title":"Source"},"subscription_id":{"type":"string","format":"uuid","title":"Subscription Id"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["source","subscription_id","is_active","created_at","updated_at"],"title":"AudienceSubscriberRead"},"AutoPublishRead":{"properties":{"auto_publish_properties":{"type":"boolean","title":"Auto Publish Properties"}},"type":"object","required":["auto_publish_properties"],"title":"AutoPublishRead","description":"Current global auto-publish flag (admin-only API)."},"AutoPublishUpdate":{"properties":{"auto_publish_properties":{"type":"boolean","title":"Auto Publish Properties","description":"If true, new listings are published immediately; if false, they await review."}},"type":"object","required":["auto_publish_properties"],"title":"AutoPublishUpdate"},"Body_upload_media_file_api_v1_properties_media_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_media_file_api_v1_properties_media_upload_post"},"Body_upload_my_agency_profile_image_api_v1_auth_me_agency_profile_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_my_agency_profile_image_api_v1_auth_me_agency_profile_image_post"},"Body_upload_my_profile_image_api_v1_auth_me_profile_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_my_profile_image_api_v1_auth_me_profile_image_post"},"BroadcastCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":50000,"minLength":1,"title":"Body"},"language":{"$ref":"#/components/schemas/BroadcastLanguage","default":"fr"}},"type":"object","required":["title","body"],"title":"BroadcastCreate"},"BroadcastLanguage":{"type":"string","enum":["fr","en"],"title":"BroadcastLanguage"},"BroadcastRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"language":{"$ref":"#/components/schemas/BroadcastLanguage"},"created_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","title","body","language","created_by_user_id","created_at","updated_at"],"title":"BroadcastRead"},"CatalogLocationFacets":{"properties":{"provinces":{"items":{"type":"string"},"type":"array","title":"Provinces"},"cities":{"items":{"type":"string"},"type":"array","title":"Cities"},"communes":{"items":{"type":"string"},"type":"array","title":"Communes"},"neighborhoods":{"items":{"type":"string"},"type":"array","title":"Neighborhoods"},"avenues":{"items":{"type":"string"},"type":"array","title":"Avenues"}},"type":"object","required":["provinces","cities","communes","neighborhoods","avenues"],"title":"CatalogLocationFacets","description":"Distinct location strings from published listings (for catalog dropdowns)."},"CloudinaryBrowserUploadConfigRead":{"properties":{"cloud_name":{"type":"string","title":"Cloud Name"},"upload_preset":{"type":"string","title":"Upload Preset"}},"type":"object","required":["cloud_name","upload_preset"],"title":"CloudinaryBrowserUploadConfigRead","description":"Credentials slice for browser-side uploads (preset only; no API secret)."},"DailyMetricPoint":{"properties":{"date":{"type":"string","title":"Date"},"profile_views":{"type":"integer","title":"Profile Views"},"post_views":{"type":"integer","title":"Post Views"}},"type":"object","required":["date","profile_views","post_views"],"title":"DailyMetricPoint"},"FavoriteCreate":{"properties":{"property_id":{"type":"string","format":"uuid","title":"Property Id"}},"type":"object","required":["property_id"],"title":"FavoriteCreate"},"FavoritePropertySummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"status":{"$ref":"#/components/schemas/PropertyStatus"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["id","title","status","city","price","currency"],"title":"FavoritePropertySummary","description":"Minimal listing info for a favorited property (requires ``property`` relationship loaded)."},"FavoriteRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_id":{"type":"string","format":"uuid","title":"Property Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"property":{"$ref":"#/components/schemas/FavoritePropertySummary"}},"type":"object","required":["id","property_id","created_at","updated_at","property"],"title":"FavoriteRead"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthStatus":{"properties":{"status":{"type":"string","title":"Status"},"service":{"type":"string","title":"Service"},"database":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database"}},"type":"object","required":["status","service"],"title":"HealthStatus"},"ListingType":{"type":"string","enum":["rent","sale"],"title":"ListingType"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":1,"title":"Password","description":"Plain password; never stored or logged."}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Email + password login (JSON). OAuth2 form login is not exposed as a separate route.","examples":[{"email":"user@example.com","password":"••••••••"}]},"OwnerPublicRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["id","full_name","phone"],"title":"OwnerPublicRead","description":"Public-safe owner profile (no auth)."},"Page_AdminUserRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminUserRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[AdminUserRead]"},"Page_BroadcastRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BroadcastRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[BroadcastRead]"},"Page_FavoriteRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FavoriteRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[FavoriteRead]"},"Page_PropertyRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PropertyRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[PropertyRead]"},"Page_PublicSubscriberRead_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PublicSubscriberRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"size":{"type":"integer","title":"Size"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[PublicSubscriberRead]"},"PropertyCategory":{"type":"string","enum":["house","empty_plot","wedding_hall","meeting_hall","hotel","airbnb"],"title":"PropertyCategory"},"PropertyCreate":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"$ref":"#/components/schemas/ListingType","default":"sale"},"property_category":{"$ref":"#/components/schemas/PropertyCategory","default":"house"},"province":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"City"},"commune":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Commune"},"neighborhood":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Neighborhood"},"avenue":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Avenue"},"address_line":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Address Line"},"latitude":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Longitude"},"price":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","maxLength":3,"minLength":3,"title":"Currency","default":"CDF"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"living_rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Living Rooms"},"bathrooms_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Inside"},"bathrooms_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Outside"},"toilets_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Inside"},"toilets_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Outside"},"kitchen_inside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Inside"},"kitchen_outside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Outside"},"fenced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fenced"},"max_families_in_plot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Families In Plot"},"shared_courtyard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared Courtyard"},"ceiling_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Ceiling Type"},"floor_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Floor Type"},"has_tiles":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Tiles"},"has_water":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Water"},"has_electricity":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Electricity"},"parking_spaces":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Parking Spaces"},"payment_method":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Payment Method"},"payment_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Payment Phone"},"payment_reference":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Payment Reference"},"media":{"items":{"$ref":"#/components/schemas/PropertyMediaCreate"},"type":"array","title":"Media"}},"type":"object","required":["title"],"title":"PropertyCreate"},"PropertyListingSort":{"type":"string","enum":["newest","price_asc","price_desc"],"title":"PropertyListingSort","description":"Public listing ordering (query param ``sort``)."},"PropertyMediaAttachRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PropertyMediaCreate"},"type":"array","maxItems":14,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"PropertyMediaAttachRequest","description":"Attach one or more media items to an existing property."},"PropertyMediaCreate":{"properties":{"kind":{"$ref":"#/components/schemas/PropertyMediaKind"},"url":{"type":"string","maxLength":2048,"title":"Url"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order","description":"Gallery position; omit to auto-assign when attaching"},"duration_seconds":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["kind","url"],"title":"PropertyMediaCreate","description":"Payload for creating a media row (embedded in property create/update or attach)."},"PropertyMediaKind":{"type":"string","enum":["photo","video"],"title":"PropertyMediaKind"},"PropertyMediaRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"$ref":"#/components/schemas/PropertyMediaKind"},"url":{"type":"string","title":"Url"},"sort_order":{"type":"integer","title":"Sort Order"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["id","kind","url","sort_order","duration_seconds"],"title":"PropertyMediaRead"},"PropertyMediaUploadOptionsRead":{"properties":{"cloudinary_browser":{"anyOf":[{"$ref":"#/components/schemas/CloudinaryBrowserUploadConfigRead"},{"type":"null"}]},"max_upload_bytes":{"type":"integer","minimum":1.0,"title":"Max Upload Bytes","description":"Max bytes enforced server-side when using API upload"}},"type":"object","required":["max_upload_bytes"],"title":"PropertyMediaUploadOptionsRead","description":"Upload strategy for the SPA.\n\nWhen ``cloudinary_browser`` is set, clients should POST ``multipart/form-data`` to Cloudinary\n(image/video upload endpoint) instead of ``/properties/media/upload``, avoiding proxy limits."},"PropertyPublisherType":{"type":"string","enum":["owner","agency"],"title":"PropertyPublisherType"},"PropertyRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"$ref":"#/components/schemas/ListingType"},"property_category":{"$ref":"#/components/schemas/PropertyCategory"},"publisher_type":{"$ref":"#/components/schemas/PropertyPublisherType"},"status":{"$ref":"#/components/schemas/PropertyStatus"},"is_published":{"type":"boolean","title":"Is Published"},"is_taken":{"type":"boolean","title":"Is Taken"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"commune":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commune"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"avenue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avenue"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"latitude":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Longitude"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"living_rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Living Rooms"},"bathrooms_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Inside"},"bathrooms_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Outside"},"toilets_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Inside"},"toilets_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Outside"},"kitchen_inside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Inside"},"kitchen_outside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Outside"},"fenced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fenced"},"max_families_in_plot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Families In Plot"},"shared_courtyard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared Courtyard"},"ceiling_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ceiling Type"},"floor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Floor Type"},"has_tiles":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Tiles"},"has_water":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Water"},"has_electricity":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Electricity"},"parking_spaces":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parking Spaces"},"owner_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner User Id"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"},"moderation_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderation Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"media":{"items":{"$ref":"#/components/schemas/PropertyMediaRead"},"type":"array","title":"Media"},"publisher_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Publisher Id","readOnly":true}},"type":"object","required":["id","title","description","listing_type","property_category","publisher_type","status","is_published","is_taken","published_at","province","city","commune","neighborhood","avenue","address_line","latitude","longitude","price","currency","bedrooms","living_rooms","bathrooms_inside","bathrooms_outside","toilets_inside","toilets_outside","kitchen_inside","kitchen_outside","fenced","max_families_in_plot","shared_courtyard","ceiling_type","floor_type","has_tiles","has_water","has_electricity","parking_spaces","owner_user_id","agency_id","moderation_notes","created_at","updated_at","publisher_id"],"title":"PropertyRead"},"PropertyStatus":{"type":"string","enum":["draft","pending_review","published","rejected"],"title":"PropertyStatus"},"PropertyTakenUpdate":{"properties":{"is_taken":{"type":"boolean","title":"Is Taken"}},"type":"object","required":["is_taken"],"title":"PropertyTakenUpdate"},"PropertyUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_type":{"anyOf":[{"$ref":"#/components/schemas/ListingType"},{"type":"null"}]},"property_category":{"anyOf":[{"$ref":"#/components/schemas/PropertyCategory"},{"type":"null"}]},"province":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Province"},"city":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"City"},"commune":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Commune"},"neighborhood":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Neighborhood"},"avenue":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Avenue"},"address_line":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Address Line"},"latitude":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Longitude"},"price":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Currency"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"living_rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Living Rooms"},"bathrooms_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Inside"},"bathrooms_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms Outside"},"toilets_inside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Inside"},"toilets_outside":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Toilets Outside"},"kitchen_inside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Inside"},"kitchen_outside":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kitchen Outside"},"fenced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fenced"},"max_families_in_plot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Families In Plot"},"shared_courtyard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared Courtyard"},"ceiling_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Ceiling Type"},"floor_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Floor Type"},"has_tiles":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Tiles"},"has_water":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Water"},"has_electricity":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Electricity"},"parking_spaces":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Parking Spaces"},"is_taken":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Taken"},"media":{"anyOf":[{"items":{"$ref":"#/components/schemas/PropertyMediaCreate"},"type":"array"},{"type":"null"}],"title":"Media"}},"type":"object","title":"PropertyUpdate","description":"Partial update; omit fields to leave unchanged. Replace ``media`` only when sent."},"PropertyVideoFeedItem":{"properties":{"property_id":{"type":"string","format":"uuid","title":"Property Id"},"title":{"type":"string","title":"Title"},"listing_type":{"$ref":"#/components/schemas/ListingType"},"property_category":{"$ref":"#/components/schemas/PropertyCategory"},"video_url":{"type":"string","title":"Video Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["property_id","title","listing_type","property_category","video_url","currency"],"title":"PropertyVideoFeedItem"},"PublicCatalogStats":{"properties":{"published_listings":{"type":"integer","minimum":0.0,"title":"Published Listings","description":"Annonces publiées visibles"},"media_items":{"type":"integer","minimum":0.0,"title":"Media Items","description":"Nombre total de fichiers média (photos + vidéos)"},"listings_with_photo_percent":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Listings With Photo Percent","description":"Pourcentage d’annonces publiées avec au moins une photo"}},"type":"object","required":["published_listings","media_items","listings_with_photo_percent"],"title":"PublicCatalogStats","description":"Agrégats publics pour la page d’accueil (catalogue publié)."},"PublicPlatformSubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"PublicPlatformSubscribeRequest","description":"Abonnement visiteur à la plateforme (sans compte utilisateur)."},"PublicPlatformSubscribeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"type":"string","title":"Phone"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"updated_existing":{"type":"boolean","title":"Updated Existing","description":"True si l’email existait déjà (réinscription / mise à jour des coordonnées)."}},"type":"object","required":["id","full_name","email","phone","is_active","created_at","updated_at","updated_existing"],"title":"PublicPlatformSubscribeResponse"},"PublicPlatformUnsubscribeResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"is_active":{"type":"boolean","title":"Is Active"},"unsubscribed":{"type":"boolean","title":"Unsubscribed"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["email","is_active","unsubscribed","updated_at"],"title":"PublicPlatformUnsubscribeResponse"},"PublicPublisherSubscribeRequest":{"properties":{"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"type":"string","maxLength":32,"minLength":1,"title":"Phone"},"target":{"$ref":"#/components/schemas/SubscriptionTarget"},"owner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"}},"type":"object","required":["full_name","email","phone","target"],"title":"PublicPublisherSubscribeRequest","description":"Visitor subscription to an owner or agency (no user account)."},"PublicPublisherSubscribeResponse":{"properties":{"subscriber_id":{"type":"string","format":"uuid","title":"Subscriber Id"},"subscription_id":{"type":"string","format":"uuid","title":"Subscription Id"},"subject_key":{"type":"string","title":"Subject Key"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"updated_existing":{"type":"boolean","title":"Updated Existing","description":"True if the email already existed and was re-activated/updated."}},"type":"object","required":["subscriber_id","subscription_id","subject_key","is_active","created_at","updated_at","updated_existing"],"title":"PublicPublisherSubscribeResponse"},"PublicSubscriberRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","full_name","email","phone","is_active","created_at","updated_at"],"title":"PublicSubscriberRead"},"PublicSubscriberUpdate":{"properties":{"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"PublicSubscriberUpdate"},"PublishPaymentConfigRead":{"properties":{"require_publish_payment":{"type":"boolean","title":"Require Publish Payment"},"publish_fee_amount":{"type":"integer","minimum":0.0,"title":"Publish Fee Amount"},"publish_fee_currency":{"type":"string","title":"Publish Fee Currency"},"payment_methods":{"items":{"type":"string"},"type":"array","title":"Payment Methods"}},"type":"object","required":["require_publish_payment","publish_fee_amount","publish_fee_currency","payment_methods"],"title":"PublishPaymentConfigRead"},"PublishPaymentSettingRead":{"properties":{"require_publish_payment":{"type":"boolean","title":"Require Publish Payment"},"publish_fee_amount":{"type":"integer","minimum":0.0,"title":"Publish Fee Amount"},"publish_fee_currency":{"type":"string","title":"Publish Fee Currency"}},"type":"object","required":["require_publish_payment","publish_fee_amount","publish_fee_currency"],"title":"PublishPaymentSettingRead"},"PublishPaymentSettingUpdate":{"properties":{"require_publish_payment":{"type":"boolean","title":"Require Publish Payment","description":"If true, publishers must complete simulated payment before posting."}},"type":"object","required":["require_publish_payment"],"title":"PublishPaymentSettingUpdate"},"PublisherPerformanceRead":{"properties":{"profile_views":{"type":"integer","title":"Profile Views"},"post_views":{"type":"integer","title":"Post Views"},"total_posts":{"type":"integer","title":"Total Posts"},"published_posts":{"type":"integer","title":"Published Posts"},"pending_posts":{"type":"integer","title":"Pending Posts"},"draft_posts":{"type":"integer","title":"Draft Posts"},"rejected_posts":{"type":"integer","title":"Rejected Posts"},"active_subscribers":{"type":"integer","title":"Active Subscribers"}},"type":"object","required":["profile_views","post_views","total_posts","published_posts","pending_posts","draft_posts","rejected_posts","active_subscribers"],"title":"PublisherPerformanceRead"},"PublisherPerformanceTimelineRead":{"properties":{"points":{"items":{"$ref":"#/components/schemas/DailyMetricPoint"},"type":"array","title":"Points"}},"type":"object","required":["points"],"title":"PublisherPerformanceTimelineRead"},"SubscriptionCreate":{"properties":{"target":{"$ref":"#/components/schemas/SubscriptionTarget"},"owner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id","description":"Required when target is owner: user id of the publisher to follow"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id","description":"Required when target is agency"}},"type":"object","required":["target"],"title":"SubscriptionCreate","description":"Start or re-activate a subscription (idempotent per user + subject)."},"SubscriptionRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"target":{"$ref":"#/components/schemas/SubscriptionTarget"},"subject_key":{"type":"string","title":"Subject Key"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"owner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id","readOnly":true},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id","readOnly":true}},"type":"object","required":["id","target","subject_key","is_active","created_at","updated_at","owner_id","agency_id"],"title":"SubscriptionRead"},"SubscriptionTarget":{"type":"string","enum":["platform","owner","agency"],"title":"SubscriptionTarget"},"SubscriptionUpdate":{"properties":{"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["is_active"],"title":"SubscriptionUpdate","description":"Toggle subscription without deleting the row (history-friendly)."},"Token":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"Token"},"UploadedMediaRead":{"properties":{"url":{"type":"string","title":"Url"},"provider":{"type":"string","title":"Provider"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"}},"type":"object","required":["url","provider"],"title":"UploadedMediaRead","description":"Response for multipart media upload endpoints."},"UserCreate":{"properties":{"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"role":{"$ref":"#/components/schemas/UserRole","default":"owner"},"preferred_language":{"type":"string","maxLength":16,"title":"Preferred Language","description":"`fr` (default) or `en`","default":"fr"},"agency":{"anyOf":[{"$ref":"#/components/schemas/AgencyRegisterInput"},{"type":"null"}],"description":"Obligatoire si ``role`` est ``agency`` : création de l’agence + ce compte représentant. Aucun rattachement à une agence existante via l’inscription."}},"additionalProperties":false,"type":"object","required":["full_name","email","password"],"title":"UserCreate"},"UserRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"full_name":{"type":"string","title":"Full Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"profile_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Image Url"},"role":{"$ref":"#/components/schemas/UserRole"},"preferred_language":{"type":"string","title":"Preferred Language"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"agency_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Agency Id"},"agency":{"anyOf":[{"$ref":"#/components/schemas/AgencyPublicRead"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","full_name","email","phone","address_line","city","province","profile_image_url","role","preferred_language","is_active","is_verified","agency_id","created_at","updated_at"],"title":"UserRead"},"UserRole":{"type":"string","enum":["client","owner","agency","admin"],"title":"UserRole","description":"Application roles stored as PostgreSQL enum ``user_role``."},"UserUpdate":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"address_line":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"City"},"province":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Province"},"preferred_language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Preferred Language"},"agency":{"anyOf":[{"$ref":"#/components/schemas/AgencyUpdate"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"UserUpdate"},"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"}}}}