Learn how to take ACH bank transfer payments using the Square Payments API.
Payments API

ACH Bank Transfer Payment

Applications take ACH bank transfer payments using the Square Web Payments SDK and the Payments API. This topic explains how to use the Payments API (CreatePayment endpoint) to accept ACH bank transfer payments.

The Square API platform manages the complexity of ACH payment processing. The Web Payments SDK uses Plaid for bank account verification. You do not need to have a Plaid account to process ACH payments. Square manages the entire bank account verification process and the ACH bank transfer.

Taking an ACH bank transfer payment is a two-step process:

  1. Generate a payment token. When a buyer chooses ACH bank transfer as the payment method, the Web Payments SDK renders a Plaid UI to let the buyer provide bank account verification. After the bank account is verified, the SDK generates a payment token.

  2. Charge the payment token. Your application makes a server-side CreatePayment call to charge the payment token. The source_id field in the request holds the payment token.

    The following is an example CreatePayment request. It directs Square to charge $100 to the bank account identified by the payment token in the source_id field.

    Create Payment
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    curl https://connect.squareupsandbox.com/v2/payments \
      -X POST \
      -H 'Square-Version: 2023-03-15' \
      -H 'Authorization: Bearer {ACCESS_TOKEN}' \
      -H 'Content-Type: application/json' \
      -d '{
        "idempotency_key": "{UNIQUE_KEY}",
        "amount_money": {
          "amount": 10000,
          "currency": "USD"
        },
        "source_id": "{PAYMENT_TOKEN}"
      }'

    Square processes the ACH payment and returns a Payment object in the response as shown:

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    {
      "payment": {
        "id": "VMnh7EfZj6XR7ykHLWCXAkYDnxEZY",
        "created_at": "2020-10-19T00:28:36.827Z",
        "amount_money": {
          "amount": 10000,
          "currency": "USD"
        },
        "status": "PENDING",
        "source_type": "BANK_ACCOUNT",
        "location_id": "LGEVM1WD8CF5Z",
        "order_id": "KiYkkC68kzRWroBkpyKN2RZYBeFZY",
        "total_money": {
          "amount": 10000,
          "currency": "USD"
        },
        "bank_account_details": {
          "bank_name": "Citizens Bank",
          "transfer_type": "ACH",
          "account_ownership_type": "INDIVIDUAL",
          "fingerprint": "sq-1-FlS9Z5LyPjofrv9KWv1...Pud8YioqOqAw",
          "country": "US",
          "ach_details": {
            "routing_number": "0111111111",
            "account_number_suffix": "000",
            "account_type": "CHECKING"
          }
        }
      }
    }
    

    Note the following response attributes:

    • The source_type is BANK_ACCOUNT and the transfer_type is ACH.

    • The payment status is PENDING. When the transfer is complete, the status is updated to COMPLETED. If your application has subscribed to the payment.updated webhook event, it receives a notification when the transfer is complete.

Square provides an end-to-end sample application in GitHub. For more information, see the Web Payments SDK Quickstart sample project.

We've made improvements to our docs.
Prefer the old format?