Skip to content

Reference

shared.services.payment_providers.jpmorgan.entities

JPMorganAccountType

Bases: AlanBaseEnum

IBAN class-attribute instance-attribute

IBAN = 'IBAN'

INTERAC class-attribute instance-attribute

INTERAC = 'INTERAC'

JPMorganBusinessAccountConfig dataclass

JPMorganBusinessAccountConfig(
    base_url,
    account_id,
    debtor_agent_bic,
    signature_private_key,
    signature_private_key_secret_name,
    transport_public_certificate,
    transport_public_certificate_secret_name,
    transport_private_key,
    transport_private_key_secret_name,
)

account_id instance-attribute

account_id

base_url instance-attribute

base_url

debtor_agent_bic instance-attribute

debtor_agent_bic

signature_private_key instance-attribute

signature_private_key

signature_private_key_secret_name instance-attribute

signature_private_key_secret_name

transport_private_key instance-attribute

transport_private_key

transport_private_key_secret_name instance-attribute

transport_private_key_secret_name

transport_public_certificate instance-attribute

transport_public_certificate

transport_public_certificate_secret_name instance-attribute

transport_public_certificate_secret_name

JPMorganBusinessAccountName

Bases: AlanBaseEnum

alan_insurance class-attribute instance-attribute

alan_insurance = 'alan_insurance'

shared.services.payment_providers.jpmorgan.errors

JPMorganBadRequestError

JPMorganBadRequestError(code=None, message=None)

Bases: JPMorganError

Our request was not formatted correctly, maybe their API has evolved or we have missed something

List of Error codes and Rule definitions.
Error Code Rule Definition
10001 Mandatory field is missing or invalid
10002 Minimum length validation failure
10003 Maximum length validation failure
10004 Date validation failure
10005 Amount validation failure ~ value more than maximum
10006 Amount validation failure ~ value less than minimum
10007 Amount validation failure ~ value is not a number
10008 Validation failure ~ unexpected value provided
10009 Invalid Id provided
10010 Personal information validation failure
12000 System error
13000 Uncategorized error

errorDescription is dynamically generated, hence not shown here.

Standard API Gateway Error codes and descriptions
Error Code Description
GCA-023 Please re-send request in valid format
GCA-030 API Processing Error
GCA-148 debtor Account id must be provided
GCA-149 debtorAgent bic or clearingSystemId must be provided
GCA-150 debtor account id/bic was not found
GCA-154 Mandatory field paymentType is invalid or missing
Source code in shared/services/payment_providers/jpmorgan/errors.py
4
5
6
def __init__(self, code: str | None = None, message: str | None = None) -> None:
    self.code = code
    self.message = message

JPMorganError

JPMorganError(code=None, message=None)

Bases: Exception

A generic JPMorgan exception we should handle

Source code in shared/services/payment_providers/jpmorgan/errors.py
4
5
6
def __init__(self, code: str | None = None, message: str | None = None) -> None:
    self.code = code
    self.message = message

code instance-attribute

code = code

message instance-attribute

message = message

JPMorganForbiddenError

JPMorganForbiddenError(code=None, message=None)

Bases: JPMorganError

We get a 403, for one of the below reasons | Error Code | Description | |----------- |-------------------------------------------| | GCA-001 |Client is not eligible for the API Service | | GCA-003 |Client is not eligible for the API Service | | GCA-145 |incorrect originator account id provided | | GCA-150 |debtor account id/bic was not found |

Source code in shared/services/payment_providers/jpmorgan/errors.py
4
5
6
def __init__(self, code: str | None = None, message: str | None = None) -> None:
    self.code = code
    self.message = message

JPMorganInternalError

JPMorganInternalError(code=None, message=None)

Bases: JPMorganError

JPMorgan issue, we can't act on it

Source code in shared/services/payment_providers/jpmorgan/errors.py
4
5
6
def __init__(self, code: str | None = None, message: str | None = None) -> None:
    self.code = code
    self.message = message

JPMorganNotFoundError

JPMorganNotFoundError(code=None, message=None)

Bases: JPMorganError

Resource does not exist on JPMorgan, it is up to us to decide whether we take this error into account or not

Source code in shared/services/payment_providers/jpmorgan/errors.py
4
5
6
def __init__(self, code: str | None = None, message: str | None = None) -> None:
    self.code = code
    self.message = message

shared.services.payment_providers.jpmorgan.helpers

get_jpmorgan_config_from_business_account_name

get_jpmorgan_config_from_business_account_name(
    account_name,
)
Source code in shared/services/payment_providers/jpmorgan/helpers.py
def get_jpmorgan_config_from_business_account_name(
    account_name: JPMorganBusinessAccountName,
) -> JPMorganBusinessAccountConfig:
    if JPMorganBusinessAccountName[account_name] not in JPMorganBusinessAccountName:
        raise ValueError(
            f"Invalid JPMorgan business account name {account_name}. "
            f"Valid values are: {', '.join(JPMorganBusinessAccountName.get_values())}"
        )

    jpmorgan_config = _business_account_name_mapping[account_name]

    if not jpmorgan_config:
        raise ValueError(
            f"Could not find JPMorgan config for business account name {account_name}"
        )

    return jpmorgan_config

shared.services.payment_providers.jpmorgan.jpmorgan_global_payments_api_client

ConfiguredResponse module-attribute

ConfiguredResponse = tuple[
    int, JPMorganResponse | JPMorganErrorResponse
]

JPMorganApiProtocol

Bases: Protocol

Protocol for JPMorgan API implementations (real and stubbed).

get_payment

get_payment(*, params)
Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def get_payment(self, *, params: dict[str, str]) -> JPMorganResponse: ...

post_payment

post_payment(payload)
Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def post_payment(self, payload: JPMorganRequest) -> JPMorganResponse: ...

JPMorganErrorResponse module-attribute

JPMorganErrorResponse = dict[str, Any]

JPMorganGlobalPaymentsApiClient

JPMorganGlobalPaymentsApiClient(api)

This class wraps the JPMorgan Treasury API and provides a single point of entry for all JPMorgan API calls.

Implements the following Nullable patterns: - Nullables: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#nullables ⧉ - Parameterless instantiation: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#instantiation ⧉ - Thin wrapper: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#thin-wrapper ⧉ - Embedded stub: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#embedded-stub ⧉

See also
Tags
Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def __init__(
    self,
    api: JPMorganApiProtocol,
) -> None:
    self.api = api

RealApi

RealApi(jpmorgan_config)

Bases: JPMorganApiProtocol

API client that calls the real JPMorgan API.

See the authentication documentation here: https://developer.jpmorgan.com/products/tsapi-onboarding-guides/guides/digitally-sign-payment-requests-(required ⧉)

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def __init__(
    self,
    jpmorgan_config: JPMorganBusinessAccountConfig,
) -> None:
    transport_private_key = raw_secret_from_config(
        config_key=jpmorgan_config.transport_private_key_secret_name,
        default_secret_value=current_config.get(
            jpmorgan_config.transport_private_key
        ),
    )
    if transport_private_key is None:
        raise ValueError("JPMorgan transport private key is not configured")

    transport_certificate = raw_secret_from_config(
        config_key=jpmorgan_config.transport_public_certificate_secret_name,
        default_secret_value=current_config.get(
            jpmorgan_config.transport_public_certificate
        ),
    )
    if transport_certificate is None:
        raise ValueError(
            "JPMorgan transport public certificate is not configured"
        )

    signature_private_key = raw_secret_from_config(
        config_key=jpmorgan_config.signature_private_key_secret_name,
        default_secret_value=current_config.get(
            jpmorgan_config.signature_private_key
        ),
    )
    if signature_private_key is None:
        raise ValueError("JPMorgan signature private key is not configured")
    self._signature_private_key = signature_private_key

    self._base_url = get_config_or_fail(jpmorgan_config.base_url)

    # To send client certificates with our request, we need to pass the requests lib (in fact, the
    # underlying OpenSSL implementation) paths to the files, not the content itself. That's why we
    # need to create named temporary files here, so we can reference them later when sending the
    # Payment.
    # In Python 3.12, we should use delete_on_close=False instead
    self._transport_private_key_temp_file = tempfile.NamedTemporaryFile(
        delete=False, suffix=".key"
    )
    self._transport_private_key_temp_file.write(
        str.encode(transport_private_key)
    )
    self._transport_private_key_temp_file.close()

    # In Python 3.12, we should use delete_on_close=False instead
    self._transport_cert_temp_file = tempfile.NamedTemporaryFile(
        delete=False, suffix=".cert"
    )
    self._transport_cert_temp_file.write(str.encode(transport_certificate))
    self._transport_cert_temp_file.close()
PAYMENTS_ENDPOINT class-attribute instance-attribute
PAYMENTS_ENDPOINT = 'payments'
get_payment
get_payment(*, params)

GET payment details from JPMorgan payments endpoint.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def get_payment(self, *, params: dict[str, str]) -> JPMorganResponse:
    """GET payment details from JPMorgan payments endpoint."""
    request = requests.Request(
        method="GET",
        url=self._base_url + self.PAYMENTS_ENDPOINT,
        params=params,
        headers=self._get_header(),
    ).prepare()

    current_logger.debug(
        "Calling JPMorgan API: GET %s",
        request.url,
        jpmorgan=params,
    )

    response = requests.Session().send(
        request,
        cert=self._get_transport_certificate(),
    )

    self._raise_for_status(response)
    return response.json()  # type: ignore[no-any-return]
post_payment
post_payment(payload)

Sign payload with JWT and POST to JPMorgan payments endpoint.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def post_payment(self, payload: JPMorganRequest) -> JPMorganResponse:
    """Sign payload with JWT and POST to JPMorgan payments endpoint."""
    signed_payload = self._build_jwt(payload)

    request = requests.Request(
        method="POST",
        url=self._base_url + self.PAYMENTS_ENDPOINT,
        headers=self._get_header(),
        data=signed_payload,
    ).prepare()

    current_logger.debug(
        "Calling JPMorgan API: POST %s",
        request.url,
        jpmorgan={
            "end_to_end_id": payload.get("payments", {})
            .get("paymentIdentifiers", {})
            .get("endToEndId"),
        },
    )

    # No advisory lock here, we assume we can create simultaneous payments on the JPMorgan API
    response = requests.Session().send(
        request,
        cert=self._get_transport_certificate(),
    )

    self._raise_for_status(response)
    return response.json()  # type: ignore[no-any-return]

StubbedApi

StubbedApi(*, track_requests=None, responses=None)

Bases: JPMorganApiProtocol

Embedded stub for JPMorgan API, replicates the same interface as the real API.

https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#embedded-stub ⧉

Implements the following Nullable patterns: - Output tracking: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#output-tracking ⧉ - Configurable responses: https://www.jamesshore.com/v2/projects/nullables/testing-without-mocks#configurable-responses ⧉

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def __init__(
    self,
    *,
    track_requests: list[TrackedRequest] | None = None,
    responses: list[ConfiguredResponse] | None = None,
) -> None:
    self.track_requests = track_requests
    self.responses = responses
get_payment
get_payment(*, params)

Simulate a payment details query.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def get_payment(self, *, params: dict[str, str]) -> JPMorganResponse:
    """Simulate a payment details query."""
    if self.responses is not None and len(self.responses) > 0:
        status_code, data = self.responses.pop(0)
    else:
        # Simulate a not found error by default
        status_code = 404
        data = {
            "errors": {
                "errorDetails": [
                    {
                        "errorCode": "GCA-404",
                        "errorDescription": "Transaction not found",
                    }
                ]
            }
        }

    return self._simulate_request(
        "get_payment", {"params": params}, data, status_code
    )
post_payment
post_payment(payload)

Simulate a payment initiation.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def post_payment(self, payload: JPMorganRequest) -> JPMorganResponse:
    """Simulate a payment initiation."""
    if self.responses is not None and len(self.responses) > 0:
        status_code, data = self.responses.pop(0)
    else:
        # Simulate a successful payment initiation
        status_code = 200
        firm_root_id = str(uuid.uuid4())
        end_to_end_id = (
            payload.get("payments", {})
            .get("paymentIdentifiers", {})
            .get("endToEndId")
        )
        data = {
            "paymentInitiationResponse": {
                "firmRootId": firm_root_id,
                "endToEndId": end_to_end_id,
            },
        }

    return self._simulate_request("post_payment", payload, data, status_code)
responses instance-attribute
responses = responses
track_requests instance-attribute
track_requests = track_requests

api instance-attribute

api = api

create classmethod

create(*, business_account_name=None)

Normal factory.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
@classmethod
def create(
    cls,
    *,
    business_account_name: JPMorganBusinessAccountName | None = None,
) -> "JPMorganGlobalPaymentsApiClient":
    """Normal factory."""
    from shared.helpers.env import is_development_mode, is_test_mode

    if is_test_mode() or is_development_mode():
        return cls.create_null()

    if business_account_name is None:
        business_account_name = JPMorganBusinessAccountName.alan_insurance

    jpmorgan_config = get_jpmorgan_config_from_business_account_name(
        business_account_name
    )

    return cls(api=cls.RealApi(jpmorgan_config=jpmorgan_config))

create_null classmethod

create_null(*, track_requests=None, responses=None)

Null factory for testing.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
@classmethod
def create_null(
    cls,
    *,
    track_requests: list[TrackedRequest] | None = None,
    responses: list[ConfiguredResponse] | None = None,
) -> "JPMorganGlobalPaymentsApiClient":
    """Null factory for testing."""
    return cls(
        api=cls.StubbedApi(
            track_requests=track_requests,
            responses=responses,
        ),
    )

get_payment_details

get_payment_details(
    *,
    firm_root_id=None,
    end_to_end_id=None,
    ignore_not_found_error=False
)

https://developer.payments.jpmorgan.com/api/treasury/global-payments/global-payments/global-payments#/operations/getPaymentDetails ⧉

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def get_payment_details(
    self,
    *,
    firm_root_id: str | None = None,
    end_to_end_id: str | None = None,
    ignore_not_found_error: bool = False,
) -> JPMorganPaymentDetailsResponse | None:
    """
    https://developer.payments.jpmorgan.com/api/treasury/global-payments/global-payments/global-payments#/operations/getPaymentDetails
    """

    if firm_root_id is None and end_to_end_id is None:
        raise ValueError("Either firm_root_id or end_to_end_id must be provided")
    if firm_root_id and end_to_end_id:
        raise ValueError(
            "Only one of firm_root_id or end_to_end_id must be provided"
        )

    if firm_root_id:
        params = {"firmRootId": firm_root_id}
    else:
        assert end_to_end_id is not None
        params = {"endToEndId": end_to_end_id}

    try:
        response_json = self.api.get_payment(params=params)
    except JPMorganError as e:
        if ignore_not_found_error and isinstance(e, JPMorganNotFoundError):
            return None
        raise e

    return JPMorganPaymentDetailsResponse.model_validate(response_json)

get_supported_currency

get_supported_currency()

Get the supported currency for this JPMorgan account.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def get_supported_currency(self) -> str:
    """Get the supported currency for this JPMorgan account."""
    return current_config.get("JPMORGAN_CURRENCY", "EUR")  # type: ignore[no-any-return]

initiate_payments

initiate_payments(
    end_to_end_id,
    amount,
    creditor_account_type,
    creditor_account_id,
    creditor_agent_bic=None,
    payment_description=None,
    creditor_first_name=None,
    creditor_last_name=None,
    creditor_company_name=None,
    creditor_address=None,
)

https://developer.payments.jpmorgan.com/api/treasury/global-payments/global-payments/global-payments#/operations/initiatePayments ⧉

Trigger a payment using JPMorgan Treasury API.

The payment will be sent to the recipient described by the recipient_* fields.

Source code in shared/services/payment_providers/jpmorgan/jpmorgan_global_payments_api_client.py
def initiate_payments(
    self,
    # The end_to_end_id is controlled by us, and is a string of 35 chars max, letters and numbers only
    end_to_end_id: str,
    amount: float,
    creditor_account_type: JPMorganAccountType,
    creditor_account_id: str,
    creditor_agent_bic: str | None = None,  # SWIFT / BIC is not mandatory
    payment_description: str | None = None,
    # These fields must be specified if the creditor is an individual
    creditor_first_name: str | None = None,
    creditor_last_name: str | None = None,
    # This field must be specified if the creditor is a company or a hospital
    creditor_company_name: str | None = None,
    creditor_address: BillingAddress | None = None,
) -> JPMorganPaymentInitiationResponse:
    """
    https://developer.payments.jpmorgan.com/api/treasury/global-payments/global-payments/global-payments#/operations/initiatePayments

    Trigger a payment using JPMorgan Treasury API.

    The payment will be sent to the recipient described by the recipient_* fields.
    """
    if not end_to_end_id:
        raise ValueError("end_to_end_id is not set")

    if creditor_company_name:
        creditor_name = f"{creditor_company_name}"
    else:
        creditor_name = f"{creditor_first_name} {creditor_last_name}"

    account_id = current_config.get("JPMORGAN_ACCOUNT_ID", "TEST_ACCOUNT_ID")
    debtor_agent_bic = current_config.get("JPMORGAN_DEBTOR_AGENT_BIC", "CHASDEFX")
    payment_currency = self.get_supported_currency()

    # SEPA Instant is supported on - Frankfurt (CHASDEFX); Dublin (CHASIE4L); Luxembourg (CHASLULX)
    is_sepa_instant = debtor_agent_bic in [
        "CHASDEFX",
        "CHASIE4L",
        "CHASLULX",
    ]

    self._check_account_type_requirements(
        creditor_account_type=creditor_account_type,
        is_sepa_instant=is_sepa_instant,
        debtor_agent_bic=debtor_agent_bic,
        creditor_address=creditor_address,
        payment_currency=payment_currency,
    )

    payments = JPMorganPayments(
        requestedExecutionDate=date.today().isoformat(),
        paymentIdentifiers=JPMorganPaymentIdentifiers(endToEndId=end_to_end_id),
        paymentCurrency=payment_currency,
        paymentAmount=amount,
        paymentType=JPMorganPaymentType.RTP if is_sepa_instant else None,
        debtor=JPMorganDebtor(
            debtorName="Alan Insurance",
            debtorAccount=JPMorganDebtorAccount(
                root=JPMorganDebtorAccountIdentification(
                    accountId=JPMorganAccountId(root=account_id),
                    # Mandatory only for SEPA INSTANT
                    accountCurrency=JPMorganAccountCurrency(root="EUR")
                    if is_sepa_instant
                    else None,
                    accountType=JPMorganAPIAccountType.IBAN
                    if is_sepa_instant
                    else None,
                )
            ),
        ),
        debtorAgent=JPMorganDebtorAgent(
            financialInstitutionId=JPMorganDebtorFinancialInstitutionId(
                bic=JPMorganBic(debtor_agent_bic)
            )
        ),
        creditorAgent=JPMorganCreditorAgent(
            financialInstitutionId=JPMorganCreditorFinancialInstitutionId(
                bic=creditor_agent_bic
            )
        )
        if creditor_agent_bic
        else None,
        creditor=JPMorganCreditor(
            creditorAccount=JPMorganCreditorAccount(
                root=JPMorganPrimaryAccountIdentification(
                    accountId=JPMorganAccountId(root=creditor_account_id),
                    accountType=JPMorganAccountTypeEnum(
                        creditor_account_type.value
                    ),
                )
            ),
            creditorName=creditor_name[:140],  # 140 chars max
            postalAddress=JPMorganPostalAddress(
                addressType=JPMorganAddressType.ADDR,
                # If client elects to use the structured address fields populate Address Line + Country
                # 2 lines, 70 characters each including spaces
                # Note: structured address fields ((Postal Address fields except Address Line) + Town Name + Country)
                # will be mandatory from November 2026, this will mean unstructured address fields will no longer be
                # supported (Address Line) past this date
                # -> https://linear.app/alan-eu/issue/FREF-390/jpmorgan-api-address-requirements-before-112026
                # -- Structured fields:
                # streetName=f"{creditor_address.street}"[:140],  # noqa: ERA001
                # buildingNumber=f"{creditor_address.street}"[:140],  # noqa: ERA001
                # postalCode=f"{creditor_address.postal_code}"[:140],  # noqa: ERA001
                # townName=f"{creditor_address.city}"[:140],  # noqa: ERA001
                # -- Unstructured fields:
                addressLine=[
                    JPMorganAddressLineItem(root=f"{creditor_address.street}"[:70]),
                    JPMorganAddressLineItem(
                        root=f"{creditor_address.postal_code} {creditor_address.city}"[
                            :70
                        ]
                    ),
                ],
                country=creditor_address.country,  # ISO Code needed here
            )
            if creditor_address
            else None,
            countryOfResidence=JPMorganCountryOfResidence(
                root=creditor_address.country  # ISO Code needed here
            )
            if creditor_address and creditor_address.country
            else None,
        ),
        transferType=JPMorganTransferType.CREDIT,
        remittanceInformation=JPMorganRemittanceInformation(
            unstructuredInformation=[
                JPMorganUnstructuredInformation(root=payment_description[:140])
            ]
        )
        if payment_description
        else None,
    )

    # mode="json" is required: StrEnum values (e.g. JPMorganTransferType), date objects,
    # and RootModel instances (e.g. JPMorganAccountId) would not serialize correctly otherwise.
    payload = {"payments": payments.model_dump(mode="json", exclude_none=True)}

    response_json = self.api.post_payment(payload)

    return JPMorganPaymentInitiationResponse.model_validate(response_json)

JPMorganRequest module-attribute

JPMorganRequest = dict[str, Any]

JPMorganResponse module-attribute

JPMorganResponse = dict[str, Any]

TrackedRequest module-attribute

TrackedRequest = tuple[
    str,
    JPMorganRequest,
    JPMorganResponse | JPMorganErrorResponse | None,
]

shared.services.payment_providers.jpmorgan.openapi

global_payments_api_1_1_33

JPMorganAccountCurrency

Bases: RootModel[str]

root instance-attribute
root

Originator account currency in 3 character ISO currency code. Field not applicable to Alternate Payments (Cards) UK FPS - GBP only SEPA INSTANT - EUR only

JPMorganAccountId

Bases: RootModel[str]

root instance-attribute
root

Direct Debit Payments

Payment Type Market Max Length
RTP Malaysia 34

Credit Transfer Payments

Applicable and mandatory for RTP and Blockchain (Kinexys Digital Payments) Payments, Push To Wallet (PayPal/Venmo) and Zelle Payments.

This field is to provide the regular account id when it is a pay by Account instruction. If pay by proxy, this does not need to be filled.

Maximum length supported for each instrument and market :-

Payment Type Market Max Length
RTP UK 8 (7 digit A/C numbers should be padded with a leading zero)
RTP Singapore 35
RTP Australia 35
RTP Hong Kong 35
RTP Indonesia 35
RTP Brazil 34
RTP Mexico 16
RTP US 31
Push To Card US/Canada 16
INTERAC Canada 35
ACH Chile 17
SEPA 34 (IBAN)
Kinexys 34
Push To Wallet (PayPal/Venmo 35
Zelle 35

JPMorganAccountIdentification

Bases: RootModel[str]

root instance-attribute
root

Maximum length supported for each instrument and market :- | Market |Maximum length limits| | ------ |--------------------------| | US RTP |9 (Routing and Transit Number: alphabetic characters may be present)| | SEPA INSTANT |8 (numeric only) | | Brazil RTP |8 | | UK FPS |6 (numeric only) |

JPMorganAccountType

Bases: StrEnum

BDA class-attribute instance-attribute
BDA = 'BDA'
CACC class-attribute instance-attribute
CACC = 'CACC'
CARD class-attribute instance-attribute
CARD = 'CARD'
DDA class-attribute instance-attribute
DDA = 'DDA'
EMBEDDED_DDA class-attribute instance-attribute
EMBEDDED_DDA = 'EMBEDDED_DDA'
IBAN class-attribute instance-attribute
IBAN = 'IBAN'
LIMITED_DDA class-attribute instance-attribute
LIMITED_DDA = 'LIMITED_DDA'
SVGS class-attribute instance-attribute
SVGS = 'SVGS'
VAM class-attribute instance-attribute
VAM = 'VAM'
WALLET class-attribute instance-attribute
WALLET = 'WALLET'

JPMorganAccountTypeEnum

Bases: StrEnum

BBAN class-attribute instance-attribute
BBAN = 'BBAN'
BDA class-attribute instance-attribute
BDA = 'BDA'
CACC class-attribute instance-attribute
CACC = 'CACC'
CARD class-attribute instance-attribute
CARD = 'CARD'
CLABE class-attribute instance-attribute
CLABE = 'CLABE'
DDA class-attribute instance-attribute
DDA = 'DDA'
DFLT class-attribute instance-attribute
DFLT = 'DFLT'
IBAN class-attribute instance-attribute
IBAN = 'IBAN'
INTERAC class-attribute instance-attribute
INTERAC = 'INTERAC'
LOAN class-attribute instance-attribute
LOAN = 'LOAN'
NREX class-attribute instance-attribute
NREX = 'NREX'
ODFT class-attribute instance-attribute
ODFT = 'ODFT'
OTHER class-attribute instance-attribute
OTHER = 'OTHER'
PAYPAL class-attribute instance-attribute
PAYPAL = 'PAYPAL'
SLRY class-attribute instance-attribute
SLRY = 'SLRY'
SVGS class-attribute instance-attribute
SVGS = 'SVGS'
TRAN class-attribute instance-attribute
TRAN = 'TRAN'
VENMO class-attribute instance-attribute
VENMO = 'VENMO'
VOSTRO class-attribute instance-attribute
VOSTRO = 'VOSTRO'
ZELLE class-attribute instance-attribute
ZELLE = 'ZELLE'

JPMorganAdditionalAlternateAccountIdentifier

Bases: BaseModel

idType instance-attribute
idType

One or more values that can be used as alternative identifiers for an account. | Identifier Type | Description | | -------------------| ---------------------------------------------------------------| | PROGRAM_ID | A client program identifier.| | CUSTOM | A custom identifier that can be used to identify an account eg. EMAIL,CARD_NUMBER etc. Should be used in conjunction with name field.|

identifier instance-attribute
identifier
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
name class-attribute instance-attribute
name = None

Optional field to provide more context to the alternate account identifier type. With idType: CUSTOM it is recommended to provide a name for the identifier, for example: | Identifier Type | NAME | | -------------------|-------------| | CUSTOM |EMAIL | | CUSTOM |CARD_NUMBER|

JPMorganAdditionalAlternateAccountIdentifiers

Bases: RootModel[list[JPMorganAdditionalAlternateAccountIdentifier]]

root instance-attribute
root

One or more values that can be used as alternative identifiers for an account.

JPMorganAdditionalCreditor

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
name class-attribute instance-attribute
name = None

JPMorganAdditionalIdentifier

Bases: BaseModel

id instance-attribute
id
idType instance-attribute
idType
issuer class-attribute instance-attribute
issuer = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
schemeName class-attribute instance-attribute
schemeName = None

type of scheme

JPMorganAdditionalInstitution

Bases: BaseModel

bic class-attribute instance-attribute
bic = None
isForeignParty class-attribute instance-attribute
isForeignParty = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
name class-attribute instance-attribute
name = None
postalAddress class-attribute instance-attribute
postalAddress = None

JPMorganAddressLineItem

Bases: RootModel[str]

root instance-attribute
root

JPMorganAddressType

Bases: StrEnum

ADDR class-attribute instance-attribute
ADDR = 'ADDR'
BIZZ class-attribute instance-attribute
BIZZ = 'BIZZ'
DLVY class-attribute instance-attribute
DLVY = 'DLVY'
HOME class-attribute instance-attribute
HOME = 'HOME'
MLTO class-attribute instance-attribute
MLTO = 'MLTO'
PBOX class-attribute instance-attribute
PBOX = 'PBOX'

JPMorganAlternateAccountIdentification

Bases: BaseModel

accountType class-attribute instance-attribute
accountType = None
additionalAlternateIdentifiers class-attribute instance-attribute
additionalAlternateIdentifiers = None
alternateAccountIdentifier instance-attribute
alternateAccountIdentifier
cardExpiryDate class-attribute instance-attribute
cardExpiryDate = None

Mandatory for Push to Card. Acceptable format - YYMM

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
schemeName class-attribute instance-attribute
schemeName = None

JPMorganAlternateAccountIdentifier

Bases: RootModel[str]

root instance-attribute
root

Alternate Account Identifier eg. email, program id, card number or other types of identifiers, used as a different means of identifying an account.

Mandatory for the following payment types: | Payment Type | description | |----------------------|-----------------------------------------------------------------------------| | Push To Card | Use program id while specifying the debtor details. | | | Use card number while specifying the creditor details. |

JPMorganBic

Bases: StrEnum

CHASAU2X class-attribute instance-attribute
CHASAU2X = 'CHASAU2X'
CHASBEBX class-attribute instance-attribute
CHASBEBX = 'CHASBEBX'
CHASBRSP class-attribute instance-attribute
CHASBRSP = 'CHASBRSP'
CHASCATT class-attribute instance-attribute
CHASCATT = 'CHASCATT'
CHASCLRM class-attribute instance-attribute
CHASCLRM = 'CHASCLRM'
CHASDEFX class-attribute instance-attribute
CHASDEFX = 'CHASDEFX'
CHASDEFXONX class-attribute instance-attribute
CHASDEFXONX = 'CHASDEFXONX'
CHASESM3 class-attribute instance-attribute
CHASESM3 = 'CHASESM3'
CHASFRPP class-attribute instance-attribute
CHASFRPP = 'CHASFRPP'
CHASGB2L class-attribute instance-attribute
CHASGB2L = 'CHASGB2L'
CHASHKHH class-attribute instance-attribute
CHASHKHH = 'CHASHKHH'
CHASIDJX class-attribute instance-attribute
CHASIDJX = 'CHASIDJX'
CHASIE4L class-attribute instance-attribute
CHASIE4L = 'CHASIE4L'
CHASINBX class-attribute instance-attribute
CHASINBX = 'CHASINBX'
CHASITMX class-attribute instance-attribute
CHASITMX = 'CHASITMX'
CHASLULX class-attribute instance-attribute
CHASLULX = 'CHASLULX'
CHASMXMX class-attribute instance-attribute
CHASMXMX = 'CHASMXMX'
CHASMYKX class-attribute instance-attribute
CHASMYKX = 'CHASMYKX'
CHASNL2X class-attribute instance-attribute
CHASNL2X = 'CHASNL2X'
CHASSGSG class-attribute instance-attribute
CHASSGSG = 'CHASSGSG'
CHASUS33 class-attribute instance-attribute
CHASUS33 = 'CHASUS33'
CHASUS33MCY class-attribute instance-attribute
CHASUS33MCY = 'CHASUS33MCY'

JPMorganCallback

Bases: BaseModel

clearingSystemReference class-attribute instance-attribute
clearingSystemReference = None

The clearing system reference

createDateTime class-attribute instance-attribute
createDateTime = None
endToEndId class-attribute instance-attribute
endToEndId = None
exceptions class-attribute instance-attribute
exceptions = None
firmRootId class-attribute instance-attribute
firmRootId = None
fx class-attribute instance-attribute
fx = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentRedirected class-attribute instance-attribute
paymentRedirected = None
paymentStatus class-attribute instance-attribute
paymentStatus = None

Status of the payment.

PENDING - Payment is pending processing

PENDING_POSTING - Payment is yet to be posted in the beneficiary account

COMPLETED - Payment has successfully completed

COMPLETED_CREDITED - Status indicating the beneficiary's account has been credited

REJECTED - Payment has been rejected. Please refer to the exception object for error details

RETURNED - Payment has been retured to the debtor party

WAREHOUSED - Payment request was successfully received. The request will be processed in the next available window, typically the next calendar day

BLOCKED - Payment blocked due to sanctions issue

RTP Flows (All Markets) -

PENDING -> COMPLETED

PENDING -> REJECTED

Additional Flows(RTP)->

US -

PENDING -> PENDING_POSTING -> COMPLETED

PENDING -> BLOCKED

Hong Kong -

PENDING -> COMPLETED -> COMPLETED_CREDITED

Push To Card Flows -

PENDING -> COMPLETED

PENDING -> REJECTED

PENDING -> COMPLETED -> RETURNED

ACH Flows (Chile) -

PENDING -> COMPLETED

PENDING - REJECTED

Blockchain (Kinexys Digital Payments) Flows -

PENDING -> PENDING_POSTING -> COMPLETED

PENDING -> REJECTED

JPMorganCallbacks

Bases: RootModel[list[JPMorganCallback]]

root instance-attribute
root

List of Error codes and Rule definitions. errorDescription is dynamically generated hence not shown here.

| Error Code        |            Rule Definition                          |
|-------------------|-----------------------------------------------------|
| `10001`           | Mandatory field is missing or invalid               |
| `10002`           | Minimum length validation failure                   |
| `10003`           | Maximum length validation failure                   |
| `10004`           | Date validation failure                             |
| `10005`           | Amount validation failure ~ value more than maximum |
| `10006`           | Amount validation failure ~ value less than minimum |
| `10007`           | Amount validation failure ~ value is not a number   |
| `10008`           | Validation failure ~ unexpected value provided      |
| `10009`           | Invalid Id provided                                 |
| `10010`           | Personal information validation failure             |
| `11000`           | Clearing/Regulatory failure                         |
| `12000`           | System error                                        |
| `13000`           | Uncategorized error                                 |

JPMorganCategoryPurpose

Bases: BaseModel

code class-attribute instance-attribute
code = None

Not applicable for Hong Kong

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
proprietary class-attribute instance-attribute
proprietary = None

Coded form Hong Kong RTP For credit transfers - "CXSALA" - Salary and Benefits Payment "CXBSNS" - General Business Payment "CXMRCH" - FPS Merchant Payment "CXTOPU" - Account Top-up Payment

Indonesia RTP WEALTH_TRANSFER INVESTMENT PURCHASE OTHER CXSALA

JPMorganChargeBearer

Bases: StrEnum

CREDITOR class-attribute instance-attribute
CREDITOR = 'CREDITOR'
DEBTOR class-attribute instance-attribute
DEBTOR = 'DEBTOR'

JPMorganClearingSystemId

Bases: BaseModel

id class-attribute instance-attribute
id = None
idType class-attribute instance-attribute
idType = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganClearingSystemId1

Bases: BaseModel

branchNumber class-attribute instance-attribute
branchNumber = None

Branch of the bank. Applicable and Mandatory for Brazil PIX only

id instance-attribute
id
idType class-attribute instance-attribute
idType = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganCode

Bases: StrEnum

PENS class-attribute instance-attribute
PENS = 'PENS'
SALA class-attribute instance-attribute
SALA = 'SALA'
SUPP class-attribute instance-attribute
SUPP = 'SUPP'
TAXS class-attribute instance-attribute
TAXS = 'TAXS'

JPMorganCodeModel

Bases: RootModel[str]

root instance-attribute
root

JPMorganCoreStatus

Bases: BaseModel

clearingSystemReference class-attribute instance-attribute
clearingSystemReference = None
createDateTime class-attribute instance-attribute
createDateTime = None
exception class-attribute instance-attribute
exception = None
fx class-attribute instance-attribute
fx = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentRedirected class-attribute instance-attribute
paymentRedirected = None
status class-attribute instance-attribute
status = None

Status of the payment.

PENDING - Payment is pending processing

PENDING_POSTING - Payment is yet to be posted in the beneficiary account

COMPLETED - Payment has successfully completed

COMPLETED_CREDITED - Status indicating the beneficiary's account has been credited

REJECTED - Payment has been rejected. Please refer to the exception object for error details

RETURNED - Payment has been retured to the debtor party

WAREHOUSED - Payment request was successfully received. The request will be processed in the next available window, typically the next calendar day

BLOCKED - Payment blocked due to sanctions issue

RTP Flows (All Markets) -

PENDING -> COMPLETED

PENDING -> REJECTED

Additional Flows(RTP)->

US -

PENDING -> PENDING_POSTING -> COMPLETED

PENDING -> BLOCKED

Hong Kong -

PENDING -> COMPLETED -> COMPLETED_CREDITED

Push To Card Flows -

PENDING -> COMPLETED

PENDING -> REJECTED

PENDING -> COMPLETED -> RETURNED

Blockchain (Kinexys Digital Payments) Flows -

PENDING -> PENDING_POSTING -> COMPLETED

PENDING -> REJECTED

JPMorganCountryOfResidence

Bases: RootModel[str]

root instance-attribute
root

2 character ISO country code of residence. Mandatory for Interac payments.

JPMorganCreditor

Bases: BaseModel

additionalCreditors class-attribute instance-attribute
additionalCreditors = None
countryOfResidence class-attribute instance-attribute
countryOfResidence = None
creditorAccount instance-attribute
creditorAccount
creditorDevice class-attribute instance-attribute
creditorDevice = None
creditorName class-attribute instance-attribute
creditorName = None

Credit Transfer Payments

Mandatory for RTP Markets :-

Market
UK
SEPA
US

Mandatory for RTP markets for Pay to Account transactions :-

Market
Singapore
Australia
Mexico
Hong Kong
Brazil

Mandatory For Alternate Payments :-

Alternate Payments Market
Push To Card US and Canada
Push To Wallet PayPal/Venmo
Interac Canada
Zelle US

Mandatory for ACH Payments :-

Market
Chile

Maximum length supported per instrument/market :-

Payment Type Market Max Length
RTP UK 40
RTP Singapore 140
RTP Australia 140
RTP Hong Kong 140
RTP Indonesia 140
RTP Mexico 40
Push To Card US/Canada 30
ACH Chile 70
SEPA Instant SEPA Zone 140

Direct Debit Payments

Maximum length supported per instrument/market :-

Payment Type Market Max Length
RTP Malaysia 140
dateAndPlaceOfBirth class-attribute instance-attribute
dateAndPlaceOfBirth = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
partyIdentifiers class-attribute instance-attribute
partyIdentifiers = None
postalAddress class-attribute instance-attribute
postalAddress = None
ultimateCreditor class-attribute instance-attribute
ultimateCreditor = None

JPMorganCreditorAccount

Bases: RootModel[JPMorganPrimaryAccountIdentification | JPMorganAlternateAccountIdentification]

root instance-attribute
root

JPMorganCreditorAgent

Bases: BaseModel

additionalInstitutions class-attribute instance-attribute
additionalInstitutions = None
  • Only applicable to UK Faster Payments. Instructing agent of the ultimate debtor.
financialInstitutionId instance-attribute
financialInstitutionId
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganCreditorFinancialInstitutionId

Bases: BaseModel

bic class-attribute instance-attribute
bic = None

SWIFT BIC. Applicable and Mandatory for RTP markets :- - Singapore - Malaysia (Credit Transfer and Direct Debit Payments)

Optional markets :- - SEPA INSTANT - Mexico

Mandatory for Blockchain(Kinexys Digital Paymentsm) Payments:- - US - CHASUS33 - SEPA - CHASDEFX

NOTE: Mandatory for RTP Direct Debit Payments for all Markets

clearingSystemId class-attribute instance-attribute
clearingSystemId = None

Clearing system identifier. Applicable and Mandatory for Faster/Real-time payment markets :- UK Australia India Hong Kong US Brazil

ACH :- Chile

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganCreditorTaxInformation

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
taxId instance-attribute
taxId

Maximum lengths allowed per instrument/market :- ACH Chile - 35

taxpayerCategory instance-attribute
taxpayerCategory

JPMorganDateAndPlaceOfBirth

Bases: BaseModel

birthDate class-attribute instance-attribute
birthDate = None
cityOfBirth class-attribute instance-attribute
cityOfBirth = None
countryOfBirth class-attribute instance-attribute
countryOfBirth = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtor

Bases: BaseModel

debtorAccount instance-attribute
debtorAccount
debtorDevice class-attribute instance-attribute
debtorDevice = None
debtorName class-attribute instance-attribute
debtorName = None

Mandatory and Supported for :-

  • ACH Chile
  • Push To Card
  • US RTP
  • US FedNow
  • SARIE IPS
  • INTERAC
  • Push To Wallet

Maximum length supported per instrument/market :-

Market Max Length
US RTP 140
Push To Card US and Canada 30
ACH Chile 140
**Zelle 50 (Optional)
Malaysia RTP (Direct Debit) 140
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
partyIdentifiers class-attribute instance-attribute
partyIdentifiers = None
ultimateDebtor class-attribute instance-attribute
ultimateDebtor = None

JPMorganDebtorAccount

JPMorganDebtorAccountIdentification

Bases: BaseModel

accountCurrency class-attribute instance-attribute
accountCurrency = None
accountId instance-attribute
accountId
accountType class-attribute instance-attribute
accountType = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtorAgent

Bases: BaseModel

additionalInstitutions class-attribute instance-attribute
additionalInstitutions = None

Only applicable to UK Faster Payments. Instructing agent of the ultimate debtor.

financialInstitutionId instance-attribute
financialInstitutionId
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtorAlternateAccountIdentification

Bases: BaseModel

accountCurrency class-attribute instance-attribute
accountCurrency = None
accountType class-attribute instance-attribute
accountType = None
alternateAccountIdentifier instance-attribute
alternateAccountIdentifier
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtorDevice

Bases: BaseModel

ipAddress class-attribute instance-attribute
ipAddress = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtorFinancialInstitutionId

Bases: BaseModel

bic class-attribute instance-attribute
bic = None

Credit Transfer Payment Not applicable for US RTP

Mandatory RTP markets:-

Market
UK
India
Singapore
Australia
Malaysia
Hong Kong
SEPA INSTANT
Brazil
Mexico

Alternate Payments:- - Push To Card: US/Canada - Interac: Canada - **Push To Wallet: Venmo/PayPal - ** Zelle

ACH:- - Chile

Mandatory Blockchain (Kinexys Digital Payments) Payment markets:- - US - SEPA

clearingSystemId class-attribute instance-attribute
clearingSystemId = None

Credit Transfer Payment:-

  • Not applicable to UK, India, Singapore, Australia, Mexico Faster Payments.
  • Mandatory for US RTP

Direct Debit Payment:- - Mandatory for Malaysia RTP

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDebtorTaxInformation

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
taxId instance-attribute
taxId

JPMorganDecimal

Bases: RootModel[str]

root instance-attribute
root

A String representation of a (potentially) decimal positive number.

JPMorganDeliveryDetails

Bases: BaseModel

deliveryAddress class-attribute instance-attribute
deliveryAddress = None

Electronic address to which an agent is to send the remittance information.

deliveryMethod class-attribute instance-attribute
deliveryMethod = None

Method used to deliver the remittance advice information. Only EMAL and URID allowed. This field is currently not available for client usage *

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganDeviceInfo

Bases: BaseModel

geoCoordinates class-attribute instance-attribute
geoCoordinates = None

Contains the geographical coordinates.

Applicable for Direct Debit Payments Only(transferType=DEBIT)

Refer the table below for the applicable and mandatory markets

| Markets        | Significance |
|----------------|--------------|
|   Malaysia     | MANDATORY    |
ipAddress class-attribute instance-attribute
ipAddress = None

Device IP address

Applicable for Direct Debit Payments Only(transferType=DEBIT)

Refer the table below for the applicable and mandatory markets

| Markets        | Significance |
|----------------|--------------|
|   Malaysia     | MANDATORY    |
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganEndToEndId

Bases: RootModel[str]

root instance-attribute
root

JPMorganError

Bases: BaseModel

errorCode class-attribute instance-attribute
errorCode = None
errorDescription class-attribute instance-attribute
errorDescription = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganErrorDetails

Bases: BaseModel

errorCode class-attribute instance-attribute
errorCode = None
errorDescription class-attribute instance-attribute
errorDescription = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
ruleDefinition class-attribute instance-attribute
ruleDefinition = None

JPMorganErrors

Bases: BaseModel

errorDetails class-attribute instance-attribute
errorDetails = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganErrorsInit

Bases: BaseModel

endToEndId class-attribute instance-attribute
endToEndId = None
errorDetails class-attribute instance-attribute
errorDetails = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganException

Bases: BaseModel

errorCode class-attribute instance-attribute
errorCode = None
errorDescription class-attribute instance-attribute
errorDescription = None
externalCode class-attribute instance-attribute
externalCode = None
externalDescription class-attribute instance-attribute
externalDescription = None

This field is currently not available for client usage *

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
ruleDefinition class-attribute instance-attribute
ruleDefinition = None

JPMorganExceptionItem

Bases: BaseModel

errorCode class-attribute instance-attribute
errorCode = None
errorDescription class-attribute instance-attribute
errorDescription = None
externalCode class-attribute instance-attribute
externalCode = None
externalDescription class-attribute instance-attribute
externalDescription = None

This field is currently not available for client usage *

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
ruleDefinition class-attribute instance-attribute
ruleDefinition = None

JPMorganFirmRootId

Bases: RootModel[str]

root instance-attribute
root

JPMorganFxApplied

Bases: BaseModel

appliedRate class-attribute instance-attribute
appliedRate = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganGeoCoordinates

Bases: BaseModel

latitude class-attribute instance-attribute
latitude = None
longitude class-attribute instance-attribute
longitude = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganIdType

Bases: RootModel[str]

root instance-attribute
root

Credit Transfer Payment Creditor Agent - Applicable and optional for Low value ACH payments (Chile). Applicable and mandatory for US RTP - USABA

Debtor Agent -
Applicable and mandatory for US RTP - USABA

Direct Debit Payment

Applicable and mandatory for Malaysia RTP - BIC

JPMorganIdType1

Bases: StrEnum

CUSTOM class-attribute instance-attribute
CUSTOM = 'CUSTOM'
PROGRAM_ID class-attribute instance-attribute
PROGRAM_ID = 'PROGRAM_ID'

JPMorganIdType2

Bases: StrEnum

INDIVIDUAL class-attribute instance-attribute
INDIVIDUAL = 'INDIVIDUAL'
ORGANIZATION class-attribute instance-attribute
ORGANIZATION = 'ORGANIZATION'

JPMorganIndividualID

Bases: BaseModel

id instance-attribute
id

Max length for ACH :- Chile - 255

issuer class-attribute instance-attribute
issuer = None

Max length for ACH :- Chile - 35

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
schemeName class-attribute instance-attribute
schemeName = None

type of scheme

JPMorganOrganizationID

Bases: BaseModel

bic class-attribute instance-attribute
bic = None
id instance-attribute
id

For AU Superannuation payment (category payment), populate with USI number for the Superannuation fund

Max length for ACH :- Chile - 255

issuer class-attribute instance-attribute
issuer = None

Max length for ACH :- Chile - 35

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
schemeName class-attribute instance-attribute
schemeName = None

type of scheme Mandatory for SEPA Instant. Check proprietary field rules for more information.

JPMorganOtherPaymentReferences

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentReferenceValue instance-attribute
paymentReferenceValue

Clearing house originating mandate identifier to be provided for Direct debit payments.

JPMorganPartyIdentifier

Bases: RootModel[JPMorganPartyIdentifier1 | JPMorganPartyIdentifier2]

root instance-attribute
root

JPMorganPartyIdentifier1

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
organizationId instance-attribute
organizationId

JPMorganPartyIdentifier2

Bases: BaseModel

individualId instance-attribute
individualId
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganPaymentDetailsResponse

Bases: BaseModel

firmRootId class-attribute instance-attribute
firmRootId = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentStatus class-attribute instance-attribute
paymentStatus = None
payments class-attribute instance-attribute
payments = None

JPMorganPaymentIdentifiers

Bases: BaseModel

endToEndId instance-attribute
endToEndId

Customer assigned reference to the transaction. Maximum length supported for each instrument and market :-

Credit Transfer Payments |Payment Type| Market | Max Length |Format |------------|--------------|------------|------------- | RTP | UK | 31 |letters and numbers only | RTP | Singapore | 35 |letters and numbers only | RTP | Australia | 35 |letters and numbers only | RTP | Hong Kong | 35 |letters and numbers only | RTP | Indonesia | 35 |letters and numbers only | RTP | Brazil | 34 |letters and numbers only | RTP | Mexico | 16 |letters and numbers only | RTP | US | 31 |letters and numbers only | RTP | SEPA | 35 |letters and numbers only | Push To Card| US/Canada | 16 |letters and numbers only | ACH | Chile | 35 | | BLOCKCHAIN | Kinexys Digital Payments markets | 16 |letters and numbers only | Push To Wallet | PayPal/Venmo | 35 |letters and numbers only | Interac | JPM Canada markets | 35 |letters and numbers only | Zelle | US | 16 |letters and numbers only Direct Debit Payments |Payment Type| Market | Max Length |Format | |------------|--------------|------------|-------------------------| | RTP | Malaysia | 35 |Letters and numbers only |

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
otherPaymentReferences class-attribute instance-attribute
otherPaymentReferences = None

The object becomes MANDATORY for below instrument and market when transferType = 'DEBIT'

Payment Type Market Max Length Format
RTP Malaysia 35 Letters and numbers only

JPMorganPaymentInitationDetails

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
payments instance-attribute
payments

JPMorganPaymentInitiationResponse

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentInitiationResponse class-attribute instance-attribute
paymentInitiationResponse = None

JPMorganPaymentInitiationResponse1

Bases: BaseModel

endToEndId class-attribute instance-attribute
endToEndId = None
firmRootId class-attribute instance-attribute
firmRootId = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganPaymentRedirected

Bases: BaseModel

isPaymentRedirected class-attribute instance-attribute
isPaymentRedirected = None

Flag to indicate if a payment has been redirected to another account

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
redirectedAccountId class-attribute instance-attribute
redirectedAccountId = None

Account id to which payment is redirected

redirectedBankId class-attribute instance-attribute
redirectedBankId = None

Bank identifier of the redirected account id.

JPMorganPaymentStatus

Bases: StrEnum

BLOCKED class-attribute instance-attribute
BLOCKED = 'BLOCKED'
COMPLETED class-attribute instance-attribute
COMPLETED = 'COMPLETED'
COMPLETED_CREDITED class-attribute instance-attribute
COMPLETED_CREDITED = 'COMPLETED_CREDITED'
PENDING class-attribute instance-attribute
PENDING = 'PENDING'
PENDING_POSTING class-attribute instance-attribute
PENDING_POSTING = 'PENDING_POSTING'
REJECTED class-attribute instance-attribute
REJECTED = 'REJECTED'
RETURNED class-attribute instance-attribute
RETURNED = 'RETURNED'
WAREHOUSED class-attribute instance-attribute
WAREHOUSED = 'WAREHOUSED'

JPMorganPaymentStatus1

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentStatus class-attribute instance-attribute
paymentStatus = None

JPMorganPaymentType

Bases: StrEnum

ACH_TRF class-attribute instance-attribute
ACH_TRF = 'ACH.TRF'
BLOCKCHAIN class-attribute instance-attribute
BLOCKCHAIN = 'BLOCKCHAIN'
RTP class-attribute instance-attribute
RTP = 'RTP'

JPMorganPayments

Bases: BaseModel

categoryPurpose class-attribute instance-attribute
categoryPurpose = None
chargeBearer class-attribute instance-attribute
chargeBearer = None
creditor instance-attribute
creditor
creditorAgent class-attribute instance-attribute
creditorAgent = None
debtor instance-attribute
debtor
debtorAgent instance-attribute
debtorAgent
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
paymentAmount instance-attribute
paymentAmount

Amount should be more than 0.01 with maximum of two decimal places allowed.

NOTE: For Chile ACH, decimals are not accepted.

Maximum amount allowed per market/instrument :-

  • UK FPS - GBP 1,000,000

  • SEPA INSTANT - EUR 100,000

paymentCurrency instance-attribute
paymentCurrency

3- character ISO currency code e.g. SGD, GBP, AUD, EUR, MXN, CLP

paymentExpiryDate class-attribute instance-attribute
paymentExpiryDate = None

Applies only for Interac proxy Payments. Format expected - YYYY-MM-DDThh:mm:ss+/-time offset to UTC

paymentIdentifiers instance-attribute
paymentIdentifiers
paymentType class-attribute instance-attribute
paymentType = None
possibleDuplicateMessage class-attribute instance-attribute
possibleDuplicateMessage = None

Optional field to indicate a duplicate payment

purpose class-attribute instance-attribute
purpose = None
remittanceInformation class-attribute instance-attribute
remittanceInformation = None
requestedExecutionDate instance-attribute
requestedExecutionDate

Requested date on which/by which the transaction should be executed ISO Date format. (YYYY-MM-DD)

secureVerification class-attribute instance-attribute
secureVerification = None

Applies only for Interac proxy payments

taxInformation class-attribute instance-attribute
taxInformation = None
transferType instance-attribute
transferType

To indicate the transaction is a credit transfer or direct debit transfer. This indicator also determines the originator and receiver is the debit and credit side of this transaction.

Supported value per market/instrument :- | Market |Value| | --------------------|-------| | UK Faster Payments |CREDIT | | SEPA INSTANT |CREDIT | | US RTP |CREDIT | |Singapore Faster Payments | CREDIT| |Australia Faster Payments | CREDIT| |Singapore Faster Payments | CREDIT| |Hong Kong Faster Payments |CREDIT| |Malaysia Faster Payments | CREDIT and DEBIT| |Indonesia RTP |CREDIT| |Brazil RTP |CREDIT| |US RTP |CREDIT| |Push To Card |CREDIT| |ACH Chile Low Value |CREDIT| |Blockchain (Kinexys Digital Payments) Payments | CREDIT| |Push To Wallet (PayPal/Venmo) |CREDIT| |Interac (Canada) |CREDIT| |Zelle |CREDIT|

JPMorganPostalAddress

Bases: BaseModel

addressLine class-attribute instance-attribute
addressLine = None

Not applicable to Wallet Payments. Free form text address lines Up to 4 lines.

Maximum number of characters allowed per instrument/market :-

Market Max Lines and length limits
UK FPS 4 lines, 140 characters including spaces
SEPA INSTANT 2 lines, 70 characters each including spaces
Brazil RTP 7 lines, 70 characters
Chile ACH 2 lines, 35 characters + 1 additional line containing 32 characters
addressType class-attribute instance-attribute
addressType = None
Address Type Description
ADDR Postal Address is the complete postal address.
BIZZ Business Address is the business address.
DLVY DeliveryTo Address is the address to which delivery is to take place.
HOME Residential Address is the home address.
MLTO MailTo Address is the address to which mail is sent.
PBOX PO Box Address is a postal office (PO) box.
buildingNumber class-attribute instance-attribute
buildingNumber = None

Building name or number. Maximum length applicable :- Push To Card - 35

country class-attribute instance-attribute
country = None

2 character ISO country code. Mandatory for Wallet Payments, US RTP, and Interac

countrySubDvsn class-attribute instance-attribute
countrySubDvsn = None

Mandatory for US RTP

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
postalCode class-attribute instance-attribute
postalCode = None

Zip code. Mandatory for Wallet Payments and US RTP Maximum length applicable :- Push To Card - 9

streetName class-attribute instance-attribute
streetName = None

Name of street. Mandatory for US RTP Maximum length applicable :- Push To Card - 35

townName class-attribute instance-attribute
townName = None

Name of the town. Mandatory for US RTP Maximum length applicable :- Push To Card - 25

JPMorganPrimaryAccountIdentification

Bases: BaseModel

accountId instance-attribute
accountId
accountType class-attribute instance-attribute
accountType = None
cardExpiryDate class-attribute instance-attribute
cardExpiryDate = None

Mandatory for Push to Card. Acceptable format - YYMM

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
schemeName class-attribute instance-attribute
schemeName = None

JPMorganProprietary

Bases: StrEnum

ACCN class-attribute instance-attribute
ACCN = 'ACCN'
ALIS class-attribute instance-attribute
ALIS = 'ALIS'
ARMN class-attribute instance-attribute
ARMN = 'ARMN'
AUBN class-attribute instance-attribute
AUBN = 'AUBN'
BREG class-attribute instance-attribute
BREG = 'BREG'
CNPJ class-attribute instance-attribute
CNPJ = 'CNPJ'
CPF class-attribute instance-attribute
CPF = 'CPF'
EMAL class-attribute instance-attribute
EMAL = 'EMAL'
EVP class-attribute instance-attribute
EVP = 'EVP'
MBNO class-attribute instance-attribute
MBNO = 'MBNO'
MOBN class-attribute instance-attribute
MOBN = 'MOBN'
MSIDN class-attribute instance-attribute
MSIDN = 'MSIDN'
NRIC class-attribute instance-attribute
NRIC = 'NRIC'
ORGN class-attribute instance-attribute
ORGN = 'ORGN'
PSPT class-attribute instance-attribute
PSPT = 'PSPT'
QRCD class-attribute instance-attribute
QRCD = 'QRCD'
SVID class-attribute instance-attribute
SVID = 'SVID'
TELI class-attribute instance-attribute
TELI = 'TELI'
UEN class-attribute instance-attribute
UEN = 'UEN'
VPA class-attribute instance-attribute
VPA = 'VPA'

JPMorganProprietary1

Bases: StrEnum

CXBSNS class-attribute instance-attribute
CXBSNS = 'CXBSNS'
CXMRCH class-attribute instance-attribute
CXMRCH = 'CXMRCH'
CXSALA class-attribute instance-attribute
CXSALA = 'CXSALA'
CXTOPU class-attribute instance-attribute
CXTOPU = 'CXTOPU'
INVESTMENT class-attribute instance-attribute
INVESTMENT = 'INVESTMENT'
OTHER class-attribute instance-attribute
OTHER = 'OTHER'
PURCHASE class-attribute instance-attribute
PURCHASE = 'PURCHASE'
WEALTH_TRANSFER class-attribute instance-attribute
WEALTH_TRANSFER = 'WEALTH_TRANSFER'

JPMorganProprietaryModel

Bases: RootModel[str]

root instance-attribute
root

Usage rules :- Australia RTP - For AU Superannuation payment (category payment), populate "USI" SEPA Instant - Use value "LEI" to indicate the organization id is a legal entity. Mandatory.

JPMorganPurpose

Bases: BaseModel

code class-attribute instance-attribute
code = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
type class-attribute instance-attribute
type = None

JPMorganRemittanceInformation

Bases: BaseModel

foreignCurrency class-attribute instance-attribute
foreignCurrency = None

Only applicable for Mexico Faster Payments

fx class-attribute instance-attribute
fx = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
structuredInformation class-attribute instance-attribute
structuredInformation = None

Applicable Faster Payment Markets - Malaysia US

unstructuredInformation class-attribute instance-attribute
unstructuredInformation = None

Maximum number of lines and characters supported per market/instrument :-

Market Maximum Line and Length limits
UK FPS 1 line, 140 characters
SEPA INSTANT 1 line, 140 characters
US RTP 1 line, 140 charaters
Singapore RTP 1 line, 140 characters
Australia RTP 2 lines, 140 characters
Hong Kong RTP 1 line, 140 characters
Malaysia RTP 1 line, 140 characters
India IMPS 1 line, 140 characters
Brazil RTP 1 line, 140 characters
Mexico RTP 210 characters
Indonesia RTP 1 line, 140 characters
Push To Card US and Canada 1 line, 16 characters (Numbers, alphabets, SPACE and special chars -./,$@& allowed)
Blockchain (Kinexys Digital Payments) Payments 1 line, 140 characters
Zelle 1 line, 200 characters (Numbers, alphabets, SPACE and special chars -./,$@& allowed)

JPMorganSchemeName

Bases: BaseModel

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
proprietary class-attribute instance-attribute
proprietary = None

Specifies the type of Proxy account. Mandatory if creditorAccount.alternateAccountIdentifier is present Proprietary types applicable per market and instrument:

RTP - Singapore :- MSIDN - Mobile number UEN - Unique Entity Number VPA - Virtual Payment Address NRIC - IC number

RTP - Australia :- EMAL - Email Address TELI - Telephone Number AUBN - Australia Business number ORGN - Organization Id

RTP - Malaysia :- MBNO - Mobile number NRIC - IC number PSPT - Passport number ARMN - Army or Police Number BREG - Business registration number

RTP - Hong Kong :- EMAL - Email Address MOBN - Mobile Number (or fixed-line number) SVID - FPS Identifier

RTP - Brazil :- CPF - Tax ID of Individual CNPJ - Tax ID of Corporate EVP - Random Key QRCD - QR Code EMAL - Email id MOBN - Mobile number

RTP - Mexico :- MOBN - Mobile number BANK - Transfer to a Bank identifier CARD - Transfer to a debit card number

RTP - Indonesia :- MOBN - Mobile number EMAL - Email id CARD - Transfer to a debit card number ALIS - eMoney transfer

Alternate Payments - Wallet (For Zelle and Interac only EMAL and TELI are applicable) :- EMAL - Email Address TELI - Telephone Number ACCN - Alternate account number ALIS - Alias identification

JPMorganSchemeName2

Bases: BaseModel

code class-attribute instance-attribute
code = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
proprietary class-attribute instance-attribute
proprietary = None

JPMorganSecureVerification

Bases: BaseModel

key class-attribute instance-attribute
key = None

Key identifies the security question

model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
secret class-attribute instance-attribute
secret = None

Authenticate the key using secret answer to the question

JPMorganServiceLevelCode

Bases: RootModel[str]

root instance-attribute
root

service Level in coded form.

JPMorganStatus

Bases: StrEnum

BLOCKED class-attribute instance-attribute
BLOCKED = 'BLOCKED'
COMPLETED class-attribute instance-attribute
COMPLETED = 'COMPLETED'
COMPLETED_CREDITED class-attribute instance-attribute
COMPLETED_CREDITED = 'COMPLETED_CREDITED'
PENDING class-attribute instance-attribute
PENDING = 'PENDING'
PENDING_POSTING class-attribute instance-attribute
PENDING_POSTING = 'PENDING_POSTING'
REJECTED class-attribute instance-attribute
REJECTED = 'REJECTED'
RETURNED class-attribute instance-attribute
RETURNED = 'RETURNED'
WAREHOUSED class-attribute instance-attribute
WAREHOUSED = 'WAREHOUSED'

JPMorganStructuredInformation

Bases: BaseModel

additionalRemittanceInformation class-attribute instance-attribute
additionalRemittanceInformation = None

Applicable Faster Payment Markets -

Malaysia Max length supported - 250 characters

US - mandatory if structuredInformation object is used

creditReference class-attribute instance-attribute
creditReference = None

Unique reference to unambiguously refer to the payment transaction.

deliveryDetails class-attribute instance-attribute
deliveryDetails = None
invoicee class-attribute instance-attribute
invoicee = None
invoicer class-attribute instance-attribute
invoicer = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')

JPMorganTaxInformation

Bases: BaseModel

creditorTaxInformation class-attribute instance-attribute
creditorTaxInformation = None
debtorTaxInformation class-attribute instance-attribute
debtorTaxInformation = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
taxAmount class-attribute instance-attribute
taxAmount = None

Applicable only for Mexico RTP

JPMorganTaxpayerCategory

Bases: StrEnum

CORPORATE class-attribute instance-attribute
CORPORATE = 'CORPORATE'
INDIVIDUAL class-attribute instance-attribute
INDIVIDUAL = 'INDIVIDUAL'

JPMorganTransferType

Bases: StrEnum

CREDIT class-attribute instance-attribute
CREDIT = 'CREDIT'
DEBIT class-attribute instance-attribute
DEBIT = 'DEBIT'

JPMorganType

Bases: StrEnum

CODE class-attribute instance-attribute
CODE = 'CODE'
PROPRIETARY class-attribute instance-attribute
PROPRIETARY = 'PROPRIETARY'

JPMorganUltimateCreditor

Bases: RootModel[JPMorganUltimateCreditorOrganization | JPMorganUltimateCreditorIndividual]

root instance-attribute
root

JPMorganUltimateCreditorIndividual

Bases: BaseModel

countryOfResidence class-attribute instance-attribute
countryOfResidence = None
dateAndPlaceOfBirth class-attribute instance-attribute
dateAndPlaceOfBirth = None
individualId instance-attribute
individualId
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
postalAddress class-attribute instance-attribute
postalAddress = None
ultimateCreditorName class-attribute instance-attribute
ultimateCreditorName = None

JPMorganUltimateCreditorName

Bases: RootModel[str]

root instance-attribute
root

Mandatory for US RTP & US FedNow

JPMorganUltimateCreditorOrganization

Bases: BaseModel

countryOfResidence class-attribute instance-attribute
countryOfResidence = None
dateAndPlaceOfBirth class-attribute instance-attribute
dateAndPlaceOfBirth = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
organizationId instance-attribute
organizationId
postalAddress class-attribute instance-attribute
postalAddress = None
ultimateCreditorName class-attribute instance-attribute
ultimateCreditorName = None

JPMorganUltimateDebtor

Bases: RootModel[JPMorganUltimateDebtorOrganization | JPMorganUltimateDebtorIndividual]

root instance-attribute
root

JPMorganUltimateDebtorIndividual

Bases: BaseModel

additionalIdentifiers class-attribute instance-attribute
additionalIdentifiers = None
countryOfResidence class-attribute instance-attribute
countryOfResidence = None
dateAndPlaceOfBirth class-attribute instance-attribute
dateAndPlaceOfBirth = None
individualId instance-attribute
individualId
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
postalAddress class-attribute instance-attribute
postalAddress = None
ultimateDebtorName class-attribute instance-attribute
ultimateDebtorName = None

JPMorganUltimateDebtorName

Bases: RootModel[str]

root instance-attribute
root
  • Mandatory for US RTP

Market specific maximum length limits :- | Market |Maximum Length| |----------------- |----| | Push To Card| 25 |

JPMorganUltimateDebtorOrganization

Bases: BaseModel

additionalIdentifiers class-attribute instance-attribute
additionalIdentifiers = None
countryOfResidence class-attribute instance-attribute
countryOfResidence = None
dateAndPlaceOfBirth class-attribute instance-attribute
dateAndPlaceOfBirth = None
model_config class-attribute instance-attribute
model_config = ConfigDict(extra='allow')
organizationId instance-attribute
organizationId
postalAddress class-attribute instance-attribute
postalAddress = None
ultimateDebtorName class-attribute instance-attribute
ultimateDebtorName = None

JPMorganUnstructuredInformation

Bases: RootModel[str]

root instance-attribute
root