Skip to main content

JPMorgan ACH Direct Debit

JPMorgan ACH Direct Debit lets you collect and refund low-value ACH direct debits in the US and Canada (USD, CAD) via JPMorgan's Treasury Payments API.

You can either submit the payer's bank details with the transaction, or let the payer enter them on a hosted payment page. There is no hosted-fields/payment.js widget.

Connector configuration​

Configure the following parameters for the Connector (see Connector Detail Overview - JPMorgan ACH Direct Debit):

  1. Fill in the mandatory Client ID (used as the connector Username)
  2. Fill in the Client Secret (used as the connector API Secret) β€” only required if Use OAuth JWT Client Assertion is disabled
  3. Select the mandatory Environment β€” Certification, Production
  4. Fill in the mandatory Service Level Code
  5. Fill in the mandatory Local Instrument Code β€” NACHA Standard Entry Class code, for example CCD for corporate or PPD for consumer collections
  6. Fill in the mandatory Debtor Agent Country β€” country of the payer's bank, US for US ACH
  7. Enable the optional Collect Bank Details on Hosted Payment Form to collect the payer's bank details on a hosted page instead of submitting them with the transaction
  8. Fill in the mandatory Creditor Name
  9. Fill in the optional Creditor Postal Address Street Name, Postcode, Town Name, Country Sub Division, Country, and Address Line
  10. Fill in the optional Creditor Account Company Id β€” JPMorgan ACH Company ID linked to the creditor bank account
  11. Fill in the mandatory Creditor Account Currency Code
  12. Fill in the mandatory Creditor Account Number
  13. Fill in the optional Creditor Agent Name and Clearing System Code
  14. Fill in the mandatory Creditor Agent Country
  15. Fill in the mandatory Creditor Agent BIC
  16. Fill in the optional Creditor Agent ABA and Member Id
  17. Select the Signed Payload Content-Type β€” text/xml, application/jose (default), or application/json
  18. Upload the mandatory mTLS PrivateKey and mTLS Certificate (PEM content) β€” required for the mutual-TLS connection to JPMorgan
  19. Upload the mandatory Digital Signature Private Key and Digital Signature Certificate (PEM content) β€” used to sign every request payload as a JWS
  20. Fill in the optional Digital Signature Key ID

Authentication (OAuth2)​

JPMorgan ACH Direct Debit supports two OAuth2 flows, selected via Use OAuth JWT Client Assertion:

  • JWT bearer client assertion (default) β€” the connector signs its own client-assertion JWT. Provide OAuth Private Key (mandatory for this flow) and optionally OAuth Key ID, OAuth Audience, OAuth Scope, and OAuth Token URL (defaults to https://login.jpmorgan.com/oauth2/token if left blank).
  • Client credentials β€” set Use OAuth JWT Client Assertion to disabled and rely on Client ID / Client Secret directly. OAuth Scope and OAuth Token URL still apply if set.

Bank account details​

Unlike some other adapters, the debtor's (customer's) bank account details are not taken from the customer profile's IBAN fields. Either submit them as extraData on the transaction, or collect them on the hosted payment page described below.

extraData keyDescription
psp:directDebitTransactionInformation.debtorAccount.accountNumberDebtor bank account number (mandatory)
psp:directDebitTransactionInformation.debtorAgent.financialInstitutionId.abaDebtor bank routing/ABA number (mandatory)
psp:directDebitTransactionInformation.debtorAccount.ibanDebtor IBAN, if used instead of/alongside an account number
psp:directDebitTransactionInformation.debtorAccount.currencyDebtor account currency β€” falls back to the transaction currency if omitted
psp:directDebitTransactionInformation.debtorAccount.type.codeAccount type β€” checking or savings. Determines the NACHA transaction code, so send it whenever the account is not a checking account

See the API reference for the full field mapping, including mandate-related fields.

Required by JPMorgan​

In addition to the bank details above, three fields must reach every debit 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
Local instrument code (NACHA SEC)Local Instrument Code connector setting
Country of the payer's bankDebtor Agent Country connector setting
Country of the payercustomer.billingCountry on the transaction, or the Country field on the hosted page

The first two are connector settings and need no per-transaction value. The third has no connector fallback β€” send customer.billingCountry, or enable the hosted payment page so the payer selects it.

Hosted payment page​

Enable Collect Bank Details on Hosted Payment Form on the connector to let the payer enter their own bank details. Submit 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 account holder name, account number, account type, routing number, collection date and country.

Anything you send with the transaction takes precedence. If you supply customer.billingCountry, for example, the payer's entry is ignored β€” so you can pre-fill what you already know and let the payer complete the rest.

Payment results are asynchronous​

A successful response to a debit does not mean the payment was accepted. JPMorgan only confirms that it received the instruction, returning PMT-C001 / SUCCESS in the processor response fields. The transaction stays pending until JPMorgan sends its status notification, typically 10 to 20 minutes later, at which point you receive a postback with the final result.

Wait for that postback before treating an ACH debit as paid. A single notification from JPMorgan can carry updates for up to 50 payments.

Registration & recurring collections​

Register stores the bank account details submitted with the transaction so a later Debit can reuse them ("debit with register"). No verification or registration takes place with JPMorgan at this point. Deregister removes the stored details again.

Refunds​

A refund is sent to JPMorgan as its own payment, with its own end-to-end identifier and its own execution date β€” it defaults to the current date, and you can set it with extraData.psp:requestedCollectionDate. Track refund-to-debit correlation via your own transaction references.

Full and partial refunds are both supported.

Testing​

Enable Testmode on the connector to use JPMorgan's certification (QAF) environment instead of production. Refer to JPMorgan's own ACH Direct Debits API documentation for sandbox credentials and test scenarios.