transfer_types are available for that address. Choose the right path based on the transfer rails you need.
Comparison
Which path should you use?
- Plaid-linked bank account — Use this when you need
ach_debitor want to provide a Plaid bank-linking experience for your users. This flow uses Plaid Link to securely connect a bank account and supportsach_debit,ach_credit,rtp_credit, andfednow_credit(on accounts with FedNow enabled). - Direct bank entry — Use this when you already have bank account details (account number, routing number) or need
wiretransfers. This flow supportswire,ach_credit,same_day_ach_credit,rtp_credit, andfednow_credit(on accounts with FedNow enabled).
fednow_credit when you register the recipient with either path, or add it to an existing address. The recipient’s routing number must participate in FedNow. See Send FedNow payouts.
Direct bank entry field requirements
For Direct bank entry, required fields depend on the transfer types you request.
If
transfer_types includes wire, wire requirements apply, even if the same address also includes ACH, RTP, or FedNow rails. For addresses without wire, omit bank_address and beneficiary_address unless you have accurate values—do not enter placeholder or generic bank addresses.
Account holder type
Both paths accept an optionalaccount_holder_type ("individual" or "business"). Brale uses it to choose the ACH SEC code for payouts to the address: individual → PPD, business → CCD. If you omit it, Brale uses the entity type of the account that owns the address. For Plaid-linked accounts, the holder category reported by Plaid takes precedence when available. You can set it later with the PATCH address endpoint if it was not set at creation; once set, it cannot be changed.
Plaid-linked bank account flow
This flow uses the Plaid Link SDK to securely connect a bank account in two steps:- Create a Plaid link token — Generate a
link_tokento launch Plaid Link in your front-end. - Register the account via Plaid — Exchange the
public_tokenfrom Plaid to create anaddress_id.
GET /accounts/{account_id}/addresses/{address_id}/balance?transfer_type=ach_debit&value_type=USD. See Get A Balance.
Direct bank entry flow
Submit bank account details directly using the Addresses API:- Create a new external address — Addresses without
wirerequireowner,account_number,routing_number,account_type, andtransfer_types. Wire-capable addresses also requirebank_addressandbeneficiary_address. This path supportswire,ach_credit,same_day_ach_credit,rtp_credit, andfednow_credit.
Validation
When you create a Direct bank entry address, Brale validates the format of the bank details. For example, Brale checks that the routing number is valid. Brale does not verify that the account exists, that it is open, or who owns it.- Bad account details surface after submission. If the account number does not exist or cannot receive the payment, the receiving bank returns the ACH entry. For example,
R03means no account was found or the account could not be located. - Returns arrive as
transfer.failed. Brale updates the transfer tofailedand sends atransfer.failedwebhook. Read the return code and reason fromfailure.ach_return. See the transferfailurefield for the full schema. - Returns can arrive late. An ACH return can arrive after the transfer was already processed. Keep handling
transfer.failedevents for transfers you have already recorded. See Transfer status lifecycle.
Archive and unarchive
If you need to stop using a previously linked external bank address without deleting the record, use the PATCH address endpoint to archive it. If the customer later wants to restore the same external address, unarchive it.- Archive:
PATCH /accounts/{account_id}/addresses/{address_id}with{ "status": "archived" } - Unarchive:
PATCH /accounts/{account_id}/addresses/{address_id}with{ "status": "active" }