Introduction to Bank Transfers (beta)

Transfer funds between bank accounts.

Explore API


Bank Transfers (beta) enables developers to seamlessly initiate and manage bank-to-bank transfers in account-to-account transfer use cases such as account funding and loan disbursement or servicing. You can use Bank Transfers to access a variety of bank-to-bank payment types, including ACH, Same-Day ACH, and wire transfers.

Plaid is also developing a variety of product features designed to make bank-to-bank transfers smarter and more user friendly for developers and consumers. For example, the Payment Success feature provides earlier visibility into whether a transfer will successfully post, enabling developers to make funds available sooner to their end users.

Bank Transfers is currently in closed beta (approval is required to participate) and available in the US only. If you're interested in learning more about our Bank Transfers product and potentially participating in our beta program, complete the beta application form, which can be found at the bottom of the Bank Transfers product page.

Bank Transfers is US-only. Looking for similar capabilities in Europe? Check out the Payment Initiation docs.

Funds Transfers bank accounts

Your bank account

If approved to participate in the closed beta, and before using Bank Transfers, you will need to contact Plaid to link Bank Transfers to your origination account. The origination account is the account you will use at your chosen Originating Depository Financial Institution (ODFI) to initiate Bank Transfers. You can choose to either use your existing ODFI (BTS Platform configuration) or Plaid can help set you up with its ODFI partner (Full Service configuration).

Full Service: Full service is recommended for customers who do not have an existing ACH relationship with an ODFI or require a new ODFI relationship to support other payment types such as wires. With this option, Plaid will guide you through creating a transactional bank account to use with Bank Transfers. This account is also known as an FBO (For Benefit Of) account. For more information on FBO accounts, see Managing your FBO account.

BTS Platform: BTS Platform is recommended for customers who are already working with an ODFI and would like to continue that relationship. With BTS Platform, your existing bank account will be enabled to work with Bank Transfers.

Your customer’s bank account

The other account in a bank transfer, owned by the end user, is represented by an Item, with an access_token obtained via Link or created via the /bank_transfer/migrate_account endpoint.

Funds transfer terminology

A transaction that moves money between accounts is characterized as either a credit or a debit.

Credits are transfers out of the origination account, while debits are transfers into the origination account. For example, a user sending money to you would be a debit, whereas moving money from the origination account to your bank account would be a credit.

Supported transfer methods

Bank transfers supports originations from the following payment rails:

  • Standard and Same-Day ACH (credits and debits)
  • Wires (credits only, requires Full Service)

ACH transfers are the most common method of account-to-account transfers, and funds typically settle either the same or next day. ACH transfers can return for a variety of reasons, with most returns occurring within 48 hours of settlement. Wire transfers are nearly instantaneous and generally irreversible. For a detailed, comprehensive guide to ACH transfers and payments, see Plaid's Modern Guide to ACH.

Bank Transfer flow

  1. If an Item does not already exist for the end user’s account, create it using Link. For Bank Transfers, the product provided to /link/token/create should be auth.

    Alternatively, you can call /bank_transfer/migrate_account if you already have the end user’s account number and routing number, but you will not be able to use non-Bank Transfer endpoints with an Item created via this endpoint.

  2. (Recommended) Before beginning the transfer, check that the source account has sufficient funds. If the source is the end user’s account, check the balance by using /accounts/balance/get. (Note that this is not possible for Items created via /bank_transfer/migrate_account.) If the source is your FBO origination account and you are using Bank Transfers in the Full Service configuration, check the balance by using /bank_transfer/balance/get.

    If the source account has insufficient funds, the transfer may fail, or the source account may be charged an overdraft fee, depending on the account holder’s settings with their bank.

  3. Call /bank_transfer/create to initiate the transfer.

  4. To check the status of the transfer, use /bank_transfer/get. A completed transfer will have a status of posted. You can check the status of a large number of transfers at once by using /bank_transfer/list. If you prefer to watch for updates to transfers instead, use /bank_transfer/event/list or /bank_transfer/event/sync.

Testing Bank Transfers

To test Bank Transfers without using real money, use the Sandbox environment. All of the regular endpoints for Bank Transfers will work in Sandbox. In addition, there is a special Sandbox-specific endpoint, /sandbox/bank_transfer/simulate, which can be used to simulate Bank Transfer events. Bank Transfer endpoints when used in the Sandbox will not actually transfer funds between Sandbox accounts, although they will create transfers and events.

To enable testing of Bank Transfers in Development, contact your Plaid Account Manager. Bank Transfers can be tested with real money using the Development environment, subject to the following limitations:

  • Each transaction must be no more than $0.05.
  • The sum total of all transactions must be less than $5.00.
  • Users may initiate up to 50 ACH credits and 10 Same-Day ACH credits.
  • All transactions must be of type credit; debits are not allowed.
  • Development access to Bank Transfers will expire after 4 weeks.

Any attempt to create a transaction in Development that does not meet the above criteria will result in a BANK_TRANSFER_LIMIT_EXCEEDED or BANK_TRANSFER_UNSUPPORTED_ENVIRONMENT error.

Managing your FBO account

This section provides instructions for transferring money to or from an origination account when using the Full Service Bank Transfers option. It is not required for customers using the BTS Platform option.

Transferring funds in

In order to start moving money with Bank Transfers, you must move an initial funding amount into your FBO account. This amount must be at least as much as your minimum reserve balance amount, which is determined during onboarding and can be changed over time to enable your required volumes. If your account balance drops below the minimum reserve, you will not be able to initiate transfers via the API.

You have two options when funding your account for how to initiate the transfer:

  • Use your bank’s regular ACH or wire transfer process to create a transfer to your FBO account.
  • Use the Bank Transfers API to move funds from your bank account to the FBO.

If you’re using the API, you’ll need to follow these steps:

  1. Contact your Plaid Account Manager to enable the /bank_transfer/migrate_account endpoint and to temporarily allow you to use Bank Transfers endpoints while below the minimum reserve.
  2. Create a Plaid Item representing your source bank account through the /bank_transfer/migrate_account endpoint.
  3. Using the access_token and account_id returned in the response, originate a bank transfer via /bank_transfer/create. When originating the transfer, make sure to set the field ach_class to ccd and set the user.legal_name field to the name on your bank account. Failure to set these fields correctly may result in your transfer being rejected.
Transferring funds out

You can transfer funds from your FBO account into your own bank account via the API using /bank_transfer/create, to create a credit transfer, using the account_id and access_token already created during Transferring Funds In. If you did not use the API to transfer in funds, you will need to follow steps 1 and 2 under Transferring funds in to add your bank account before calling /bank_transfer/create.

When moving funds from the FBO to your own bank account, we recommend leaving a buffer amount in the FBO above your specified minimum reserve balance. This helps ensure that returns do not cause your account to drop below the threshold and block subsequent originations.

Alternatively, your balance can be automatically paid out to your account every time a batch of transfers has succeeded (once every bank business day). To set up automatic payments, contact your Plaid Account Manager.

Managing inbound transfers

ACH differentiates between inbound and outbound transfers, which are defined relative to the ODFI. An outbound transfer was initiated from the ODFI; an inbound transfer was initiated from an external bank account. For example, transfers created via the Bank Transfers API are outbound transfers, relative to the Bank Transfers ODFI, because they are initiated from the origination account. By contrast, if you use your bank’s website to create an initial funding transfer to your origination account, this would be an inbound transfer relative to your origination account. The “inbound” or “outbound” nature of the transfer does not indicate whether the transfer is a credit or a debit, only which bank initiated the transfer.

If you are using an FBO account, you can see inbound transfers in the event stream; contact your Plaid Account Manager to enable this functionality. Whenever Plaid is made aware of an inbound transfer, a new bank transfer and a posted event for that transfer will be created. These will appear with a direction of inbound in both bank transfer and event API responses. You can also query for inbound transfers directly by using the /bank_transfer/list or /bank_transfer/event/list endpoints using the direction request field.

Note: Inbound and Outbound transfers are billed at the same rate.

Reversing transactions

Disputes on the ACH network are fundamentally different than those on the credit card networks. If a consumer disputes a transfer and the consumer’s bank accepts the request to return the funds, funds will automatically be clawed back from the origination account. A reversed transaction will have the status reversed. Unlike credit card disputes, you are not able to contest ACH reversals.

The ACH network allows 60 days for consumers to contest a debit on their account. Business accounts only have 2 business days, but since there is no way to tell for sure whether the end account is a business account or personal account, you should never rely on this as a way to reduce risk.

If you want to voluntarily reverse an ACH or wire transfer transaction because you mistakenly initiated a transaction, or a customer has requested a pending transfer to be canceled, you can use /bank_transfer/get to check the cancellable property of the transfer. If this field is true, the transfer can be canceled. Use the /bank_transfer/cancel endpoint to cancel the transfer.

Next steps

To learn more about Bank Transfers, see Itempotency and Retries.

To apply to use Bank Transfers, complete the beta application form, which can be found at the bottom of the Bank Transfers product page.