"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from .basesdk import BaseSDK
from datetime import date
from typing import Mapping, Optional
from zillow_rapidapi_client import models, utils
from zillow_rapidapi_client._hooks import HookContext
from zillow_rapidapi_client.types import OptionalNullable, UNSET


class Properties(BaseSDK):
    def extended_search(
        self,
        *,
        location: Optional[str] = None,
        page: Optional[int] = None,
        status_type: Optional[models.StatusType] = None,
        home_type: Optional[models.HomeType] = None,
        sort: Optional[models.Sort] = None,
        polygon: Optional[str] = None,
        min_price: Optional[float] = None,
        max_price: Optional[float] = None,
        rent_min_price: Optional[float] = None,
        rent_max_price: Optional[float] = None,
        baths_min: Optional[float] = None,
        baths_max: Optional[float] = None,
        beds_min: Optional[float] = None,
        beds_max: Optional[float] = None,
        sqft_min: Optional[float] = None,
        sqft_max: Optional[float] = None,
        build_year_min: Optional[float] = None,
        build_year_max: Optional[float] = None,
        days_on: Optional[models.DaysOn] = None,
        sold_in_last: Optional[models.SoldInLast] = None,
        is_basement_finished: Optional[float] = None,
        is_basement_unfinished: Optional[float] = None,
        is_pending_under_contract: Optional[float] = None,
        is_accepting_backup_offers: Optional[float] = None,
        is_coming_soon: Optional[bool] = None,
        other_listings: Optional[bool] = None,
        is_new_construction: Optional[bool] = None,
        keywords: Optional[str] = None,
        lot_size_min: Optional[models.LotSizeMin] = None,
        lot_size_max: Optional[models.LotSizeMax] = None,
        sale_by_agent: Optional[str] = None,
        sale_by_owner: Optional[str] = None,
        is_for_sale_foreclosure: Optional[bool] = None,
        is_waterfront: Optional[bool] = None,
        has_pool: Optional[bool] = None,
        has_air_conditioning: Optional[bool] = None,
        is_city_view: Optional[bool] = None,
        is_mountain_view: Optional[bool] = None,
        is_water_view: Optional[bool] = None,
        is_park_view: Optional[bool] = None,
        is_open_houses_only: Optional[bool] = None,
        is3d_home: Optional[bool] = None,
        coordinates: Optional[str] = None,
        hoa: Optional[float] = None,
        include_homes_with_no_hoa_data: Optional[bool] = None,
        is_auction: Optional[bool] = None,
        schools: Optional[str] = None,
        schools_rating: Optional[str] = None,
        include_unrated_schools: Optional[bool] = None,
        has_garage: Optional[bool] = None,
        parking_spots: Optional[float] = None,
        is_foreclosed: Optional[bool] = None,
        is_pre_foreclosure: Optional[bool] = None,
        is_entire_place: Optional[bool] = None,
        is_room: Optional[bool] = None,
        large_dogs_allowed: Optional[bool] = None,
        small_dogs_allowed: Optional[bool] = None,
        cats_allowed: Optional[bool] = None,
        no_pets: Optional[bool] = None,
        move_in_date: Optional[date] = None,
        parking_available: Optional[bool] = None,
        in_unit_laundry: Optional[bool] = None,
        accepts_applications: Optional[bool] = None,
        income_restricted: Optional[bool] = None,
        hardwood_floor: Optional[bool] = None,
        disabled_access: Optional[bool] = None,
        utilities_included: Optional[bool] = None,
        short_term_lease: Optional[bool] = None,
        furnished: Optional[bool] = None,
        outdoor_space: Optional[bool] = None,
        controlled_access: Optional[bool] = None,
        high_speed_internet: Optional[bool] = None,
        elevator: Optional[bool] = None,
        multi_family_building: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.PropertySearchResponse:
        r"""Search for properties

        :param location: Location details (address, county, neighborhood, or Zip code). Required if  polygon or coordinates are empty.
        :param page: Page number for paginated results. Max value is 20.
        :param status_type: Property status type.
        :param home_type: Property type. Comma-separated list.
        :param sort: Sorting order.
        :param polygon: Polygon coordinates in the format: lon lat,lon1 lat1,lon2 lat2. It is  required if the location or coordinates are empty. The last pair must be the  same as the first pair.
        :param min_price: Minimum price filter.
        :param max_price: Maximum price filter.
        :param rent_min_price: Minimum rent price filter (if status_type = ForRent).
        :param rent_max_price: Maximum rent price filter (if status_type = ForRent).
        :param baths_min: Bathrooms min count.
        :param baths_max: Bathrooms max count.
        :param beds_min: Bedrooms min count.
        :param beds_max: Bedrooms max count.
        :param sqft_min: Square Feet min value.
        :param sqft_max: Square Feet max value.
        :param build_year_min: Year Built min value.
        :param build_year_max: Year Built max value.
        :param days_on: Days on Z. Use with status_type='ForSale' or status_type='ForRent'.
        :param sold_in_last: Sold in the last. Use with status_type='RecentlySold'.
        :param is_basement_finished: Basement filter. Set it to 1 if needed.
        :param is_basement_unfinished: Basement filter. Set it to 1 if needed.
        :param is_pending_under_contract: Pending & Under Contract filter. Set it to 1 if needed.
        :param is_accepting_backup_offers: Accepting Backup Offers filter. Set it to 1 if needed.
        :param is_coming_soon: Coming Soon listings are homes that will soon be on the market. Set it to 1  if needed.
        :param other_listings: If set to 1, the results will only include data from the Other Listings tab.
        :param is_new_construction: New Construction filter. Set it to 1 or true if you only need properties  with New Construction status.
        :param keywords: Keywords filter for property search.
        :param lot_size_min: Minimum lot size.
        :param lot_size_max: Maximum lot size.
        :param sale_by_agent: Default - true. To get FSBO set  saleByAgent=false&saleByOwner=true&otherListings=true.
        :param sale_by_owner: Default - true. To get only FSBO set  saleByAgent=false&saleByOwner=true&otherListings=true.
        :param is_for_sale_foreclosure: If you only need to get ForSaleForeclosure set to true or 1.
        :param is_waterfront:
        :param has_pool:
        :param has_air_conditioning:
        :param is_city_view:
        :param is_mountain_view:
        :param is_water_view:
        :param is_park_view:
        :param is_open_houses_only: Must have open house.
        :param is3d_home: Must have 3D Tour.
        :param coordinates: It is required if the location or polygon is empty. Format: lon lat,diameter. Diameter in miles from 1 to 99 -118.51750373840332  34.007063913440916,20
        :param hoa: Max HOA.
        :param include_homes_with_no_hoa_data: Default - true.
        :param is_auction: Auctions. Default true.
        :param schools: Available values: elementary, public, private, middle, charter, high For multiple selection, separate with comma: middle,high
        :param schools_rating: Min school ratings. From 1 to 10.
        :param include_unrated_schools: Include schools with no rating.
        :param has_garage: Must have a garage. Default value false.
        :param parking_spots: Parking Spots. Max value - 4.
        :param is_foreclosed:
        :param is_pre_foreclosure:
        :param is_entire_place: Default - true. Apply when status_type = 'ForRent'. Set it to false if you  need only a room.
        :param is_room: Default - false. Apply when status_type = 'ForRent'. Set it true and  isEntirePlace to false if you need only a room.
        :param large_dogs_allowed: Allows large dogs. Only For Rent.
        :param small_dogs_allowed: Allows small dogs. Only For Rent.
        :param cats_allowed: Allows cats. Only For Rent.
        :param no_pets: No pets. Only For Rent.
        :param move_in_date: Move-in Date. Only For Rent.
        :param parking_available: On-site Parking. Only For Rent.
        :param in_unit_laundry: In-unit Laundry. Only For Rent.
        :param accepts_applications: Accepts Zillow Applications. Only For Rent.
        :param income_restricted: Income restricted. Only For Rent.
        :param hardwood_floor: Hardwood Floors. Only For Rent.
        :param disabled_access: Disabled Access. Only For Rent.
        :param utilities_included: Utilities Included. Only For Rent.
        :param short_term_lease: Short term lease available. Only For Rent.
        :param furnished: Furnished. Only For Rent.
        :param outdoor_space: Outdoor space. Only For Rent.
        :param controlled_access: Controlled access. Only For Rent.
        :param high_speed_internet: High speed internet. Only For Rent.
        :param elevator: Elevator. Only For Rent.
        :param multi_family_building: Apartment Community. Only For Rent.
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        request = models.PropertyExtendedSearchRequest(
            location=location,
            page=page,
            status_type=status_type,
            home_type=home_type,
            sort=sort,
            polygon=polygon,
            min_price=min_price,
            max_price=max_price,
            rent_min_price=rent_min_price,
            rent_max_price=rent_max_price,
            baths_min=baths_min,
            baths_max=baths_max,
            beds_min=beds_min,
            beds_max=beds_max,
            sqft_min=sqft_min,
            sqft_max=sqft_max,
            build_year_min=build_year_min,
            build_year_max=build_year_max,
            days_on=days_on,
            sold_in_last=sold_in_last,
            is_basement_finished=is_basement_finished,
            is_basement_unfinished=is_basement_unfinished,
            is_pending_under_contract=is_pending_under_contract,
            is_accepting_backup_offers=is_accepting_backup_offers,
            is_coming_soon=is_coming_soon,
            other_listings=other_listings,
            is_new_construction=is_new_construction,
            keywords=keywords,
            lot_size_min=lot_size_min,
            lot_size_max=lot_size_max,
            sale_by_agent=sale_by_agent,
            sale_by_owner=sale_by_owner,
            is_for_sale_foreclosure=is_for_sale_foreclosure,
            is_waterfront=is_waterfront,
            has_pool=has_pool,
            has_air_conditioning=has_air_conditioning,
            is_city_view=is_city_view,
            is_mountain_view=is_mountain_view,
            is_water_view=is_water_view,
            is_park_view=is_park_view,
            is_open_houses_only=is_open_houses_only,
            is3d_home=is3d_home,
            coordinates=coordinates,
            hoa=hoa,
            include_homes_with_no_hoa_data=include_homes_with_no_hoa_data,
            is_auction=is_auction,
            schools=schools,
            schools_rating=schools_rating,
            include_unrated_schools=include_unrated_schools,
            has_garage=has_garage,
            parking_spots=parking_spots,
            is_foreclosed=is_foreclosed,
            is_pre_foreclosure=is_pre_foreclosure,
            is_entire_place=is_entire_place,
            is_room=is_room,
            large_dogs_allowed=large_dogs_allowed,
            small_dogs_allowed=small_dogs_allowed,
            cats_allowed=cats_allowed,
            no_pets=no_pets,
            move_in_date=move_in_date,
            parking_available=parking_available,
            in_unit_laundry=in_unit_laundry,
            accepts_applications=accepts_applications,
            income_restricted=income_restricted,
            hardwood_floor=hardwood_floor,
            disabled_access=disabled_access,
            utilities_included=utilities_included,
            short_term_lease=short_term_lease,
            furnished=furnished,
            outdoor_space=outdoor_space,
            controlled_access=controlled_access,
            high_speed_internet=high_speed_internet,
            elevator=elevator,
            multi_family_building=multi_family_building,
        )

        req = self._build_request(
            method="GET",
            path="/propertyExtendedSearch",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=False,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="application/json",
            http_headers=http_headers,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = self.do_request(
            hook_ctx=HookContext(
                base_url=base_url or "",
                operation_id="propertyExtendedSearch",
                oauth2_scopes=[],
                security_source=None,
            ),
            request=req,
            error_status_codes=["400", "4XX", "500", "5XX"],
            retry_config=retry_config,
        )

        if utils.match_response(http_res, "200", "application/json"):
            return utils.unmarshal_json(http_res.text, models.PropertySearchResponse)
        if utils.match_response(http_res, ["400", "4XX"], "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )
        if utils.match_response(http_res, ["500", "5XX"], "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )

        content_type = http_res.headers.get("Content-Type")
        http_res_text = utils.stream_to_text(http_res)
        raise models.APIError(
            f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
            http_res.status_code,
            http_res_text,
            http_res,
        )

    async def extended_search_async(
        self,
        *,
        location: Optional[str] = None,
        page: Optional[int] = None,
        status_type: Optional[models.StatusType] = None,
        home_type: Optional[models.HomeType] = None,
        sort: Optional[models.Sort] = None,
        polygon: Optional[str] = None,
        min_price: Optional[float] = None,
        max_price: Optional[float] = None,
        rent_min_price: Optional[float] = None,
        rent_max_price: Optional[float] = None,
        baths_min: Optional[float] = None,
        baths_max: Optional[float] = None,
        beds_min: Optional[float] = None,
        beds_max: Optional[float] = None,
        sqft_min: Optional[float] = None,
        sqft_max: Optional[float] = None,
        build_year_min: Optional[float] = None,
        build_year_max: Optional[float] = None,
        days_on: Optional[models.DaysOn] = None,
        sold_in_last: Optional[models.SoldInLast] = None,
        is_basement_finished: Optional[float] = None,
        is_basement_unfinished: Optional[float] = None,
        is_pending_under_contract: Optional[float] = None,
        is_accepting_backup_offers: Optional[float] = None,
        is_coming_soon: Optional[bool] = None,
        other_listings: Optional[bool] = None,
        is_new_construction: Optional[bool] = None,
        keywords: Optional[str] = None,
        lot_size_min: Optional[models.LotSizeMin] = None,
        lot_size_max: Optional[models.LotSizeMax] = None,
        sale_by_agent: Optional[str] = None,
        sale_by_owner: Optional[str] = None,
        is_for_sale_foreclosure: Optional[bool] = None,
        is_waterfront: Optional[bool] = None,
        has_pool: Optional[bool] = None,
        has_air_conditioning: Optional[bool] = None,
        is_city_view: Optional[bool] = None,
        is_mountain_view: Optional[bool] = None,
        is_water_view: Optional[bool] = None,
        is_park_view: Optional[bool] = None,
        is_open_houses_only: Optional[bool] = None,
        is3d_home: Optional[bool] = None,
        coordinates: Optional[str] = None,
        hoa: Optional[float] = None,
        include_homes_with_no_hoa_data: Optional[bool] = None,
        is_auction: Optional[bool] = None,
        schools: Optional[str] = None,
        schools_rating: Optional[str] = None,
        include_unrated_schools: Optional[bool] = None,
        has_garage: Optional[bool] = None,
        parking_spots: Optional[float] = None,
        is_foreclosed: Optional[bool] = None,
        is_pre_foreclosure: Optional[bool] = None,
        is_entire_place: Optional[bool] = None,
        is_room: Optional[bool] = None,
        large_dogs_allowed: Optional[bool] = None,
        small_dogs_allowed: Optional[bool] = None,
        cats_allowed: Optional[bool] = None,
        no_pets: Optional[bool] = None,
        move_in_date: Optional[date] = None,
        parking_available: Optional[bool] = None,
        in_unit_laundry: Optional[bool] = None,
        accepts_applications: Optional[bool] = None,
        income_restricted: Optional[bool] = None,
        hardwood_floor: Optional[bool] = None,
        disabled_access: Optional[bool] = None,
        utilities_included: Optional[bool] = None,
        short_term_lease: Optional[bool] = None,
        furnished: Optional[bool] = None,
        outdoor_space: Optional[bool] = None,
        controlled_access: Optional[bool] = None,
        high_speed_internet: Optional[bool] = None,
        elevator: Optional[bool] = None,
        multi_family_building: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.PropertySearchResponse:
        r"""Search for properties

        :param location: Location details (address, county, neighborhood, or Zip code). Required if  polygon or coordinates are empty.
        :param page: Page number for paginated results. Max value is 20.
        :param status_type: Property status type.
        :param home_type: Property type. Comma-separated list.
        :param sort: Sorting order.
        :param polygon: Polygon coordinates in the format: lon lat,lon1 lat1,lon2 lat2. It is  required if the location or coordinates are empty. The last pair must be the  same as the first pair.
        :param min_price: Minimum price filter.
        :param max_price: Maximum price filter.
        :param rent_min_price: Minimum rent price filter (if status_type = ForRent).
        :param rent_max_price: Maximum rent price filter (if status_type = ForRent).
        :param baths_min: Bathrooms min count.
        :param baths_max: Bathrooms max count.
        :param beds_min: Bedrooms min count.
        :param beds_max: Bedrooms max count.
        :param sqft_min: Square Feet min value.
        :param sqft_max: Square Feet max value.
        :param build_year_min: Year Built min value.
        :param build_year_max: Year Built max value.
        :param days_on: Days on Z. Use with status_type='ForSale' or status_type='ForRent'.
        :param sold_in_last: Sold in the last. Use with status_type='RecentlySold'.
        :param is_basement_finished: Basement filter. Set it to 1 if needed.
        :param is_basement_unfinished: Basement filter. Set it to 1 if needed.
        :param is_pending_under_contract: Pending & Under Contract filter. Set it to 1 if needed.
        :param is_accepting_backup_offers: Accepting Backup Offers filter. Set it to 1 if needed.
        :param is_coming_soon: Coming Soon listings are homes that will soon be on the market. Set it to 1  if needed.
        :param other_listings: If set to 1, the results will only include data from the Other Listings tab.
        :param is_new_construction: New Construction filter. Set it to 1 or true if you only need properties  with New Construction status.
        :param keywords: Keywords filter for property search.
        :param lot_size_min: Minimum lot size.
        :param lot_size_max: Maximum lot size.
        :param sale_by_agent: Default - true. To get FSBO set  saleByAgent=false&saleByOwner=true&otherListings=true.
        :param sale_by_owner: Default - true. To get only FSBO set  saleByAgent=false&saleByOwner=true&otherListings=true.
        :param is_for_sale_foreclosure: If you only need to get ForSaleForeclosure set to true or 1.
        :param is_waterfront:
        :param has_pool:
        :param has_air_conditioning:
        :param is_city_view:
        :param is_mountain_view:
        :param is_water_view:
        :param is_park_view:
        :param is_open_houses_only: Must have open house.
        :param is3d_home: Must have 3D Tour.
        :param coordinates: It is required if the location or polygon is empty. Format: lon lat,diameter. Diameter in miles from 1 to 99 -118.51750373840332  34.007063913440916,20
        :param hoa: Max HOA.
        :param include_homes_with_no_hoa_data: Default - true.
        :param is_auction: Auctions. Default true.
        :param schools: Available values: elementary, public, private, middle, charter, high For multiple selection, separate with comma: middle,high
        :param schools_rating: Min school ratings. From 1 to 10.
        :param include_unrated_schools: Include schools with no rating.
        :param has_garage: Must have a garage. Default value false.
        :param parking_spots: Parking Spots. Max value - 4.
        :param is_foreclosed:
        :param is_pre_foreclosure:
        :param is_entire_place: Default - true. Apply when status_type = 'ForRent'. Set it to false if you  need only a room.
        :param is_room: Default - false. Apply when status_type = 'ForRent'. Set it true and  isEntirePlace to false if you need only a room.
        :param large_dogs_allowed: Allows large dogs. Only For Rent.
        :param small_dogs_allowed: Allows small dogs. Only For Rent.
        :param cats_allowed: Allows cats. Only For Rent.
        :param no_pets: No pets. Only For Rent.
        :param move_in_date: Move-in Date. Only For Rent.
        :param parking_available: On-site Parking. Only For Rent.
        :param in_unit_laundry: In-unit Laundry. Only For Rent.
        :param accepts_applications: Accepts Zillow Applications. Only For Rent.
        :param income_restricted: Income restricted. Only For Rent.
        :param hardwood_floor: Hardwood Floors. Only For Rent.
        :param disabled_access: Disabled Access. Only For Rent.
        :param utilities_included: Utilities Included. Only For Rent.
        :param short_term_lease: Short term lease available. Only For Rent.
        :param furnished: Furnished. Only For Rent.
        :param outdoor_space: Outdoor space. Only For Rent.
        :param controlled_access: Controlled access. Only For Rent.
        :param high_speed_internet: High speed internet. Only For Rent.
        :param elevator: Elevator. Only For Rent.
        :param multi_family_building: Apartment Community. Only For Rent.
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        request = models.PropertyExtendedSearchRequest(
            location=location,
            page=page,
            status_type=status_type,
            home_type=home_type,
            sort=sort,
            polygon=polygon,
            min_price=min_price,
            max_price=max_price,
            rent_min_price=rent_min_price,
            rent_max_price=rent_max_price,
            baths_min=baths_min,
            baths_max=baths_max,
            beds_min=beds_min,
            beds_max=beds_max,
            sqft_min=sqft_min,
            sqft_max=sqft_max,
            build_year_min=build_year_min,
            build_year_max=build_year_max,
            days_on=days_on,
            sold_in_last=sold_in_last,
            is_basement_finished=is_basement_finished,
            is_basement_unfinished=is_basement_unfinished,
            is_pending_under_contract=is_pending_under_contract,
            is_accepting_backup_offers=is_accepting_backup_offers,
            is_coming_soon=is_coming_soon,
            other_listings=other_listings,
            is_new_construction=is_new_construction,
            keywords=keywords,
            lot_size_min=lot_size_min,
            lot_size_max=lot_size_max,
            sale_by_agent=sale_by_agent,
            sale_by_owner=sale_by_owner,
            is_for_sale_foreclosure=is_for_sale_foreclosure,
            is_waterfront=is_waterfront,
            has_pool=has_pool,
            has_air_conditioning=has_air_conditioning,
            is_city_view=is_city_view,
            is_mountain_view=is_mountain_view,
            is_water_view=is_water_view,
            is_park_view=is_park_view,
            is_open_houses_only=is_open_houses_only,
            is3d_home=is3d_home,
            coordinates=coordinates,
            hoa=hoa,
            include_homes_with_no_hoa_data=include_homes_with_no_hoa_data,
            is_auction=is_auction,
            schools=schools,
            schools_rating=schools_rating,
            include_unrated_schools=include_unrated_schools,
            has_garage=has_garage,
            parking_spots=parking_spots,
            is_foreclosed=is_foreclosed,
            is_pre_foreclosure=is_pre_foreclosure,
            is_entire_place=is_entire_place,
            is_room=is_room,
            large_dogs_allowed=large_dogs_allowed,
            small_dogs_allowed=small_dogs_allowed,
            cats_allowed=cats_allowed,
            no_pets=no_pets,
            move_in_date=move_in_date,
            parking_available=parking_available,
            in_unit_laundry=in_unit_laundry,
            accepts_applications=accepts_applications,
            income_restricted=income_restricted,
            hardwood_floor=hardwood_floor,
            disabled_access=disabled_access,
            utilities_included=utilities_included,
            short_term_lease=short_term_lease,
            furnished=furnished,
            outdoor_space=outdoor_space,
            controlled_access=controlled_access,
            high_speed_internet=high_speed_internet,
            elevator=elevator,
            multi_family_building=multi_family_building,
        )

        req = self._build_request_async(
            method="GET",
            path="/propertyExtendedSearch",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=False,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="application/json",
            http_headers=http_headers,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = await self.do_request_async(
            hook_ctx=HookContext(
                base_url=base_url or "",
                operation_id="propertyExtendedSearch",
                oauth2_scopes=[],
                security_source=None,
            ),
            request=req,
            error_status_codes=["400", "4XX", "500", "5XX"],
            retry_config=retry_config,
        )

        if utils.match_response(http_res, "200", "application/json"):
            return utils.unmarshal_json(http_res.text, models.PropertySearchResponse)
        if utils.match_response(http_res, ["400", "4XX"], "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )
        if utils.match_response(http_res, ["500", "5XX"], "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise models.APIError(
                "API error occurred", http_res.status_code, http_res_text, http_res
            )

        content_type = http_res.headers.get("Content-Type")
        http_res_text = await utils.stream_to_text_async(http_res)
        raise models.APIError(
            f"Unexpected response received (code: {http_res.status_code}, type: {content_type})",
            http_res.status_code,
            http_res_text,
            http_res,
        )
