Introduction to Bank Transfers (beta)
Transfer funds between bank accounts.
View Bank Transfers requests, responses, and example code
Learn about Plaid's key concepts and run starter code
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
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
If an Item does not already exist for the end user’s account, create it using Link. For Bank Transfers, the
Alternatively, you can call
/bank_transfer/migrate_accountif 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.
(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
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.
/bank_transfer/createto initiate the transfer.
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
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
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:
- Contact your Plaid Account Manager to enable the
/bank_transfer/migrate_accountendpoint and to temporarily allow you to use Bank Transfers endpoints while below the minimum reserve.
- Create a Plaid Item representing your source bank account through the
- Using the
account_idreturned in the response, originate a bank transfer via
/bank_transfer/create. When originating the transfer, make sure to set the field
ccdand set the
user.legal_namefield 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
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
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
inbound in both bank transfer and event API responses. You can also query for inbound transfers directly by using the
/bank_transfer/event/list endpoints using the
direction request field.
Note: Inbound and Outbound transfers are billed at the same rate.
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.
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.