Skip to main content

JPMorgan

This page provides an overview of the payments methods provided by the JPMorgan adapter in the IXOPAY platform. It also includes a full list of all configuration options available to you when integrating JPMorgan within your payments landscape, as well as an overview of the parameters required when submitting a transaction via IXOPAY's API.

Process low-value ACH direct debits and refunds in the US and Canada via JPMorgan's Treasury Payments API.

Supported features​

Payment methods​

The table below lists the payment methods that JPMorgan ACH Direct Debit supports. It also includes the available processing options and the supported transaction types for each of those payment methods.

Payment methodProcessing optionsTransaction types
ACH Direct DebitServer-to-server
Hosted payment page
Debit
Refund (full & partial)
Register
Deregister

Currencies​

USD, CAD

Register transactions​

Register stores the submitted bank account details so they can be reused for subsequent transactions. No verification or registration takes place with JPMorgan at this point.

Bank account details​

Debtor (customer) bank account number, routing/ABA number, IBAN, and account type are not read from the customer's IBAN fields. They are supplied in one of two ways:

  • Server-to-server β€” submitted as extraData under the psp:directDebitTransactionInformation.debtorAccount.* keys documented below.
  • Hosted payment page β€” entered by the payer on a page hosted by the gateway (see below).

Hosted payment page​

Enable the connector option Collect Bank Details on Hosted Payment Form to let the payer enter their own bank details instead of submitting them with the request. Send a debit or register without an account number and routing number, and the response returns a redirect URL. Send the payer there; once they submit, the payment continues and you receive the result as usual.

The page collects:

FieldMaps to
Account Holder NamedirectDebitTransactionInformation.debtor.name
Account NumberdirectDebitTransactionInformation.debtorAccount.accountNumber
Account TypedirectDebitTransactionInformation.debtorAccount.type.code
Routing NumberdirectDebitTransactionInformation.debtorAgent.financialInstitutionId.aba
Bank NamedirectDebitTransactionInformation.debtorAgent.financialInstitutionId.name
Bank CitydirectDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.townName
Collection DaterequestedCollectionDate
CountrydirectDebitTransactionInformation.debtor.postalAddress.country

The routing number is checked against the ABA format and checksum before the page is submitted, and the collection date cannot be set earlier than the current processing date on JPMorgan's clock.

Values supplied in the original API request take precedence: if you send customer.billingCountry, for example, the payer's entry is ignored. Any field you do not send is collected from the payer instead.

Required by JPMorgan​

All three of the following must reach the request, or JPMorgan rejects the payment with NARR / INVALID PM VEHICLE. The rejection arrives in the status notification, not in the response to your request.

FieldWhere it comes from
paymentTypeInformation.localInstrument.codeLocal Instrument Code connector option (NACHA SEC code, e.g. CCD for corporate, PPD for consumer)
directDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.countryDebtor Agent Country connector option
directDebitTransactionInformation.debtor.postalAddress.countrycustomer.billingCountry in the request, or the Country field on the hosted page

The first two are connector configuration and normally need no per-transaction value. The third has no connector fallback and must be supplied per transaction.

Collection date​

psp:requestedCollectionDate is the date JPMorgan processes the collection, not the date the money moves. Funds leave the payer one to three clearing business days after the collection is initiated.

  • The earliest date you can send is the current date on JPMorgan's processing clock (US Eastern). An earlier date is rejected with DT01.
  • Omit the field and the current date is used.
  • A date falling on a weekend or a US bank holiday is not rejected β€” JPMorgan processes it on the next working day.
  • Only a date is sent, never a time, so JPMorgan's daily cut-off does not change what you submit. It only affects how soon JPMorgan starts processing.

Mapping to JPMorgan​

This segment provides a comprehensive guide to effectively integrate JPMorgan ACH Direct Debit into your payment procedure. It offers a detailed mapping between the fields of the gateway and corresponding fields on the JPMorgan side.

All extraData keys use the psp: prefix convention. Fields not listed as required can be omitted unless noted.

Parameters​

Request mapping​

Gateway parameterJPMorgan parameterTypeDescriptionTransaction types
extraData.psp:paymentTypeInformation.categoryPurpose.proprietarypaymentTypeInformation.categoryPurpose.proprietaryoptional string?Category purpose proprietary codeonly: Debit
extraData.psp:chargeBearerchargeBeareroptional string?Who bears the transaction charges
extraData.psp:requestedCollectionDaterequestedCollectionDateoptional string?
Also settable on the hosted page; defaults to the current date
Processing date for the debit (YYYY-MM-DD) β€” see Collection date. A date in the past is rejected by JPMorgan with DT01only: Debit
extraData.psp:requestedCollectionDaterequestedExecutionDateoptional string?
Defaults to today's date
Execution date for the refund (YYYY-MM-DD)only: Refund
extraData.psp:paymentTypeInformation.serviceLevelCodepaymentTypeInformation.serviceLevelCodeoptional string?
Falls back to the Service Level Code config option
Service level code
extraData.psp:paymentTypeInformation.localInstrument.codepaymentTypeInformation.localInstrument.coderequired string
Falls back to the Local Instrument Code config option
NACHA Standard Entry Class code, e.g. CCD (corporate) or PPD (consumer). JPMorgan rejects the payment without it
extraData.psp:paymentTypeInformation.localInstrument.proprietarypaymentTypeInformation.localInstrument.proprietaryoptional string?Local instrument proprietary value
extraData.psp:paymentTypeInformation.categoryPurpose.codepaymentTypeInformation.categoryPurpose.codeoptional string?Category purpose code
extraData.psp:paymentTypeInformation.sequenceTypepaymentTypeInformation.sequenceTypeoptional string?Direct debit sequence type (e.g. one-off, recurring)
extraData.psp:creditor.namecreditor.name, directDebitTransactionInformation.ultimateCreditor.nameoptional string?
Falls back to the Creditor Name config option
Creditor legal name
extraData.psp:creditor.postalAddress.streetNamecreditor.postalAddress.streetNameoptional string?
Falls back to Creditor Postal Address Street Name config option
extraData.psp:creditor.postalAddress.postCodecreditor.postalAddress.postCodeoptional string?
Falls back to Creditor Postal Address Postcode config option
extraData.psp:creditor.postalAddress.townNamecreditor.postalAddress.townNameoptional string?
Falls back to Creditor Postal Address Town Name config option
extraData.psp:creditor.postalAddress.countrySubDivisioncreditor.postalAddress.countrySubDivisionoptional string?
Falls back to Creditor Postal Address Country Sub Division config option
extraData.psp:creditor.postalAddress.countrycreditor.postalAddress.countryoptional string?
Falls back to Creditor Postal Address Country config option
extraData.psp:creditor.postalAddress.addressLinecreditor.postalAddress.addressLineoptional string?
Falls back to Creditor Postal Address Address Line config option
Sent as a single-element array
extraData.psp:creditorAccount.companyIdcreditorAccount.companyIdoptional string?
Falls back to Creditor Account Company Id config option
JPMorgan ACH Company ID
extraData.psp:creditorAccount.currencycreditorAccount.currencyoptional string?
Falls back to Creditor Account Currency Code config option
extraData.psp:creditorAccount.accountNumbercreditorAccount.accountNumberoptional string?
Falls back to Creditor Account Number config option
extraData.psp:creditorAccount.ibancreditorAccount.ibanoptional string?Extra-data only, no config fallback
extraData.psp:creditorAgent.namecreditorAgent.nameoptional string?
Falls back to Creditor Agent Name config option
extraData.psp:creditorAgent.clearingSystemCodecreditorAgent.clearingSystemCodeoptional string?
extraData.psp:creditorAgent.countrycreditorAgent.countryoptional string?
Falls back to Creditor Agent Country config option
extraData.psp:creditorAgent.biccreditorAgent.bicoptional string?
Falls back to Creditor Agent BIC config option
extraData.psp:creditorAgent.abacreditorAgent.abaoptional string?
Falls back to Creditor Agent ABA config option
extraData.psp:creditorAgent.memberIdcreditorAgent.memberIdoptional string?
Falls back to Creditor Agent Member Id config option
extraData.psp:creditorSchemeId.privateId.idcreditorSchemeId.privateId.idoptional string?
extraData.psp:creditorSchemeId.privateId.schemeName.proprietarycreditorSchemeId.privateId.schemeName.proprietaryoptional string?
extraData.psp:directDebitTransactionInformation.remittanceInformation.unstructureddirectDebitTransactionInformation.remittanceInformation.unstructuredoptional string?Sent as a single-element array
extraData.psp:directDebitTransactionInformation.regulatoryReportingdirectDebitTransactionInformation.regulatoryReportingoptional mixed?Passed through as-is, no structured mapping
extraData.psp:directDebitTransactionInformation.ultimateCreditor.postalAddress.{streetName,buildingNumber,postCode,townName,countrySubDivision,country,addressLine}directDebitTransactionInformation.ultimateCreditor.postalAddress.{streetName,buildingNumber,postCode,townName,countrySubDivision,country,addressLine}optional string?
(all but buildingNumber) fall back to the matching Creditor Postal Address * config option
extraData.psp:directDebitTransactionInformation.ultimateCreditor.organizationId.bicOrBeidirectDebitTransactionInformation.ultimateCreditor.organizationId.bicOrBeioptional string?
extraData.psp:directDebitTransactionInformation.ultimateCreditor.organizationId.other.{id,schemeName.code,schemeName.proprietary,issuer}directDebitTransactionInformation.ultimateCreditor.organizationId.other.{id,schemeName.code,schemeName.proprietary,issuer}optional string?
extraData.psp:directDebitTransactionInformation.ultimateCreditor.privateId.dateAndPlaceOfBirth.{birthDate,cityOfBirth,countryOfBirth}directDebitTransactionInformation.ultimateCreditor.privateId.dateAndPlaceOfBirth.{birthDate,cityOfBirth,countryOfBirth}optional string?
extraData.psp:directDebitTransactionInformation.ultimateCreditor.privateId.other.{id,schemeName.code,schemeName.proprietary,issuer}directDebitTransactionInformation.ultimateCreditor.privateId.other.{id,schemeName.code,schemeName.proprietary,issuer}optional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.mandateIddirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.mandateIdoptional string?SEPA-style mandate ID; this adapter does not create or store mandates itself
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.dateOfSignaturedirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.dateOfSignatureoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentIndicatordirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentIndicatoroptional boolean?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalMandateIddirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalMandateIdoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.namedirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.nameoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.privateId.iddirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.privateId.idoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.privateId.schemeName.proprietarydirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalCreditorSchemeId.privateId.schemeName.proprietaryoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalDebtorAccount.otherIddirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.amendmentInformationDetails.originalDebtorAccount.otherIdoptional string?
extraData.psp:directDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.electronicSignaturedirectDebitTransactionInformation.directDebitTransaction.mandateRelatedInformation.electronicSignatureoptional string?
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.abadirectDebitTransactionInformation.debtorAgent.financialInstitutionId.abarequired stringDebtor bank routing/ABA number; also used as the routing number fallback returned in AchData on registration
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.namedirectDebitTransactionInformation.debtorAgent.financialInstitutionId.nameoptional string?
Also set by the hosted page
Name of the debtor's bank. JPMorgan asks for it alongside the routing number, so supply it on the API path too
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.{bic,clearingSystemCode,otherId,memberId}directDebitTransactionInformation.debtorAgent.financialInstitutionId.{bic,clearingSystemCode,otherId,memberId}optional string?
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.countrydirectDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.countryrequired string
Falls back to the Debtor Agent Country config option
Country of the debtor's bank (US for US ACH). JPMorgan rejects the payment without it
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.townNamedirectDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.townNameoptional string?
Also set by the hosted page
Town of the debtor's bank. JPMorgan asks for it alongside the bank name, so supply it on the API path too
extraData.psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.{streetName,buildingNumber,postCode,countrySubDivision,addressLine}directDebitTransactionInformation.debtorAgent.financialInstitutionId.postalAddress.{streetName,buildingNumber,postCode,countrySubDivision,addressLine}optional string?
extraData.psp:directDebitTransactionInformation.debtor.name
(else from Customer object) getBankAccountOwner() or getFullName()
directDebitTransactionInformation.debtor.namerequired stringName on the debtor's bank account. Supply the psp: key when the account holder differs from the customer name; also set by the hosted page
(from Customer object, extraData) psp:directDebitTransactionInformation.debtor.{department,subDepartment,buildingNumber,townName,countrySubDivision,contactDetails.other}directDebitTransactionInformation.debtor.postalAddress.{department,subDepartment,buildingNumber,townName,countrySubDivision} / directDebitTransactionInformation.debtor.contactDetails.otheroptional string?
Stored on the customer's extraData, not the transaction's
(from Customer object) getBillingCountry()directDebitTransactionInformation.debtor.postalAddress.countryrequired stringSend as customer.billingCountry, or let the payer select it on the hosted page. No connector fallback β€” JPMorgan rejects the payment without it
(from Customer object) getBillingAddress1() / getBillingPostcode()directDebitTransactionInformation.debtor.postalAddress.streetName / directDebitTransactionInformation.debtor.postalAddress.postCodeoptional string?
(from Customer object) getBic()directDebitTransactionInformation.debtor.organizationId.bicOrBeioptional string?
(from Customer object) getBirthDate()directDebitTransactionInformation.debtor.privateId.dateAndPlaceOfBirth.birthDateoptional string?
(from Customer object) getBillingPhone() / getEmail()directDebitTransactionInformation.debtor.contactDetails.phoneNumber / directDebitTransactionInformation.debtor.contactDetails.emailAddressoptional string?
extraData.psp:directDebitTransactionInformation.debtorAccount.type.{code,proprietary}directDebitTransactionInformation.debtorAccount.type.{code,proprietary}optional string?
Send on the transaction's or the customer's extraData; also set by the hosted page
Checking or savings. Determines the NACHA transaction code, so send it whenever the account is not a checking account
extraData.psp:directDebitTransactionInformation.debtorAccount.currencydirectDebitTransactionInformation.debtorAccount.currencyoptional string?
Falls back to the transaction currency
extraData.psp:directDebitTransactionInformation.debtorAccount.accountNumberdirectDebitTransactionInformation.debtorAccount.accountNumberrequired stringDebtor bank account number
extraData.psp:directDebitTransactionInformation.debtorAccount.ibandirectDebitTransactionInformation.debtorAccount.ibanoptional string?

Response mapping​

A successful response to a debit does not mean the payment was accepted β€” JPMorgan only confirms that it received the instruction, and returns PMT-C001 / SUCCESS in the processor response fields. The transaction stays pending until JPMorgan sends its status notification, typically 10 to 20 minutes later.

Wait for the postback before treating an ACH debit as paid.

Gateway parameterJPMorgan parameterTypeDescriptionTransaction types
secondAdapterTxIdendToEndIdstringEnd-to-end transaction identifier
processorIdjpmcPmtRefIdstringJPMorgan payment reference ID
processorResponseCodeprocessingInfo.statusCodestringProcessor status code
processorResponseMessageprocessingInfo.statusTextstringProcessor status text

On registration (Register, or a Debit submitted "with register"), the following ACH bank data is stored for later reuse:

AchData fieldSource
accountNumberpsp:directDebitTransactionInformation.debtorAccount.accountNumber
routingNumberdebtorAgent.financialInstitutionId.aba, else .memberId, else .clearingSystemCode
accountTypedebtorAccount.type.code, else .type.proprietary, else empty string
accountHolder / accountHolderTypeCustomer's company name (company) or full name

Callback mapping​

JPMorgan sends an asynchronous callback with a JSON body containing a transactionData array (or single object). A single callback can carry updates for up to 50 payments. Each entry is mapped as follows:

JPMorgan paymentStatusGateway result
HOLDPending postback
ACCEPTED, CLEARED, COMPLETEDOK
REJECTED, RETURNEDError (mapped via the error code table below, using processingInfo.statusCode/.statusText)
(any other value)Ignored
Gateway parameterJPMorgan parameter
adapterTxId, processorIdjpmcPmtRefId
secondAdapterTxIdendToEndId

Error codes​

JPMorgan error codeGateway error codeJPMorgan error message
PMT-E005INVALID_REQUEST_DATAEndToEndId field is required
PMT-E006INVALID_REQUEST_DATAEndToEndId is not in correct format
PMT-E010DUPLICATE_TRANSACTION_IDendToEndId must be unique
PMT-E011INVALID_REQUEST_DATAinstructedAmount or equivalentAmount is required with amount and currency fields
PMT-E009INVALID_REQUEST_DATAinstructedAmount field is required
PMT-E012INVALID_REQUEST_DATAamount field is required
PMT-E013INVALID_REQUEST_DATAcurrency field is required
PMT-E007, GCA-023INVALID_REQUEST_DATAPlease re-send request in valid format
GCA-029INCORRECT_PAYMENT_INFOThe requested debit account was not found
GCA-042INVALID_REQUEST_DATAcreditorAccount must NOT be provided with iban AND accountNumber
GCA-044INVALID_REQUEST_DATAWhen creditorAccount is provided with iban, creditorAgent must NOT be provided with abaNumber
GCA-046INVALID_REQUEST_DATAcreditorAccount must be provided with iban or accountNumber
GCA-048INVALID_REQUEST_DATAWhen creditorAccount is provided with accountNumber, bic or aba is required; when provided with iban, bic is required
GCA-050INVALID_REQUEST_DATAcreditorAgent must NOT be provided with bic AND abaNumber
GCA-051INVALID_CONFIGURATIONACH Company id and Account combination was not found
GCA-056INVALID_REQUEST_DATAbic must be provided with accountNumber
GCA-055INVALID_CONFIGURATIONACH Company id was not provided
GCA-058INVALID_REQUEST_DATAcountry is required in the creditorAgent
GCA-060INVALID_CONFIGURATIONserviceLevelCode value is invalid
GCA-001, GCA-003NOT_ALLOWEDUnauthorized Access
GCA-030PROCESSING_ERRORAccess API Processing Error
GCA-099TEMPORARY_UNAVAILABLESystem is Unavailable
AC01INCORRECT_PAYMENT_INFOIncorrect Account Number
AC04ACCOUNT_CLOSED_EXTERNALLYClosed Account Number
AC06ACCOUNT_CLOSED_EXTERNALLYBlocked Account
AG01NOT_ALLOWEDTransaction Forbidden
AG02INVALID_REQUEST_DATAInvalid Bank Operation Code
AG03NOT_ALLOWEDTransaction Not Supported
AG07TRANSACTION_DECLINEDUnsuccessful Direct Debit
AM04INSUFFICIENT_FUNDSInsufficient Funds
AM05DUPLICATE_TRANSACTION_IDDuplication
AM07TRANSACTION_DECLINEDBlocked Amount
AM12INVALID_REQUEST_DATAInvalid Amount
BE01CUSTOMER_DATA_INVALIDInconsistent with End Customer
BE06CUSTOMER_DATA_INVALIDUnknown End Customer
BE15CUSTOMER_DATA_INVALIDInvalid Identification Code
DS02TRANSACTION_CANCELLEDOrder Cancelled
DT01INVALID_REQUEST_DATAInvalid date
ED05PROCESSING_ERRORSettlement Failed
FF01, FF02INVALID_XMLSyntax Error
FF09INVALID_REQUEST_DATAInvalid Cheque Number
MD05TRANSACTION_DECLINEDCollection Not Due
MD07ACCOUNT_CLOSED_EXTERNALLYEnd Customer Deceased
RC01INCORRECT_PAYMENT_INFOBank Identifier Incorrect
RC02INCORRECT_PAYMENT_INFOInvalid Bank Identifier
RC04INCORRECT_PAYMENT_INFOInvalid Creditor Bank Identifier
RC08INCORRECT_PAYMENT_INFOInvalid Clearing System Member Identifier
RR01INVALID_REQUEST_DATAMissing Debtor Account or Identification
RR04TRANSACTION_DECLINEDRegulatory Reason
RR07INVALID_REQUEST_DATARemittance Information Invalid
NARRUNKNOWNJPMorgan's free-text reason is returned as the error message, e.g. INVALID PM VEHICLE
0000, (unrecognized)UNKNOWNJPMorgan's own message is returned where one is supplied

Testing​

JPMorgan ACH Direct Debit uses JPMorgan's QAF sandbox environment when the connector is in test mode. Refer to JPMorgan's own ACH Direct Debits API documentation for sandbox credentials and test scenarios.