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
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
{
"merchant": {
"merchantSoftware": {
"companyName": "Payment Company",
"productName": "Application Name",
"version": "1.235"
}
},
"currency": "USD",
"paymentMethodType": {
"ach": {
"accountNumber": "1234567891",
"financialInstitutionRoutingNumber": "122000247",
"achVerificationType": "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
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
.
The following example shows the minimum required fields for an ACH capture request:
HTTP method: POST
Endpoint: /payments
{
"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:
{
"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
{
"paymentMethodType": {
"transactionReference": {
"transactionReferenceId": "{{transactionId}}"
}
},
"merchant": {
"merchantSoftware": {
"companyName": "Payment Company",
"productName": "Application Name"
}
}
}
Response:
{
"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"
}
]
}
}