Skip to main content

ACH

Automated Clearing House (ACH)/eCheck payments enable US consumers to pay for goods and services directly from their US bank and credit union accounts. ACH payments are not as immediate as other payment methods like credit or debit card transactions. However, they are often cheaper options for businesses than other payment methods due to the lower processing fees.

ACH payments are commonly used for payroll direct deposits, bill payments, and recurring transactions like subscription fees.

Availability

ACH availability
Payment method Payment type Countries Supported presentment currencies
ACH Direct debit CA, US CAD, USD

How ACH works

ACH payments, also known as direct debits, electronic funds transfer (EFT), electronic bank transactions, and eCheck payments, allow customers to use their account number and bank or credit union’s routing number to pay for goods and services. These payments are processed through the ACH network and regulated by the National Automated Clearing House Association (NACHA).

ACH supports both one-time and recurring payments made directly from your consumers’ bank accounts. In accordance with NACHA rules and regulations, your consumer must authorize you to debit or credit their bank account prior to submission of the initial ACH transaction.

The ACH payment type (paymentMethodType.ach.paymentType) is determined by how your consumer initiates their ACH transaction. We support the following payment types:

  • Online payments page or mobile application (per WEB SEC code guidelines) — paymentType: WEB
  • Call center (oral authorization and recording required) — paymentType: TEL
  • Recurring billing program — paymentType: RECURRING

Risk and exception management

J.P. Morgan’s ACH solution provides risk and exception management features for bank and account ownership validation by leveraging the Early Warning Systems (EWS) National Shared Database. This allows you to verify a bank account and/or account owner information prior to submitting an ACH payment or refund. To avoid ACH payment rejections, verify the payment instrument prior to a payment transaction.

Supported transaction types

Verification

Use ACH verification to validate that the financial institution, identified by the bank routing number, participates in ACH.

The following example shows the required fields for an ACH verification request:  

HTTP method: POST
Endpoint: /verifications

Json
{
    "merchant": {
        "merchantSoftware": {
            "companyName": "Payment Company",
            "productName": "Application Name",
            "version": "1.235"
        }
    },
    "currency": "USD",
    "paymentMethodType": {
        "ach": {
            "accountNumber": "1234567891",
            "financialInstitutionRoutingNumber": "122000247",
            "achVerificationType": "BASIC"
        }
    }
}
Note

If you are a Canadian merchant, the only achVerificationType supported is BASIC.

For an advanced ACH verification request that leverages the EWS National Shared Database to confirm whether a deposit account (checking or savings) is open and valid and if there is a risk of returning ACH transactions, update the following field in your request:

  • paymentMethodType.ach.achVerificationType: ACCOUNT_STATUS

For an ACH verification request that leverages the EWS National Shared Database Resource to verify that the consumer or business entity has the authority to transact on that account, update and include the following fields in your request:  

  • paymentMethodType.ach.achVerificationType: ACCOUNT_OWNER
  • accountHolder.fullName or accountHolder.firstName and accountHolder.lastName

For an ACH verification request that validates the status of an account (open/closed), accuracy of a consumer’s account number and the account type, and then submits a pre-note credit advice, update and include the following fields in your request:  

  • paymentMethodType.ach.achVerificationType: PRE_NOTE_CREDIT
  • accountHolder.firstName
  • accountHolder.lastName
Tip

Per NACHA rules, wait 2 business days after you submit a pre-note credit or pre-note debit transaction to send the ACH payment.

For an ACH verification request that validates the status of an account (open/closed), accuracy of a consumer’s account number and the account type, and then submits a pre-note debit advice, update and include the following fields in your request:

  • paymentMethodType.ach.achVerificationType: "PRE_NOTE_DEBIT"
  • accountHolder.firstName
  • accountHolder.lastName

Capture

To create an ACH payment, send a POST request to /payments with the paymentMethodType.ACH object. To reduce the risk of ACH payment rejections, verify the payment instrument before submitting the capture request.

Required fields:

  • accountNumber
  • financialInstitutionRoutingNumber
  • accountHolder.firstName
  • accountHolder.lastName
  • accountType

To leverage statement descriptors, the following fields must be present:

  • statementDescriptor — Overrides the default merchant name on the cardholder statement.
  • merchant.softMerchant.merchantPurchaseDescription — This is used to add more details about the payment in the customer’s statement

If micro-entries are used for account validation purposes, set the paymentMethodType.ach.isTransactionMicroEntry field to true.

Tip

Micro-entries are defined as ACH credits of less than $1, and the offsetting ACH debits, to verify a receiver’s account.

The following example shows the minimum required fields for an ACH capture request:

HTTP method: POST
Endpoint: /payments

Json
{
    "captureMethod": "NOW",
    "amount": 10000,
    "currency": "USD",
    "statementDescriptor": "Statement Descriptor",
    "paymentMethodType": {
        "ach": {
            "accountNumber": "1111111111111111",
            "financialInstitutionRoutingNumber": "123456789",
            "accountType": "CHECKING"
        }
    },
    "accountHolder": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "merchant": {
        "merchantSoftware": {
            "companyName": "Payment Company",
            "productName": "Application Name"
        },
        "softMerchant": {
            "merchantPurchaseDescription": "Merchant Purchase Description"
        }
    }
}

Response:

Json
{
    "transactionId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
    "requestId": "7f0d335d-31aa-48b8-a4fc-a63098690523",
    "transactionState": "CLOSED",
    "responseStatus": "SUCCESS",
    "responseCode": "ACCEPTED",
    "responseMessage": "Request successfully completed",
    "paymentMethodType": {
        "ach": {
            "financialInstitutionRoutingNumber": "123456789",
            "accountType": "CHECKING",
            "maskedAccountNumber": "111111XXXXXX1111"
        }
    },
    "captureMethod": "NOW",
    "captureTime": "2024-03-14T18:06:18.796Z",
    "isVoid": false,
    "transactionDate": "2024-03-14T18:06:18.796Z",
    "amount": 10000,
    "currency": "USD",
    "remainingRefundableAmount": 10000,
    "remainingAuthAmount": 0,
    "hostReferenceId": "J538sH4NuO1HkPLeHtgsr3",
    "statementDescriptor": "Statement Descriptor",
    "merchant": {
        "merchantId": "000017904374",
        "merchantSoftware": {
            "companyName": "Payment Company",
            "productName": "Application Name"
        },
        "merchantCategoryCode": "4899",
        "softMerchant": {
            "merchantPurchaseDescription": "Merchant Purchase Description"
        }
    },
    "paymentRequest": {
        "paymentRequestId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
        "paymentRequestStatus": "CLOSED",
        "authorizations": [
            {
                "authorizationId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
                "amount": 10000,
                "transactionStatusCode": "CAPTURED",
                "authorizationType": "INITIAL"
            }
        ],
        "captures": [
            {
                "captureId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
                "amount": 10000,
                "transactionStatusCode": "CLOSED",
                "captureRemainingRefundableAmount": 10000
            }
        ]
    }
}

Refund

To refund an ACH payment, send a refund and reference the existing payment. To reduce the risk of ACH refund rejections, verify the payment instrument before submitting the refund request.

If micro-entries are used for account validation purposes, set the paymentMethodType.ach.isTransactionMicroEntry field to true.  

HTTP method: POST
Endpoint: /refunds

Json
{
    "paymentMethodType": {
        "transactionReference": {
            "transactionReferenceId": "{{transactionId}}"
        }
    },
    "merchant": {
        "merchantSoftware": {
            "companyName": "Payment Company",
            "productName": "Application Name"
        }
    }
}

Response:

Json
{
    "transactionId": "7c84f070-7bde-46e9-b08c-b7d5ebd7deb9",
    "requestId": "4a415c0d-d1e8-4e1e-b6f9-73acabd4524b",
    "transactionState": "CLOSED",
    "amount": 10000,
    "currency": "USD",
    "responseStatus": "SUCCESS",
    "responseCode": "ACCEPTED",
    "responseMessage": "Request successfully completed",
    "remainingRefundableAmount": 0,
    "transactionDate": "2024-03-14T18:07:53.518Z",
    "merchant": {
        "merchantId": "000017904374",
        "merchantSoftware": {
            "companyName": "Payment Company",
            "productName": "Application Name"
        },
        "merchantCategoryCode": "4899",
        "softMerchant": {
            "merchantPurchaseDescription": "Merchant Purchase Description"
        }
    },
    "statementDescriptor": "Statement Descriptor",
    "accountHolder": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "paymentMethodType": {
        "ach": {
            "financialInstitutionRoutingNumber": "123456789",
            "accountType": "CHECKING",
            "maskedAccountNumber": "111111XXXXXX1111"
        }
    },
    "hostReferenceId": "6PPj0y3AcEhjK2Vl5i8Mg",
    "paymentRequest": {
        "paymentRequestId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
        "paymentRequestStatus": "CLOSED",
        "authorizations": [
            {
                "authorizationId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
                "amount": 10000,
                "transactionStatusCode": "CAPTURED",
                "authorizationType": "INITIAL"
            }
        ],
        "captures": [
            {
                "captureId": "81449b6b-a964-4089-9b7c-13802ac8e53e",
                "amount": 10000,
                "transactionStatusCode": "CLOSED",
                "captureRemainingRefundableAmount": 0
            }
        ],
        "refunds": [
            {
                "refundId": "7c84f070-7bde-46e9-b08c-b7d5ebd7deb9",
                "amount": 10000,
                "transactionStatusCode": "CLOSED"
            }
        ]
    }
}