"""
    RentCast API

    No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)

    The version of the OpenAPI document: 1.0
    Contact: support@rentcast.io
    Generated by OpenAPI Generator (https://openapi-generator.tech)

    Do not edit the class manually.
"""  # noqa: E501


import warnings
from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
from typing import Any, Dict, List, Optional, Tuple, Union
from typing_extensions import Annotated

from pydantic import Field, StrictBool, StrictFloat, StrictInt, StrictStr, field_validator
from typing import List, Optional, Union
from typing_extensions import Annotated
from rentcast_client.models.rentcast_market_statistics200_response import RentcastMarketStatistics200Response
from rentcast_client.models.rentcast_property_records200_response_inner import RentcastPropertyRecords200ResponseInner
from rentcast_client.models.rentcast_rent_estimate_long_term200_response import RentcastRentEstimateLongTerm200Response
from rentcast_client.models.rentcast_rental_listings_long_term200_response_inner import RentcastRentalListingsLongTerm200ResponseInner
from rentcast_client.models.rentcast_sale_listing_by_id200_response import RentcastSaleListingById200Response
from rentcast_client.models.rentcast_sale_listings200_response_inner import RentcastSaleListings200ResponseInner
from rentcast_client.models.rentcast_value_estimate200_response import RentcastValueEstimate200Response

from rentcast_client.api_client import ApiClient, RequestSerialized
from rentcast_client.api_response import ApiResponse
from rentcast_client.rest import RESTResponseType


class DefaultRentcast:
    """NOTE: This class is auto generated by OpenAPI Generator
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """

    def __init__(self, api_client=None) -> None:
        if api_client is None:
            api_client = ApiClient.get_default()
        self.api_client = api_client


    @validate_call
    async def market_statistics(
        self,
        zip_code: Annotated[StrictStr, Field(description="A valid 5-digit US zip code")],
        data_type: Annotated[Optional[StrictStr], Field(description="The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided")] = None,
        history_range: Annotated[Optional[StrictInt], Field(description="The time range for historical record entries, in months. Defaults to `12` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastMarketStatistics200Response:
        """Market Statistics

        Returns aggregate market statistics and listing trends for a single US zip code.

        :param zip_code: A valid 5-digit US zip code (required)
        :type zip_code: str
        :param data_type: The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided
        :type data_type: str
        :param history_range: The time range for historical record entries, in months. Defaults to `12` if not provided
        :type history_range: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._market_statistics_serialize(
            zip_code=zip_code,
            data_type=data_type,
            history_range=history_range,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastMarketStatistics200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def market_statistics_with_http_info(
        self,
        zip_code: Annotated[StrictStr, Field(description="A valid 5-digit US zip code")],
        data_type: Annotated[Optional[StrictStr], Field(description="The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided")] = None,
        history_range: Annotated[Optional[StrictInt], Field(description="The time range for historical record entries, in months. Defaults to `12` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastMarketStatistics200Response]:
        """Market Statistics

        Returns aggregate market statistics and listing trends for a single US zip code.

        :param zip_code: A valid 5-digit US zip code (required)
        :type zip_code: str
        :param data_type: The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided
        :type data_type: str
        :param history_range: The time range for historical record entries, in months. Defaults to `12` if not provided
        :type history_range: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._market_statistics_serialize(
            zip_code=zip_code,
            data_type=data_type,
            history_range=history_range,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastMarketStatistics200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def market_statistics_without_preload_content(
        self,
        zip_code: Annotated[StrictStr, Field(description="A valid 5-digit US zip code")],
        data_type: Annotated[Optional[StrictStr], Field(description="The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided")] = None,
        history_range: Annotated[Optional[StrictInt], Field(description="The time range for historical record entries, in months. Defaults to `12` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Market Statistics

        Returns aggregate market statistics and listing trends for a single US zip code.

        :param zip_code: A valid 5-digit US zip code (required)
        :type zip_code: str
        :param data_type: The type of aggregate market data to retrieve. Defaults to `\"All\"` if not provided
        :type data_type: str
        :param history_range: The time range for historical record entries, in months. Defaults to `12` if not provided
        :type history_range: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._market_statistics_serialize(
            zip_code=zip_code,
            data_type=data_type,
            history_range=history_range,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastMarketStatistics200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _market_statistics_serialize(
        self,
        zip_code,
        data_type,
        history_range,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if zip_code is not None:
            
            _query_params.append(('zipCode', zip_code))
            
        if data_type is not None:
            
            _query_params.append(('dataType', data_type))
            
        if history_range is not None:
            
            _query_params.append(('historyRange', history_range))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/markets',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def property_record_by_id(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property record to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastPropertyRecords200ResponseInner:
        """Property Record by Id

        Returns a single property record matching the specified id.

        :param id: The id of the property record to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_record_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastPropertyRecords200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def property_record_by_id_with_http_info(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property record to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastPropertyRecords200ResponseInner]:
        """Property Record by Id

        Returns a single property record matching the specified id.

        :param id: The id of the property record to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_record_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastPropertyRecords200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def property_record_by_id_without_preload_content(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property record to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Property Record by Id

        Returns a single property record matching the specified id.

        :param id: The id of the property record to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_record_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastPropertyRecords200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _property_record_by_id_serialize(
        self,
        id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if id is not None:
            _path_params['id'] = id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/properties/{id}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def property_records(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for properties in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for properties in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        sale_date_range: Annotated[Optional[StrictStr], Field(description="The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> List[RentcastPropertyRecords200ResponseInner]:
        """Property Records

        Search for property records in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area
        :type address: str
        :param city: The name of the city, used to search for properties in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for properties in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param sale_date_range: The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type sale_date_range: str
        :param limit: The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            sale_date_range=sale_date_range,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def property_records_with_http_info(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for properties in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for properties in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        sale_date_range: Annotated[Optional[StrictStr], Field(description="The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[List[RentcastPropertyRecords200ResponseInner]]:
        """Property Records

        Search for property records in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area
        :type address: str
        :param city: The name of the city, used to search for properties in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for properties in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param sale_date_range: The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type sale_date_range: str
        :param limit: The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            sale_date_range=sale_date_range,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def property_records_without_preload_content(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for properties in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for properties in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        sale_date_range: Annotated[Optional[StrictStr], Field(description="The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Property Records

        Search for property records in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for properties in a circular area
        :type address: str
        :param city: The name of the city, used to search for properties in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for properties in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for properties in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for properties in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for properties in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for properties matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for properties matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for properties matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for properties matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param sale_date_range: The number of days since a property was last sold, with a minimum of 1. Used to search for properties that were sold within the specified date range. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type sale_date_range: str
        :param limit: The maximum number of property records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first property record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            sale_date_range=sale_date_range,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _property_records_serialize(
        self,
        address,
        city,
        state,
        zip_code,
        latitude,
        longitude,
        radius,
        property_type,
        bedrooms,
        bathrooms,
        square_footage,
        lot_size,
        year_built,
        sale_date_range,
        limit,
        offset,
        include_total_count,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if address is not None:
            
            _query_params.append(('address', address))
            
        if city is not None:
            
            _query_params.append(('city', city))
            
        if state is not None:
            
            _query_params.append(('state', state))
            
        if zip_code is not None:
            
            _query_params.append(('zipCode', zip_code))
            
        if latitude is not None:
            
            _query_params.append(('latitude', latitude))
            
        if longitude is not None:
            
            _query_params.append(('longitude', longitude))
            
        if radius is not None:
            
            _query_params.append(('radius', radius))
            
        if property_type is not None:
            
            _query_params.append(('propertyType', property_type))
            
        if bedrooms is not None:
            
            _query_params.append(('bedrooms', bedrooms))
            
        if bathrooms is not None:
            
            _query_params.append(('bathrooms', bathrooms))
            
        if square_footage is not None:
            
            _query_params.append(('squareFootage', square_footage))
            
        if lot_size is not None:
            
            _query_params.append(('lotSize', lot_size))
            
        if year_built is not None:
            
            _query_params.append(('yearBuilt', year_built))
            
        if sale_date_range is not None:
            
            _query_params.append(('saleDateRange', sale_date_range))
            
        if limit is not None:
            
            _query_params.append(('limit', limit))
            
        if offset is not None:
            
            _query_params.append(('offset', offset))
            
        if include_total_count is not None:
            
            _query_params.append(('includeTotalCount', include_total_count))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/properties',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def property_records_random(
        self,
        limit: Annotated[Optional[StrictInt], Field(description="The number of property records to return, between 1 and 500. Defaults to `50` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> List[RentcastPropertyRecords200ResponseInner]:
        """Random Property Records

        Returns a list of property records selected at random.

        :param limit: The number of property records to return, between 1 and 500. Defaults to `50` if not provided
        :type limit: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_random_serialize(
            limit=limit,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def property_records_random_with_http_info(
        self,
        limit: Annotated[Optional[StrictInt], Field(description="The number of property records to return, between 1 and 500. Defaults to `50` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[List[RentcastPropertyRecords200ResponseInner]]:
        """Random Property Records

        Returns a list of property records selected at random.

        :param limit: The number of property records to return, between 1 and 500. Defaults to `50` if not provided
        :type limit: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_random_serialize(
            limit=limit,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def property_records_random_without_preload_content(
        self,
        limit: Annotated[Optional[StrictInt], Field(description="The number of property records to return, between 1 and 500. Defaults to `50` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Random Property Records

        Returns a list of property records selected at random.

        :param limit: The number of property records to return, between 1 and 500. Defaults to `50` if not provided
        :type limit: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._property_records_random_serialize(
            limit=limit,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastPropertyRecords200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _property_records_random_serialize(
        self,
        limit,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if limit is not None:
            
            _query_params.append(('limit', limit))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/properties/random',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def rent_estimate_long_term(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastRentEstimateLongTerm200Response:
        """Rent Estimate

        Returns a property rent estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rent_estimate_long_term_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentEstimateLongTerm200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def rent_estimate_long_term_with_http_info(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastRentEstimateLongTerm200Response]:
        """Rent Estimate

        Returns a property rent estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rent_estimate_long_term_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentEstimateLongTerm200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def rent_estimate_long_term_without_preload_content(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Rent Estimate

        Returns a property rent estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the rent estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rent_estimate_long_term_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentEstimateLongTerm200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _rent_estimate_long_term_serialize(
        self,
        address,
        latitude,
        longitude,
        property_type,
        bedrooms,
        bathrooms,
        square_footage,
        max_radius,
        days_old,
        comp_count,
        lookup_subject_attributes,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if address is not None:
            
            _query_params.append(('address', address))
            
        if latitude is not None:
            
            _query_params.append(('latitude', latitude))
            
        if longitude is not None:
            
            _query_params.append(('longitude', longitude))
            
        if property_type is not None:
            
            _query_params.append(('propertyType', property_type))
            
        if bedrooms is not None:
            
            _query_params.append(('bedrooms', bedrooms))
            
        if bathrooms is not None:
            
            _query_params.append(('bathrooms', bathrooms))
            
        if square_footage is not None:
            
            _query_params.append(('squareFootage', square_footage))
            
        if max_radius is not None:
            
            _query_params.append(('maxRadius', max_radius))
            
        if days_old is not None:
            
            _query_params.append(('daysOld', days_old))
            
        if comp_count is not None:
            
            _query_params.append(('compCount', comp_count))
            
        if lookup_subject_attributes is not None:
            
            _query_params.append(('lookupSubjectAttributes', lookup_subject_attributes))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/avm/rent/long-term',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def rental_listing_long_term_by_id(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastRentalListingsLongTerm200ResponseInner:
        """Rental Listing by Id

        Returns a single rental listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listing_long_term_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentalListingsLongTerm200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def rental_listing_long_term_by_id_with_http_info(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastRentalListingsLongTerm200ResponseInner]:
        """Rental Listing by Id

        Returns a single rental listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listing_long_term_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentalListingsLongTerm200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def rental_listing_long_term_by_id_without_preload_content(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Rental Listing by Id

        Returns a single rental listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listing_long_term_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastRentalListingsLongTerm200ResponseInner",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _rental_listing_long_term_by_id_serialize(
        self,
        id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if id is not None:
            _path_params['id'] = id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/listings/rental/long-term/{id}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def rental_listings_long_term(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> List[RentcastRentalListingsLongTerm200ResponseInner]:
        """Rental Listings

        Search for rental listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listings_long_term_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastRentalListingsLongTerm200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def rental_listings_long_term_with_http_info(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[List[RentcastRentalListingsLongTerm200ResponseInner]]:
        """Rental Listings

        Search for rental listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listings_long_term_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastRentalListingsLongTerm200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def rental_listings_long_term_without_preload_content(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Rental Listings

        Search for rental listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed rent of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._rental_listings_long_term_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastRentalListingsLongTerm200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _rental_listings_long_term_serialize(
        self,
        address,
        city,
        state,
        zip_code,
        latitude,
        longitude,
        radius,
        property_type,
        bedrooms,
        bathrooms,
        square_footage,
        lot_size,
        year_built,
        status,
        price,
        days_old,
        limit,
        offset,
        include_total_count,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if address is not None:
            
            _query_params.append(('address', address))
            
        if city is not None:
            
            _query_params.append(('city', city))
            
        if state is not None:
            
            _query_params.append(('state', state))
            
        if zip_code is not None:
            
            _query_params.append(('zipCode', zip_code))
            
        if latitude is not None:
            
            _query_params.append(('latitude', latitude))
            
        if longitude is not None:
            
            _query_params.append(('longitude', longitude))
            
        if radius is not None:
            
            _query_params.append(('radius', radius))
            
        if property_type is not None:
            
            _query_params.append(('propertyType', property_type))
            
        if bedrooms is not None:
            
            _query_params.append(('bedrooms', bedrooms))
            
        if bathrooms is not None:
            
            _query_params.append(('bathrooms', bathrooms))
            
        if square_footage is not None:
            
            _query_params.append(('squareFootage', square_footage))
            
        if lot_size is not None:
            
            _query_params.append(('lotSize', lot_size))
            
        if year_built is not None:
            
            _query_params.append(('yearBuilt', year_built))
            
        if status is not None:
            
            _query_params.append(('status', status))
            
        if price is not None:
            
            _query_params.append(('price', price))
            
        if days_old is not None:
            
            _query_params.append(('daysOld', days_old))
            
        if limit is not None:
            
            _query_params.append(('limit', limit))
            
        if offset is not None:
            
            _query_params.append(('offset', offset))
            
        if include_total_count is not None:
            
            _query_params.append(('includeTotalCount', include_total_count))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/listings/rental/long-term',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def sale_listing_by_id(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastSaleListingById200Response:
        """Sale Listing by Id

        Returns a single sale listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listing_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastSaleListingById200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def sale_listing_by_id_with_http_info(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastSaleListingById200Response]:
        """Sale Listing by Id

        Returns a single sale listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listing_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastSaleListingById200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def sale_listing_by_id_without_preload_content(
        self,
        id: Annotated[StrictStr, Field(description="The id of the property listing to return")],
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Sale Listing by Id

        Returns a single sale listing matching the specified id.

        :param id: The id of the property listing to return (required)
        :type id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listing_by_id_serialize(
            id=id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastSaleListingById200Response",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _sale_listing_by_id_serialize(
        self,
        id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if id is not None:
            _path_params['id'] = id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/listings/sale/{id}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def sale_listings(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> List[RentcastSaleListings200ResponseInner]:
        """Sale Listings

        Search for sale listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listings_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastSaleListings200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def sale_listings_with_http_info(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[List[RentcastSaleListings200ResponseInner]]:
        """Sale Listings

        Search for sale listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listings_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastSaleListings200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def sale_listings_without_preload_content(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area")] = None,
        city: Annotated[Optional[StrictStr], Field(description="The name of the city, used to search for listings in a specific city. This parameter is case-sensitive")] = None,
        state: Annotated[Optional[StrictStr], Field(description="The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive")] = None,
        zip_code: Annotated[Optional[StrictStr], Field(description="The 5-digit zip code, used to search for listings in a specific zip code")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area")] = None,
        radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bedrooms: Annotated[Optional[StrictStr], Field(description="The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        bathrooms: Annotated[Optional[StrictStr], Field(description="The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        square_footage: Annotated[Optional[StrictStr], Field(description="The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        lot_size: Annotated[Optional[StrictStr], Field(description="The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        year_built: Annotated[Optional[StrictStr], Field(description="The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        status: Annotated[Optional[StrictStr], Field(description="The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)")] = None,
        price: Annotated[Optional[StrictStr], Field(description="The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)")] = None,
        days_old: Annotated[Optional[StrictStr], Field(description="The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        offset: Annotated[Optional[StrictInt], Field(description="The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination")] = None,
        include_total_count: Annotated[Optional[StrictBool], Field(description="When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Sale Listings

        Search for sale listings in a geographical area, or by a specific address.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. Used to retrieve data for a specific property, or together with the `radius` parameter to search for listings in a circular area
        :type address: str
        :param city: The name of the city, used to search for listings in a specific city. This parameter is case-sensitive
        :type city: str
        :param state: The 2-character state abbreviation, used to search for listings in a specific state. This parameter is case-sensitive
        :type state: str
        :param zip_code: The 5-digit zip code, used to search for listings in a specific zip code
        :type zip_code: str
        :param latitude: The latitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type latitude: float
        :param longitude: The longitude of the search area. Use the `latitude`/`longitude` and `radius` parameters to search for listings in a circular area
        :type longitude: float
        :param radius: The radius of the search area in miles, with a maximum of 100. Use in combination with the `latitude`/`longitude` or `address` parameters to search for listings in a circular area
        :type radius: float
        :param property_type: The type of the property, used to search for listings matching this criteria. See [explanation of property types](https://developers.rentcast.io/reference/property-types). Supports [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type property_type: str
        :param bedrooms: The number of bedrooms, used to search for listings matching this criteria. Use `0` to indicate a studio layout. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bedrooms: str
        :param bathrooms: The number of bathrooms, used to search for listings matching this criteria. Supports fractions to indicate partial bathrooms, [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type bathrooms: str
        :param square_footage: The total living area size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type square_footage: str
        :param lot_size: The total lot size in square feet, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type lot_size: str
        :param year_built: The year of construction, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type year_built: str
        :param status: The current listing status, used to search for listings matching this criteria. See [explanation of listing statuses](https://developers.rentcast.io/reference/property-listings-schema#listing-status-field-values)
        :type status: str
        :param price: The listed price of the property, used to search for listings matching this criteria. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters) and [multiple values](https://developers.rentcast.io/reference/search-queries#using-multiple-value-parameters)
        :type price: str
        :param days_old: The number of days since a property was listed on the market, with a minimum of 1. Supports [numeric ranges](https://developers.rentcast.io/reference/search-queries#using-numeric-range-parameters)
        :type days_old: str
        :param limit: The maximum number of listing records to return, between 1 and 500. Defaults to `50` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type limit: int
        :param offset: The index of the first listing record to return, used to paginate through large lists of results. Defaults to `0` if not provided. [Learn more](https://developers.rentcast.io/reference/pagination) about pagination
        :type offset: int
        :param include_total_count: When enabled, will return the total number of results matching the current query in the `X-Total-Count` response header. Defaults to `false` if not provided
        :type include_total_count: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._sale_listings_serialize(
            address=address,
            city=city,
            state=state,
            zip_code=zip_code,
            latitude=latitude,
            longitude=longitude,
            radius=radius,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            lot_size=lot_size,
            year_built=year_built,
            status=status,
            price=price,
            days_old=days_old,
            limit=limit,
            offset=offset,
            include_total_count=include_total_count,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "List[RentcastSaleListings200ResponseInner]",
            '401': "RentcastPropertyRecords401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _sale_listings_serialize(
        self,
        address,
        city,
        state,
        zip_code,
        latitude,
        longitude,
        radius,
        property_type,
        bedrooms,
        bathrooms,
        square_footage,
        lot_size,
        year_built,
        status,
        price,
        days_old,
        limit,
        offset,
        include_total_count,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if address is not None:
            
            _query_params.append(('address', address))
            
        if city is not None:
            
            _query_params.append(('city', city))
            
        if state is not None:
            
            _query_params.append(('state', state))
            
        if zip_code is not None:
            
            _query_params.append(('zipCode', zip_code))
            
        if latitude is not None:
            
            _query_params.append(('latitude', latitude))
            
        if longitude is not None:
            
            _query_params.append(('longitude', longitude))
            
        if radius is not None:
            
            _query_params.append(('radius', radius))
            
        if property_type is not None:
            
            _query_params.append(('propertyType', property_type))
            
        if bedrooms is not None:
            
            _query_params.append(('bedrooms', bedrooms))
            
        if bathrooms is not None:
            
            _query_params.append(('bathrooms', bathrooms))
            
        if square_footage is not None:
            
            _query_params.append(('squareFootage', square_footage))
            
        if lot_size is not None:
            
            _query_params.append(('lotSize', lot_size))
            
        if year_built is not None:
            
            _query_params.append(('yearBuilt', year_built))
            
        if status is not None:
            
            _query_params.append(('status', status))
            
        if price is not None:
            
            _query_params.append(('price', price))
            
        if days_old is not None:
            
            _query_params.append(('daysOld', days_old))
            
        if limit is not None:
            
            _query_params.append(('limit', limit))
            
        if offset is not None:
            
            _query_params.append(('offset', offset))
            
        if include_total_count is not None:
            
            _query_params.append(('includeTotalCount', include_total_count))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/listings/sale',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )




    @validate_call
    async def value_estimate(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RentcastValueEstimate200Response:
        """Value Estimate

        Returns a property value estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._value_estimate_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastValueEstimate200Response",
            '401': "RentcastValueEstimate401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    async def value_estimate_with_http_info(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RentcastValueEstimate200Response]:
        """Value Estimate

        Returns a property value estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._value_estimate_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastValueEstimate200Response",
            '401': "RentcastValueEstimate401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        await response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    async def value_estimate_without_preload_content(
        self,
        address: Annotated[Optional[StrictStr], Field(description="The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters")] = None,
        latitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        longitude: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter")] = None,
        property_type: Annotated[Optional[StrictStr], Field(description="The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)")] = None,
        bedrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bedrooms in the property. Use `0` to indicate a studio layout")] = None,
        bathrooms: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The number of bathrooms in the property. Supports fractions to indicate partial bathrooms")] = None,
        square_footage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The total living area size of the property, in square feet")] = None,
        max_radius: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The maximum distance between comparable listings and the subject property, in miles")] = None,
        days_old: Annotated[Optional[StrictInt], Field(description="The maximum number of days since comparable listings were last seen on the market, with a minimum of 1")] = None,
        comp_count: Annotated[Optional[StrictInt], Field(description="The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided")] = None,
        lookup_subject_attributes: Annotated[Optional[StrictBool], Field(description="When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """Value Estimate

        Returns a property value estimate and comparable properties.

        :param address: The **full address** of the property, in the format `Street, City, State, Zip`. You need to provide either the `address` or the `latitude`/`longitude` parameters
        :type address: str
        :param latitude: The latitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type latitude: float
        :param longitude: The longitude of the property. The `latitude`/`longitude` can be provided instead of the `address` parameter
        :type longitude: float
        :param property_type: The type of the property. See [explanation of property types](https://developers.rentcast.io/reference/property-types)
        :type property_type: str
        :param bedrooms: The number of bedrooms in the property. Use `0` to indicate a studio layout
        :type bedrooms: float
        :param bathrooms: The number of bathrooms in the property. Supports fractions to indicate partial bathrooms
        :type bathrooms: float
        :param square_footage: The total living area size of the property, in square feet
        :type square_footage: float
        :param max_radius: The maximum distance between comparable listings and the subject property, in miles
        :type max_radius: float
        :param days_old: The maximum number of days since comparable listings were last seen on the market, with a minimum of 1
        :type days_old: int
        :param comp_count: The number of comparable listings to use when calculating the value estimate, between 5 and 25. Defaults to `15` if not provided
        :type comp_count: int
        :param lookup_subject_attributes: When enabled, will attempt to look up subject property attributes to find more relevant comps. Defaults to `true` if not provided. [Learn more](https://developers.rentcast.io/reference/property-valuation#subject-property-attribute-lookup) about this feature
        :type lookup_subject_attributes: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._value_estimate_serialize(
            address=address,
            latitude=latitude,
            longitude=longitude,
            property_type=property_type,
            bedrooms=bedrooms,
            bathrooms=bathrooms,
            square_footage=square_footage,
            max_radius=max_radius,
            days_old=days_old,
            comp_count=comp_count,
            lookup_subject_attributes=lookup_subject_attributes,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RentcastValueEstimate200Response",
            '401': "RentcastValueEstimate401Response",
        }
        response_data = await self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _value_estimate_serialize(
        self,
        address,
        latitude,
        longitude,
        property_type,
        bedrooms,
        bathrooms,
        square_footage,
        max_radius,
        days_old,
        comp_count,
        lookup_subject_attributes,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if address is not None:
            
            _query_params.append(('address', address))
            
        if latitude is not None:
            
            _query_params.append(('latitude', latitude))
            
        if longitude is not None:
            
            _query_params.append(('longitude', longitude))
            
        if property_type is not None:
            
            _query_params.append(('propertyType', property_type))
            
        if bedrooms is not None:
            
            _query_params.append(('bedrooms', bedrooms))
            
        if bathrooms is not None:
            
            _query_params.append(('bathrooms', bathrooms))
            
        if square_footage is not None:
            
            _query_params.append(('squareFootage', square_footage))
            
        if max_radius is not None:
            
            _query_params.append(('maxRadius', max_radius))
            
        if days_old is not None:
            
            _query_params.append(('daysOld', days_old))
            
        if comp_count is not None:
            
            _query_params.append(('compCount', comp_count))
            
        if lookup_subject_attributes is not None:
            
            _query_params.append(('lookupSubjectAttributes', lookup_subject_attributes))
            
        # process the header parameters
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'sec0'
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/avm/value',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


