# coding: utf-8

"""
    Acre Platform User API

    # CORS CORS is implemented by all Acre API endpoints and only certain hostnames are allowed for each deployment of the API. If your use case requires calling the Acre User API from a browser, please contact Acre to arrange the appropriate configuration. # API Authentication The primary method of authentication for users of the Acre API is with the use of JSON Web Tokens (JWTs), which are suplemented by an application specific API Key. The API key must be provided through the `X-API-KEY` HTTP header and will be provided by your Acre Customer Success Manager. The JWT must be provided through a cookie with key of `authorization`. The JWT must be generated and signed as per the following section. # Generating JWTs JWT must either be generated by a third-party such as Azure ADB2C that has been configured for the appropriate service and/or user account, or alternatively can be generated locally and signed by an private key for which the public key has been made available to Acre via a JWKS URL. In addition to being signed by your private key, the JWT will also need to contain at a minimum:  * An issuer `iss`, which must be a valid URI previously agreed with Acre.  * A subject `sub`, which must be a unique identifier for the user and/or service account previously agreed with Acre.  * An expiry time `exp` which must not be more than four hours in the future.  * A not before time `nbf` which must be in the past, but not greater than six hours in the past.  The JWT should be signed using RS256.

    The version of the OpenAPI document: 1.0
    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 acre_api.models.cdm_add_mortgage_case_response import CdmAddMortgageCaseResponse
from acre_api.models.cdm_add_mortgage_product_response import CdmAddMortgageProductResponse
from acre_api.models.cdm_create_acre_mortgage_product_request import CdmCreateAcreMortgageProductRequest
from acre_api.models.cdm_create_acre_mortgage_product_response import CdmCreateAcreMortgageProductResponse
from acre_api.models.cdm_create_mortgage_response import CdmCreateMortgageResponse
from acre_api.models.cdm_create_mortgage_version_response import CdmCreateMortgageVersionResponse
from acre_api.models.cdm_create_mortgage_with_product_request import CdmCreateMortgageWithProductRequest
from acre_api.models.cdm_create_mortgage_with_product_response import CdmCreateMortgageWithProductResponse
from acre_api.models.cdm_delete_mortgage_case_response import CdmDeleteMortgageCaseResponse
from acre_api.models.cdm_delete_mortgage_product_response import CdmDeleteMortgageProductResponse
from acre_api.models.cdm_get_acre_mortgage_product_response import CdmGetAcreMortgageProductResponse
from acre_api.models.cdm_get_mortgage_response import CdmGetMortgageResponse
from acre_api.models.cdm_get_mortgage_version_response import CdmGetMortgageVersionResponse
from acre_api.models.cdm_mortgage import CdmMortgage
from acre_api.models.cdm_replace_mortgage_response import CdmReplaceMortgageResponse
from acre_api.models.cdm_update_mortgage_response import CdmUpdateMortgageResponse
from acre_api.models.cdm_update_mortgage_with_product_response import CdmUpdateMortgageWithProductResponse
from acre_api.models.complete_details_of_the_mortgage_to_be_replaced_required import CompleteDetailsOfTheMortgageToBeReplacedRequired
from acre_api.models.mortgage_product_and_sourcing_details_to_update import MortgageProductAndSourcingDetailsToUpdate
from acre_api.models.partial_details_of_the_mortgage_to_be_replaced_required import PartialDetailsOfTheMortgageToBeReplacedRequired
from acre_api.models.srv_acre_processor_add_mortgage_case_body import SrvAcreProcessorAddMortgageCaseBody
from acre_api.models.srv_acre_processor_add_mortgage_product_body import SrvAcreProcessorAddMortgageProductBody

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


class MortgageMortgageProductApi:
    """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
    def add_mortgage_case(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to be added to the case.")],
        body: SrvAcreProcessorAddMortgageCaseBody,
        _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,
    ) -> CdmAddMortgageCaseResponse:
        """Add a mortgage to an existing case.


        :param mortgage_id: ID of the mortgage to be added to the case. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageCaseBody
        :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._add_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def add_mortgage_case_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to be added to the case.")],
        body: SrvAcreProcessorAddMortgageCaseBody,
        _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[CdmAddMortgageCaseResponse]:
        """Add a mortgage to an existing case.


        :param mortgage_id: ID of the mortgage to be added to the case. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageCaseBody
        :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._add_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def add_mortgage_case_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to be added to the case.")],
        body: SrvAcreProcessorAddMortgageCaseBody,
        _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:
        """Add a mortgage to an existing case.


        :param mortgage_id: ID of the mortgage to be added to the case. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageCaseBody
        :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._add_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _add_mortgage_case_serialize(
        self,
        mortgage_id,
        body,
        _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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage/{mortgage_id}/case',
            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
    def add_mortgage_product(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to add a product to. Required.")],
        body: SrvAcreProcessorAddMortgageProductBody,
        _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,
    ) -> CdmAddMortgageProductResponse:
        """Add a mortgage product to an existing mortgage.


        :param mortgage_id: ID of the mortgage to add a product to. Required. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageProductBody
        :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._add_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def add_mortgage_product_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to add a product to. Required.")],
        body: SrvAcreProcessorAddMortgageProductBody,
        _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[CdmAddMortgageProductResponse]:
        """Add a mortgage product to an existing mortgage.


        :param mortgage_id: ID of the mortgage to add a product to. Required. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageProductBody
        :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._add_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def add_mortgage_product_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to add a product to. Required.")],
        body: SrvAcreProcessorAddMortgageProductBody,
        _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:
        """Add a mortgage product to an existing mortgage.


        :param mortgage_id: ID of the mortgage to add a product to. Required. (required)
        :type mortgage_id: str
        :param body: (required)
        :type body: SrvAcreProcessorAddMortgageProductBody
        :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._add_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmAddMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _add_mortgage_product_serialize(
        self,
        mortgage_id,
        body,
        _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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage/{mortgage_id}/product',
            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
    def create_acre_mortgage_product(
        self,
        body: Annotated[CdmCreateAcreMortgageProductRequest, Field(description="Create a mortgage product within Acre.")],
        _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,
    ) -> CdmCreateAcreMortgageProductResponse:
        """Create a mortgage product stored within Acre.


        :param body: Create a mortgage product within Acre. (required)
        :type body: CdmCreateAcreMortgageProductRequest
        :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._create_acre_mortgage_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def create_acre_mortgage_product_with_http_info(
        self,
        body: Annotated[CdmCreateAcreMortgageProductRequest, Field(description="Create a mortgage product within Acre.")],
        _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[CdmCreateAcreMortgageProductResponse]:
        """Create a mortgage product stored within Acre.


        :param body: Create a mortgage product within Acre. (required)
        :type body: CdmCreateAcreMortgageProductRequest
        :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._create_acre_mortgage_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def create_acre_mortgage_product_without_preload_content(
        self,
        body: Annotated[CdmCreateAcreMortgageProductRequest, Field(description="Create a mortgage product within Acre.")],
        _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:
        """Create a mortgage product stored within Acre.


        :param body: Create a mortgage product within Acre. (required)
        :type body: CdmCreateAcreMortgageProductRequest
        :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._create_acre_mortgage_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _create_acre_mortgage_product_serialize(
        self,
        body,
        _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
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage_product',
            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
    def create_mortgage(
        self,
        mortgage: Annotated[CdmMortgage, Field(description="Mortgage details. Required.")],
        _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,
    ) -> CdmCreateMortgageResponse:
        """Create a new mortgage.


        :param mortgage: Mortgage details. Required. (required)
        :type mortgage: CdmMortgage
        :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._create_mortgage_serialize(
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def create_mortgage_with_http_info(
        self,
        mortgage: Annotated[CdmMortgage, Field(description="Mortgage details. Required.")],
        _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[CdmCreateMortgageResponse]:
        """Create a new mortgage.


        :param mortgage: Mortgage details. Required. (required)
        :type mortgage: CdmMortgage
        :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._create_mortgage_serialize(
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def create_mortgage_without_preload_content(
        self,
        mortgage: Annotated[CdmMortgage, Field(description="Mortgage details. Required.")],
        _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:
        """Create a new mortgage.


        :param mortgage: Mortgage details. Required. (required)
        :type mortgage: CdmMortgage
        :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._create_mortgage_serialize(
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _create_mortgage_serialize(
        self,
        mortgage,
        _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
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if mortgage is not None:
            _body_params = mortgage


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage',
            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
    def create_mortgage_version(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        _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,
    ) -> CdmCreateMortgageVersionResponse:
        """Create a Mortgage version.


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_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._create_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def create_mortgage_version_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        _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[CdmCreateMortgageVersionResponse]:
        """Create a Mortgage version.


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_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._create_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def create_mortgage_version_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        _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:
        """Create a Mortgage version.


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_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._create_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _create_mortgage_version_serialize(
        self,
        mortgage_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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_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] = [
        ]

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage/{mortgage_id}/version',
            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
    def create_mortgage_with_product(
        self,
        body: Annotated[CdmCreateMortgageWithProductRequest, Field(description="Create a mortgage and product within Acre, and link to case if ID supplied.")],
        _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,
    ) -> CdmCreateMortgageWithProductResponse:
        """Create a new mortgage with a product and link it to a case.


        :param body: Create a mortgage and product within Acre, and link to case if ID supplied. (required)
        :type body: CdmCreateMortgageWithProductRequest
        :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._create_mortgage_with_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def create_mortgage_with_product_with_http_info(
        self,
        body: Annotated[CdmCreateMortgageWithProductRequest, Field(description="Create a mortgage and product within Acre, and link to case if ID supplied.")],
        _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[CdmCreateMortgageWithProductResponse]:
        """Create a new mortgage with a product and link it to a case.


        :param body: Create a mortgage and product within Acre, and link to case if ID supplied. (required)
        :type body: CdmCreateMortgageWithProductRequest
        :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._create_mortgage_with_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def create_mortgage_with_product_without_preload_content(
        self,
        body: Annotated[CdmCreateMortgageWithProductRequest, Field(description="Create a mortgage and product within Acre, and link to case if ID supplied.")],
        _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:
        """Create a new mortgage with a product and link it to a case.


        :param body: Create a mortgage and product within Acre, and link to case if ID supplied. (required)
        :type body: CdmCreateMortgageWithProductRequest
        :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._create_mortgage_with_product_serialize(
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmCreateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _create_mortgage_with_product_serialize(
        self,
        body,
        _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
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v1/acre/mortgage_with_product',
            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
    def delete_mortgage_case(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove.")],
        case_id: Annotated[StrictStr, Field(description="Case to remove the mortgage. Required.")],
        reason: Annotated[Optional[StrictStr], Field(description="Reason for removing the mortgage. Required.")] = 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,
    ) -> CdmDeleteMortgageCaseResponse:
        """Delete (DELETE) mortgage from an existing case.


        :param mortgage_id: ID of the mortgage to remove. (required)
        :type mortgage_id: str
        :param case_id: Case to remove the mortgage. Required. (required)
        :type case_id: str
        :param reason: Reason for removing the mortgage. Required.
        :type reason: 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._delete_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            case_id=case_id,
            reason=reason,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def delete_mortgage_case_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove.")],
        case_id: Annotated[StrictStr, Field(description="Case to remove the mortgage. Required.")],
        reason: Annotated[Optional[StrictStr], Field(description="Reason for removing the mortgage. Required.")] = 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[CdmDeleteMortgageCaseResponse]:
        """Delete (DELETE) mortgage from an existing case.


        :param mortgage_id: ID of the mortgage to remove. (required)
        :type mortgage_id: str
        :param case_id: Case to remove the mortgage. Required. (required)
        :type case_id: str
        :param reason: Reason for removing the mortgage. Required.
        :type reason: 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._delete_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            case_id=case_id,
            reason=reason,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def delete_mortgage_case_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove.")],
        case_id: Annotated[StrictStr, Field(description="Case to remove the mortgage. Required.")],
        reason: Annotated[Optional[StrictStr], Field(description="Reason for removing the mortgage. Required.")] = 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:
        """Delete (DELETE) mortgage from an existing case.


        :param mortgage_id: ID of the mortgage to remove. (required)
        :type mortgage_id: str
        :param case_id: Case to remove the mortgage. Required. (required)
        :type case_id: str
        :param reason: Reason for removing the mortgage. Required.
        :type reason: 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._delete_mortgage_case_serialize(
            mortgage_id=mortgage_id,
            case_id=case_id,
            reason=reason,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageCaseResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _delete_mortgage_case_serialize(
        self,
        mortgage_id,
        case_id,
        reason,
        _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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_id
        if case_id is not None:
            _path_params['case_id'] = case_id
        # process the query parameters
        if reason is not None:
            
            _query_params.append(('reason', reason))
            
        # 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] = [
        ]

        return self.api_client.param_serialize(
            method='DELETE',
            resource_path='/v1/acre/mortgage/{mortgage_id}/case/{case_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
    def delete_mortgage_product(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove the product. Required.")],
        product_id: Annotated[StrictStr, Field(description="ID of the product to be removed. Required.")],
        _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,
    ) -> CdmDeleteMortgageProductResponse:
        """Delete (DELETE) mortgage product from an existing mortgage.


        :param mortgage_id: ID of the mortgage to remove the product. Required. (required)
        :type mortgage_id: str
        :param product_id: ID of the product to be removed. Required. (required)
        :type product_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._delete_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            product_id=product_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def delete_mortgage_product_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove the product. Required.")],
        product_id: Annotated[StrictStr, Field(description="ID of the product to be removed. Required.")],
        _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[CdmDeleteMortgageProductResponse]:
        """Delete (DELETE) mortgage product from an existing mortgage.


        :param mortgage_id: ID of the mortgage to remove the product. Required. (required)
        :type mortgage_id: str
        :param product_id: ID of the product to be removed. Required. (required)
        :type product_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._delete_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            product_id=product_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def delete_mortgage_product_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="ID of the mortgage to remove the product. Required.")],
        product_id: Annotated[StrictStr, Field(description="ID of the product to be removed. Required.")],
        _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:
        """Delete (DELETE) mortgage product from an existing mortgage.


        :param mortgage_id: ID of the mortgage to remove the product. Required. (required)
        :type mortgage_id: str
        :param product_id: ID of the product to be removed. Required. (required)
        :type product_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._delete_mortgage_product_serialize(
            mortgage_id=mortgage_id,
            product_id=product_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmDeleteMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _delete_mortgage_product_serialize(
        self,
        mortgage_id,
        product_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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_id
        if product_id is not None:
            _path_params['product_id'] = product_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] = [
        ]

        return self.api_client.param_serialize(
            method='DELETE',
            resource_path='/v1/acre/mortgage/{mortgage_id}/product/{product_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
    def get_acre_mortgage_product(
        self,
        product_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage product (cannot be used with `product_details`). Required.")],
        product_details_product_code: Annotated[Optional[StrictStr], Field(description="A unique identifier for each product within the engine.")] = None,
        product_details_product_name: Annotated[Optional[StrictStr], Field(description="Name of the product.")] = None,
        product_details_lender_code: Annotated[Optional[StrictStr], Field(description="Lender Code of the applicant’s existing mortgage lender.")] = None,
        product_details_lender_name: Annotated[Optional[StrictStr], Field(description="The mortgage lender’s name.")] = None,
        product_details_initial_pay_rate: Annotated[Optional[StrictInt], Field(description="The initial pay rate.")] = None,
        product_details_mortgage_class: Annotated[Optional[StrictStr], Field(description="The class of the product")] = None,
        product_details_applicant_type_conditions: Annotated[Optional[StrictStr], Field(description="Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.")] = None,
        product_details_full_rate_description: Annotated[Optional[StrictStr], Field(description="A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.")] = None,
        product_details_apr_lenders: Annotated[Optional[StrictInt], Field(description="Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values")] = None,
        product_details_max_ltv_available: Annotated[Optional[StrictInt], Field(description="The maximum loan to value available for the product.")] = None,
        product_details_applicant1_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app1 income to calculate the maximum available based on income.")] = None,
        product_details_applicant2_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app2 income to calculate the maximum available based on income.")] = None,
        product_details_joint_applicant_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against both applicants income to calculate the maximum available based on income.")] = None,
        product_details_standard_variable_rate: Annotated[Optional[StrictInt], Field(description="This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_initial_monthly_payment: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.")] = None,
        product_details_cashback: Annotated[Optional[StrictStr], Field(description="Total cashback amount available for the product (in pence, not GBP).")] = None,
        product_details_cashback_conditions: Annotated[Optional[StrictStr], Field(description="Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).")] = None,
        product_details_valuation_fee: Annotated[Optional[StrictStr], Field(description="How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).")] = None,
        product_details_valuation_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.")] = None,
        product_details_arrangement_fee: Annotated[Optional[StrictStr], Field(description="The amount of the arrangement fee for the product (in pence, not GBP).")] = None,
        product_details_arrangement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_booking_fee: Annotated[Optional[StrictStr], Field(description="The amount of the Booking fee for the product (in pence, not GBP).")] = None,
        product_details_booking_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_higher_lending_charge: Annotated[Optional[StrictStr], Field(description="The amount of the Higher lending charge fee for the product (in pence, not GBP).")] = None,
        product_details_higher_lending_charge_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_free_legal_fees: Annotated[Optional[StrictBool], Field(description="Indicates if the product offers free legal fees as an incentive.")] = None,
        product_details_free_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.")] = None,
        product_details_chaps_fee: Annotated[Optional[StrictStr], Field(description="The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).")] = None,
        product_details_fees_payable_on_application: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).")] = None,
        product_details_fees_payable_on_completion: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).")] = None,
        product_details_fees_total: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable (in pence, not GBP).")] = None,
        product_details_early_repayment_charge_applies_until: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).")] = None,
        product_details_early_repayment_charge_applies_until_calculated_date: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.")] = None,
        product_details_product_notes: Annotated[Optional[StrictStr], Field(description="Any free-form notes for the specific product.")] = None,
        product_details_employed_prob_period: Annotated[Optional[StrictStr], Field(description="An Employed applicants available probationary period.")] = None,
        product_details_max_property_valuation: Annotated[Optional[StrictStr], Field(description="Max property valuation acceptable (in pence, not GBP).")] = None,
        product_details_studio_flat_flag: Annotated[Optional[StrictStr], Field(description="Studio flat acceptable.")] = None,
        product_details_proc_fee_code: Annotated[Optional[StrictStr], Field(description="The proc fee code. (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_min: Annotated[Optional[StrictStr], Field(description="Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_max: Annotated[Optional[StrictStr], Field(description="Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_monthly_payment_after_initial_period_plus_1perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 1%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_2perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 2%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_3perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 3%.")] = None,
        product_details_self_build: Annotated[Optional[StrictStr], Field(description="Describes whether the product is available for Self-Build.")] = None,
        product_details_shared_ownership: Annotated[Optional[StrictStr], Field(description="Product available for Shared Ownership.")] = None,
        product_details_mortgage_discharge_fee: Annotated[Optional[StrictStr], Field(description="Mortgage Discharge Fee (in pence, not GBP).")] = None,
        product_details_deeds_release_fee: Annotated[Optional[StrictStr], Field(description="Deeds Release Fee (in pence, not GBP).")] = None,
        product_details_funds_transfer_fee_rule: Annotated[Optional[StrictStr], Field(description="Specifies the add to loan conditions for the Funds Transfer Fee.")] = None,
        product_details_capital_rest_period: Annotated[Optional[StrictStr], Field(description="Specifies the Capital Rest Period (Daily, Monthly, Annually)")] = None,
        product_details_help_to_buy_shared_equity: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Shared Equity.")] = None,
        product_details_help_to_buy_mortgage_guarantee: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Mortgage Guarantee.")] = None,
        product_details_broker_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="**DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.")] = None,
        product_details_broker_fee_conditions: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.")] = None,
        product_details_packager_reference: Annotated[Optional[StrictStr], Field(description="The organisation identifier of the Packager if relevant.")] = None,
        product_details_packager_name: Annotated[Optional[StrictStr], Field(description="The name of the Packager.")] = None,
        product_details_packager_tel_no: Annotated[Optional[StrictStr], Field(description="The telephone number of the Packager.")] = None,
        product_details_packager_web_address: Annotated[Optional[StrictStr], Field(description="The web address url of the Packager.")] = None,
        product_details_lender_criteria_url: Annotated[Optional[StrictStr], Field(description="A String specifying the url to use to navigate to the Lender’s own criteria.")] = None,
        product_details_lender_product_reference: Annotated[Optional[StrictStr], Field(description="Specifies the lender’s reference number or code for the product.")] = None,
        product_details_homebuyers_fee: Annotated[Optional[StrictStr], Field(description="The amount of the homebuyers fee for the product (in pence, not GBP).")] = None,
        product_details_homebuyers_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the homebuyers fee.")] = None,
        product_details_legal_fee: Annotated[Optional[StrictStr], Field(description="The amount of the legal fee (in pence, not GBP).")] = None,
        product_details_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the legal fee.")] = None,
        product_details_product_type: Annotated[Optional[StrictStr], Field(description="The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.")] = None,
        product_details_net_proc_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The amount of the net proc fee. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_min: Annotated[Optional[StrictStr], Field(description="The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_max: Annotated[Optional[StrictStr], Field(description="The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_mortgage_discharge_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the mortgage discharge fee is payable.")] = None,
        product_details_product_match_status: Annotated[Optional[StrictStr], Field(description="This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.")] = None,
        product_details_reject_reasons: Annotated[Optional[StrictStr], Field(description="A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.")] = None,
        product_details_max_loan_available: Annotated[Optional[StrictStr], Field(description="The maximum calculated loan amount available for this product (in pence, not GBP).")] = None,
        product_details_buy_to_let_rental_income_calculation_rate: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The rate value used in the calculation to determine the required rental income for BTL.")] = None,
        product_details_disbursement_fee: Annotated[Optional[StrictStr], Field(description="The Disbursement Fee amount (in pence, not GBP).")] = None,
        product_details_disbursement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_true_cost_full_term: Annotated[Optional[StrictStr], Field(description="This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).")] = None,
        product_details_initial_monthly_payment_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.")] = None,
        product_details_true_cost_full_term_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_initial_period_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_selected_mortgage_club_code: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** moved to mortgage.  The selected mortgage club code.")] = None,
        product_details_max_overpayment_percent_no_erc: Annotated[Optional[StrictInt], Field(description="Describes the maximum overpayment percentage when no ERC.")] = None,
        product_details_overpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows overpayments.")] = None,
        product_details_overpayment_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage allows overpayments, provide details and conditions for overpayment.")] = None,
        product_details_underpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows underpayments.")] = None,
        product_details_payment_holidays_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows payment holidays.")] = None,
        product_details_date_last_modified: Annotated[Optional[StrictStr], Field(description="The date that the product data was last modified (RFC3339)")] = None,
        product_details_optional_partial_repayment: Annotated[Optional[StrictBool], Field(description="Ability to make Optional Partial Repayments for the Equity Release Product.")] = None,
        product_details_apply_online: Annotated[Optional[StrictBool], Field(description="Indicates whether the product can be applied for online using MortgageApply.  more details")] = None,
        product_details_lender_tel_no: Annotated[Optional[StrictStr], Field(description="Telephone number of the lender.")] = None,
        product_details_lender_web_address: Annotated[Optional[StrictStr], Field(description="Web address of the lender.")] = None,
        product_details_initial_rate_period: Annotated[Optional[StrictStr], Field(description="The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"")] = None,
        product_details_initial_rate_period_months: Annotated[Optional[StrictInt], Field(description="The length of time (in months) of the product’s initial rate period.")] = None,
        product_details_repayment_acceptable: Annotated[Optional[StrictBool], Field(description="Indicates if Repayment Capital and Interest only is available as a repayment method.")] = None,
        product_details_product_availability: Annotated[Optional[StrictStr], Field(description="Who the product is available to - All, Direct Only Exclusive or intermediary.")] = None,
        product_details_available_to_purchase: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for Purchases.")] = None,
        product_details_available_to_remortgage: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for remortgages.")] = None,
        product_details_available_to_ftb: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available to First Time Buyers.")] = None,
        product_details_max_loan: Annotated[Optional[StrictStr], Field(description="The Maximum Loan available for the product (in pence, not GBP).")] = None,
        product_details_min_loan: Annotated[Optional[StrictStr], Field(description="The Minimum Loan required for the product (in pence, not GBP).")] = None,
        product_details_min_time_in_current_position_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be in their current employment to be considered for the mortgage.")] = None,
        product_details_min_time_in_continuous_service_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.")] = None,
        product_details_min_self_employed_accounts_years: Annotated[Optional[StrictInt], Field(description="The minimum years account a self-employed applicant will need to be considered.")] = None,
        product_details_early_repayment_charge_applies: Annotated[Optional[StrictBool], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.")] = None,
        product_details_early_repayment_charge: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.")] = None,
        product_details_ccj_maximum_number: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_ccj_maximum_amount: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_arrears_not_in_last_months: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.")] = None,
        product_details_true_cost: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_initial_period: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_calculated_period: Annotated[Optional[StrictStr], Field(description="This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).")] = None,
        product_details_cashback_paid_on: Annotated[Optional[StrictStr], Field(description="Point in time cashback is paid.")] = None,
        product_details_remort_home_improv_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Home Improvements.")] = None,
        product_details_remort_debt_con_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.")] = None,
        product_details_remort_bus_purpose_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Business Purposes.")] = None,
        product_details_remort_hol_cars_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.")] = None,
        product_details_affordability_calculator: Annotated[Optional[StrictStr], Field(description="Link to lender’s affordability calculator.")] = None,
        product_details_self_years_avg_income: Annotated[Optional[StrictInt], Field(description="Average income acceptable for self-employed based on profits.")] = None,
        product_details_flat_over_shop_flag: Annotated[Optional[StrictStr], Field(description="Flat over shop acceptable. “Yes”, “No”, “Refer”.")] = None,
        product_details_flat_over_shop_notes: Annotated[Optional[StrictStr], Field(description="Notes on this arrangement.")] = None,
        product_details_flat_over_shop_owner: Annotated[Optional[StrictStr], Field(description="If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_ent: Annotated[Optional[StrictStr], Field(description="Is separate entrance required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_title: Annotated[Optional[StrictStr], Field(description="Is separate title required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_restaurant: Annotated[Optional[StrictStr], Field(description="Acceptable if above restaurant. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_retail: Annotated[Optional[StrictStr], Field(description="Acceptable if above retail shop. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_food: Annotated[Optional[StrictStr], Field(description="Acceptable if above fast food. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_industry_unit: Annotated[Optional[StrictStr], Field(description="Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_max_floors: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in a flat.")] = None,
        product_details_flat_max_floors_no_lift: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in flat without a lift.")] = None,
        product_details_deeds_release_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the deeds release fee is payable.")] = None,
        product_details_applicant1_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the primary applicant.")] = None,
        product_details_applicant2_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the secondary applicant.")] = None,
        product_details_applicant_maximum_age: Annotated[Optional[StrictInt], Field(description="The applicants' maximum age on expiry.")] = None,
        product_details_freehold_flag: Annotated[Optional[StrictStr], Field(description="Freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_leasehold_flag: Annotated[Optional[StrictStr], Field(description="Leasehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_commonhold_flag: Annotated[Optional[StrictStr], Field(description="Commonhold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_feudal_flag: Annotated[Optional[StrictStr], Field(description="Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_flag: Annotated[Optional[StrictStr], Field(description="Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_max_percentage: Annotated[Optional[StrictInt], Field(description="Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_product_available_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming available (YYYY-MM-DD).")] = None,
        product_details_product_discontinued_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming discontinued (YYYY-MM-DD).")] = None,
        product_details_is_offset_product: Annotated[Optional[StrictBool], Field(description="Specifies whether this is an offset product.")] = None,
        product_details_is_further_advance: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a further advance product.")] = None,
        product_details_is_porting: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a porting product.")] = None,
        product_details_mortgage_type: Annotated[Optional[StrictStr], Field(description="The type of mortgage.")] = None,
        product_details_sourcing_reference: Annotated[Optional[StrictStr], Field(description="Sourcing Engines Lender Reference.")] = None,
        product_details_sourcing_product_reference: Annotated[Optional[StrictStr], Field(description="SourceEngines Unique Product Reference.")] = None,
        product_details_lender_reference: Annotated[Optional[StrictStr], Field(description="Acre Organisation GUID of the mortgage lender.")] = None,
        product_details_portability_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage is portable, provide details and conditions for portability.")] = None,
        product_details_incentive_description: Annotated[Optional[StrictStr], Field(description="Where a mortgage includes incentives, provides details on said incentives.")] = None,
        product_details_insurance_conditions: Annotated[Optional[StrictStr], Field(description="Where insurance is required as a condition of a mortgage, provides details of such.")] = None,
        product_details_is_interest_retained: Annotated[Optional[StrictBool], Field(description="False (default) Whether the interest is retained.")] = 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,
    ) -> CdmGetAcreMortgageProductResponse:
        """Get mortgage product details for a mortgage product stored in Acre.


        :param product_id: Acre ID of the mortgage product (cannot be used with `product_details`). Required. (required)
        :type product_id: str
        :param product_details_product_code: A unique identifier for each product within the engine.
        :type product_details_product_code: str
        :param product_details_product_name: Name of the product.
        :type product_details_product_name: str
        :param product_details_lender_code: Lender Code of the applicant’s existing mortgage lender.
        :type product_details_lender_code: str
        :param product_details_lender_name: The mortgage lender’s name.
        :type product_details_lender_name: str
        :param product_details_initial_pay_rate: The initial pay rate.
        :type product_details_initial_pay_rate: int
        :param product_details_mortgage_class: The class of the product
        :type product_details_mortgage_class: str
        :param product_details_applicant_type_conditions: Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.
        :type product_details_applicant_type_conditions: str
        :param product_details_full_rate_description: A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.
        :type product_details_full_rate_description: str
        :param product_details_apr_lenders: Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values
        :type product_details_apr_lenders: int
        :param product_details_max_ltv_available: The maximum loan to value available for the product.
        :type product_details_max_ltv_available: int
        :param product_details_applicant1_income_multiplier: The income multiple the lender will use against app1 income to calculate the maximum available based on income.
        :type product_details_applicant1_income_multiplier: float
        :param product_details_applicant2_income_multiplier: The income multiple the lender will use against app2 income to calculate the maximum available based on income.
        :type product_details_applicant2_income_multiplier: float
        :param product_details_joint_applicant_income_multiplier: The income multiple the lender will use against both applicants income to calculate the maximum available based on income.
        :type product_details_joint_applicant_income_multiplier: float
        :param product_details_standard_variable_rate: This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_standard_variable_rate: int
        :param product_details_initial_monthly_payment: The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.
        :type product_details_initial_monthly_payment: float
        :param product_details_cashback: Total cashback amount available for the product (in pence, not GBP).
        :type product_details_cashback: str
        :param product_details_cashback_conditions: Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).
        :type product_details_cashback_conditions: str
        :param product_details_valuation_fee: How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).
        :type product_details_valuation_fee: str
        :param product_details_valuation_fee_conditions: Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.
        :type product_details_valuation_fee_conditions: str
        :param product_details_arrangement_fee: The amount of the arrangement fee for the product (in pence, not GBP).
        :type product_details_arrangement_fee: str
        :param product_details_arrangement_fee_conditions: Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.
        :type product_details_arrangement_fee_conditions: str
        :param product_details_booking_fee: The amount of the Booking fee for the product (in pence, not GBP).
        :type product_details_booking_fee: str
        :param product_details_booking_fee_conditions: Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_booking_fee_conditions: str
        :param product_details_higher_lending_charge: The amount of the Higher lending charge fee for the product (in pence, not GBP).
        :type product_details_higher_lending_charge: str
        :param product_details_higher_lending_charge_conditions: Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_higher_lending_charge_conditions: str
        :param product_details_free_legal_fees: Indicates if the product offers free legal fees as an incentive.
        :type product_details_free_legal_fees: bool
        :param product_details_free_legal_fee_conditions: Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.
        :type product_details_free_legal_fee_conditions: str
        :param product_details_chaps_fee: The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).
        :type product_details_chaps_fee: str
        :param product_details_fees_payable_on_application: The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).
        :type product_details_fees_payable_on_application: str
        :param product_details_fees_payable_on_completion: The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).
        :type product_details_fees_payable_on_completion: str
        :param product_details_fees_total: The total amount of fees associated with the mortgage that are payable (in pence, not GBP).
        :type product_details_fees_total: str
        :param product_details_early_repayment_charge_applies_until: **DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).
        :type product_details_early_repayment_charge_applies_until: str
        :param product_details_early_repayment_charge_applies_until_calculated_date: **DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.
        :type product_details_early_repayment_charge_applies_until_calculated_date: str
        :param product_details_product_notes: Any free-form notes for the specific product.
        :type product_details_product_notes: str
        :param product_details_employed_prob_period: An Employed applicants available probationary period.
        :type product_details_employed_prob_period: str
        :param product_details_max_property_valuation: Max property valuation acceptable (in pence, not GBP).
        :type product_details_max_property_valuation: str
        :param product_details_studio_flat_flag: Studio flat acceptable.
        :type product_details_studio_flat_flag: str
        :param product_details_proc_fee_code: The proc fee code. (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_code: str
        :param product_details_proc_fee_fixed: If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_fixed: str
        :param product_details_proc_fee_percentage: Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_percentage: int
        :param product_details_proc_fee_min: Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_min: str
        :param product_details_proc_fee_max: Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_max: str
        :param product_details_monthly_payment_after_initial_period_plus_1perc: This is the monthly payment after the initial period if the interest rate were to go up 1%.
        :type product_details_monthly_payment_after_initial_period_plus_1perc: float
        :param product_details_monthly_payment_after_initial_period_plus_2perc: This is the monthly payment after the initial period if the interest rate were to go up 2%.
        :type product_details_monthly_payment_after_initial_period_plus_2perc: float
        :param product_details_monthly_payment_after_initial_period_plus_3perc: This is the monthly payment after the initial period if the interest rate were to go up 3%.
        :type product_details_monthly_payment_after_initial_period_plus_3perc: float
        :param product_details_self_build: Describes whether the product is available for Self-Build.
        :type product_details_self_build: str
        :param product_details_shared_ownership: Product available for Shared Ownership.
        :type product_details_shared_ownership: str
        :param product_details_mortgage_discharge_fee: Mortgage Discharge Fee (in pence, not GBP).
        :type product_details_mortgage_discharge_fee: str
        :param product_details_deeds_release_fee: Deeds Release Fee (in pence, not GBP).
        :type product_details_deeds_release_fee: str
        :param product_details_funds_transfer_fee_rule: Specifies the add to loan conditions for the Funds Transfer Fee.
        :type product_details_funds_transfer_fee_rule: str
        :param product_details_capital_rest_period: Specifies the Capital Rest Period (Daily, Monthly, Annually)
        :type product_details_capital_rest_period: str
        :param product_details_help_to_buy_shared_equity: Denotes whether the product is available for HelpToBuy Shared Equity.
        :type product_details_help_to_buy_shared_equity: bool
        :param product_details_help_to_buy_mortgage_guarantee: Denotes whether the product is available for HelpToBuy Mortgage Guarantee.
        :type product_details_help_to_buy_mortgage_guarantee: bool
        :param product_details_broker_fee: **DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.
        :type product_details_broker_fee: float
        :param product_details_broker_fee_conditions: **DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.
        :type product_details_broker_fee_conditions: str
        :param product_details_packager_reference: The organisation identifier of the Packager if relevant.
        :type product_details_packager_reference: str
        :param product_details_packager_name: The name of the Packager.
        :type product_details_packager_name: str
        :param product_details_packager_tel_no: The telephone number of the Packager.
        :type product_details_packager_tel_no: str
        :param product_details_packager_web_address: The web address url of the Packager.
        :type product_details_packager_web_address: str
        :param product_details_lender_criteria_url: A String specifying the url to use to navigate to the Lender’s own criteria.
        :type product_details_lender_criteria_url: str
        :param product_details_lender_product_reference: Specifies the lender’s reference number or code for the product.
        :type product_details_lender_product_reference: str
        :param product_details_homebuyers_fee: The amount of the homebuyers fee for the product (in pence, not GBP).
        :type product_details_homebuyers_fee: str
        :param product_details_homebuyers_fee_conditions: The conditions associated with the homebuyers fee.
        :type product_details_homebuyers_fee_conditions: str
        :param product_details_legal_fee: The amount of the legal fee (in pence, not GBP).
        :type product_details_legal_fee: str
        :param product_details_legal_fee_conditions: The conditions associated with the legal fee.
        :type product_details_legal_fee_conditions: str
        :param product_details_product_type: The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.
        :type product_details_product_type: str
        :param product_details_net_proc_fee: The amount of the net proc fee. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee: float
        :param product_details_net_proc_fee_fixed: The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_fixed: str
        :param product_details_net_proc_fee_percentage: The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_percentage: int
        :param product_details_net_proc_fee_min: The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_min: str
        :param product_details_net_proc_fee_max: The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_max: str
        :param product_details_mortgage_discharge_fee_when_to_pay: Describes when the mortgage discharge fee is payable.
        :type product_details_mortgage_discharge_fee_when_to_pay: str
        :param product_details_product_match_status: This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.
        :type product_details_product_match_status: str
        :param product_details_reject_reasons: A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.
        :type product_details_reject_reasons: str
        :param product_details_max_loan_available: The maximum calculated loan amount available for this product (in pence, not GBP).
        :type product_details_max_loan_available: str
        :param product_details_buy_to_let_rental_income_calculation_rate: The rate value used in the calculation to determine the required rental income for BTL.
        :type product_details_buy_to_let_rental_income_calculation_rate: float
        :param product_details_disbursement_fee: The Disbursement Fee amount (in pence, not GBP).
        :type product_details_disbursement_fee: str
        :param product_details_disbursement_fee_conditions: Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.
        :type product_details_disbursement_fee_conditions: str
        :param product_details_true_cost_full_term: This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).
        :type product_details_true_cost_full_term: str
        :param product_details_initial_monthly_payment_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.
        :type product_details_initial_monthly_payment_inc_existing_mortgage: float
        :param product_details_true_cost_full_term_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_full_term_inc_existing_mortgage: float
        :param product_details_true_cost_initial_period_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_initial_period_inc_existing_mortgage: float
        :param product_details_true_cost_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_inc_existing_mortgage: float
        :param product_details_selected_mortgage_club_code: **DEPRECATED** moved to mortgage.  The selected mortgage club code.
        :type product_details_selected_mortgage_club_code: str
        :param product_details_max_overpayment_percent_no_erc: Describes the maximum overpayment percentage when no ERC.
        :type product_details_max_overpayment_percent_no_erc: int
        :param product_details_overpayments_allowed: Indicates whether the product allows overpayments.
        :type product_details_overpayments_allowed: bool
        :param product_details_overpayment_conditions: Where a mortgage allows overpayments, provide details and conditions for overpayment.
        :type product_details_overpayment_conditions: str
        :param product_details_underpayments_allowed: Indicates whether the product allows underpayments.
        :type product_details_underpayments_allowed: bool
        :param product_details_payment_holidays_allowed: Indicates whether the product allows payment holidays.
        :type product_details_payment_holidays_allowed: bool
        :param product_details_date_last_modified: The date that the product data was last modified (RFC3339)
        :type product_details_date_last_modified: str
        :param product_details_optional_partial_repayment: Ability to make Optional Partial Repayments for the Equity Release Product.
        :type product_details_optional_partial_repayment: bool
        :param product_details_apply_online: Indicates whether the product can be applied for online using MortgageApply.  more details
        :type product_details_apply_online: bool
        :param product_details_lender_tel_no: Telephone number of the lender.
        :type product_details_lender_tel_no: str
        :param product_details_lender_web_address: Web address of the lender.
        :type product_details_lender_web_address: str
        :param product_details_initial_rate_period: The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"
        :type product_details_initial_rate_period: str
        :param product_details_initial_rate_period_months: The length of time (in months) of the product’s initial rate period.
        :type product_details_initial_rate_period_months: int
        :param product_details_repayment_acceptable: Indicates if Repayment Capital and Interest only is available as a repayment method.
        :type product_details_repayment_acceptable: bool
        :param product_details_product_availability: Who the product is available to - All, Direct Only Exclusive or intermediary.
        :type product_details_product_availability: str
        :param product_details_available_to_purchase: Indicates if the product is available for Purchases.
        :type product_details_available_to_purchase: bool
        :param product_details_available_to_remortgage: Indicates if the product is available for remortgages.
        :type product_details_available_to_remortgage: bool
        :param product_details_available_to_ftb: Indicates if the product is available to First Time Buyers.
        :type product_details_available_to_ftb: bool
        :param product_details_max_loan: The Maximum Loan available for the product (in pence, not GBP).
        :type product_details_max_loan: str
        :param product_details_min_loan: The Minimum Loan required for the product (in pence, not GBP).
        :type product_details_min_loan: str
        :param product_details_min_time_in_current_position_months: The minimum time an applicant must be in their current employment to be considered for the mortgage.
        :type product_details_min_time_in_current_position_months: int
        :param product_details_min_time_in_continuous_service_months: The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.
        :type product_details_min_time_in_continuous_service_months: int
        :param product_details_min_self_employed_accounts_years: The minimum years account a self-employed applicant will need to be considered.
        :type product_details_min_self_employed_accounts_years: int
        :param product_details_early_repayment_charge_applies: **DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.
        :type product_details_early_repayment_charge_applies: bool
        :param product_details_early_repayment_charge: **DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.
        :type product_details_early_repayment_charge: str
        :param product_details_ccj_maximum_number: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_number: int
        :param product_details_ccj_maximum_amount: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_amount: int
        :param product_details_arrears_not_in_last_months: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.
        :type product_details_arrears_not_in_last_months: int
        :param product_details_true_cost: This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost: str
        :param product_details_true_cost_over_initial_period: This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost_over_initial_period: str
        :param product_details_true_cost_over_calculated_period: This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).
        :type product_details_true_cost_over_calculated_period: str
        :param product_details_cashback_paid_on: Point in time cashback is paid.
        :type product_details_cashback_paid_on: str
        :param product_details_remort_home_improv_max_ltv: Max LTV for Remortgage with a reason for remortgage being Home Improvements.
        :type product_details_remort_home_improv_max_ltv: int
        :param product_details_remort_debt_con_max_ltv: Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.
        :type product_details_remort_debt_con_max_ltv: int
        :param product_details_remort_bus_purpose_max_ltv: Max LTV for Remortgage with a reason for remortgage being Business Purposes.
        :type product_details_remort_bus_purpose_max_ltv: int
        :param product_details_remort_hol_cars_max_ltv: Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.
        :type product_details_remort_hol_cars_max_ltv: int
        :param product_details_affordability_calculator: Link to lender’s affordability calculator.
        :type product_details_affordability_calculator: str
        :param product_details_self_years_avg_income: Average income acceptable for self-employed based on profits.
        :type product_details_self_years_avg_income: int
        :param product_details_flat_over_shop_flag: Flat over shop acceptable. “Yes”, “No”, “Refer”.
        :type product_details_flat_over_shop_flag: str
        :param product_details_flat_over_shop_notes: Notes on this arrangement.
        :type product_details_flat_over_shop_notes: str
        :param product_details_flat_over_shop_owner: If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_owner: str
        :param product_details_flat_over_shop_sep_ent: Is separate entrance required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_ent: str
        :param product_details_flat_over_shop_sep_title: Is separate title required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_title: str
        :param product_details_flat_over_shop_restaurant: Acceptable if above restaurant. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_restaurant: str
        :param product_details_flat_over_shop_retail: Acceptable if above retail shop. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_retail: str
        :param product_details_flat_over_shop_fast_food: Acceptable if above fast food. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_food: str
        :param product_details_flat_over_shop_fast_industry_unit: Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_industry_unit: str
        :param product_details_flat_max_floors: Max floors acceptable in a flat.
        :type product_details_flat_max_floors: int
        :param product_details_flat_max_floors_no_lift: Max floors acceptable in flat without a lift.
        :type product_details_flat_max_floors_no_lift: int
        :param product_details_deeds_release_fee_when_to_pay: Describes when the deeds release fee is payable.
        :type product_details_deeds_release_fee_when_to_pay: str
        :param product_details_applicant1_minimum_age: The minimum age for the primary applicant.
        :type product_details_applicant1_minimum_age: int
        :param product_details_applicant2_minimum_age: The minimum age for the secondary applicant.
        :type product_details_applicant2_minimum_age: int
        :param product_details_applicant_maximum_age: The applicants' maximum age on expiry.
        :type product_details_applicant_maximum_age: int
        :param product_details_freehold_flag: Freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_freehold_flag: str
        :param product_details_leasehold_flag: Leasehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_leasehold_flag: str
        :param product_details_commonhold_flag: Commonhold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_commonhold_flag: str
        :param product_details_feudal_flag: Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_feudal_flag: str
        :param product_details_flying_freehold_flag: Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_flying_freehold_flag: str
        :param product_details_flying_freehold_max_percentage: Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_flying_freehold_max_percentage: int
        :param product_details_product_available_date: Date of product becoming available (YYYY-MM-DD).
        :type product_details_product_available_date: str
        :param product_details_product_discontinued_date: Date of product becoming discontinued (YYYY-MM-DD).
        :type product_details_product_discontinued_date: str
        :param product_details_is_offset_product: Specifies whether this is an offset product.
        :type product_details_is_offset_product: bool
        :param product_details_is_further_advance: Specifies whether this is for a further advance product.
        :type product_details_is_further_advance: bool
        :param product_details_is_porting: Specifies whether this is for a porting product.
        :type product_details_is_porting: bool
        :param product_details_mortgage_type: The type of mortgage.
        :type product_details_mortgage_type: str
        :param product_details_sourcing_reference: Sourcing Engines Lender Reference.
        :type product_details_sourcing_reference: str
        :param product_details_sourcing_product_reference: SourceEngines Unique Product Reference.
        :type product_details_sourcing_product_reference: str
        :param product_details_lender_reference: Acre Organisation GUID of the mortgage lender.
        :type product_details_lender_reference: str
        :param product_details_portability_conditions: Where a mortgage is portable, provide details and conditions for portability.
        :type product_details_portability_conditions: str
        :param product_details_incentive_description: Where a mortgage includes incentives, provides details on said incentives.
        :type product_details_incentive_description: str
        :param product_details_insurance_conditions: Where insurance is required as a condition of a mortgage, provides details of such.
        :type product_details_insurance_conditions: str
        :param product_details_is_interest_retained: False (default) Whether the interest is retained.
        :type product_details_is_interest_retained: 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._get_acre_mortgage_product_serialize(
            product_id=product_id,
            product_details_product_code=product_details_product_code,
            product_details_product_name=product_details_product_name,
            product_details_lender_code=product_details_lender_code,
            product_details_lender_name=product_details_lender_name,
            product_details_initial_pay_rate=product_details_initial_pay_rate,
            product_details_mortgage_class=product_details_mortgage_class,
            product_details_applicant_type_conditions=product_details_applicant_type_conditions,
            product_details_full_rate_description=product_details_full_rate_description,
            product_details_apr_lenders=product_details_apr_lenders,
            product_details_max_ltv_available=product_details_max_ltv_available,
            product_details_applicant1_income_multiplier=product_details_applicant1_income_multiplier,
            product_details_applicant2_income_multiplier=product_details_applicant2_income_multiplier,
            product_details_joint_applicant_income_multiplier=product_details_joint_applicant_income_multiplier,
            product_details_standard_variable_rate=product_details_standard_variable_rate,
            product_details_initial_monthly_payment=product_details_initial_monthly_payment,
            product_details_cashback=product_details_cashback,
            product_details_cashback_conditions=product_details_cashback_conditions,
            product_details_valuation_fee=product_details_valuation_fee,
            product_details_valuation_fee_conditions=product_details_valuation_fee_conditions,
            product_details_arrangement_fee=product_details_arrangement_fee,
            product_details_arrangement_fee_conditions=product_details_arrangement_fee_conditions,
            product_details_booking_fee=product_details_booking_fee,
            product_details_booking_fee_conditions=product_details_booking_fee_conditions,
            product_details_higher_lending_charge=product_details_higher_lending_charge,
            product_details_higher_lending_charge_conditions=product_details_higher_lending_charge_conditions,
            product_details_free_legal_fees=product_details_free_legal_fees,
            product_details_free_legal_fee_conditions=product_details_free_legal_fee_conditions,
            product_details_chaps_fee=product_details_chaps_fee,
            product_details_fees_payable_on_application=product_details_fees_payable_on_application,
            product_details_fees_payable_on_completion=product_details_fees_payable_on_completion,
            product_details_fees_total=product_details_fees_total,
            product_details_early_repayment_charge_applies_until=product_details_early_repayment_charge_applies_until,
            product_details_early_repayment_charge_applies_until_calculated_date=product_details_early_repayment_charge_applies_until_calculated_date,
            product_details_product_notes=product_details_product_notes,
            product_details_employed_prob_period=product_details_employed_prob_period,
            product_details_max_property_valuation=product_details_max_property_valuation,
            product_details_studio_flat_flag=product_details_studio_flat_flag,
            product_details_proc_fee_code=product_details_proc_fee_code,
            product_details_proc_fee_fixed=product_details_proc_fee_fixed,
            product_details_proc_fee_percentage=product_details_proc_fee_percentage,
            product_details_proc_fee_min=product_details_proc_fee_min,
            product_details_proc_fee_max=product_details_proc_fee_max,
            product_details_monthly_payment_after_initial_period_plus_1perc=product_details_monthly_payment_after_initial_period_plus_1perc,
            product_details_monthly_payment_after_initial_period_plus_2perc=product_details_monthly_payment_after_initial_period_plus_2perc,
            product_details_monthly_payment_after_initial_period_plus_3perc=product_details_monthly_payment_after_initial_period_plus_3perc,
            product_details_self_build=product_details_self_build,
            product_details_shared_ownership=product_details_shared_ownership,
            product_details_mortgage_discharge_fee=product_details_mortgage_discharge_fee,
            product_details_deeds_release_fee=product_details_deeds_release_fee,
            product_details_funds_transfer_fee_rule=product_details_funds_transfer_fee_rule,
            product_details_capital_rest_period=product_details_capital_rest_period,
            product_details_help_to_buy_shared_equity=product_details_help_to_buy_shared_equity,
            product_details_help_to_buy_mortgage_guarantee=product_details_help_to_buy_mortgage_guarantee,
            product_details_broker_fee=product_details_broker_fee,
            product_details_broker_fee_conditions=product_details_broker_fee_conditions,
            product_details_packager_reference=product_details_packager_reference,
            product_details_packager_name=product_details_packager_name,
            product_details_packager_tel_no=product_details_packager_tel_no,
            product_details_packager_web_address=product_details_packager_web_address,
            product_details_lender_criteria_url=product_details_lender_criteria_url,
            product_details_lender_product_reference=product_details_lender_product_reference,
            product_details_homebuyers_fee=product_details_homebuyers_fee,
            product_details_homebuyers_fee_conditions=product_details_homebuyers_fee_conditions,
            product_details_legal_fee=product_details_legal_fee,
            product_details_legal_fee_conditions=product_details_legal_fee_conditions,
            product_details_product_type=product_details_product_type,
            product_details_net_proc_fee=product_details_net_proc_fee,
            product_details_net_proc_fee_fixed=product_details_net_proc_fee_fixed,
            product_details_net_proc_fee_percentage=product_details_net_proc_fee_percentage,
            product_details_net_proc_fee_min=product_details_net_proc_fee_min,
            product_details_net_proc_fee_max=product_details_net_proc_fee_max,
            product_details_mortgage_discharge_fee_when_to_pay=product_details_mortgage_discharge_fee_when_to_pay,
            product_details_product_match_status=product_details_product_match_status,
            product_details_reject_reasons=product_details_reject_reasons,
            product_details_max_loan_available=product_details_max_loan_available,
            product_details_buy_to_let_rental_income_calculation_rate=product_details_buy_to_let_rental_income_calculation_rate,
            product_details_disbursement_fee=product_details_disbursement_fee,
            product_details_disbursement_fee_conditions=product_details_disbursement_fee_conditions,
            product_details_true_cost_full_term=product_details_true_cost_full_term,
            product_details_initial_monthly_payment_inc_existing_mortgage=product_details_initial_monthly_payment_inc_existing_mortgage,
            product_details_true_cost_full_term_inc_existing_mortgage=product_details_true_cost_full_term_inc_existing_mortgage,
            product_details_true_cost_initial_period_inc_existing_mortgage=product_details_true_cost_initial_period_inc_existing_mortgage,
            product_details_true_cost_inc_existing_mortgage=product_details_true_cost_inc_existing_mortgage,
            product_details_selected_mortgage_club_code=product_details_selected_mortgage_club_code,
            product_details_max_overpayment_percent_no_erc=product_details_max_overpayment_percent_no_erc,
            product_details_overpayments_allowed=product_details_overpayments_allowed,
            product_details_overpayment_conditions=product_details_overpayment_conditions,
            product_details_underpayments_allowed=product_details_underpayments_allowed,
            product_details_payment_holidays_allowed=product_details_payment_holidays_allowed,
            product_details_date_last_modified=product_details_date_last_modified,
            product_details_optional_partial_repayment=product_details_optional_partial_repayment,
            product_details_apply_online=product_details_apply_online,
            product_details_lender_tel_no=product_details_lender_tel_no,
            product_details_lender_web_address=product_details_lender_web_address,
            product_details_initial_rate_period=product_details_initial_rate_period,
            product_details_initial_rate_period_months=product_details_initial_rate_period_months,
            product_details_repayment_acceptable=product_details_repayment_acceptable,
            product_details_product_availability=product_details_product_availability,
            product_details_available_to_purchase=product_details_available_to_purchase,
            product_details_available_to_remortgage=product_details_available_to_remortgage,
            product_details_available_to_ftb=product_details_available_to_ftb,
            product_details_max_loan=product_details_max_loan,
            product_details_min_loan=product_details_min_loan,
            product_details_min_time_in_current_position_months=product_details_min_time_in_current_position_months,
            product_details_min_time_in_continuous_service_months=product_details_min_time_in_continuous_service_months,
            product_details_min_self_employed_accounts_years=product_details_min_self_employed_accounts_years,
            product_details_early_repayment_charge_applies=product_details_early_repayment_charge_applies,
            product_details_early_repayment_charge=product_details_early_repayment_charge,
            product_details_ccj_maximum_number=product_details_ccj_maximum_number,
            product_details_ccj_maximum_amount=product_details_ccj_maximum_amount,
            product_details_arrears_not_in_last_months=product_details_arrears_not_in_last_months,
            product_details_true_cost=product_details_true_cost,
            product_details_true_cost_over_initial_period=product_details_true_cost_over_initial_period,
            product_details_true_cost_over_calculated_period=product_details_true_cost_over_calculated_period,
            product_details_cashback_paid_on=product_details_cashback_paid_on,
            product_details_remort_home_improv_max_ltv=product_details_remort_home_improv_max_ltv,
            product_details_remort_debt_con_max_ltv=product_details_remort_debt_con_max_ltv,
            product_details_remort_bus_purpose_max_ltv=product_details_remort_bus_purpose_max_ltv,
            product_details_remort_hol_cars_max_ltv=product_details_remort_hol_cars_max_ltv,
            product_details_affordability_calculator=product_details_affordability_calculator,
            product_details_self_years_avg_income=product_details_self_years_avg_income,
            product_details_flat_over_shop_flag=product_details_flat_over_shop_flag,
            product_details_flat_over_shop_notes=product_details_flat_over_shop_notes,
            product_details_flat_over_shop_owner=product_details_flat_over_shop_owner,
            product_details_flat_over_shop_sep_ent=product_details_flat_over_shop_sep_ent,
            product_details_flat_over_shop_sep_title=product_details_flat_over_shop_sep_title,
            product_details_flat_over_shop_restaurant=product_details_flat_over_shop_restaurant,
            product_details_flat_over_shop_retail=product_details_flat_over_shop_retail,
            product_details_flat_over_shop_fast_food=product_details_flat_over_shop_fast_food,
            product_details_flat_over_shop_fast_industry_unit=product_details_flat_over_shop_fast_industry_unit,
            product_details_flat_max_floors=product_details_flat_max_floors,
            product_details_flat_max_floors_no_lift=product_details_flat_max_floors_no_lift,
            product_details_deeds_release_fee_when_to_pay=product_details_deeds_release_fee_when_to_pay,
            product_details_applicant1_minimum_age=product_details_applicant1_minimum_age,
            product_details_applicant2_minimum_age=product_details_applicant2_minimum_age,
            product_details_applicant_maximum_age=product_details_applicant_maximum_age,
            product_details_freehold_flag=product_details_freehold_flag,
            product_details_leasehold_flag=product_details_leasehold_flag,
            product_details_commonhold_flag=product_details_commonhold_flag,
            product_details_feudal_flag=product_details_feudal_flag,
            product_details_flying_freehold_flag=product_details_flying_freehold_flag,
            product_details_flying_freehold_max_percentage=product_details_flying_freehold_max_percentage,
            product_details_product_available_date=product_details_product_available_date,
            product_details_product_discontinued_date=product_details_product_discontinued_date,
            product_details_is_offset_product=product_details_is_offset_product,
            product_details_is_further_advance=product_details_is_further_advance,
            product_details_is_porting=product_details_is_porting,
            product_details_mortgage_type=product_details_mortgage_type,
            product_details_sourcing_reference=product_details_sourcing_reference,
            product_details_sourcing_product_reference=product_details_sourcing_product_reference,
            product_details_lender_reference=product_details_lender_reference,
            product_details_portability_conditions=product_details_portability_conditions,
            product_details_incentive_description=product_details_incentive_description,
            product_details_insurance_conditions=product_details_insurance_conditions,
            product_details_is_interest_retained=product_details_is_interest_retained,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def get_acre_mortgage_product_with_http_info(
        self,
        product_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage product (cannot be used with `product_details`). Required.")],
        product_details_product_code: Annotated[Optional[StrictStr], Field(description="A unique identifier for each product within the engine.")] = None,
        product_details_product_name: Annotated[Optional[StrictStr], Field(description="Name of the product.")] = None,
        product_details_lender_code: Annotated[Optional[StrictStr], Field(description="Lender Code of the applicant’s existing mortgage lender.")] = None,
        product_details_lender_name: Annotated[Optional[StrictStr], Field(description="The mortgage lender’s name.")] = None,
        product_details_initial_pay_rate: Annotated[Optional[StrictInt], Field(description="The initial pay rate.")] = None,
        product_details_mortgage_class: Annotated[Optional[StrictStr], Field(description="The class of the product")] = None,
        product_details_applicant_type_conditions: Annotated[Optional[StrictStr], Field(description="Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.")] = None,
        product_details_full_rate_description: Annotated[Optional[StrictStr], Field(description="A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.")] = None,
        product_details_apr_lenders: Annotated[Optional[StrictInt], Field(description="Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values")] = None,
        product_details_max_ltv_available: Annotated[Optional[StrictInt], Field(description="The maximum loan to value available for the product.")] = None,
        product_details_applicant1_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app1 income to calculate the maximum available based on income.")] = None,
        product_details_applicant2_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app2 income to calculate the maximum available based on income.")] = None,
        product_details_joint_applicant_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against both applicants income to calculate the maximum available based on income.")] = None,
        product_details_standard_variable_rate: Annotated[Optional[StrictInt], Field(description="This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_initial_monthly_payment: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.")] = None,
        product_details_cashback: Annotated[Optional[StrictStr], Field(description="Total cashback amount available for the product (in pence, not GBP).")] = None,
        product_details_cashback_conditions: Annotated[Optional[StrictStr], Field(description="Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).")] = None,
        product_details_valuation_fee: Annotated[Optional[StrictStr], Field(description="How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).")] = None,
        product_details_valuation_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.")] = None,
        product_details_arrangement_fee: Annotated[Optional[StrictStr], Field(description="The amount of the arrangement fee for the product (in pence, not GBP).")] = None,
        product_details_arrangement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_booking_fee: Annotated[Optional[StrictStr], Field(description="The amount of the Booking fee for the product (in pence, not GBP).")] = None,
        product_details_booking_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_higher_lending_charge: Annotated[Optional[StrictStr], Field(description="The amount of the Higher lending charge fee for the product (in pence, not GBP).")] = None,
        product_details_higher_lending_charge_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_free_legal_fees: Annotated[Optional[StrictBool], Field(description="Indicates if the product offers free legal fees as an incentive.")] = None,
        product_details_free_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.")] = None,
        product_details_chaps_fee: Annotated[Optional[StrictStr], Field(description="The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).")] = None,
        product_details_fees_payable_on_application: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).")] = None,
        product_details_fees_payable_on_completion: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).")] = None,
        product_details_fees_total: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable (in pence, not GBP).")] = None,
        product_details_early_repayment_charge_applies_until: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).")] = None,
        product_details_early_repayment_charge_applies_until_calculated_date: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.")] = None,
        product_details_product_notes: Annotated[Optional[StrictStr], Field(description="Any free-form notes for the specific product.")] = None,
        product_details_employed_prob_period: Annotated[Optional[StrictStr], Field(description="An Employed applicants available probationary period.")] = None,
        product_details_max_property_valuation: Annotated[Optional[StrictStr], Field(description="Max property valuation acceptable (in pence, not GBP).")] = None,
        product_details_studio_flat_flag: Annotated[Optional[StrictStr], Field(description="Studio flat acceptable.")] = None,
        product_details_proc_fee_code: Annotated[Optional[StrictStr], Field(description="The proc fee code. (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_min: Annotated[Optional[StrictStr], Field(description="Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_max: Annotated[Optional[StrictStr], Field(description="Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_monthly_payment_after_initial_period_plus_1perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 1%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_2perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 2%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_3perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 3%.")] = None,
        product_details_self_build: Annotated[Optional[StrictStr], Field(description="Describes whether the product is available for Self-Build.")] = None,
        product_details_shared_ownership: Annotated[Optional[StrictStr], Field(description="Product available for Shared Ownership.")] = None,
        product_details_mortgage_discharge_fee: Annotated[Optional[StrictStr], Field(description="Mortgage Discharge Fee (in pence, not GBP).")] = None,
        product_details_deeds_release_fee: Annotated[Optional[StrictStr], Field(description="Deeds Release Fee (in pence, not GBP).")] = None,
        product_details_funds_transfer_fee_rule: Annotated[Optional[StrictStr], Field(description="Specifies the add to loan conditions for the Funds Transfer Fee.")] = None,
        product_details_capital_rest_period: Annotated[Optional[StrictStr], Field(description="Specifies the Capital Rest Period (Daily, Monthly, Annually)")] = None,
        product_details_help_to_buy_shared_equity: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Shared Equity.")] = None,
        product_details_help_to_buy_mortgage_guarantee: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Mortgage Guarantee.")] = None,
        product_details_broker_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="**DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.")] = None,
        product_details_broker_fee_conditions: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.")] = None,
        product_details_packager_reference: Annotated[Optional[StrictStr], Field(description="The organisation identifier of the Packager if relevant.")] = None,
        product_details_packager_name: Annotated[Optional[StrictStr], Field(description="The name of the Packager.")] = None,
        product_details_packager_tel_no: Annotated[Optional[StrictStr], Field(description="The telephone number of the Packager.")] = None,
        product_details_packager_web_address: Annotated[Optional[StrictStr], Field(description="The web address url of the Packager.")] = None,
        product_details_lender_criteria_url: Annotated[Optional[StrictStr], Field(description="A String specifying the url to use to navigate to the Lender’s own criteria.")] = None,
        product_details_lender_product_reference: Annotated[Optional[StrictStr], Field(description="Specifies the lender’s reference number or code for the product.")] = None,
        product_details_homebuyers_fee: Annotated[Optional[StrictStr], Field(description="The amount of the homebuyers fee for the product (in pence, not GBP).")] = None,
        product_details_homebuyers_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the homebuyers fee.")] = None,
        product_details_legal_fee: Annotated[Optional[StrictStr], Field(description="The amount of the legal fee (in pence, not GBP).")] = None,
        product_details_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the legal fee.")] = None,
        product_details_product_type: Annotated[Optional[StrictStr], Field(description="The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.")] = None,
        product_details_net_proc_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The amount of the net proc fee. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_min: Annotated[Optional[StrictStr], Field(description="The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_max: Annotated[Optional[StrictStr], Field(description="The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_mortgage_discharge_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the mortgage discharge fee is payable.")] = None,
        product_details_product_match_status: Annotated[Optional[StrictStr], Field(description="This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.")] = None,
        product_details_reject_reasons: Annotated[Optional[StrictStr], Field(description="A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.")] = None,
        product_details_max_loan_available: Annotated[Optional[StrictStr], Field(description="The maximum calculated loan amount available for this product (in pence, not GBP).")] = None,
        product_details_buy_to_let_rental_income_calculation_rate: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The rate value used in the calculation to determine the required rental income for BTL.")] = None,
        product_details_disbursement_fee: Annotated[Optional[StrictStr], Field(description="The Disbursement Fee amount (in pence, not GBP).")] = None,
        product_details_disbursement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_true_cost_full_term: Annotated[Optional[StrictStr], Field(description="This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).")] = None,
        product_details_initial_monthly_payment_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.")] = None,
        product_details_true_cost_full_term_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_initial_period_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_selected_mortgage_club_code: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** moved to mortgage.  The selected mortgage club code.")] = None,
        product_details_max_overpayment_percent_no_erc: Annotated[Optional[StrictInt], Field(description="Describes the maximum overpayment percentage when no ERC.")] = None,
        product_details_overpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows overpayments.")] = None,
        product_details_overpayment_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage allows overpayments, provide details and conditions for overpayment.")] = None,
        product_details_underpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows underpayments.")] = None,
        product_details_payment_holidays_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows payment holidays.")] = None,
        product_details_date_last_modified: Annotated[Optional[StrictStr], Field(description="The date that the product data was last modified (RFC3339)")] = None,
        product_details_optional_partial_repayment: Annotated[Optional[StrictBool], Field(description="Ability to make Optional Partial Repayments for the Equity Release Product.")] = None,
        product_details_apply_online: Annotated[Optional[StrictBool], Field(description="Indicates whether the product can be applied for online using MortgageApply.  more details")] = None,
        product_details_lender_tel_no: Annotated[Optional[StrictStr], Field(description="Telephone number of the lender.")] = None,
        product_details_lender_web_address: Annotated[Optional[StrictStr], Field(description="Web address of the lender.")] = None,
        product_details_initial_rate_period: Annotated[Optional[StrictStr], Field(description="The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"")] = None,
        product_details_initial_rate_period_months: Annotated[Optional[StrictInt], Field(description="The length of time (in months) of the product’s initial rate period.")] = None,
        product_details_repayment_acceptable: Annotated[Optional[StrictBool], Field(description="Indicates if Repayment Capital and Interest only is available as a repayment method.")] = None,
        product_details_product_availability: Annotated[Optional[StrictStr], Field(description="Who the product is available to - All, Direct Only Exclusive or intermediary.")] = None,
        product_details_available_to_purchase: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for Purchases.")] = None,
        product_details_available_to_remortgage: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for remortgages.")] = None,
        product_details_available_to_ftb: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available to First Time Buyers.")] = None,
        product_details_max_loan: Annotated[Optional[StrictStr], Field(description="The Maximum Loan available for the product (in pence, not GBP).")] = None,
        product_details_min_loan: Annotated[Optional[StrictStr], Field(description="The Minimum Loan required for the product (in pence, not GBP).")] = None,
        product_details_min_time_in_current_position_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be in their current employment to be considered for the mortgage.")] = None,
        product_details_min_time_in_continuous_service_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.")] = None,
        product_details_min_self_employed_accounts_years: Annotated[Optional[StrictInt], Field(description="The minimum years account a self-employed applicant will need to be considered.")] = None,
        product_details_early_repayment_charge_applies: Annotated[Optional[StrictBool], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.")] = None,
        product_details_early_repayment_charge: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.")] = None,
        product_details_ccj_maximum_number: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_ccj_maximum_amount: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_arrears_not_in_last_months: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.")] = None,
        product_details_true_cost: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_initial_period: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_calculated_period: Annotated[Optional[StrictStr], Field(description="This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).")] = None,
        product_details_cashback_paid_on: Annotated[Optional[StrictStr], Field(description="Point in time cashback is paid.")] = None,
        product_details_remort_home_improv_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Home Improvements.")] = None,
        product_details_remort_debt_con_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.")] = None,
        product_details_remort_bus_purpose_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Business Purposes.")] = None,
        product_details_remort_hol_cars_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.")] = None,
        product_details_affordability_calculator: Annotated[Optional[StrictStr], Field(description="Link to lender’s affordability calculator.")] = None,
        product_details_self_years_avg_income: Annotated[Optional[StrictInt], Field(description="Average income acceptable for self-employed based on profits.")] = None,
        product_details_flat_over_shop_flag: Annotated[Optional[StrictStr], Field(description="Flat over shop acceptable. “Yes”, “No”, “Refer”.")] = None,
        product_details_flat_over_shop_notes: Annotated[Optional[StrictStr], Field(description="Notes on this arrangement.")] = None,
        product_details_flat_over_shop_owner: Annotated[Optional[StrictStr], Field(description="If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_ent: Annotated[Optional[StrictStr], Field(description="Is separate entrance required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_title: Annotated[Optional[StrictStr], Field(description="Is separate title required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_restaurant: Annotated[Optional[StrictStr], Field(description="Acceptable if above restaurant. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_retail: Annotated[Optional[StrictStr], Field(description="Acceptable if above retail shop. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_food: Annotated[Optional[StrictStr], Field(description="Acceptable if above fast food. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_industry_unit: Annotated[Optional[StrictStr], Field(description="Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_max_floors: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in a flat.")] = None,
        product_details_flat_max_floors_no_lift: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in flat without a lift.")] = None,
        product_details_deeds_release_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the deeds release fee is payable.")] = None,
        product_details_applicant1_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the primary applicant.")] = None,
        product_details_applicant2_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the secondary applicant.")] = None,
        product_details_applicant_maximum_age: Annotated[Optional[StrictInt], Field(description="The applicants' maximum age on expiry.")] = None,
        product_details_freehold_flag: Annotated[Optional[StrictStr], Field(description="Freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_leasehold_flag: Annotated[Optional[StrictStr], Field(description="Leasehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_commonhold_flag: Annotated[Optional[StrictStr], Field(description="Commonhold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_feudal_flag: Annotated[Optional[StrictStr], Field(description="Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_flag: Annotated[Optional[StrictStr], Field(description="Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_max_percentage: Annotated[Optional[StrictInt], Field(description="Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_product_available_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming available (YYYY-MM-DD).")] = None,
        product_details_product_discontinued_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming discontinued (YYYY-MM-DD).")] = None,
        product_details_is_offset_product: Annotated[Optional[StrictBool], Field(description="Specifies whether this is an offset product.")] = None,
        product_details_is_further_advance: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a further advance product.")] = None,
        product_details_is_porting: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a porting product.")] = None,
        product_details_mortgage_type: Annotated[Optional[StrictStr], Field(description="The type of mortgage.")] = None,
        product_details_sourcing_reference: Annotated[Optional[StrictStr], Field(description="Sourcing Engines Lender Reference.")] = None,
        product_details_sourcing_product_reference: Annotated[Optional[StrictStr], Field(description="SourceEngines Unique Product Reference.")] = None,
        product_details_lender_reference: Annotated[Optional[StrictStr], Field(description="Acre Organisation GUID of the mortgage lender.")] = None,
        product_details_portability_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage is portable, provide details and conditions for portability.")] = None,
        product_details_incentive_description: Annotated[Optional[StrictStr], Field(description="Where a mortgage includes incentives, provides details on said incentives.")] = None,
        product_details_insurance_conditions: Annotated[Optional[StrictStr], Field(description="Where insurance is required as a condition of a mortgage, provides details of such.")] = None,
        product_details_is_interest_retained: Annotated[Optional[StrictBool], Field(description="False (default) Whether the interest is retained.")] = 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[CdmGetAcreMortgageProductResponse]:
        """Get mortgage product details for a mortgage product stored in Acre.


        :param product_id: Acre ID of the mortgage product (cannot be used with `product_details`). Required. (required)
        :type product_id: str
        :param product_details_product_code: A unique identifier for each product within the engine.
        :type product_details_product_code: str
        :param product_details_product_name: Name of the product.
        :type product_details_product_name: str
        :param product_details_lender_code: Lender Code of the applicant’s existing mortgage lender.
        :type product_details_lender_code: str
        :param product_details_lender_name: The mortgage lender’s name.
        :type product_details_lender_name: str
        :param product_details_initial_pay_rate: The initial pay rate.
        :type product_details_initial_pay_rate: int
        :param product_details_mortgage_class: The class of the product
        :type product_details_mortgage_class: str
        :param product_details_applicant_type_conditions: Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.
        :type product_details_applicant_type_conditions: str
        :param product_details_full_rate_description: A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.
        :type product_details_full_rate_description: str
        :param product_details_apr_lenders: Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values
        :type product_details_apr_lenders: int
        :param product_details_max_ltv_available: The maximum loan to value available for the product.
        :type product_details_max_ltv_available: int
        :param product_details_applicant1_income_multiplier: The income multiple the lender will use against app1 income to calculate the maximum available based on income.
        :type product_details_applicant1_income_multiplier: float
        :param product_details_applicant2_income_multiplier: The income multiple the lender will use against app2 income to calculate the maximum available based on income.
        :type product_details_applicant2_income_multiplier: float
        :param product_details_joint_applicant_income_multiplier: The income multiple the lender will use against both applicants income to calculate the maximum available based on income.
        :type product_details_joint_applicant_income_multiplier: float
        :param product_details_standard_variable_rate: This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_standard_variable_rate: int
        :param product_details_initial_monthly_payment: The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.
        :type product_details_initial_monthly_payment: float
        :param product_details_cashback: Total cashback amount available for the product (in pence, not GBP).
        :type product_details_cashback: str
        :param product_details_cashback_conditions: Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).
        :type product_details_cashback_conditions: str
        :param product_details_valuation_fee: How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).
        :type product_details_valuation_fee: str
        :param product_details_valuation_fee_conditions: Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.
        :type product_details_valuation_fee_conditions: str
        :param product_details_arrangement_fee: The amount of the arrangement fee for the product (in pence, not GBP).
        :type product_details_arrangement_fee: str
        :param product_details_arrangement_fee_conditions: Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.
        :type product_details_arrangement_fee_conditions: str
        :param product_details_booking_fee: The amount of the Booking fee for the product (in pence, not GBP).
        :type product_details_booking_fee: str
        :param product_details_booking_fee_conditions: Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_booking_fee_conditions: str
        :param product_details_higher_lending_charge: The amount of the Higher lending charge fee for the product (in pence, not GBP).
        :type product_details_higher_lending_charge: str
        :param product_details_higher_lending_charge_conditions: Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_higher_lending_charge_conditions: str
        :param product_details_free_legal_fees: Indicates if the product offers free legal fees as an incentive.
        :type product_details_free_legal_fees: bool
        :param product_details_free_legal_fee_conditions: Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.
        :type product_details_free_legal_fee_conditions: str
        :param product_details_chaps_fee: The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).
        :type product_details_chaps_fee: str
        :param product_details_fees_payable_on_application: The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).
        :type product_details_fees_payable_on_application: str
        :param product_details_fees_payable_on_completion: The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).
        :type product_details_fees_payable_on_completion: str
        :param product_details_fees_total: The total amount of fees associated with the mortgage that are payable (in pence, not GBP).
        :type product_details_fees_total: str
        :param product_details_early_repayment_charge_applies_until: **DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).
        :type product_details_early_repayment_charge_applies_until: str
        :param product_details_early_repayment_charge_applies_until_calculated_date: **DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.
        :type product_details_early_repayment_charge_applies_until_calculated_date: str
        :param product_details_product_notes: Any free-form notes for the specific product.
        :type product_details_product_notes: str
        :param product_details_employed_prob_period: An Employed applicants available probationary period.
        :type product_details_employed_prob_period: str
        :param product_details_max_property_valuation: Max property valuation acceptable (in pence, not GBP).
        :type product_details_max_property_valuation: str
        :param product_details_studio_flat_flag: Studio flat acceptable.
        :type product_details_studio_flat_flag: str
        :param product_details_proc_fee_code: The proc fee code. (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_code: str
        :param product_details_proc_fee_fixed: If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_fixed: str
        :param product_details_proc_fee_percentage: Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_percentage: int
        :param product_details_proc_fee_min: Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_min: str
        :param product_details_proc_fee_max: Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_max: str
        :param product_details_monthly_payment_after_initial_period_plus_1perc: This is the monthly payment after the initial period if the interest rate were to go up 1%.
        :type product_details_monthly_payment_after_initial_period_plus_1perc: float
        :param product_details_monthly_payment_after_initial_period_plus_2perc: This is the monthly payment after the initial period if the interest rate were to go up 2%.
        :type product_details_monthly_payment_after_initial_period_plus_2perc: float
        :param product_details_monthly_payment_after_initial_period_plus_3perc: This is the monthly payment after the initial period if the interest rate were to go up 3%.
        :type product_details_monthly_payment_after_initial_period_plus_3perc: float
        :param product_details_self_build: Describes whether the product is available for Self-Build.
        :type product_details_self_build: str
        :param product_details_shared_ownership: Product available for Shared Ownership.
        :type product_details_shared_ownership: str
        :param product_details_mortgage_discharge_fee: Mortgage Discharge Fee (in pence, not GBP).
        :type product_details_mortgage_discharge_fee: str
        :param product_details_deeds_release_fee: Deeds Release Fee (in pence, not GBP).
        :type product_details_deeds_release_fee: str
        :param product_details_funds_transfer_fee_rule: Specifies the add to loan conditions for the Funds Transfer Fee.
        :type product_details_funds_transfer_fee_rule: str
        :param product_details_capital_rest_period: Specifies the Capital Rest Period (Daily, Monthly, Annually)
        :type product_details_capital_rest_period: str
        :param product_details_help_to_buy_shared_equity: Denotes whether the product is available for HelpToBuy Shared Equity.
        :type product_details_help_to_buy_shared_equity: bool
        :param product_details_help_to_buy_mortgage_guarantee: Denotes whether the product is available for HelpToBuy Mortgage Guarantee.
        :type product_details_help_to_buy_mortgage_guarantee: bool
        :param product_details_broker_fee: **DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.
        :type product_details_broker_fee: float
        :param product_details_broker_fee_conditions: **DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.
        :type product_details_broker_fee_conditions: str
        :param product_details_packager_reference: The organisation identifier of the Packager if relevant.
        :type product_details_packager_reference: str
        :param product_details_packager_name: The name of the Packager.
        :type product_details_packager_name: str
        :param product_details_packager_tel_no: The telephone number of the Packager.
        :type product_details_packager_tel_no: str
        :param product_details_packager_web_address: The web address url of the Packager.
        :type product_details_packager_web_address: str
        :param product_details_lender_criteria_url: A String specifying the url to use to navigate to the Lender’s own criteria.
        :type product_details_lender_criteria_url: str
        :param product_details_lender_product_reference: Specifies the lender’s reference number or code for the product.
        :type product_details_lender_product_reference: str
        :param product_details_homebuyers_fee: The amount of the homebuyers fee for the product (in pence, not GBP).
        :type product_details_homebuyers_fee: str
        :param product_details_homebuyers_fee_conditions: The conditions associated with the homebuyers fee.
        :type product_details_homebuyers_fee_conditions: str
        :param product_details_legal_fee: The amount of the legal fee (in pence, not GBP).
        :type product_details_legal_fee: str
        :param product_details_legal_fee_conditions: The conditions associated with the legal fee.
        :type product_details_legal_fee_conditions: str
        :param product_details_product_type: The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.
        :type product_details_product_type: str
        :param product_details_net_proc_fee: The amount of the net proc fee. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee: float
        :param product_details_net_proc_fee_fixed: The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_fixed: str
        :param product_details_net_proc_fee_percentage: The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_percentage: int
        :param product_details_net_proc_fee_min: The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_min: str
        :param product_details_net_proc_fee_max: The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_max: str
        :param product_details_mortgage_discharge_fee_when_to_pay: Describes when the mortgage discharge fee is payable.
        :type product_details_mortgage_discharge_fee_when_to_pay: str
        :param product_details_product_match_status: This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.
        :type product_details_product_match_status: str
        :param product_details_reject_reasons: A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.
        :type product_details_reject_reasons: str
        :param product_details_max_loan_available: The maximum calculated loan amount available for this product (in pence, not GBP).
        :type product_details_max_loan_available: str
        :param product_details_buy_to_let_rental_income_calculation_rate: The rate value used in the calculation to determine the required rental income for BTL.
        :type product_details_buy_to_let_rental_income_calculation_rate: float
        :param product_details_disbursement_fee: The Disbursement Fee amount (in pence, not GBP).
        :type product_details_disbursement_fee: str
        :param product_details_disbursement_fee_conditions: Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.
        :type product_details_disbursement_fee_conditions: str
        :param product_details_true_cost_full_term: This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).
        :type product_details_true_cost_full_term: str
        :param product_details_initial_monthly_payment_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.
        :type product_details_initial_monthly_payment_inc_existing_mortgage: float
        :param product_details_true_cost_full_term_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_full_term_inc_existing_mortgage: float
        :param product_details_true_cost_initial_period_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_initial_period_inc_existing_mortgage: float
        :param product_details_true_cost_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_inc_existing_mortgage: float
        :param product_details_selected_mortgage_club_code: **DEPRECATED** moved to mortgage.  The selected mortgage club code.
        :type product_details_selected_mortgage_club_code: str
        :param product_details_max_overpayment_percent_no_erc: Describes the maximum overpayment percentage when no ERC.
        :type product_details_max_overpayment_percent_no_erc: int
        :param product_details_overpayments_allowed: Indicates whether the product allows overpayments.
        :type product_details_overpayments_allowed: bool
        :param product_details_overpayment_conditions: Where a mortgage allows overpayments, provide details and conditions for overpayment.
        :type product_details_overpayment_conditions: str
        :param product_details_underpayments_allowed: Indicates whether the product allows underpayments.
        :type product_details_underpayments_allowed: bool
        :param product_details_payment_holidays_allowed: Indicates whether the product allows payment holidays.
        :type product_details_payment_holidays_allowed: bool
        :param product_details_date_last_modified: The date that the product data was last modified (RFC3339)
        :type product_details_date_last_modified: str
        :param product_details_optional_partial_repayment: Ability to make Optional Partial Repayments for the Equity Release Product.
        :type product_details_optional_partial_repayment: bool
        :param product_details_apply_online: Indicates whether the product can be applied for online using MortgageApply.  more details
        :type product_details_apply_online: bool
        :param product_details_lender_tel_no: Telephone number of the lender.
        :type product_details_lender_tel_no: str
        :param product_details_lender_web_address: Web address of the lender.
        :type product_details_lender_web_address: str
        :param product_details_initial_rate_period: The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"
        :type product_details_initial_rate_period: str
        :param product_details_initial_rate_period_months: The length of time (in months) of the product’s initial rate period.
        :type product_details_initial_rate_period_months: int
        :param product_details_repayment_acceptable: Indicates if Repayment Capital and Interest only is available as a repayment method.
        :type product_details_repayment_acceptable: bool
        :param product_details_product_availability: Who the product is available to - All, Direct Only Exclusive or intermediary.
        :type product_details_product_availability: str
        :param product_details_available_to_purchase: Indicates if the product is available for Purchases.
        :type product_details_available_to_purchase: bool
        :param product_details_available_to_remortgage: Indicates if the product is available for remortgages.
        :type product_details_available_to_remortgage: bool
        :param product_details_available_to_ftb: Indicates if the product is available to First Time Buyers.
        :type product_details_available_to_ftb: bool
        :param product_details_max_loan: The Maximum Loan available for the product (in pence, not GBP).
        :type product_details_max_loan: str
        :param product_details_min_loan: The Minimum Loan required for the product (in pence, not GBP).
        :type product_details_min_loan: str
        :param product_details_min_time_in_current_position_months: The minimum time an applicant must be in their current employment to be considered for the mortgage.
        :type product_details_min_time_in_current_position_months: int
        :param product_details_min_time_in_continuous_service_months: The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.
        :type product_details_min_time_in_continuous_service_months: int
        :param product_details_min_self_employed_accounts_years: The minimum years account a self-employed applicant will need to be considered.
        :type product_details_min_self_employed_accounts_years: int
        :param product_details_early_repayment_charge_applies: **DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.
        :type product_details_early_repayment_charge_applies: bool
        :param product_details_early_repayment_charge: **DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.
        :type product_details_early_repayment_charge: str
        :param product_details_ccj_maximum_number: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_number: int
        :param product_details_ccj_maximum_amount: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_amount: int
        :param product_details_arrears_not_in_last_months: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.
        :type product_details_arrears_not_in_last_months: int
        :param product_details_true_cost: This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost: str
        :param product_details_true_cost_over_initial_period: This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost_over_initial_period: str
        :param product_details_true_cost_over_calculated_period: This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).
        :type product_details_true_cost_over_calculated_period: str
        :param product_details_cashback_paid_on: Point in time cashback is paid.
        :type product_details_cashback_paid_on: str
        :param product_details_remort_home_improv_max_ltv: Max LTV for Remortgage with a reason for remortgage being Home Improvements.
        :type product_details_remort_home_improv_max_ltv: int
        :param product_details_remort_debt_con_max_ltv: Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.
        :type product_details_remort_debt_con_max_ltv: int
        :param product_details_remort_bus_purpose_max_ltv: Max LTV for Remortgage with a reason for remortgage being Business Purposes.
        :type product_details_remort_bus_purpose_max_ltv: int
        :param product_details_remort_hol_cars_max_ltv: Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.
        :type product_details_remort_hol_cars_max_ltv: int
        :param product_details_affordability_calculator: Link to lender’s affordability calculator.
        :type product_details_affordability_calculator: str
        :param product_details_self_years_avg_income: Average income acceptable for self-employed based on profits.
        :type product_details_self_years_avg_income: int
        :param product_details_flat_over_shop_flag: Flat over shop acceptable. “Yes”, “No”, “Refer”.
        :type product_details_flat_over_shop_flag: str
        :param product_details_flat_over_shop_notes: Notes on this arrangement.
        :type product_details_flat_over_shop_notes: str
        :param product_details_flat_over_shop_owner: If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_owner: str
        :param product_details_flat_over_shop_sep_ent: Is separate entrance required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_ent: str
        :param product_details_flat_over_shop_sep_title: Is separate title required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_title: str
        :param product_details_flat_over_shop_restaurant: Acceptable if above restaurant. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_restaurant: str
        :param product_details_flat_over_shop_retail: Acceptable if above retail shop. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_retail: str
        :param product_details_flat_over_shop_fast_food: Acceptable if above fast food. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_food: str
        :param product_details_flat_over_shop_fast_industry_unit: Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_industry_unit: str
        :param product_details_flat_max_floors: Max floors acceptable in a flat.
        :type product_details_flat_max_floors: int
        :param product_details_flat_max_floors_no_lift: Max floors acceptable in flat without a lift.
        :type product_details_flat_max_floors_no_lift: int
        :param product_details_deeds_release_fee_when_to_pay: Describes when the deeds release fee is payable.
        :type product_details_deeds_release_fee_when_to_pay: str
        :param product_details_applicant1_minimum_age: The minimum age for the primary applicant.
        :type product_details_applicant1_minimum_age: int
        :param product_details_applicant2_minimum_age: The minimum age for the secondary applicant.
        :type product_details_applicant2_minimum_age: int
        :param product_details_applicant_maximum_age: The applicants' maximum age on expiry.
        :type product_details_applicant_maximum_age: int
        :param product_details_freehold_flag: Freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_freehold_flag: str
        :param product_details_leasehold_flag: Leasehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_leasehold_flag: str
        :param product_details_commonhold_flag: Commonhold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_commonhold_flag: str
        :param product_details_feudal_flag: Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_feudal_flag: str
        :param product_details_flying_freehold_flag: Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_flying_freehold_flag: str
        :param product_details_flying_freehold_max_percentage: Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_flying_freehold_max_percentage: int
        :param product_details_product_available_date: Date of product becoming available (YYYY-MM-DD).
        :type product_details_product_available_date: str
        :param product_details_product_discontinued_date: Date of product becoming discontinued (YYYY-MM-DD).
        :type product_details_product_discontinued_date: str
        :param product_details_is_offset_product: Specifies whether this is an offset product.
        :type product_details_is_offset_product: bool
        :param product_details_is_further_advance: Specifies whether this is for a further advance product.
        :type product_details_is_further_advance: bool
        :param product_details_is_porting: Specifies whether this is for a porting product.
        :type product_details_is_porting: bool
        :param product_details_mortgage_type: The type of mortgage.
        :type product_details_mortgage_type: str
        :param product_details_sourcing_reference: Sourcing Engines Lender Reference.
        :type product_details_sourcing_reference: str
        :param product_details_sourcing_product_reference: SourceEngines Unique Product Reference.
        :type product_details_sourcing_product_reference: str
        :param product_details_lender_reference: Acre Organisation GUID of the mortgage lender.
        :type product_details_lender_reference: str
        :param product_details_portability_conditions: Where a mortgage is portable, provide details and conditions for portability.
        :type product_details_portability_conditions: str
        :param product_details_incentive_description: Where a mortgage includes incentives, provides details on said incentives.
        :type product_details_incentive_description: str
        :param product_details_insurance_conditions: Where insurance is required as a condition of a mortgage, provides details of such.
        :type product_details_insurance_conditions: str
        :param product_details_is_interest_retained: False (default) Whether the interest is retained.
        :type product_details_is_interest_retained: 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._get_acre_mortgage_product_serialize(
            product_id=product_id,
            product_details_product_code=product_details_product_code,
            product_details_product_name=product_details_product_name,
            product_details_lender_code=product_details_lender_code,
            product_details_lender_name=product_details_lender_name,
            product_details_initial_pay_rate=product_details_initial_pay_rate,
            product_details_mortgage_class=product_details_mortgage_class,
            product_details_applicant_type_conditions=product_details_applicant_type_conditions,
            product_details_full_rate_description=product_details_full_rate_description,
            product_details_apr_lenders=product_details_apr_lenders,
            product_details_max_ltv_available=product_details_max_ltv_available,
            product_details_applicant1_income_multiplier=product_details_applicant1_income_multiplier,
            product_details_applicant2_income_multiplier=product_details_applicant2_income_multiplier,
            product_details_joint_applicant_income_multiplier=product_details_joint_applicant_income_multiplier,
            product_details_standard_variable_rate=product_details_standard_variable_rate,
            product_details_initial_monthly_payment=product_details_initial_monthly_payment,
            product_details_cashback=product_details_cashback,
            product_details_cashback_conditions=product_details_cashback_conditions,
            product_details_valuation_fee=product_details_valuation_fee,
            product_details_valuation_fee_conditions=product_details_valuation_fee_conditions,
            product_details_arrangement_fee=product_details_arrangement_fee,
            product_details_arrangement_fee_conditions=product_details_arrangement_fee_conditions,
            product_details_booking_fee=product_details_booking_fee,
            product_details_booking_fee_conditions=product_details_booking_fee_conditions,
            product_details_higher_lending_charge=product_details_higher_lending_charge,
            product_details_higher_lending_charge_conditions=product_details_higher_lending_charge_conditions,
            product_details_free_legal_fees=product_details_free_legal_fees,
            product_details_free_legal_fee_conditions=product_details_free_legal_fee_conditions,
            product_details_chaps_fee=product_details_chaps_fee,
            product_details_fees_payable_on_application=product_details_fees_payable_on_application,
            product_details_fees_payable_on_completion=product_details_fees_payable_on_completion,
            product_details_fees_total=product_details_fees_total,
            product_details_early_repayment_charge_applies_until=product_details_early_repayment_charge_applies_until,
            product_details_early_repayment_charge_applies_until_calculated_date=product_details_early_repayment_charge_applies_until_calculated_date,
            product_details_product_notes=product_details_product_notes,
            product_details_employed_prob_period=product_details_employed_prob_period,
            product_details_max_property_valuation=product_details_max_property_valuation,
            product_details_studio_flat_flag=product_details_studio_flat_flag,
            product_details_proc_fee_code=product_details_proc_fee_code,
            product_details_proc_fee_fixed=product_details_proc_fee_fixed,
            product_details_proc_fee_percentage=product_details_proc_fee_percentage,
            product_details_proc_fee_min=product_details_proc_fee_min,
            product_details_proc_fee_max=product_details_proc_fee_max,
            product_details_monthly_payment_after_initial_period_plus_1perc=product_details_monthly_payment_after_initial_period_plus_1perc,
            product_details_monthly_payment_after_initial_period_plus_2perc=product_details_monthly_payment_after_initial_period_plus_2perc,
            product_details_monthly_payment_after_initial_period_plus_3perc=product_details_monthly_payment_after_initial_period_plus_3perc,
            product_details_self_build=product_details_self_build,
            product_details_shared_ownership=product_details_shared_ownership,
            product_details_mortgage_discharge_fee=product_details_mortgage_discharge_fee,
            product_details_deeds_release_fee=product_details_deeds_release_fee,
            product_details_funds_transfer_fee_rule=product_details_funds_transfer_fee_rule,
            product_details_capital_rest_period=product_details_capital_rest_period,
            product_details_help_to_buy_shared_equity=product_details_help_to_buy_shared_equity,
            product_details_help_to_buy_mortgage_guarantee=product_details_help_to_buy_mortgage_guarantee,
            product_details_broker_fee=product_details_broker_fee,
            product_details_broker_fee_conditions=product_details_broker_fee_conditions,
            product_details_packager_reference=product_details_packager_reference,
            product_details_packager_name=product_details_packager_name,
            product_details_packager_tel_no=product_details_packager_tel_no,
            product_details_packager_web_address=product_details_packager_web_address,
            product_details_lender_criteria_url=product_details_lender_criteria_url,
            product_details_lender_product_reference=product_details_lender_product_reference,
            product_details_homebuyers_fee=product_details_homebuyers_fee,
            product_details_homebuyers_fee_conditions=product_details_homebuyers_fee_conditions,
            product_details_legal_fee=product_details_legal_fee,
            product_details_legal_fee_conditions=product_details_legal_fee_conditions,
            product_details_product_type=product_details_product_type,
            product_details_net_proc_fee=product_details_net_proc_fee,
            product_details_net_proc_fee_fixed=product_details_net_proc_fee_fixed,
            product_details_net_proc_fee_percentage=product_details_net_proc_fee_percentage,
            product_details_net_proc_fee_min=product_details_net_proc_fee_min,
            product_details_net_proc_fee_max=product_details_net_proc_fee_max,
            product_details_mortgage_discharge_fee_when_to_pay=product_details_mortgage_discharge_fee_when_to_pay,
            product_details_product_match_status=product_details_product_match_status,
            product_details_reject_reasons=product_details_reject_reasons,
            product_details_max_loan_available=product_details_max_loan_available,
            product_details_buy_to_let_rental_income_calculation_rate=product_details_buy_to_let_rental_income_calculation_rate,
            product_details_disbursement_fee=product_details_disbursement_fee,
            product_details_disbursement_fee_conditions=product_details_disbursement_fee_conditions,
            product_details_true_cost_full_term=product_details_true_cost_full_term,
            product_details_initial_monthly_payment_inc_existing_mortgage=product_details_initial_monthly_payment_inc_existing_mortgage,
            product_details_true_cost_full_term_inc_existing_mortgage=product_details_true_cost_full_term_inc_existing_mortgage,
            product_details_true_cost_initial_period_inc_existing_mortgage=product_details_true_cost_initial_period_inc_existing_mortgage,
            product_details_true_cost_inc_existing_mortgage=product_details_true_cost_inc_existing_mortgage,
            product_details_selected_mortgage_club_code=product_details_selected_mortgage_club_code,
            product_details_max_overpayment_percent_no_erc=product_details_max_overpayment_percent_no_erc,
            product_details_overpayments_allowed=product_details_overpayments_allowed,
            product_details_overpayment_conditions=product_details_overpayment_conditions,
            product_details_underpayments_allowed=product_details_underpayments_allowed,
            product_details_payment_holidays_allowed=product_details_payment_holidays_allowed,
            product_details_date_last_modified=product_details_date_last_modified,
            product_details_optional_partial_repayment=product_details_optional_partial_repayment,
            product_details_apply_online=product_details_apply_online,
            product_details_lender_tel_no=product_details_lender_tel_no,
            product_details_lender_web_address=product_details_lender_web_address,
            product_details_initial_rate_period=product_details_initial_rate_period,
            product_details_initial_rate_period_months=product_details_initial_rate_period_months,
            product_details_repayment_acceptable=product_details_repayment_acceptable,
            product_details_product_availability=product_details_product_availability,
            product_details_available_to_purchase=product_details_available_to_purchase,
            product_details_available_to_remortgage=product_details_available_to_remortgage,
            product_details_available_to_ftb=product_details_available_to_ftb,
            product_details_max_loan=product_details_max_loan,
            product_details_min_loan=product_details_min_loan,
            product_details_min_time_in_current_position_months=product_details_min_time_in_current_position_months,
            product_details_min_time_in_continuous_service_months=product_details_min_time_in_continuous_service_months,
            product_details_min_self_employed_accounts_years=product_details_min_self_employed_accounts_years,
            product_details_early_repayment_charge_applies=product_details_early_repayment_charge_applies,
            product_details_early_repayment_charge=product_details_early_repayment_charge,
            product_details_ccj_maximum_number=product_details_ccj_maximum_number,
            product_details_ccj_maximum_amount=product_details_ccj_maximum_amount,
            product_details_arrears_not_in_last_months=product_details_arrears_not_in_last_months,
            product_details_true_cost=product_details_true_cost,
            product_details_true_cost_over_initial_period=product_details_true_cost_over_initial_period,
            product_details_true_cost_over_calculated_period=product_details_true_cost_over_calculated_period,
            product_details_cashback_paid_on=product_details_cashback_paid_on,
            product_details_remort_home_improv_max_ltv=product_details_remort_home_improv_max_ltv,
            product_details_remort_debt_con_max_ltv=product_details_remort_debt_con_max_ltv,
            product_details_remort_bus_purpose_max_ltv=product_details_remort_bus_purpose_max_ltv,
            product_details_remort_hol_cars_max_ltv=product_details_remort_hol_cars_max_ltv,
            product_details_affordability_calculator=product_details_affordability_calculator,
            product_details_self_years_avg_income=product_details_self_years_avg_income,
            product_details_flat_over_shop_flag=product_details_flat_over_shop_flag,
            product_details_flat_over_shop_notes=product_details_flat_over_shop_notes,
            product_details_flat_over_shop_owner=product_details_flat_over_shop_owner,
            product_details_flat_over_shop_sep_ent=product_details_flat_over_shop_sep_ent,
            product_details_flat_over_shop_sep_title=product_details_flat_over_shop_sep_title,
            product_details_flat_over_shop_restaurant=product_details_flat_over_shop_restaurant,
            product_details_flat_over_shop_retail=product_details_flat_over_shop_retail,
            product_details_flat_over_shop_fast_food=product_details_flat_over_shop_fast_food,
            product_details_flat_over_shop_fast_industry_unit=product_details_flat_over_shop_fast_industry_unit,
            product_details_flat_max_floors=product_details_flat_max_floors,
            product_details_flat_max_floors_no_lift=product_details_flat_max_floors_no_lift,
            product_details_deeds_release_fee_when_to_pay=product_details_deeds_release_fee_when_to_pay,
            product_details_applicant1_minimum_age=product_details_applicant1_minimum_age,
            product_details_applicant2_minimum_age=product_details_applicant2_minimum_age,
            product_details_applicant_maximum_age=product_details_applicant_maximum_age,
            product_details_freehold_flag=product_details_freehold_flag,
            product_details_leasehold_flag=product_details_leasehold_flag,
            product_details_commonhold_flag=product_details_commonhold_flag,
            product_details_feudal_flag=product_details_feudal_flag,
            product_details_flying_freehold_flag=product_details_flying_freehold_flag,
            product_details_flying_freehold_max_percentage=product_details_flying_freehold_max_percentage,
            product_details_product_available_date=product_details_product_available_date,
            product_details_product_discontinued_date=product_details_product_discontinued_date,
            product_details_is_offset_product=product_details_is_offset_product,
            product_details_is_further_advance=product_details_is_further_advance,
            product_details_is_porting=product_details_is_porting,
            product_details_mortgage_type=product_details_mortgage_type,
            product_details_sourcing_reference=product_details_sourcing_reference,
            product_details_sourcing_product_reference=product_details_sourcing_product_reference,
            product_details_lender_reference=product_details_lender_reference,
            product_details_portability_conditions=product_details_portability_conditions,
            product_details_incentive_description=product_details_incentive_description,
            product_details_insurance_conditions=product_details_insurance_conditions,
            product_details_is_interest_retained=product_details_is_interest_retained,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def get_acre_mortgage_product_without_preload_content(
        self,
        product_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage product (cannot be used with `product_details`). Required.")],
        product_details_product_code: Annotated[Optional[StrictStr], Field(description="A unique identifier for each product within the engine.")] = None,
        product_details_product_name: Annotated[Optional[StrictStr], Field(description="Name of the product.")] = None,
        product_details_lender_code: Annotated[Optional[StrictStr], Field(description="Lender Code of the applicant’s existing mortgage lender.")] = None,
        product_details_lender_name: Annotated[Optional[StrictStr], Field(description="The mortgage lender’s name.")] = None,
        product_details_initial_pay_rate: Annotated[Optional[StrictInt], Field(description="The initial pay rate.")] = None,
        product_details_mortgage_class: Annotated[Optional[StrictStr], Field(description="The class of the product")] = None,
        product_details_applicant_type_conditions: Annotated[Optional[StrictStr], Field(description="Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.")] = None,
        product_details_full_rate_description: Annotated[Optional[StrictStr], Field(description="A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.")] = None,
        product_details_apr_lenders: Annotated[Optional[StrictInt], Field(description="Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values")] = None,
        product_details_max_ltv_available: Annotated[Optional[StrictInt], Field(description="The maximum loan to value available for the product.")] = None,
        product_details_applicant1_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app1 income to calculate the maximum available based on income.")] = None,
        product_details_applicant2_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against app2 income to calculate the maximum available based on income.")] = None,
        product_details_joint_applicant_income_multiplier: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The income multiple the lender will use against both applicants income to calculate the maximum available based on income.")] = None,
        product_details_standard_variable_rate: Annotated[Optional[StrictInt], Field(description="This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_initial_monthly_payment: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.")] = None,
        product_details_cashback: Annotated[Optional[StrictStr], Field(description="Total cashback amount available for the product (in pence, not GBP).")] = None,
        product_details_cashback_conditions: Annotated[Optional[StrictStr], Field(description="Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).")] = None,
        product_details_valuation_fee: Annotated[Optional[StrictStr], Field(description="How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).")] = None,
        product_details_valuation_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.")] = None,
        product_details_arrangement_fee: Annotated[Optional[StrictStr], Field(description="The amount of the arrangement fee for the product (in pence, not GBP).")] = None,
        product_details_arrangement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_booking_fee: Annotated[Optional[StrictStr], Field(description="The amount of the Booking fee for the product (in pence, not GBP).")] = None,
        product_details_booking_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_higher_lending_charge: Annotated[Optional[StrictStr], Field(description="The amount of the Higher lending charge fee for the product (in pence, not GBP).")] = None,
        product_details_higher_lending_charge_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.")] = None,
        product_details_free_legal_fees: Annotated[Optional[StrictBool], Field(description="Indicates if the product offers free legal fees as an incentive.")] = None,
        product_details_free_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.")] = None,
        product_details_chaps_fee: Annotated[Optional[StrictStr], Field(description="The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).")] = None,
        product_details_fees_payable_on_application: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).")] = None,
        product_details_fees_payable_on_completion: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).")] = None,
        product_details_fees_total: Annotated[Optional[StrictStr], Field(description="The total amount of fees associated with the mortgage that are payable (in pence, not GBP).")] = None,
        product_details_early_repayment_charge_applies_until: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).")] = None,
        product_details_early_repayment_charge_applies_until_calculated_date: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.")] = None,
        product_details_product_notes: Annotated[Optional[StrictStr], Field(description="Any free-form notes for the specific product.")] = None,
        product_details_employed_prob_period: Annotated[Optional[StrictStr], Field(description="An Employed applicants available probationary period.")] = None,
        product_details_max_property_valuation: Annotated[Optional[StrictStr], Field(description="Max property valuation acceptable (in pence, not GBP).")] = None,
        product_details_studio_flat_flag: Annotated[Optional[StrictStr], Field(description="Studio flat acceptable.")] = None,
        product_details_proc_fee_code: Annotated[Optional[StrictStr], Field(description="The proc fee code. (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_min: Annotated[Optional[StrictStr], Field(description="Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_proc_fee_max: Annotated[Optional[StrictStr], Field(description="Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_monthly_payment_after_initial_period_plus_1perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 1%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_2perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 2%.")] = None,
        product_details_monthly_payment_after_initial_period_plus_3perc: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="This is the monthly payment after the initial period if the interest rate were to go up 3%.")] = None,
        product_details_self_build: Annotated[Optional[StrictStr], Field(description="Describes whether the product is available for Self-Build.")] = None,
        product_details_shared_ownership: Annotated[Optional[StrictStr], Field(description="Product available for Shared Ownership.")] = None,
        product_details_mortgage_discharge_fee: Annotated[Optional[StrictStr], Field(description="Mortgage Discharge Fee (in pence, not GBP).")] = None,
        product_details_deeds_release_fee: Annotated[Optional[StrictStr], Field(description="Deeds Release Fee (in pence, not GBP).")] = None,
        product_details_funds_transfer_fee_rule: Annotated[Optional[StrictStr], Field(description="Specifies the add to loan conditions for the Funds Transfer Fee.")] = None,
        product_details_capital_rest_period: Annotated[Optional[StrictStr], Field(description="Specifies the Capital Rest Period (Daily, Monthly, Annually)")] = None,
        product_details_help_to_buy_shared_equity: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Shared Equity.")] = None,
        product_details_help_to_buy_mortgage_guarantee: Annotated[Optional[StrictBool], Field(description="Denotes whether the product is available for HelpToBuy Mortgage Guarantee.")] = None,
        product_details_broker_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="**DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.")] = None,
        product_details_broker_fee_conditions: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.")] = None,
        product_details_packager_reference: Annotated[Optional[StrictStr], Field(description="The organisation identifier of the Packager if relevant.")] = None,
        product_details_packager_name: Annotated[Optional[StrictStr], Field(description="The name of the Packager.")] = None,
        product_details_packager_tel_no: Annotated[Optional[StrictStr], Field(description="The telephone number of the Packager.")] = None,
        product_details_packager_web_address: Annotated[Optional[StrictStr], Field(description="The web address url of the Packager.")] = None,
        product_details_lender_criteria_url: Annotated[Optional[StrictStr], Field(description="A String specifying the url to use to navigate to the Lender’s own criteria.")] = None,
        product_details_lender_product_reference: Annotated[Optional[StrictStr], Field(description="Specifies the lender’s reference number or code for the product.")] = None,
        product_details_homebuyers_fee: Annotated[Optional[StrictStr], Field(description="The amount of the homebuyers fee for the product (in pence, not GBP).")] = None,
        product_details_homebuyers_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the homebuyers fee.")] = None,
        product_details_legal_fee: Annotated[Optional[StrictStr], Field(description="The amount of the legal fee (in pence, not GBP).")] = None,
        product_details_legal_fee_conditions: Annotated[Optional[StrictStr], Field(description="The conditions associated with the legal fee.")] = None,
        product_details_product_type: Annotated[Optional[StrictStr], Field(description="The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.")] = None,
        product_details_net_proc_fee: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The amount of the net proc fee. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_fixed: Annotated[Optional[StrictStr], Field(description="The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_percentage: Annotated[Optional[StrictInt], Field(description="The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_min: Annotated[Optional[StrictStr], Field(description="The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_net_proc_fee_max: Annotated[Optional[StrictStr], Field(description="The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).")] = None,
        product_details_mortgage_discharge_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the mortgage discharge fee is payable.")] = None,
        product_details_product_match_status: Annotated[Optional[StrictStr], Field(description="This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.")] = None,
        product_details_reject_reasons: Annotated[Optional[StrictStr], Field(description="A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.")] = None,
        product_details_max_loan_available: Annotated[Optional[StrictStr], Field(description="The maximum calculated loan amount available for this product (in pence, not GBP).")] = None,
        product_details_buy_to_let_rental_income_calculation_rate: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="The rate value used in the calculation to determine the required rental income for BTL.")] = None,
        product_details_disbursement_fee: Annotated[Optional[StrictStr], Field(description="The Disbursement Fee amount (in pence, not GBP).")] = None,
        product_details_disbursement_fee_conditions: Annotated[Optional[StrictStr], Field(description="Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.")] = None,
        product_details_true_cost_full_term: Annotated[Optional[StrictStr], Field(description="This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).")] = None,
        product_details_initial_monthly_payment_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.")] = None,
        product_details_true_cost_full_term_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_initial_period_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_true_cost_inc_existing_mortgage: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.")] = None,
        product_details_selected_mortgage_club_code: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** moved to mortgage.  The selected mortgage club code.")] = None,
        product_details_max_overpayment_percent_no_erc: Annotated[Optional[StrictInt], Field(description="Describes the maximum overpayment percentage when no ERC.")] = None,
        product_details_overpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows overpayments.")] = None,
        product_details_overpayment_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage allows overpayments, provide details and conditions for overpayment.")] = None,
        product_details_underpayments_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows underpayments.")] = None,
        product_details_payment_holidays_allowed: Annotated[Optional[StrictBool], Field(description="Indicates whether the product allows payment holidays.")] = None,
        product_details_date_last_modified: Annotated[Optional[StrictStr], Field(description="The date that the product data was last modified (RFC3339)")] = None,
        product_details_optional_partial_repayment: Annotated[Optional[StrictBool], Field(description="Ability to make Optional Partial Repayments for the Equity Release Product.")] = None,
        product_details_apply_online: Annotated[Optional[StrictBool], Field(description="Indicates whether the product can be applied for online using MortgageApply.  more details")] = None,
        product_details_lender_tel_no: Annotated[Optional[StrictStr], Field(description="Telephone number of the lender.")] = None,
        product_details_lender_web_address: Annotated[Optional[StrictStr], Field(description="Web address of the lender.")] = None,
        product_details_initial_rate_period: Annotated[Optional[StrictStr], Field(description="The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"")] = None,
        product_details_initial_rate_period_months: Annotated[Optional[StrictInt], Field(description="The length of time (in months) of the product’s initial rate period.")] = None,
        product_details_repayment_acceptable: Annotated[Optional[StrictBool], Field(description="Indicates if Repayment Capital and Interest only is available as a repayment method.")] = None,
        product_details_product_availability: Annotated[Optional[StrictStr], Field(description="Who the product is available to - All, Direct Only Exclusive or intermediary.")] = None,
        product_details_available_to_purchase: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for Purchases.")] = None,
        product_details_available_to_remortgage: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available for remortgages.")] = None,
        product_details_available_to_ftb: Annotated[Optional[StrictBool], Field(description="Indicates if the product is available to First Time Buyers.")] = None,
        product_details_max_loan: Annotated[Optional[StrictStr], Field(description="The Maximum Loan available for the product (in pence, not GBP).")] = None,
        product_details_min_loan: Annotated[Optional[StrictStr], Field(description="The Minimum Loan required for the product (in pence, not GBP).")] = None,
        product_details_min_time_in_current_position_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be in their current employment to be considered for the mortgage.")] = None,
        product_details_min_time_in_continuous_service_months: Annotated[Optional[StrictInt], Field(description="The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.")] = None,
        product_details_min_self_employed_accounts_years: Annotated[Optional[StrictInt], Field(description="The minimum years account a self-employed applicant will need to be considered.")] = None,
        product_details_early_repayment_charge_applies: Annotated[Optional[StrictBool], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.")] = None,
        product_details_early_repayment_charge: Annotated[Optional[StrictStr], Field(description="**DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.")] = None,
        product_details_ccj_maximum_number: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_ccj_maximum_amount: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.")] = None,
        product_details_arrears_not_in_last_months: Annotated[Optional[StrictInt], Field(description="Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.")] = None,
        product_details_true_cost: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_initial_period: Annotated[Optional[StrictStr], Field(description="This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.")] = None,
        product_details_true_cost_over_calculated_period: Annotated[Optional[StrictStr], Field(description="This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).")] = None,
        product_details_cashback_paid_on: Annotated[Optional[StrictStr], Field(description="Point in time cashback is paid.")] = None,
        product_details_remort_home_improv_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Home Improvements.")] = None,
        product_details_remort_debt_con_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.")] = None,
        product_details_remort_bus_purpose_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Business Purposes.")] = None,
        product_details_remort_hol_cars_max_ltv: Annotated[Optional[StrictInt], Field(description="Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.")] = None,
        product_details_affordability_calculator: Annotated[Optional[StrictStr], Field(description="Link to lender’s affordability calculator.")] = None,
        product_details_self_years_avg_income: Annotated[Optional[StrictInt], Field(description="Average income acceptable for self-employed based on profits.")] = None,
        product_details_flat_over_shop_flag: Annotated[Optional[StrictStr], Field(description="Flat over shop acceptable. “Yes”, “No”, “Refer”.")] = None,
        product_details_flat_over_shop_notes: Annotated[Optional[StrictStr], Field(description="Notes on this arrangement.")] = None,
        product_details_flat_over_shop_owner: Annotated[Optional[StrictStr], Field(description="If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_ent: Annotated[Optional[StrictStr], Field(description="Is separate entrance required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_sep_title: Annotated[Optional[StrictStr], Field(description="Is separate title required? \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_restaurant: Annotated[Optional[StrictStr], Field(description="Acceptable if above restaurant. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_retail: Annotated[Optional[StrictStr], Field(description="Acceptable if above retail shop. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_food: Annotated[Optional[StrictStr], Field(description="Acceptable if above fast food. \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_over_shop_fast_industry_unit: Annotated[Optional[StrictStr], Field(description="Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".")] = None,
        product_details_flat_max_floors: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in a flat.")] = None,
        product_details_flat_max_floors_no_lift: Annotated[Optional[StrictInt], Field(description="Max floors acceptable in flat without a lift.")] = None,
        product_details_deeds_release_fee_when_to_pay: Annotated[Optional[StrictStr], Field(description="Describes when the deeds release fee is payable.")] = None,
        product_details_applicant1_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the primary applicant.")] = None,
        product_details_applicant2_minimum_age: Annotated[Optional[StrictInt], Field(description="The minimum age for the secondary applicant.")] = None,
        product_details_applicant_maximum_age: Annotated[Optional[StrictInt], Field(description="The applicants' maximum age on expiry.")] = None,
        product_details_freehold_flag: Annotated[Optional[StrictStr], Field(description="Freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_leasehold_flag: Annotated[Optional[StrictStr], Field(description="Leasehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_commonhold_flag: Annotated[Optional[StrictStr], Field(description="Commonhold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_feudal_flag: Annotated[Optional[StrictStr], Field(description="Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_flag: Annotated[Optional[StrictStr], Field(description="Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".")] = None,
        product_details_flying_freehold_max_percentage: Annotated[Optional[StrictInt], Field(description="Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).")] = None,
        product_details_product_available_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming available (YYYY-MM-DD).")] = None,
        product_details_product_discontinued_date: Annotated[Optional[StrictStr], Field(description="Date of product becoming discontinued (YYYY-MM-DD).")] = None,
        product_details_is_offset_product: Annotated[Optional[StrictBool], Field(description="Specifies whether this is an offset product.")] = None,
        product_details_is_further_advance: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a further advance product.")] = None,
        product_details_is_porting: Annotated[Optional[StrictBool], Field(description="Specifies whether this is for a porting product.")] = None,
        product_details_mortgage_type: Annotated[Optional[StrictStr], Field(description="The type of mortgage.")] = None,
        product_details_sourcing_reference: Annotated[Optional[StrictStr], Field(description="Sourcing Engines Lender Reference.")] = None,
        product_details_sourcing_product_reference: Annotated[Optional[StrictStr], Field(description="SourceEngines Unique Product Reference.")] = None,
        product_details_lender_reference: Annotated[Optional[StrictStr], Field(description="Acre Organisation GUID of the mortgage lender.")] = None,
        product_details_portability_conditions: Annotated[Optional[StrictStr], Field(description="Where a mortgage is portable, provide details and conditions for portability.")] = None,
        product_details_incentive_description: Annotated[Optional[StrictStr], Field(description="Where a mortgage includes incentives, provides details on said incentives.")] = None,
        product_details_insurance_conditions: Annotated[Optional[StrictStr], Field(description="Where insurance is required as a condition of a mortgage, provides details of such.")] = None,
        product_details_is_interest_retained: Annotated[Optional[StrictBool], Field(description="False (default) Whether the interest is retained.")] = 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:
        """Get mortgage product details for a mortgage product stored in Acre.


        :param product_id: Acre ID of the mortgage product (cannot be used with `product_details`). Required. (required)
        :type product_id: str
        :param product_details_product_code: A unique identifier for each product within the engine.
        :type product_details_product_code: str
        :param product_details_product_name: Name of the product.
        :type product_details_product_name: str
        :param product_details_lender_code: Lender Code of the applicant’s existing mortgage lender.
        :type product_details_lender_code: str
        :param product_details_lender_name: The mortgage lender’s name.
        :type product_details_lender_name: str
        :param product_details_initial_pay_rate: The initial pay rate.
        :type product_details_initial_pay_rate: int
        :param product_details_mortgage_class: The class of the product
        :type product_details_mortgage_class: str
        :param product_details_applicant_type_conditions: Indicated who the product is available to - all applicants, existing borrowers only, First time buyers only etc.
        :type product_details_applicant_type_conditions: str
        :param product_details_full_rate_description: A summary of what the initial rate is (Fixed, Discount), the initial rate, how long it is for, then followed by what it then reverts to after this initial rate period.
        :type product_details_full_rate_description: str
        :param product_details_apr_lenders: Lender’s illustrative APRC value, represented as 1/100000 of a percent (precision for up to 5 decimal places).  This value is provided by the lender and will be based on assumptions about term and loan amount that and therefore is illustrative only. The specific APRC value for a mortgage can be found on the mortgage, under its calculated values
        :type product_details_apr_lenders: int
        :param product_details_max_ltv_available: The maximum loan to value available for the product.
        :type product_details_max_ltv_available: int
        :param product_details_applicant1_income_multiplier: The income multiple the lender will use against app1 income to calculate the maximum available based on income.
        :type product_details_applicant1_income_multiplier: float
        :param product_details_applicant2_income_multiplier: The income multiple the lender will use against app2 income to calculate the maximum available based on income.
        :type product_details_applicant2_income_multiplier: float
        :param product_details_joint_applicant_income_multiplier: The income multiple the lender will use against both applicants income to calculate the maximum available based on income.
        :type product_details_joint_applicant_income_multiplier: float
        :param product_details_standard_variable_rate: This is the lenders standard variable rate, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_standard_variable_rate: int
        :param product_details_initial_monthly_payment: The initial monthly mortgage payment based on loan amount and term at the mortgage product’s initial pay rate.
        :type product_details_initial_monthly_payment: float
        :param product_details_cashback: Total cashback amount available for the product (in pence, not GBP).
        :type product_details_cashback: str
        :param product_details_cashback_conditions: Conditions of when the cashback is available (i.e. For remortgage only, Purchase only).
        :type product_details_cashback_conditions: str
        :param product_details_valuation_fee: How the lender charges for a mortgage valuation depending on the value of the property (in pence, not GBP).
        :type product_details_valuation_fee: str
        :param product_details_valuation_fee_conditions: Indicates if there is a free/refundable valuation and if so if it is for Purchase only, remortgage only or to both.
        :type product_details_valuation_fee_conditions: str
        :param product_details_arrangement_fee: The amount of the arrangement fee for the product (in pence, not GBP).
        :type product_details_arrangement_fee: str
        :param product_details_arrangement_fee_conditions: Indicates if the Arrangement fee can be added to the loan, deducted from the loan etc.
        :type product_details_arrangement_fee_conditions: str
        :param product_details_booking_fee: The amount of the Booking fee for the product (in pence, not GBP).
        :type product_details_booking_fee: str
        :param product_details_booking_fee_conditions: Indicates if the Booking fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_booking_fee_conditions: str
        :param product_details_higher_lending_charge: The amount of the Higher lending charge fee for the product (in pence, not GBP).
        :type product_details_higher_lending_charge: str
        :param product_details_higher_lending_charge_conditions: Indicates if the Higher Lending Charge fee can be added to the loan, deducted from the loan etc. Normally has to be paid upfront.
        :type product_details_higher_lending_charge_conditions: str
        :param product_details_free_legal_fees: Indicates if the product offers free legal fees as an incentive.
        :type product_details_free_legal_fees: bool
        :param product_details_free_legal_fee_conditions: Indicates if the free legal fees incentive is available for Purchase only, remortgage only or to both.
        :type product_details_free_legal_fee_conditions: str
        :param product_details_chaps_fee: The amount of the telegraphic Transfer fee for transferring the monies on completion (in pence, not GBP).
        :type product_details_chaps_fee: str
        :param product_details_fees_payable_on_application: The total amount of fees associated with the mortgage that are payable on Application (in pence, not GBP).
        :type product_details_fees_payable_on_application: str
        :param product_details_fees_payable_on_completion: The total amount of fees associated with the mortgage that are payable on Completion (in pence, not GBP).
        :type product_details_fees_payable_on_completion: str
        :param product_details_fees_total: The total amount of fees associated with the mortgage that are payable (in pence, not GBP).
        :type product_details_fees_total: str
        :param product_details_early_repayment_charge_applies_until: **DEPRECATED** Use early_repayment_charge_periods  Indicates when any early repayment charges apply until for paying part or all of the mortgage off (attempts to convert to YYYY-MM-DD, otherwise leaves date unmodified).
        :type product_details_early_repayment_charge_applies_until: str
        :param product_details_early_repayment_charge_applies_until_calculated_date: **DEPRECATED** Use early_repayment_charge_periods  A calculated YYYY-MM-DD for sorting of early_repayment_charge_applies_until.
        :type product_details_early_repayment_charge_applies_until_calculated_date: str
        :param product_details_product_notes: Any free-form notes for the specific product.
        :type product_details_product_notes: str
        :param product_details_employed_prob_period: An Employed applicants available probationary period.
        :type product_details_employed_prob_period: str
        :param product_details_max_property_valuation: Max property valuation acceptable (in pence, not GBP).
        :type product_details_max_property_valuation: str
        :param product_details_studio_flat_flag: Studio flat acceptable.
        :type product_details_studio_flat_flag: str
        :param product_details_proc_fee_code: The proc fee code. (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_code: str
        :param product_details_proc_fee_fixed: If the proc fee is fixed, then it is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_fixed: str
        :param product_details_proc_fee_percentage: Proc fee based on this percentage of loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_percentage: int
        :param product_details_proc_fee_min: Minimum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_min: str
        :param product_details_proc_fee_max: Maximum proc fee if using percentage (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_proc_fee_max: str
        :param product_details_monthly_payment_after_initial_period_plus_1perc: This is the monthly payment after the initial period if the interest rate were to go up 1%.
        :type product_details_monthly_payment_after_initial_period_plus_1perc: float
        :param product_details_monthly_payment_after_initial_period_plus_2perc: This is the monthly payment after the initial period if the interest rate were to go up 2%.
        :type product_details_monthly_payment_after_initial_period_plus_2perc: float
        :param product_details_monthly_payment_after_initial_period_plus_3perc: This is the monthly payment after the initial period if the interest rate were to go up 3%.
        :type product_details_monthly_payment_after_initial_period_plus_3perc: float
        :param product_details_self_build: Describes whether the product is available for Self-Build.
        :type product_details_self_build: str
        :param product_details_shared_ownership: Product available for Shared Ownership.
        :type product_details_shared_ownership: str
        :param product_details_mortgage_discharge_fee: Mortgage Discharge Fee (in pence, not GBP).
        :type product_details_mortgage_discharge_fee: str
        :param product_details_deeds_release_fee: Deeds Release Fee (in pence, not GBP).
        :type product_details_deeds_release_fee: str
        :param product_details_funds_transfer_fee_rule: Specifies the add to loan conditions for the Funds Transfer Fee.
        :type product_details_funds_transfer_fee_rule: str
        :param product_details_capital_rest_period: Specifies the Capital Rest Period (Daily, Monthly, Annually)
        :type product_details_capital_rest_period: str
        :param product_details_help_to_buy_shared_equity: Denotes whether the product is available for HelpToBuy Shared Equity.
        :type product_details_help_to_buy_shared_equity: bool
        :param product_details_help_to_buy_mortgage_guarantee: Denotes whether the product is available for HelpToBuy Mortgage Guarantee.
        :type product_details_help_to_buy_mortgage_guarantee: bool
        :param product_details_broker_fee: **DEPRECATED** Will be moved to mortgage. The amount of the broker fee for the product.
        :type product_details_broker_fee: float
        :param product_details_broker_fee_conditions: **DEPRECATED** Will be moved to mortgage. Describes the conditions associated with the Broker Fee.
        :type product_details_broker_fee_conditions: str
        :param product_details_packager_reference: The organisation identifier of the Packager if relevant.
        :type product_details_packager_reference: str
        :param product_details_packager_name: The name of the Packager.
        :type product_details_packager_name: str
        :param product_details_packager_tel_no: The telephone number of the Packager.
        :type product_details_packager_tel_no: str
        :param product_details_packager_web_address: The web address url of the Packager.
        :type product_details_packager_web_address: str
        :param product_details_lender_criteria_url: A String specifying the url to use to navigate to the Lender’s own criteria.
        :type product_details_lender_criteria_url: str
        :param product_details_lender_product_reference: Specifies the lender’s reference number or code for the product.
        :type product_details_lender_product_reference: str
        :param product_details_homebuyers_fee: The amount of the homebuyers fee for the product (in pence, not GBP).
        :type product_details_homebuyers_fee: str
        :param product_details_homebuyers_fee_conditions: The conditions associated with the homebuyers fee.
        :type product_details_homebuyers_fee_conditions: str
        :param product_details_legal_fee: The amount of the legal fee (in pence, not GBP).
        :type product_details_legal_fee: str
        :param product_details_legal_fee_conditions: The conditions associated with the legal fee.
        :type product_details_legal_fee_conditions: str
        :param product_details_product_type: The type of product. The possible values are: Residential, Buy To Let, Secured Loan, Secured Loan BTL, Bridging Loan, Commercial, Let To Buy, Equity Release.
        :type product_details_product_type: str
        :param product_details_net_proc_fee: The amount of the net proc fee. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee: float
        :param product_details_net_proc_fee_fixed: The net proc fee is fixed to this amount (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_fixed: str
        :param product_details_net_proc_fee_percentage: The net proc fee is this percentage of the loan amount, represented as 1/100000 of a percent (precision for up to 5 decimal places).. (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_percentage: int
        :param product_details_net_proc_fee_min: The minimum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_min: str
        :param product_details_net_proc_fee_max: The maximum amount for the net proc fee (in pence, not GBP). (This value is for the lender/packager proc fee).
        :type product_details_net_proc_fee_max: str
        :param product_details_mortgage_discharge_fee_when_to_pay: Describes when the mortgage discharge fee is payable.
        :type product_details_mortgage_discharge_fee_when_to_pay: str
        :param product_details_product_match_status: This specifies the type of match the sourcing engine has made. Possible values are “Available” and “Near Miss”. “Near Miss” values will appear when an “Include_Near_Misses” search type has been selected and a product has fallen within the buffer zones specified in the NearMissesDetails object.
        :type product_details_product_match_status: str
        :param product_details_reject_reasons: A delimited list (|) of the reasons why the product was marked as a “Near Miss”. Example value: “Maximum LTV Available|Maximum Term Available”.
        :type product_details_reject_reasons: str
        :param product_details_max_loan_available: The maximum calculated loan amount available for this product (in pence, not GBP).
        :type product_details_max_loan_available: str
        :param product_details_buy_to_let_rental_income_calculation_rate: The rate value used in the calculation to determine the required rental income for BTL.
        :type product_details_buy_to_let_rental_income_calculation_rate: float
        :param product_details_disbursement_fee: The Disbursement Fee amount (in pence, not GBP).
        :type product_details_disbursement_fee: str
        :param product_details_disbursement_fee_conditions: Indicates if the Disbursement fee can be added to the loan, deducted from the loan etc.
        :type product_details_disbursement_fee_conditions: str
        :param product_details_true_cost_full_term: This is the True Cost of the mortgage over the full term as specified by the Term and TermUnit fields in the request. In order to have the system calculate this value, the loan amount and term values must be specified in the request (in pence, not GBP).
        :type product_details_true_cost_full_term: str
        :param product_details_initial_monthly_payment_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the cost of the initial monthly payment, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment amount.
        :type product_details_initial_monthly_payment_inc_existing_mortgage: float
        :param product_details_true_cost_full_term_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_full_term_inc_existing_mortgage: float
        :param product_details_true_cost_initial_period_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the full term as specified by the Term and TermUnit fields in the request, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_initial_period_inc_existing_mortgage: float
        :param product_details_true_cost_inc_existing_mortgage: When sourcing Secured Loans/Further Advances/Porting, if the ExistingMortgage object for Applicant 1 is provided, then this field will provide the total cost of the loan over the specified custom duration in CalculateOverNoOfMonths in the TrueCostDetails object or over the full term if a custom duration is not provided, plus the cost of the applicant’s existing mortgage as defined by the CurrentMonthlyPayment and MonthsRemainingOnMortgage fields. If the MonthsRemainingOnMortgage field is not provided, then the existing mortgage’s CurrentMonthlyPayment value is considered to apply over the full term as specified by the request.
        :type product_details_true_cost_inc_existing_mortgage: float
        :param product_details_selected_mortgage_club_code: **DEPRECATED** moved to mortgage.  The selected mortgage club code.
        :type product_details_selected_mortgage_club_code: str
        :param product_details_max_overpayment_percent_no_erc: Describes the maximum overpayment percentage when no ERC.
        :type product_details_max_overpayment_percent_no_erc: int
        :param product_details_overpayments_allowed: Indicates whether the product allows overpayments.
        :type product_details_overpayments_allowed: bool
        :param product_details_overpayment_conditions: Where a mortgage allows overpayments, provide details and conditions for overpayment.
        :type product_details_overpayment_conditions: str
        :param product_details_underpayments_allowed: Indicates whether the product allows underpayments.
        :type product_details_underpayments_allowed: bool
        :param product_details_payment_holidays_allowed: Indicates whether the product allows payment holidays.
        :type product_details_payment_holidays_allowed: bool
        :param product_details_date_last_modified: The date that the product data was last modified (RFC3339)
        :type product_details_date_last_modified: str
        :param product_details_optional_partial_repayment: Ability to make Optional Partial Repayments for the Equity Release Product.
        :type product_details_optional_partial_repayment: bool
        :param product_details_apply_online: Indicates whether the product can be applied for online using MortgageApply.  more details
        :type product_details_apply_online: bool
        :param product_details_lender_tel_no: Telephone number of the lender.
        :type product_details_lender_tel_no: str
        :param product_details_lender_web_address: Web address of the lender.
        :type product_details_lender_web_address: str
        :param product_details_initial_rate_period: The description of when the initial rate period ends. Possible formats: \"mmm-yyyy\" (ie. may-2022), \"x year/s\", \"yyyy-mm-dd\", \"Term\"
        :type product_details_initial_rate_period: str
        :param product_details_initial_rate_period_months: The length of time (in months) of the product’s initial rate period.
        :type product_details_initial_rate_period_months: int
        :param product_details_repayment_acceptable: Indicates if Repayment Capital and Interest only is available as a repayment method.
        :type product_details_repayment_acceptable: bool
        :param product_details_product_availability: Who the product is available to - All, Direct Only Exclusive or intermediary.
        :type product_details_product_availability: str
        :param product_details_available_to_purchase: Indicates if the product is available for Purchases.
        :type product_details_available_to_purchase: bool
        :param product_details_available_to_remortgage: Indicates if the product is available for remortgages.
        :type product_details_available_to_remortgage: bool
        :param product_details_available_to_ftb: Indicates if the product is available to First Time Buyers.
        :type product_details_available_to_ftb: bool
        :param product_details_max_loan: The Maximum Loan available for the product (in pence, not GBP).
        :type product_details_max_loan: str
        :param product_details_min_loan: The Minimum Loan required for the product (in pence, not GBP).
        :type product_details_min_loan: str
        :param product_details_min_time_in_current_position_months: The minimum time an applicant must be in their current employment to be considered for the mortgage.
        :type product_details_min_time_in_current_position_months: int
        :param product_details_min_time_in_continuous_service_months: The minimum time an applicant must be have been in continuous employment to be considered for the mortgage.
        :type product_details_min_time_in_continuous_service_months: int
        :param product_details_min_self_employed_accounts_years: The minimum years account a self-employed applicant will need to be considered.
        :type product_details_min_self_employed_accounts_years: int
        :param product_details_early_repayment_charge_applies: **DEPRECATED** Use early_repayment_charge_periods.  Indicates if the product has any early repayment charges for paying part or all of the mortgage off.
        :type product_details_early_repayment_charge_applies: bool
        :param product_details_early_repayment_charge: **DEPRECATED** Use early_repayment_charge_periods.  Shows what the early repayment charge is as a percentage of the loan amount for each year - 3% year one and 2 % year two etc.
        :type product_details_early_repayment_charge: str
        :param product_details_ccj_maximum_number: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum number of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_number: int
        :param product_details_ccj_maximum_amount: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) The maximum amount of acceptable of County Court Judgements indicated/recorded that will be acceptable.
        :type product_details_ccj_maximum_amount: int
        :param product_details_arrears_not_in_last_months: Deprecated (All adverse sourcing has been replaced with more detailed criteria and this value should no longer be considered accurate) Indicates that if there are mortgage arrears in the last x number of months the product will not be acceptable.
        :type product_details_arrears_not_in_last_months: int
        :param product_details_true_cost: This is how much the mortgage will cost over the custom duration specified by the true_cost_calculate_over_no_of_months field. Also referred to as Total Cost.  In order to have the system calculate this value, there must be a value set for true_cost_calculate_over_no_of_months, and load_required and term values must also be specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost: str
        :param product_details_true_cost_over_initial_period: This is how much the mortgage will cost over just the product’s initial rate period. In order to have the system calculate this value, the field true_cost_disable_calculate_over_initial_period must not be true and there must also be loan amount and term values specified in the request. The amount is specified in pence and not GBP.
        :type product_details_true_cost_over_initial_period: str
        :param product_details_true_cost_over_calculated_period: This field abstracts true_cost and will be populated using the value of true_cost_over_initial_period when true_cost is not present (due to true_cost_calculate_over_no_of_months being omitted from the request).
        :type product_details_true_cost_over_calculated_period: str
        :param product_details_cashback_paid_on: Point in time cashback is paid.
        :type product_details_cashback_paid_on: str
        :param product_details_remort_home_improv_max_ltv: Max LTV for Remortgage with a reason for remortgage being Home Improvements.
        :type product_details_remort_home_improv_max_ltv: int
        :param product_details_remort_debt_con_max_ltv: Max LTV for Remortgage with a reason for remortgage being Debt Consolidation.
        :type product_details_remort_debt_con_max_ltv: int
        :param product_details_remort_bus_purpose_max_ltv: Max LTV for Remortgage with a reason for remortgage being Business Purposes.
        :type product_details_remort_bus_purpose_max_ltv: int
        :param product_details_remort_hol_cars_max_ltv: Max LTV for Remortgage with a reason for remortgage being Holidays, Cars, etc.
        :type product_details_remort_hol_cars_max_ltv: int
        :param product_details_affordability_calculator: Link to lender’s affordability calculator.
        :type product_details_affordability_calculator: str
        :param product_details_self_years_avg_income: Average income acceptable for self-employed based on profits.
        :type product_details_self_years_avg_income: int
        :param product_details_flat_over_shop_flag: Flat over shop acceptable. “Yes”, “No”, “Refer”.
        :type product_details_flat_over_shop_flag: str
        :param product_details_flat_over_shop_notes: Notes on this arrangement.
        :type product_details_flat_over_shop_notes: str
        :param product_details_flat_over_shop_owner: If the purchaser is required to own the shop that the flat is over. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_owner: str
        :param product_details_flat_over_shop_sep_ent: Is separate entrance required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_ent: str
        :param product_details_flat_over_shop_sep_title: Is separate title required? \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_sep_title: str
        :param product_details_flat_over_shop_restaurant: Acceptable if above restaurant. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_restaurant: str
        :param product_details_flat_over_shop_retail: Acceptable if above retail shop. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_retail: str
        :param product_details_flat_over_shop_fast_food: Acceptable if above fast food. \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_food: str
        :param product_details_flat_over_shop_fast_industry_unit: Acceptable if above Industrial unit.  \"Yes\", \"No\", \"\".
        :type product_details_flat_over_shop_fast_industry_unit: str
        :param product_details_flat_max_floors: Max floors acceptable in a flat.
        :type product_details_flat_max_floors: int
        :param product_details_flat_max_floors_no_lift: Max floors acceptable in flat without a lift.
        :type product_details_flat_max_floors_no_lift: int
        :param product_details_deeds_release_fee_when_to_pay: Describes when the deeds release fee is payable.
        :type product_details_deeds_release_fee_when_to_pay: str
        :param product_details_applicant1_minimum_age: The minimum age for the primary applicant.
        :type product_details_applicant1_minimum_age: int
        :param product_details_applicant2_minimum_age: The minimum age for the secondary applicant.
        :type product_details_applicant2_minimum_age: int
        :param product_details_applicant_maximum_age: The applicants' maximum age on expiry.
        :type product_details_applicant_maximum_age: int
        :param product_details_freehold_flag: Freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_freehold_flag: str
        :param product_details_leasehold_flag: Leasehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_leasehold_flag: str
        :param product_details_commonhold_flag: Commonhold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_commonhold_flag: str
        :param product_details_feudal_flag: Feudal hold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_feudal_flag: str
        :param product_details_flying_freehold_flag: Flying freehold acceptable. \"Yes\", \"No\", \"Refer\".
        :type product_details_flying_freehold_flag: str
        :param product_details_flying_freehold_max_percentage: Allowable percentage as flying freehold, represented as 1/100000 of a percent (precision for up to 5 decimal places).
        :type product_details_flying_freehold_max_percentage: int
        :param product_details_product_available_date: Date of product becoming available (YYYY-MM-DD).
        :type product_details_product_available_date: str
        :param product_details_product_discontinued_date: Date of product becoming discontinued (YYYY-MM-DD).
        :type product_details_product_discontinued_date: str
        :param product_details_is_offset_product: Specifies whether this is an offset product.
        :type product_details_is_offset_product: bool
        :param product_details_is_further_advance: Specifies whether this is for a further advance product.
        :type product_details_is_further_advance: bool
        :param product_details_is_porting: Specifies whether this is for a porting product.
        :type product_details_is_porting: bool
        :param product_details_mortgage_type: The type of mortgage.
        :type product_details_mortgage_type: str
        :param product_details_sourcing_reference: Sourcing Engines Lender Reference.
        :type product_details_sourcing_reference: str
        :param product_details_sourcing_product_reference: SourceEngines Unique Product Reference.
        :type product_details_sourcing_product_reference: str
        :param product_details_lender_reference: Acre Organisation GUID of the mortgage lender.
        :type product_details_lender_reference: str
        :param product_details_portability_conditions: Where a mortgage is portable, provide details and conditions for portability.
        :type product_details_portability_conditions: str
        :param product_details_incentive_description: Where a mortgage includes incentives, provides details on said incentives.
        :type product_details_incentive_description: str
        :param product_details_insurance_conditions: Where insurance is required as a condition of a mortgage, provides details of such.
        :type product_details_insurance_conditions: str
        :param product_details_is_interest_retained: False (default) Whether the interest is retained.
        :type product_details_is_interest_retained: 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._get_acre_mortgage_product_serialize(
            product_id=product_id,
            product_details_product_code=product_details_product_code,
            product_details_product_name=product_details_product_name,
            product_details_lender_code=product_details_lender_code,
            product_details_lender_name=product_details_lender_name,
            product_details_initial_pay_rate=product_details_initial_pay_rate,
            product_details_mortgage_class=product_details_mortgage_class,
            product_details_applicant_type_conditions=product_details_applicant_type_conditions,
            product_details_full_rate_description=product_details_full_rate_description,
            product_details_apr_lenders=product_details_apr_lenders,
            product_details_max_ltv_available=product_details_max_ltv_available,
            product_details_applicant1_income_multiplier=product_details_applicant1_income_multiplier,
            product_details_applicant2_income_multiplier=product_details_applicant2_income_multiplier,
            product_details_joint_applicant_income_multiplier=product_details_joint_applicant_income_multiplier,
            product_details_standard_variable_rate=product_details_standard_variable_rate,
            product_details_initial_monthly_payment=product_details_initial_monthly_payment,
            product_details_cashback=product_details_cashback,
            product_details_cashback_conditions=product_details_cashback_conditions,
            product_details_valuation_fee=product_details_valuation_fee,
            product_details_valuation_fee_conditions=product_details_valuation_fee_conditions,
            product_details_arrangement_fee=product_details_arrangement_fee,
            product_details_arrangement_fee_conditions=product_details_arrangement_fee_conditions,
            product_details_booking_fee=product_details_booking_fee,
            product_details_booking_fee_conditions=product_details_booking_fee_conditions,
            product_details_higher_lending_charge=product_details_higher_lending_charge,
            product_details_higher_lending_charge_conditions=product_details_higher_lending_charge_conditions,
            product_details_free_legal_fees=product_details_free_legal_fees,
            product_details_free_legal_fee_conditions=product_details_free_legal_fee_conditions,
            product_details_chaps_fee=product_details_chaps_fee,
            product_details_fees_payable_on_application=product_details_fees_payable_on_application,
            product_details_fees_payable_on_completion=product_details_fees_payable_on_completion,
            product_details_fees_total=product_details_fees_total,
            product_details_early_repayment_charge_applies_until=product_details_early_repayment_charge_applies_until,
            product_details_early_repayment_charge_applies_until_calculated_date=product_details_early_repayment_charge_applies_until_calculated_date,
            product_details_product_notes=product_details_product_notes,
            product_details_employed_prob_period=product_details_employed_prob_period,
            product_details_max_property_valuation=product_details_max_property_valuation,
            product_details_studio_flat_flag=product_details_studio_flat_flag,
            product_details_proc_fee_code=product_details_proc_fee_code,
            product_details_proc_fee_fixed=product_details_proc_fee_fixed,
            product_details_proc_fee_percentage=product_details_proc_fee_percentage,
            product_details_proc_fee_min=product_details_proc_fee_min,
            product_details_proc_fee_max=product_details_proc_fee_max,
            product_details_monthly_payment_after_initial_period_plus_1perc=product_details_monthly_payment_after_initial_period_plus_1perc,
            product_details_monthly_payment_after_initial_period_plus_2perc=product_details_monthly_payment_after_initial_period_plus_2perc,
            product_details_monthly_payment_after_initial_period_plus_3perc=product_details_monthly_payment_after_initial_period_plus_3perc,
            product_details_self_build=product_details_self_build,
            product_details_shared_ownership=product_details_shared_ownership,
            product_details_mortgage_discharge_fee=product_details_mortgage_discharge_fee,
            product_details_deeds_release_fee=product_details_deeds_release_fee,
            product_details_funds_transfer_fee_rule=product_details_funds_transfer_fee_rule,
            product_details_capital_rest_period=product_details_capital_rest_period,
            product_details_help_to_buy_shared_equity=product_details_help_to_buy_shared_equity,
            product_details_help_to_buy_mortgage_guarantee=product_details_help_to_buy_mortgage_guarantee,
            product_details_broker_fee=product_details_broker_fee,
            product_details_broker_fee_conditions=product_details_broker_fee_conditions,
            product_details_packager_reference=product_details_packager_reference,
            product_details_packager_name=product_details_packager_name,
            product_details_packager_tel_no=product_details_packager_tel_no,
            product_details_packager_web_address=product_details_packager_web_address,
            product_details_lender_criteria_url=product_details_lender_criteria_url,
            product_details_lender_product_reference=product_details_lender_product_reference,
            product_details_homebuyers_fee=product_details_homebuyers_fee,
            product_details_homebuyers_fee_conditions=product_details_homebuyers_fee_conditions,
            product_details_legal_fee=product_details_legal_fee,
            product_details_legal_fee_conditions=product_details_legal_fee_conditions,
            product_details_product_type=product_details_product_type,
            product_details_net_proc_fee=product_details_net_proc_fee,
            product_details_net_proc_fee_fixed=product_details_net_proc_fee_fixed,
            product_details_net_proc_fee_percentage=product_details_net_proc_fee_percentage,
            product_details_net_proc_fee_min=product_details_net_proc_fee_min,
            product_details_net_proc_fee_max=product_details_net_proc_fee_max,
            product_details_mortgage_discharge_fee_when_to_pay=product_details_mortgage_discharge_fee_when_to_pay,
            product_details_product_match_status=product_details_product_match_status,
            product_details_reject_reasons=product_details_reject_reasons,
            product_details_max_loan_available=product_details_max_loan_available,
            product_details_buy_to_let_rental_income_calculation_rate=product_details_buy_to_let_rental_income_calculation_rate,
            product_details_disbursement_fee=product_details_disbursement_fee,
            product_details_disbursement_fee_conditions=product_details_disbursement_fee_conditions,
            product_details_true_cost_full_term=product_details_true_cost_full_term,
            product_details_initial_monthly_payment_inc_existing_mortgage=product_details_initial_monthly_payment_inc_existing_mortgage,
            product_details_true_cost_full_term_inc_existing_mortgage=product_details_true_cost_full_term_inc_existing_mortgage,
            product_details_true_cost_initial_period_inc_existing_mortgage=product_details_true_cost_initial_period_inc_existing_mortgage,
            product_details_true_cost_inc_existing_mortgage=product_details_true_cost_inc_existing_mortgage,
            product_details_selected_mortgage_club_code=product_details_selected_mortgage_club_code,
            product_details_max_overpayment_percent_no_erc=product_details_max_overpayment_percent_no_erc,
            product_details_overpayments_allowed=product_details_overpayments_allowed,
            product_details_overpayment_conditions=product_details_overpayment_conditions,
            product_details_underpayments_allowed=product_details_underpayments_allowed,
            product_details_payment_holidays_allowed=product_details_payment_holidays_allowed,
            product_details_date_last_modified=product_details_date_last_modified,
            product_details_optional_partial_repayment=product_details_optional_partial_repayment,
            product_details_apply_online=product_details_apply_online,
            product_details_lender_tel_no=product_details_lender_tel_no,
            product_details_lender_web_address=product_details_lender_web_address,
            product_details_initial_rate_period=product_details_initial_rate_period,
            product_details_initial_rate_period_months=product_details_initial_rate_period_months,
            product_details_repayment_acceptable=product_details_repayment_acceptable,
            product_details_product_availability=product_details_product_availability,
            product_details_available_to_purchase=product_details_available_to_purchase,
            product_details_available_to_remortgage=product_details_available_to_remortgage,
            product_details_available_to_ftb=product_details_available_to_ftb,
            product_details_max_loan=product_details_max_loan,
            product_details_min_loan=product_details_min_loan,
            product_details_min_time_in_current_position_months=product_details_min_time_in_current_position_months,
            product_details_min_time_in_continuous_service_months=product_details_min_time_in_continuous_service_months,
            product_details_min_self_employed_accounts_years=product_details_min_self_employed_accounts_years,
            product_details_early_repayment_charge_applies=product_details_early_repayment_charge_applies,
            product_details_early_repayment_charge=product_details_early_repayment_charge,
            product_details_ccj_maximum_number=product_details_ccj_maximum_number,
            product_details_ccj_maximum_amount=product_details_ccj_maximum_amount,
            product_details_arrears_not_in_last_months=product_details_arrears_not_in_last_months,
            product_details_true_cost=product_details_true_cost,
            product_details_true_cost_over_initial_period=product_details_true_cost_over_initial_period,
            product_details_true_cost_over_calculated_period=product_details_true_cost_over_calculated_period,
            product_details_cashback_paid_on=product_details_cashback_paid_on,
            product_details_remort_home_improv_max_ltv=product_details_remort_home_improv_max_ltv,
            product_details_remort_debt_con_max_ltv=product_details_remort_debt_con_max_ltv,
            product_details_remort_bus_purpose_max_ltv=product_details_remort_bus_purpose_max_ltv,
            product_details_remort_hol_cars_max_ltv=product_details_remort_hol_cars_max_ltv,
            product_details_affordability_calculator=product_details_affordability_calculator,
            product_details_self_years_avg_income=product_details_self_years_avg_income,
            product_details_flat_over_shop_flag=product_details_flat_over_shop_flag,
            product_details_flat_over_shop_notes=product_details_flat_over_shop_notes,
            product_details_flat_over_shop_owner=product_details_flat_over_shop_owner,
            product_details_flat_over_shop_sep_ent=product_details_flat_over_shop_sep_ent,
            product_details_flat_over_shop_sep_title=product_details_flat_over_shop_sep_title,
            product_details_flat_over_shop_restaurant=product_details_flat_over_shop_restaurant,
            product_details_flat_over_shop_retail=product_details_flat_over_shop_retail,
            product_details_flat_over_shop_fast_food=product_details_flat_over_shop_fast_food,
            product_details_flat_over_shop_fast_industry_unit=product_details_flat_over_shop_fast_industry_unit,
            product_details_flat_max_floors=product_details_flat_max_floors,
            product_details_flat_max_floors_no_lift=product_details_flat_max_floors_no_lift,
            product_details_deeds_release_fee_when_to_pay=product_details_deeds_release_fee_when_to_pay,
            product_details_applicant1_minimum_age=product_details_applicant1_minimum_age,
            product_details_applicant2_minimum_age=product_details_applicant2_minimum_age,
            product_details_applicant_maximum_age=product_details_applicant_maximum_age,
            product_details_freehold_flag=product_details_freehold_flag,
            product_details_leasehold_flag=product_details_leasehold_flag,
            product_details_commonhold_flag=product_details_commonhold_flag,
            product_details_feudal_flag=product_details_feudal_flag,
            product_details_flying_freehold_flag=product_details_flying_freehold_flag,
            product_details_flying_freehold_max_percentage=product_details_flying_freehold_max_percentage,
            product_details_product_available_date=product_details_product_available_date,
            product_details_product_discontinued_date=product_details_product_discontinued_date,
            product_details_is_offset_product=product_details_is_offset_product,
            product_details_is_further_advance=product_details_is_further_advance,
            product_details_is_porting=product_details_is_porting,
            product_details_mortgage_type=product_details_mortgage_type,
            product_details_sourcing_reference=product_details_sourcing_reference,
            product_details_sourcing_product_reference=product_details_sourcing_product_reference,
            product_details_lender_reference=product_details_lender_reference,
            product_details_portability_conditions=product_details_portability_conditions,
            product_details_incentive_description=product_details_incentive_description,
            product_details_insurance_conditions=product_details_insurance_conditions,
            product_details_is_interest_retained=product_details_is_interest_retained,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetAcreMortgageProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _get_acre_mortgage_product_serialize(
        self,
        product_id,
        product_details_product_code,
        product_details_product_name,
        product_details_lender_code,
        product_details_lender_name,
        product_details_initial_pay_rate,
        product_details_mortgage_class,
        product_details_applicant_type_conditions,
        product_details_full_rate_description,
        product_details_apr_lenders,
        product_details_max_ltv_available,
        product_details_applicant1_income_multiplier,
        product_details_applicant2_income_multiplier,
        product_details_joint_applicant_income_multiplier,
        product_details_standard_variable_rate,
        product_details_initial_monthly_payment,
        product_details_cashback,
        product_details_cashback_conditions,
        product_details_valuation_fee,
        product_details_valuation_fee_conditions,
        product_details_arrangement_fee,
        product_details_arrangement_fee_conditions,
        product_details_booking_fee,
        product_details_booking_fee_conditions,
        product_details_higher_lending_charge,
        product_details_higher_lending_charge_conditions,
        product_details_free_legal_fees,
        product_details_free_legal_fee_conditions,
        product_details_chaps_fee,
        product_details_fees_payable_on_application,
        product_details_fees_payable_on_completion,
        product_details_fees_total,
        product_details_early_repayment_charge_applies_until,
        product_details_early_repayment_charge_applies_until_calculated_date,
        product_details_product_notes,
        product_details_employed_prob_period,
        product_details_max_property_valuation,
        product_details_studio_flat_flag,
        product_details_proc_fee_code,
        product_details_proc_fee_fixed,
        product_details_proc_fee_percentage,
        product_details_proc_fee_min,
        product_details_proc_fee_max,
        product_details_monthly_payment_after_initial_period_plus_1perc,
        product_details_monthly_payment_after_initial_period_plus_2perc,
        product_details_monthly_payment_after_initial_period_plus_3perc,
        product_details_self_build,
        product_details_shared_ownership,
        product_details_mortgage_discharge_fee,
        product_details_deeds_release_fee,
        product_details_funds_transfer_fee_rule,
        product_details_capital_rest_period,
        product_details_help_to_buy_shared_equity,
        product_details_help_to_buy_mortgage_guarantee,
        product_details_broker_fee,
        product_details_broker_fee_conditions,
        product_details_packager_reference,
        product_details_packager_name,
        product_details_packager_tel_no,
        product_details_packager_web_address,
        product_details_lender_criteria_url,
        product_details_lender_product_reference,
        product_details_homebuyers_fee,
        product_details_homebuyers_fee_conditions,
        product_details_legal_fee,
        product_details_legal_fee_conditions,
        product_details_product_type,
        product_details_net_proc_fee,
        product_details_net_proc_fee_fixed,
        product_details_net_proc_fee_percentage,
        product_details_net_proc_fee_min,
        product_details_net_proc_fee_max,
        product_details_mortgage_discharge_fee_when_to_pay,
        product_details_product_match_status,
        product_details_reject_reasons,
        product_details_max_loan_available,
        product_details_buy_to_let_rental_income_calculation_rate,
        product_details_disbursement_fee,
        product_details_disbursement_fee_conditions,
        product_details_true_cost_full_term,
        product_details_initial_monthly_payment_inc_existing_mortgage,
        product_details_true_cost_full_term_inc_existing_mortgage,
        product_details_true_cost_initial_period_inc_existing_mortgage,
        product_details_true_cost_inc_existing_mortgage,
        product_details_selected_mortgage_club_code,
        product_details_max_overpayment_percent_no_erc,
        product_details_overpayments_allowed,
        product_details_overpayment_conditions,
        product_details_underpayments_allowed,
        product_details_payment_holidays_allowed,
        product_details_date_last_modified,
        product_details_optional_partial_repayment,
        product_details_apply_online,
        product_details_lender_tel_no,
        product_details_lender_web_address,
        product_details_initial_rate_period,
        product_details_initial_rate_period_months,
        product_details_repayment_acceptable,
        product_details_product_availability,
        product_details_available_to_purchase,
        product_details_available_to_remortgage,
        product_details_available_to_ftb,
        product_details_max_loan,
        product_details_min_loan,
        product_details_min_time_in_current_position_months,
        product_details_min_time_in_continuous_service_months,
        product_details_min_self_employed_accounts_years,
        product_details_early_repayment_charge_applies,
        product_details_early_repayment_charge,
        product_details_ccj_maximum_number,
        product_details_ccj_maximum_amount,
        product_details_arrears_not_in_last_months,
        product_details_true_cost,
        product_details_true_cost_over_initial_period,
        product_details_true_cost_over_calculated_period,
        product_details_cashback_paid_on,
        product_details_remort_home_improv_max_ltv,
        product_details_remort_debt_con_max_ltv,
        product_details_remort_bus_purpose_max_ltv,
        product_details_remort_hol_cars_max_ltv,
        product_details_affordability_calculator,
        product_details_self_years_avg_income,
        product_details_flat_over_shop_flag,
        product_details_flat_over_shop_notes,
        product_details_flat_over_shop_owner,
        product_details_flat_over_shop_sep_ent,
        product_details_flat_over_shop_sep_title,
        product_details_flat_over_shop_restaurant,
        product_details_flat_over_shop_retail,
        product_details_flat_over_shop_fast_food,
        product_details_flat_over_shop_fast_industry_unit,
        product_details_flat_max_floors,
        product_details_flat_max_floors_no_lift,
        product_details_deeds_release_fee_when_to_pay,
        product_details_applicant1_minimum_age,
        product_details_applicant2_minimum_age,
        product_details_applicant_maximum_age,
        product_details_freehold_flag,
        product_details_leasehold_flag,
        product_details_commonhold_flag,
        product_details_feudal_flag,
        product_details_flying_freehold_flag,
        product_details_flying_freehold_max_percentage,
        product_details_product_available_date,
        product_details_product_discontinued_date,
        product_details_is_offset_product,
        product_details_is_further_advance,
        product_details_is_porting,
        product_details_mortgage_type,
        product_details_sourcing_reference,
        product_details_sourcing_product_reference,
        product_details_lender_reference,
        product_details_portability_conditions,
        product_details_incentive_description,
        product_details_insurance_conditions,
        product_details_is_interest_retained,
        _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 product_id is not None:
            _path_params['product_id'] = product_id
        # process the query parameters
        if product_details_product_code is not None:
            
            _query_params.append(('product_details.product_code', product_details_product_code))
            
        if product_details_product_name is not None:
            
            _query_params.append(('product_details.product_name', product_details_product_name))
            
        if product_details_lender_code is not None:
            
            _query_params.append(('product_details.lender_code', product_details_lender_code))
            
        if product_details_lender_name is not None:
            
            _query_params.append(('product_details.lender_name', product_details_lender_name))
            
        if product_details_initial_pay_rate is not None:
            
            _query_params.append(('product_details.initial_pay_rate', product_details_initial_pay_rate))
            
        if product_details_mortgage_class is not None:
            
            _query_params.append(('product_details.mortgage_class', product_details_mortgage_class))
            
        if product_details_applicant_type_conditions is not None:
            
            _query_params.append(('product_details.applicant_type_conditions', product_details_applicant_type_conditions))
            
        if product_details_full_rate_description is not None:
            
            _query_params.append(('product_details.full_rate_description', product_details_full_rate_description))
            
        if product_details_apr_lenders is not None:
            
            _query_params.append(('product_details.apr_lenders', product_details_apr_lenders))
            
        if product_details_max_ltv_available is not None:
            
            _query_params.append(('product_details.max_ltv_available', product_details_max_ltv_available))
            
        if product_details_applicant1_income_multiplier is not None:
            
            _query_params.append(('product_details.applicant1_income_multiplier', product_details_applicant1_income_multiplier))
            
        if product_details_applicant2_income_multiplier is not None:
            
            _query_params.append(('product_details.applicant2_income_multiplier', product_details_applicant2_income_multiplier))
            
        if product_details_joint_applicant_income_multiplier is not None:
            
            _query_params.append(('product_details.joint_applicant_income_multiplier', product_details_joint_applicant_income_multiplier))
            
        if product_details_standard_variable_rate is not None:
            
            _query_params.append(('product_details.standard_variable_rate', product_details_standard_variable_rate))
            
        if product_details_initial_monthly_payment is not None:
            
            _query_params.append(('product_details.initial_monthly_payment', product_details_initial_monthly_payment))
            
        if product_details_cashback is not None:
            
            _query_params.append(('product_details.cashback', product_details_cashback))
            
        if product_details_cashback_conditions is not None:
            
            _query_params.append(('product_details.cashback_conditions', product_details_cashback_conditions))
            
        if product_details_valuation_fee is not None:
            
            _query_params.append(('product_details.valuation_fee', product_details_valuation_fee))
            
        if product_details_valuation_fee_conditions is not None:
            
            _query_params.append(('product_details.valuation_fee_conditions', product_details_valuation_fee_conditions))
            
        if product_details_arrangement_fee is not None:
            
            _query_params.append(('product_details.arrangement_fee', product_details_arrangement_fee))
            
        if product_details_arrangement_fee_conditions is not None:
            
            _query_params.append(('product_details.arrangement_fee_conditions', product_details_arrangement_fee_conditions))
            
        if product_details_booking_fee is not None:
            
            _query_params.append(('product_details.booking_fee', product_details_booking_fee))
            
        if product_details_booking_fee_conditions is not None:
            
            _query_params.append(('product_details.booking_fee_conditions', product_details_booking_fee_conditions))
            
        if product_details_higher_lending_charge is not None:
            
            _query_params.append(('product_details.higher_lending_charge', product_details_higher_lending_charge))
            
        if product_details_higher_lending_charge_conditions is not None:
            
            _query_params.append(('product_details.higher_lending_charge_conditions', product_details_higher_lending_charge_conditions))
            
        if product_details_free_legal_fees is not None:
            
            _query_params.append(('product_details.free_legal_fees', product_details_free_legal_fees))
            
        if product_details_free_legal_fee_conditions is not None:
            
            _query_params.append(('product_details.free_legal_fee_conditions', product_details_free_legal_fee_conditions))
            
        if product_details_chaps_fee is not None:
            
            _query_params.append(('product_details.chaps_fee', product_details_chaps_fee))
            
        if product_details_fees_payable_on_application is not None:
            
            _query_params.append(('product_details.fees_payable_on_application', product_details_fees_payable_on_application))
            
        if product_details_fees_payable_on_completion is not None:
            
            _query_params.append(('product_details.fees_payable_on_completion', product_details_fees_payable_on_completion))
            
        if product_details_fees_total is not None:
            
            _query_params.append(('product_details.fees_total', product_details_fees_total))
            
        if product_details_early_repayment_charge_applies_until is not None:
            
            _query_params.append(('product_details.early_repayment_charge_applies_until', product_details_early_repayment_charge_applies_until))
            
        if product_details_early_repayment_charge_applies_until_calculated_date is not None:
            
            _query_params.append(('product_details.early_repayment_charge_applies_until_calculated_date', product_details_early_repayment_charge_applies_until_calculated_date))
            
        if product_details_product_notes is not None:
            
            _query_params.append(('product_details.product_notes', product_details_product_notes))
            
        if product_details_employed_prob_period is not None:
            
            _query_params.append(('product_details.employed_prob_period', product_details_employed_prob_period))
            
        if product_details_max_property_valuation is not None:
            
            _query_params.append(('product_details.max_property_valuation', product_details_max_property_valuation))
            
        if product_details_studio_flat_flag is not None:
            
            _query_params.append(('product_details.studio_flat_flag', product_details_studio_flat_flag))
            
        if product_details_proc_fee_code is not None:
            
            _query_params.append(('product_details.proc_fee_code', product_details_proc_fee_code))
            
        if product_details_proc_fee_fixed is not None:
            
            _query_params.append(('product_details.proc_fee_fixed', product_details_proc_fee_fixed))
            
        if product_details_proc_fee_percentage is not None:
            
            _query_params.append(('product_details.proc_fee_percentage', product_details_proc_fee_percentage))
            
        if product_details_proc_fee_min is not None:
            
            _query_params.append(('product_details.proc_fee_min', product_details_proc_fee_min))
            
        if product_details_proc_fee_max is not None:
            
            _query_params.append(('product_details.proc_fee_max', product_details_proc_fee_max))
            
        if product_details_monthly_payment_after_initial_period_plus_1perc is not None:
            
            _query_params.append(('product_details.monthly_payment_after_initial_period_plus_1perc', product_details_monthly_payment_after_initial_period_plus_1perc))
            
        if product_details_monthly_payment_after_initial_period_plus_2perc is not None:
            
            _query_params.append(('product_details.monthly_payment_after_initial_period_plus_2perc', product_details_monthly_payment_after_initial_period_plus_2perc))
            
        if product_details_monthly_payment_after_initial_period_plus_3perc is not None:
            
            _query_params.append(('product_details.monthly_payment_after_initial_period_plus_3perc', product_details_monthly_payment_after_initial_period_plus_3perc))
            
        if product_details_self_build is not None:
            
            _query_params.append(('product_details.self_build', product_details_self_build))
            
        if product_details_shared_ownership is not None:
            
            _query_params.append(('product_details.shared_ownership', product_details_shared_ownership))
            
        if product_details_mortgage_discharge_fee is not None:
            
            _query_params.append(('product_details.mortgage_discharge_fee', product_details_mortgage_discharge_fee))
            
        if product_details_deeds_release_fee is not None:
            
            _query_params.append(('product_details.deeds_release_fee', product_details_deeds_release_fee))
            
        if product_details_funds_transfer_fee_rule is not None:
            
            _query_params.append(('product_details.funds_transfer_fee_rule', product_details_funds_transfer_fee_rule))
            
        if product_details_capital_rest_period is not None:
            
            _query_params.append(('product_details.capital_rest_period', product_details_capital_rest_period))
            
        if product_details_help_to_buy_shared_equity is not None:
            
            _query_params.append(('product_details.help_to_buy_shared_equity', product_details_help_to_buy_shared_equity))
            
        if product_details_help_to_buy_mortgage_guarantee is not None:
            
            _query_params.append(('product_details.help_to_buy_mortgage_guarantee', product_details_help_to_buy_mortgage_guarantee))
            
        if product_details_broker_fee is not None:
            
            _query_params.append(('product_details.broker_fee', product_details_broker_fee))
            
        if product_details_broker_fee_conditions is not None:
            
            _query_params.append(('product_details.broker_fee_conditions', product_details_broker_fee_conditions))
            
        if product_details_packager_reference is not None:
            
            _query_params.append(('product_details.packager_reference', product_details_packager_reference))
            
        if product_details_packager_name is not None:
            
            _query_params.append(('product_details.packager_name', product_details_packager_name))
            
        if product_details_packager_tel_no is not None:
            
            _query_params.append(('product_details.packager_tel_no', product_details_packager_tel_no))
            
        if product_details_packager_web_address is not None:
            
            _query_params.append(('product_details.packager_web_address', product_details_packager_web_address))
            
        if product_details_lender_criteria_url is not None:
            
            _query_params.append(('product_details.lender_criteria_url', product_details_lender_criteria_url))
            
        if product_details_lender_product_reference is not None:
            
            _query_params.append(('product_details.lender_product_reference', product_details_lender_product_reference))
            
        if product_details_homebuyers_fee is not None:
            
            _query_params.append(('product_details.homebuyers_fee', product_details_homebuyers_fee))
            
        if product_details_homebuyers_fee_conditions is not None:
            
            _query_params.append(('product_details.homebuyers_fee_conditions', product_details_homebuyers_fee_conditions))
            
        if product_details_legal_fee is not None:
            
            _query_params.append(('product_details.legal_fee', product_details_legal_fee))
            
        if product_details_legal_fee_conditions is not None:
            
            _query_params.append(('product_details.legal_fee_conditions', product_details_legal_fee_conditions))
            
        if product_details_product_type is not None:
            
            _query_params.append(('product_details.product_type', product_details_product_type))
            
        if product_details_net_proc_fee is not None:
            
            _query_params.append(('product_details.net_proc_fee', product_details_net_proc_fee))
            
        if product_details_net_proc_fee_fixed is not None:
            
            _query_params.append(('product_details.net_proc_fee_fixed', product_details_net_proc_fee_fixed))
            
        if product_details_net_proc_fee_percentage is not None:
            
            _query_params.append(('product_details.net_proc_fee_percentage', product_details_net_proc_fee_percentage))
            
        if product_details_net_proc_fee_min is not None:
            
            _query_params.append(('product_details.net_proc_fee_min', product_details_net_proc_fee_min))
            
        if product_details_net_proc_fee_max is not None:
            
            _query_params.append(('product_details.net_proc_fee_max', product_details_net_proc_fee_max))
            
        if product_details_mortgage_discharge_fee_when_to_pay is not None:
            
            _query_params.append(('product_details.mortgage_discharge_fee_when_to_pay', product_details_mortgage_discharge_fee_when_to_pay))
            
        if product_details_product_match_status is not None:
            
            _query_params.append(('product_details.product_match_status', product_details_product_match_status))
            
        if product_details_reject_reasons is not None:
            
            _query_params.append(('product_details.reject_reasons', product_details_reject_reasons))
            
        if product_details_max_loan_available is not None:
            
            _query_params.append(('product_details.max_loan_available', product_details_max_loan_available))
            
        if product_details_buy_to_let_rental_income_calculation_rate is not None:
            
            _query_params.append(('product_details.buy_to_let_rental_income_calculation_rate', product_details_buy_to_let_rental_income_calculation_rate))
            
        if product_details_disbursement_fee is not None:
            
            _query_params.append(('product_details.disbursement_fee', product_details_disbursement_fee))
            
        if product_details_disbursement_fee_conditions is not None:
            
            _query_params.append(('product_details.disbursement_fee_conditions', product_details_disbursement_fee_conditions))
            
        if product_details_true_cost_full_term is not None:
            
            _query_params.append(('product_details.true_cost_full_term', product_details_true_cost_full_term))
            
        if product_details_initial_monthly_payment_inc_existing_mortgage is not None:
            
            _query_params.append(('product_details.initial_monthly_payment_inc_existing_mortgage', product_details_initial_monthly_payment_inc_existing_mortgage))
            
        if product_details_true_cost_full_term_inc_existing_mortgage is not None:
            
            _query_params.append(('product_details.true_cost_full_term_inc_existing_mortgage', product_details_true_cost_full_term_inc_existing_mortgage))
            
        if product_details_true_cost_initial_period_inc_existing_mortgage is not None:
            
            _query_params.append(('product_details.true_cost_initial_period_inc_existing_mortgage', product_details_true_cost_initial_period_inc_existing_mortgage))
            
        if product_details_true_cost_inc_existing_mortgage is not None:
            
            _query_params.append(('product_details.true_cost_inc_existing_mortgage', product_details_true_cost_inc_existing_mortgage))
            
        if product_details_selected_mortgage_club_code is not None:
            
            _query_params.append(('product_details.selected_mortgage_club_code', product_details_selected_mortgage_club_code))
            
        if product_details_max_overpayment_percent_no_erc is not None:
            
            _query_params.append(('product_details.max_overpayment_percent_no_erc', product_details_max_overpayment_percent_no_erc))
            
        if product_details_overpayments_allowed is not None:
            
            _query_params.append(('product_details.overpayments_allowed', product_details_overpayments_allowed))
            
        if product_details_overpayment_conditions is not None:
            
            _query_params.append(('product_details.overpayment_conditions', product_details_overpayment_conditions))
            
        if product_details_underpayments_allowed is not None:
            
            _query_params.append(('product_details.underpayments_allowed', product_details_underpayments_allowed))
            
        if product_details_payment_holidays_allowed is not None:
            
            _query_params.append(('product_details.payment_holidays_allowed', product_details_payment_holidays_allowed))
            
        if product_details_date_last_modified is not None:
            
            _query_params.append(('product_details.date_last_modified', product_details_date_last_modified))
            
        if product_details_optional_partial_repayment is not None:
            
            _query_params.append(('product_details.optional_partial_repayment', product_details_optional_partial_repayment))
            
        if product_details_apply_online is not None:
            
            _query_params.append(('product_details.apply_online', product_details_apply_online))
            
        if product_details_lender_tel_no is not None:
            
            _query_params.append(('product_details.lender_tel_no', product_details_lender_tel_no))
            
        if product_details_lender_web_address is not None:
            
            _query_params.append(('product_details.lender_web_address', product_details_lender_web_address))
            
        if product_details_initial_rate_period is not None:
            
            _query_params.append(('product_details.initial_rate_period', product_details_initial_rate_period))
            
        if product_details_initial_rate_period_months is not None:
            
            _query_params.append(('product_details.initial_rate_period_months', product_details_initial_rate_period_months))
            
        if product_details_repayment_acceptable is not None:
            
            _query_params.append(('product_details.repayment_acceptable', product_details_repayment_acceptable))
            
        if product_details_product_availability is not None:
            
            _query_params.append(('product_details.product_availability', product_details_product_availability))
            
        if product_details_available_to_purchase is not None:
            
            _query_params.append(('product_details.available_to_purchase', product_details_available_to_purchase))
            
        if product_details_available_to_remortgage is not None:
            
            _query_params.append(('product_details.available_to_remortgage', product_details_available_to_remortgage))
            
        if product_details_available_to_ftb is not None:
            
            _query_params.append(('product_details.available_to_ftb', product_details_available_to_ftb))
            
        if product_details_max_loan is not None:
            
            _query_params.append(('product_details.max_loan', product_details_max_loan))
            
        if product_details_min_loan is not None:
            
            _query_params.append(('product_details.min_loan', product_details_min_loan))
            
        if product_details_min_time_in_current_position_months is not None:
            
            _query_params.append(('product_details.min_time_in_current_position_months', product_details_min_time_in_current_position_months))
            
        if product_details_min_time_in_continuous_service_months is not None:
            
            _query_params.append(('product_details.min_time_in_continuous_service_months', product_details_min_time_in_continuous_service_months))
            
        if product_details_min_self_employed_accounts_years is not None:
            
            _query_params.append(('product_details.min_self_employed_accounts_years', product_details_min_self_employed_accounts_years))
            
        if product_details_early_repayment_charge_applies is not None:
            
            _query_params.append(('product_details.early_repayment_charge_applies', product_details_early_repayment_charge_applies))
            
        if product_details_early_repayment_charge is not None:
            
            _query_params.append(('product_details.early_repayment_charge', product_details_early_repayment_charge))
            
        if product_details_ccj_maximum_number is not None:
            
            _query_params.append(('product_details.ccj_maximum_number', product_details_ccj_maximum_number))
            
        if product_details_ccj_maximum_amount is not None:
            
            _query_params.append(('product_details.ccj_maximum_amount', product_details_ccj_maximum_amount))
            
        if product_details_arrears_not_in_last_months is not None:
            
            _query_params.append(('product_details.arrears_not_in_last_months', product_details_arrears_not_in_last_months))
            
        if product_details_true_cost is not None:
            
            _query_params.append(('product_details.true_cost', product_details_true_cost))
            
        if product_details_true_cost_over_initial_period is not None:
            
            _query_params.append(('product_details.true_cost_over_initial_period', product_details_true_cost_over_initial_period))
            
        if product_details_true_cost_over_calculated_period is not None:
            
            _query_params.append(('product_details.true_cost_over_calculated_period', product_details_true_cost_over_calculated_period))
            
        if product_details_cashback_paid_on is not None:
            
            _query_params.append(('product_details.cashback_paid_on', product_details_cashback_paid_on))
            
        if product_details_remort_home_improv_max_ltv is not None:
            
            _query_params.append(('product_details.remort_home_improv_max_ltv', product_details_remort_home_improv_max_ltv))
            
        if product_details_remort_debt_con_max_ltv is not None:
            
            _query_params.append(('product_details.remort_debt_con_max_ltv', product_details_remort_debt_con_max_ltv))
            
        if product_details_remort_bus_purpose_max_ltv is not None:
            
            _query_params.append(('product_details.remort_bus_purpose_max_ltv', product_details_remort_bus_purpose_max_ltv))
            
        if product_details_remort_hol_cars_max_ltv is not None:
            
            _query_params.append(('product_details.remort_hol_cars_max_ltv', product_details_remort_hol_cars_max_ltv))
            
        if product_details_affordability_calculator is not None:
            
            _query_params.append(('product_details.affordability_calculator', product_details_affordability_calculator))
            
        if product_details_self_years_avg_income is not None:
            
            _query_params.append(('product_details.self_years_avg_income', product_details_self_years_avg_income))
            
        if product_details_flat_over_shop_flag is not None:
            
            _query_params.append(('product_details.flat_over_shop_flag', product_details_flat_over_shop_flag))
            
        if product_details_flat_over_shop_notes is not None:
            
            _query_params.append(('product_details.flat_over_shop_notes', product_details_flat_over_shop_notes))
            
        if product_details_flat_over_shop_owner is not None:
            
            _query_params.append(('product_details.flat_over_shop_owner', product_details_flat_over_shop_owner))
            
        if product_details_flat_over_shop_sep_ent is not None:
            
            _query_params.append(('product_details.flat_over_shop_sep_ent', product_details_flat_over_shop_sep_ent))
            
        if product_details_flat_over_shop_sep_title is not None:
            
            _query_params.append(('product_details.flat_over_shop_sep_title', product_details_flat_over_shop_sep_title))
            
        if product_details_flat_over_shop_restaurant is not None:
            
            _query_params.append(('product_details.flat_over_shop_restaurant', product_details_flat_over_shop_restaurant))
            
        if product_details_flat_over_shop_retail is not None:
            
            _query_params.append(('product_details.flat_over_shop_retail', product_details_flat_over_shop_retail))
            
        if product_details_flat_over_shop_fast_food is not None:
            
            _query_params.append(('product_details.flat_over_shop_fast_food', product_details_flat_over_shop_fast_food))
            
        if product_details_flat_over_shop_fast_industry_unit is not None:
            
            _query_params.append(('product_details.flat_over_shop_fast_industry_unit', product_details_flat_over_shop_fast_industry_unit))
            
        if product_details_flat_max_floors is not None:
            
            _query_params.append(('product_details.flat_max_floors', product_details_flat_max_floors))
            
        if product_details_flat_max_floors_no_lift is not None:
            
            _query_params.append(('product_details.flat_max_floors_no_lift', product_details_flat_max_floors_no_lift))
            
        if product_details_deeds_release_fee_when_to_pay is not None:
            
            _query_params.append(('product_details.deeds_release_fee_when_to_pay', product_details_deeds_release_fee_when_to_pay))
            
        if product_details_applicant1_minimum_age is not None:
            
            _query_params.append(('product_details.applicant1_minimum_age', product_details_applicant1_minimum_age))
            
        if product_details_applicant2_minimum_age is not None:
            
            _query_params.append(('product_details.applicant2_minimum_age', product_details_applicant2_minimum_age))
            
        if product_details_applicant_maximum_age is not None:
            
            _query_params.append(('product_details.applicant_maximum_age', product_details_applicant_maximum_age))
            
        if product_details_freehold_flag is not None:
            
            _query_params.append(('product_details.freehold_flag', product_details_freehold_flag))
            
        if product_details_leasehold_flag is not None:
            
            _query_params.append(('product_details.leasehold_flag', product_details_leasehold_flag))
            
        if product_details_commonhold_flag is not None:
            
            _query_params.append(('product_details.commonhold_flag', product_details_commonhold_flag))
            
        if product_details_feudal_flag is not None:
            
            _query_params.append(('product_details.feudal_flag', product_details_feudal_flag))
            
        if product_details_flying_freehold_flag is not None:
            
            _query_params.append(('product_details.flying_freehold_flag', product_details_flying_freehold_flag))
            
        if product_details_flying_freehold_max_percentage is not None:
            
            _query_params.append(('product_details.flying_freehold_max_percentage', product_details_flying_freehold_max_percentage))
            
        if product_details_product_available_date is not None:
            
            _query_params.append(('product_details.product_available_date', product_details_product_available_date))
            
        if product_details_product_discontinued_date is not None:
            
            _query_params.append(('product_details.product_discontinued_date', product_details_product_discontinued_date))
            
        if product_details_is_offset_product is not None:
            
            _query_params.append(('product_details.is_offset_product', product_details_is_offset_product))
            
        if product_details_is_further_advance is not None:
            
            _query_params.append(('product_details.is_further_advance', product_details_is_further_advance))
            
        if product_details_is_porting is not None:
            
            _query_params.append(('product_details.is_porting', product_details_is_porting))
            
        if product_details_mortgage_type is not None:
            
            _query_params.append(('product_details.mortgage_type', product_details_mortgage_type))
            
        if product_details_sourcing_reference is not None:
            
            _query_params.append(('product_details.sourcing_reference', product_details_sourcing_reference))
            
        if product_details_sourcing_product_reference is not None:
            
            _query_params.append(('product_details.sourcing_product_reference', product_details_sourcing_product_reference))
            
        if product_details_lender_reference is not None:
            
            _query_params.append(('product_details.lender_reference', product_details_lender_reference))
            
        if product_details_portability_conditions is not None:
            
            _query_params.append(('product_details.portability_conditions', product_details_portability_conditions))
            
        if product_details_incentive_description is not None:
            
            _query_params.append(('product_details.incentive_description', product_details_incentive_description))
            
        if product_details_insurance_conditions is not None:
            
            _query_params.append(('product_details.insurance_conditions', product_details_insurance_conditions))
            
        if product_details_is_interest_retained is not None:
            
            _query_params.append(('product_details.is_interest_retained', product_details_is_interest_retained))
            
        # 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] = [
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v1/acre/mortgage_product/{product_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
    def get_mortgage(
        self,
        mortgage_details: Annotated[Optional[StrictBool], Field(description="Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.")] = None,
        mortgage_ids: Annotated[Optional[List[StrictStr]], Field(description="Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.")] = None,
        filter_property_secured_id: Annotated[Optional[StrictStr], Field(description="Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_client_ids: Annotated[Optional[List[StrictStr]], Field(description="Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.")] = None,
        filter_case_id: Annotated[Optional[StrictStr], Field(description="Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_ext_source: Annotated[Optional[StrictStr], Field(description="Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).")] = None,
        filter_ext_ids: Annotated[Optional[List[StrictStr]], Field(description="Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.")] = None,
        bookmark: Annotated[Optional[StrictStr], Field(description="Opaque pagination bookmark. Set to the empty string (or omit) to begin.")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.")] = None,
        skip_source_response: Annotated[Optional[StrictBool], Field(description="Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.")] = 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,
    ) -> CdmGetMortgageResponse:
        """Get the details of existing mortgages.


        :param mortgage_details: Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.
        :type mortgage_details: bool
        :param mortgage_ids: Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.
        :type mortgage_ids: List[str]
        :param filter_property_secured_id: Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_property_secured_id: str
        :param filter_client_ids: Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.
        :type filter_client_ids: List[str]
        :param filter_case_id: Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_case_id: str
        :param filter_ext_source: Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).
        :type filter_ext_source: str
        :param filter_ext_ids: Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.
        :type filter_ext_ids: List[str]
        :param bookmark: Opaque pagination bookmark. Set to the empty string (or omit) to begin.
        :type bookmark: str
        :param page_size: Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.
        :type page_size: int
        :param skip_source_response: Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.
        :type skip_source_response: 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._get_mortgage_serialize(
            mortgage_details=mortgage_details,
            mortgage_ids=mortgage_ids,
            filter_property_secured_id=filter_property_secured_id,
            filter_client_ids=filter_client_ids,
            filter_case_id=filter_case_id,
            filter_ext_source=filter_ext_source,
            filter_ext_ids=filter_ext_ids,
            bookmark=bookmark,
            page_size=page_size,
            skip_source_response=skip_source_response,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def get_mortgage_with_http_info(
        self,
        mortgage_details: Annotated[Optional[StrictBool], Field(description="Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.")] = None,
        mortgage_ids: Annotated[Optional[List[StrictStr]], Field(description="Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.")] = None,
        filter_property_secured_id: Annotated[Optional[StrictStr], Field(description="Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_client_ids: Annotated[Optional[List[StrictStr]], Field(description="Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.")] = None,
        filter_case_id: Annotated[Optional[StrictStr], Field(description="Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_ext_source: Annotated[Optional[StrictStr], Field(description="Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).")] = None,
        filter_ext_ids: Annotated[Optional[List[StrictStr]], Field(description="Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.")] = None,
        bookmark: Annotated[Optional[StrictStr], Field(description="Opaque pagination bookmark. Set to the empty string (or omit) to begin.")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.")] = None,
        skip_source_response: Annotated[Optional[StrictBool], Field(description="Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.")] = 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[CdmGetMortgageResponse]:
        """Get the details of existing mortgages.


        :param mortgage_details: Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.
        :type mortgage_details: bool
        :param mortgage_ids: Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.
        :type mortgage_ids: List[str]
        :param filter_property_secured_id: Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_property_secured_id: str
        :param filter_client_ids: Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.
        :type filter_client_ids: List[str]
        :param filter_case_id: Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_case_id: str
        :param filter_ext_source: Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).
        :type filter_ext_source: str
        :param filter_ext_ids: Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.
        :type filter_ext_ids: List[str]
        :param bookmark: Opaque pagination bookmark. Set to the empty string (or omit) to begin.
        :type bookmark: str
        :param page_size: Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.
        :type page_size: int
        :param skip_source_response: Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.
        :type skip_source_response: 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._get_mortgage_serialize(
            mortgage_details=mortgage_details,
            mortgage_ids=mortgage_ids,
            filter_property_secured_id=filter_property_secured_id,
            filter_client_ids=filter_client_ids,
            filter_case_id=filter_case_id,
            filter_ext_source=filter_ext_source,
            filter_ext_ids=filter_ext_ids,
            bookmark=bookmark,
            page_size=page_size,
            skip_source_response=skip_source_response,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def get_mortgage_without_preload_content(
        self,
        mortgage_details: Annotated[Optional[StrictBool], Field(description="Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.")] = None,
        mortgage_ids: Annotated[Optional[List[StrictStr]], Field(description="Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.")] = None,
        filter_property_secured_id: Annotated[Optional[StrictStr], Field(description="Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_client_ids: Annotated[Optional[List[StrictStr]], Field(description="Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.")] = None,
        filter_case_id: Annotated[Optional[StrictStr], Field(description="Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.")] = None,
        filter_ext_source: Annotated[Optional[StrictStr], Field(description="Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).")] = None,
        filter_ext_ids: Annotated[Optional[List[StrictStr]], Field(description="Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.")] = None,
        bookmark: Annotated[Optional[StrictStr], Field(description="Opaque pagination bookmark. Set to the empty string (or omit) to begin.")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.")] = None,
        skip_source_response: Annotated[Optional[StrictBool], Field(description="Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.")] = 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:
        """Get the details of existing mortgages.


        :param mortgage_details: Return the entire mortgage details. By default this value is false and Mortgage is returned with a reduced set of fields.
        :type mortgage_details: bool
        :param mortgage_ids: Return mortgages by IDs. Requests for too many IDs are rejected. This field cannot be used with other filters.
        :type mortgage_ids: List[str]
        :param filter_property_secured_id: Filtering by property_secured_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_property_secured_id: str
        :param filter_client_ids: Filter to only include mortgages with all (conjunction) of the specified clients assigned to them (including possibly other clients). Cannot be used with other fields and `mortgage_ids` non-empty.
        :type filter_client_ids: List[str]
        :param filter_case_id: Filtering by case_id. This filter is cannot be used with other filters and `mortgage_ids`.
        :type filter_case_id: str
        :param filter_ext_source: Filtering by external source. This filter must be used in conjunction with filter_ext_id.   - ONFIDO: Onfido (https://onfido.com/).
        :type filter_ext_source: str
        :param filter_ext_ids: Only include mortgages with the specified mortgage external IDs. This filter must be used in conjunction with filter_ext_source.
        :type filter_ext_ids: List[str]
        :param bookmark: Opaque pagination bookmark. Set to the empty string (or omit) to begin.
        :type bookmark: str
        :param page_size: Specify a limit on the number of items returned in a page. Values that are too large will be rejected. All requests are subject to the page size, which is 100 if not specified and can be specified up to 500.
        :type page_size: int
        :param skip_source_response: Option to indicate if you wan to avoid returning the source response for the mortgage products. It will be returned by default.
        :type skip_source_response: 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._get_mortgage_serialize(
            mortgage_details=mortgage_details,
            mortgage_ids=mortgage_ids,
            filter_property_secured_id=filter_property_secured_id,
            filter_client_ids=filter_client_ids,
            filter_case_id=filter_case_id,
            filter_ext_source=filter_ext_source,
            filter_ext_ids=filter_ext_ids,
            bookmark=bookmark,
            page_size=page_size,
            skip_source_response=skip_source_response,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _get_mortgage_serialize(
        self,
        mortgage_details,
        mortgage_ids,
        filter_property_secured_id,
        filter_client_ids,
        filter_case_id,
        filter_ext_source,
        filter_ext_ids,
        bookmark,
        page_size,
        skip_source_response,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = None

        _collection_formats: Dict[str, str] = {
            'mortgage_ids': 'multi',
            'filter_client_ids': 'multi',
            'filter_ext_ids': 'multi',
        }

        _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 mortgage_details is not None:
            
            _query_params.append(('mortgage_details', mortgage_details))
            
        if mortgage_ids is not None:
            
            _query_params.append(('mortgage_ids', mortgage_ids))
            
        if filter_property_secured_id is not None:
            
            _query_params.append(('filter_property_secured_id', filter_property_secured_id))
            
        if filter_client_ids is not None:
            
            _query_params.append(('filter_client_ids', filter_client_ids))
            
        if filter_case_id is not None:
            
            _query_params.append(('filter_case_id', filter_case_id))
            
        if filter_ext_source is not None:
            
            _query_params.append(('filter_ext_source', filter_ext_source))
            
        if filter_ext_ids is not None:
            
            _query_params.append(('filter_ext_ids', filter_ext_ids))
            
        if bookmark is not None:
            
            _query_params.append(('bookmark', bookmark))
            
        if page_size is not None:
            
            _query_params.append(('page_size', page_size))
            
        if skip_source_response is not None:
            
            _query_params.append(('skip_source_response', skip_source_response))
            
        # 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] = [
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v1/acre/mortgage',
            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
    def get_mortgage_version(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        version: Annotated[StrictInt, Field(description="If zero, returns the latest (i.e., mutable) version. Required.")],
        _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,
    ) -> CdmGetMortgageVersionResponse:
        """Get a mortgage, specifying a version (use zero for latest).


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_id: str
        :param version: If zero, returns the latest (i.e., mutable) version. Required. (required)
        :type version: 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._get_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            version=version,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def get_mortgage_version_with_http_info(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        version: Annotated[StrictInt, Field(description="If zero, returns the latest (i.e., mutable) version. Required.")],
        _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[CdmGetMortgageVersionResponse]:
        """Get a mortgage, specifying a version (use zero for latest).


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_id: str
        :param version: If zero, returns the latest (i.e., mutable) version. Required. (required)
        :type version: 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._get_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            version=version,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def get_mortgage_version_without_preload_content(
        self,
        mortgage_id: Annotated[StrictStr, Field(description="Mortgage ID. Required.")],
        version: Annotated[StrictInt, Field(description="If zero, returns the latest (i.e., mutable) version. Required.")],
        _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:
        """Get a mortgage, specifying a version (use zero for latest).


        :param mortgage_id: Mortgage ID. Required. (required)
        :type mortgage_id: str
        :param version: If zero, returns the latest (i.e., mutable) version. Required. (required)
        :type version: 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._get_mortgage_version_serialize(
            mortgage_id=mortgage_id,
            version=version,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmGetMortgageVersionResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _get_mortgage_version_serialize(
        self,
        mortgage_id,
        version,
        _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 mortgage_id is not None:
            _path_params['mortgage_id'] = mortgage_id
        if version is not None:
            _path_params['version'] = version
        # 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] = [
        ]

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v1/acre/mortgage/{mortgage_id}/version/{version}',
            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
    def replace_mortgage(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[CompleteDetailsOfTheMortgageToBeReplacedRequired, Field(description="Complete details of the mortgage to be replaced. Required.")],
        _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,
    ) -> CdmReplaceMortgageResponse:
        """Replace (PUT) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Complete details of the mortgage to be replaced. Required. (required)
        :type mortgage: CompleteDetailsOfTheMortgageToBeReplacedRequired
        :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._replace_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmReplaceMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def replace_mortgage_with_http_info(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[CompleteDetailsOfTheMortgageToBeReplacedRequired, Field(description="Complete details of the mortgage to be replaced. Required.")],
        _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[CdmReplaceMortgageResponse]:
        """Replace (PUT) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Complete details of the mortgage to be replaced. Required. (required)
        :type mortgage: CompleteDetailsOfTheMortgageToBeReplacedRequired
        :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._replace_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmReplaceMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def replace_mortgage_without_preload_content(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[CompleteDetailsOfTheMortgageToBeReplacedRequired, Field(description="Complete details of the mortgage to be replaced. Required.")],
        _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:
        """Replace (PUT) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Complete details of the mortgage to be replaced. Required. (required)
        :type mortgage: CompleteDetailsOfTheMortgageToBeReplacedRequired
        :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._replace_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmReplaceMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _replace_mortgage_serialize(
        self,
        mortgage_mortgage_id,
        mortgage,
        _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 mortgage_mortgage_id is not None:
            _path_params['mortgage.mortgage_id'] = mortgage_mortgage_id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if mortgage is not None:
            _body_params = mortgage


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v1/acre/mortgage/{mortgage.mortgage_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
    def update_mortgage(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[PartialDetailsOfTheMortgageToBeReplacedRequired, Field(description="Partial details of the mortgage to be replaced. Required.")],
        _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,
    ) -> CdmUpdateMortgageResponse:
        """Update (PATCH) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Partial details of the mortgage to be replaced. Required. (required)
        :type mortgage: PartialDetailsOfTheMortgageToBeReplacedRequired
        :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._update_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def update_mortgage_with_http_info(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[PartialDetailsOfTheMortgageToBeReplacedRequired, Field(description="Partial details of the mortgage to be replaced. Required.")],
        _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[CdmUpdateMortgageResponse]:
        """Update (PATCH) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Partial details of the mortgage to be replaced. Required. (required)
        :type mortgage: PartialDetailsOfTheMortgageToBeReplacedRequired
        :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._update_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def update_mortgage_without_preload_content(
        self,
        mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage: Annotated[PartialDetailsOfTheMortgageToBeReplacedRequired, Field(description="Partial details of the mortgage to be replaced. Required.")],
        _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:
        """Update (PATCH) an existing mortgage.


        :param mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_mortgage_id: str
        :param mortgage: Partial details of the mortgage to be replaced. Required. (required)
        :type mortgage: PartialDetailsOfTheMortgageToBeReplacedRequired
        :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._update_mortgage_serialize(
            mortgage_mortgage_id=mortgage_mortgage_id,
            mortgage=mortgage,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _update_mortgage_serialize(
        self,
        mortgage_mortgage_id,
        mortgage,
        _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 mortgage_mortgage_id is not None:
            _path_params['mortgage.mortgage_id'] = mortgage_mortgage_id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if mortgage is not None:
            _body_params = mortgage


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='PATCH',
            resource_path='/v1/acre/mortgage/{mortgage.mortgage_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
    def update_mortgage_with_product(
        self,
        mortgage_with_product_mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage_with_product: Annotated[MortgageProductAndSourcingDetailsToUpdate, Field(description="Mortgage, product and sourcing details to update.")],
        _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,
    ) -> CdmUpdateMortgageWithProductResponse:
        """Update (PATCH) an existing mortgage and its product


        :param mortgage_with_product_mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_with_product_mortgage_mortgage_id: str
        :param mortgage_with_product: Mortgage, product and sourcing details to update. (required)
        :type mortgage_with_product: MortgageProductAndSourcingDetailsToUpdate
        :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._update_mortgage_with_product_serialize(
            mortgage_with_product_mortgage_mortgage_id=mortgage_with_product_mortgage_mortgage_id,
            mortgage_with_product=mortgage_with_product,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data


    @validate_call
    def update_mortgage_with_product_with_http_info(
        self,
        mortgage_with_product_mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage_with_product: Annotated[MortgageProductAndSourcingDetailsToUpdate, Field(description="Mortgage, product and sourcing details to update.")],
        _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[CdmUpdateMortgageWithProductResponse]:
        """Update (PATCH) an existing mortgage and its product


        :param mortgage_with_product_mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_with_product_mortgage_mortgage_id: str
        :param mortgage_with_product: Mortgage, product and sourcing details to update. (required)
        :type mortgage_with_product: MortgageProductAndSourcingDetailsToUpdate
        :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._update_mortgage_with_product_serialize(
            mortgage_with_product_mortgage_mortgage_id=mortgage_with_product_mortgage_mortgage_id,
            mortgage_with_product=mortgage_with_product,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )


    @validate_call
    def update_mortgage_with_product_without_preload_content(
        self,
        mortgage_with_product_mortgage_mortgage_id: Annotated[StrictStr, Field(description="Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2;")],
        mortgage_with_product: Annotated[MortgageProductAndSourcingDetailsToUpdate, Field(description="Mortgage, product and sourcing details to update.")],
        _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:
        """Update (PATCH) an existing mortgage and its product


        :param mortgage_with_product_mortgage_mortgage_id: Acre ID of the mortgage.  DEPRECATED: Property ID of the mortgage.  string property_id = 2; (required)
        :type mortgage_with_product_mortgage_mortgage_id: str
        :param mortgage_with_product: Mortgage, product and sourcing details to update. (required)
        :type mortgage_with_product: MortgageProductAndSourcingDetailsToUpdate
        :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._update_mortgage_with_product_serialize(
            mortgage_with_product_mortgage_mortgage_id=mortgage_with_product_mortgage_mortgage_id,
            mortgage_with_product=mortgage_with_product,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CdmUpdateMortgageWithProductResponse",
            '400': "V1ExceptionResponse",
            '401': "V1ExceptionResponse",
            '403': "V1ExceptionResponse",
            '404': "V1ExceptionResponse",
            '405': "str",
            '500': "V1ExceptionResponse",
            '503': "V1ExceptionResponse",
        }
        response_data = self.api_client.call_api(
            *_param,
            _request_timeout=_request_timeout
        )
        return response_data.response


    def _update_mortgage_with_product_serialize(
        self,
        mortgage_with_product_mortgage_mortgage_id,
        mortgage_with_product,
        _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 mortgage_with_product_mortgage_mortgage_id is not None:
            _path_params['mortgage_with_product.mortgage.mortgage_id'] = mortgage_with_product_mortgage_mortgage_id
        # process the query parameters
        # process the header parameters
        # process the form parameters
        # process the body parameter
        if mortgage_with_product is not None:
            _body_params = mortgage_with_product


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

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

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

        return self.api_client.param_serialize(
            method='PATCH',
            resource_path='/v1/acre/mortgage_with_product/{mortgage_with_product.mortgage.mortgage_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
        )


