Skip to main content
Online Payments

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

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"
        }
    }
}
Note

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

Note

The accountHolder.firstName and accountHolder.lastName fields are required and must be sent separately. Sending an accountHolder.fullName field will result in an error.

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

{
    "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"
            }
        ]
    }
}