Bank Transfer (beta) endpoints
API Reference guide for the Bank Transfer (beta) product
| Endpoints | |
|---|---|
/bank_transfer/create | Initiate a bank transfer |
/bank_transfer/cancel | Cancel a bank transfer |
/bank_transfer/get | Retrieve data about a bank transfer |
/bank_transfer/list | Find bank transfers matching specified criteria |
/bank_transfer/event/list | Retrieve bank transfer events matching specified criteria |
/bank_transfer/event/sync | Retrieve bank transfer events after a given bank transfer event |
/bank_transfer/migrate_account | Create an Item to use with Bank Transfers from a known account number and routing number |
/bank_transfer/balance/get | Retrieve the balance on your Plaid bank transfer account |
/sandbox/bank_transfer/simulate | Simulate a bank transfer event |
/sandbox/bank_transfer/fire_webhook | Simulate a Bank Transfers webhook |
| Webhooks | |
|---|---|
BANK_TRANSFERS_EVENTS_UPDATE | New bank transfer events available |
Endpoints
/bank_transfer/create
Create a bank transfer
Use the /bank_transfer/create endpoint to initiate a new bank transfer.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.idempotency_keyThe API supports idempotency for safely retrying requests without accidentally performing the same operation twice. For example, if a request to create a bank transfer fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single bank transfer is created.
50 access_tokenaccess_token for the account that will be debited or credited.account_idaccount_id for the account that will be debited or credited.typedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, creditnetworkach, same-day-ach, or wire.ach, same-day-ach, wireamountiso_currency_codedescription10 ach_classCodes supported for credits:
ccd, ppd
Codes supported for debits: ccd, tel, web"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts"ppd" - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, e.g. bill payment"tel" - Telephone-Initiated Entry"web" - Internet-Initiated Entry - debits from a consumer’s account where their authorization is obtained over the Internetccd, ppd, tel, webuserlegal_nameach_class is ccd, this should be the business name of the account holder.email_addressrouting_numbercustom_tag100 metadataorigination_account_id1const request: BankTransferCreateRequest = {2 type: 'credit',3 network: 'ach',4 amount: '10.00',5 iso_currency_code: 'USD',6 description: 'payment',7 ach_class: 'ppd',8 user: {9 legal_name: 'First Lastname',10 },11 access_token: accessToken,12 idempotency_key: 'random string',13 account_id: 'BxBXxLj1m4HMXBm9WZZmCWVbPjX16EHwv99vp',14};15try {16 const response = await client.bankTransferCreate(request);17 const bank_transfer = response.data.bank_transfer;18} catch (error) {19 // handle error20}Response fields and example
bank_transferidach_classCodes supported for credits:
ccd, ppd
Codes supported for debits: ccd, tel, web"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts"ppd" - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, e.g. bill payment"tel" - Telephone-Initiated Entry"web" - Internet-Initiated Entry - debits from a consumer’s account where their authorization is obtained over the Internetccd, ppd, tel, webaccount_idtypedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, credituserlegal_nameach_class is ccd, this should be the business name of the account holder.email_addressrouting_numberamountiso_currency_codedescriptioncreated2006-01-02T15:04:05Zdate-time statuspending, posted, cancelled, failed, reversednetworkach, same-day-ach, or wire.ach, same-day-ach, wirecancellabletrue, you can still cancel this bank transfer.failure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.descriptioncustom_tagmetadataorigination_account_iddirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, nullrequest_id1{2 "bank_transfer": {3 "account_id": "6qL6lWoQkAfNE3mB8Kk5tAnvpX81qefrvvl7B",4 "ach_class": "ppd",5 "amount": "12.34",6 "cancellable": true,7 "created": "2020-08-06T17:27:15Z",8 "custom_tag": "my tag",9 "description": "Testing2",10 "direction": "outbound",11 "failure_reason": null,12 "id": "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",13 "iso_currency_code": "USD",14 "metadata": {15 "key1": "value1",16 "key2": "value2"17 },18 "network": "ach",19 "origination_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",20 "status": "pending",21 "type": "credit",22 "user": {23 "email_address": "plaid@plaid.com",24 "legal_name": "John Smith",25 "routing_number": "111111111"26 }27 },28 "request_id": "saKrIBuEB9qJZno"29}Was this helpful?
/bank_transfer/cancel
Cancel a bank transfer
Use the /bank_transfer/cancel endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the cancellable property returned by /bank_transfer/get is true.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.bank_transfer_id1const request: BankTransferCancelRequest = {2 bank_transfer_id,3};4try {5 const response = await plaidClient.bankTransferCancel(request);6 const request_id = response.data.request_id;7} catch (error) {8 // handle error9}Response fields and example
request_id1{2 "request_id": "saKrIBuEB9qJZno"3}Was this helpful?
/bank_transfer/get
Retrieve a bank transfer
The /bank_transfer/get fetches information about the bank transfer corresponding to the given bank_transfer_id.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.bank_transfer_id1const request: BankTransferGetRequest = {2 bank_transfer_id,3};4try {5 const response = await plaidClient.bankTransferGet(request);6 const bank_transfer = response.data.bank_transfer;7} catch (error) {8 // handle error9}Response fields and example
bank_transferidach_classCodes supported for credits:
ccd, ppd
Codes supported for debits: ccd, tel, web"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts"ppd" - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, e.g. bill payment"tel" - Telephone-Initiated Entry"web" - Internet-Initiated Entry - debits from a consumer’s account where their authorization is obtained over the Internetccd, ppd, tel, webaccount_idtypedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, credituserlegal_nameach_class is ccd, this should be the business name of the account holder.email_addressrouting_numberamountiso_currency_codedescriptioncreated2006-01-02T15:04:05Zdate-time statuspending, posted, cancelled, failed, reversednetworkach, same-day-ach, or wire.ach, same-day-ach, wirecancellabletrue, you can still cancel this bank transfer.failure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.descriptioncustom_tagmetadataorigination_account_iddirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, nullrequest_id1{2 "bank_transfer": {3 "account_id": "6qL6lWoQkAfNE3mB8Kk5tAnvpX81qefrvvl7B",4 "ach_class": "ppd",5 "amount": "12.34",6 "cancellable": true,7 "created": "2020-08-06T17:27:15Z",8 "custom_tag": "my tag",9 "description": "Testing2",10 "direction": "outbound",11 "failure_reason": {12 "ach_return_code": "R13",13 "description": "Invalid ACH routing number"14 },15 "id": "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",16 "iso_currency_code": "USD",17 "metadata": {18 "key1": "value1",19 "key2": "value2"20 },21 "network": "ach",22 "origination_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",23 "status": "pending",24 "type": "credit",25 "user": {26 "email_address": "plaid@plaid.com",27 "legal_name": "John Smith",28 "routing_number": "111111111"29 }30 },31 "request_id": "saKrIBuEB9qJZno"32}Was this helpful?
/bank_transfer/list
List bank transfers
Use the /bank_transfer/list endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the count and offset query parameters to retrieve the desired bank transfers.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.start_date2019-12-06T22:35:49Z)date-time end_date2019-12-06T22:35:49Z)date-time count1 25 25 offset0 0 origination_account_iddirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, null1const request: BankTransferListRequest = {2 start_date: start_date,3 end_date: end_date,4 count: count,5 offset: offset,6 origination_account_id: origination_account_id,7 direction: direction,8};9try {10 const response = await plaidClient.bankTransferList(request);11 const bank_transfers = response.data.bank_transfers;12 for (const transfer of bank_transfers) {13 // iterate through transfers14 }15} catch (error) {16 // handle error17}Response fields and example
bank_transfersidach_classCodes supported for credits:
ccd, ppd
Codes supported for debits: ccd, tel, web"ccd" - Corporate Credit or Debit - fund transfer between two corporate bank accounts"ppd" - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, e.g. bill payment"tel" - Telephone-Initiated Entry"web" - Internet-Initiated Entry - debits from a consumer’s account where their authorization is obtained over the Internetccd, ppd, tel, webaccount_idtypedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, credituserlegal_nameach_class is ccd, this should be the business name of the account holder.email_addressrouting_numberamountiso_currency_codedescriptioncreated2006-01-02T15:04:05Zdate-time statuspending, posted, cancelled, failed, reversednetworkach, same-day-ach, or wire.ach, same-day-ach, wirecancellabletrue, you can still cancel this bank transfer.failure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.descriptioncustom_tagmetadataorigination_account_iddirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, nullrequest_id1{2 "bank_transfers": [3 {4 "account_id": "6qL6lWoQkAfNE3mB8Kk5tAnvpX81qefrvvl7B",5 "ach_class": "ppd",6 "amount": "12.34",7 "cancellable": true,8 "created": "2020-08-06T17:27:15Z",9 "custom_tag": "my tag",10 "description": "Testing2",11 "direction": "outbound",12 "failure_reason": {13 "ach_return_code": "R13",14 "description": "Invalid ACH routing number"15 },16 "id": "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",17 "iso_currency_code": "USD",18 "metadata": {19 "key1": "value1",20 "key2": "value2"21 },22 "network": "ach",23 "origination_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",24 "originator_client_id": "569ed2f36b3a3a021713abc1",25 "status": "pending",26 "type": "credit",27 "user": {28 "email_address": "plaid@plaid.com",29 "legal_name": "John Smith",30 "routing_number": "111111111"31 }32 }33 ],34 "request_id": "saKrIBuEB9qJZno"35}Was this helpful?
/bank_transfer/event/list
List bank transfer events
Use the /bank_transfer/event/list endpoint to get a list of Plaid-initiated ACH or bank transfer events based on specified filter criteria. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see micro-deposit events.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.start_date2019-12-06T22:35:49Z)date-time end_date2019-12-06T22:35:49Z)date-time bank_transfer_idaccount_idbank_transfer_typedebit or credit. A debit indicates a transfer of money into your origination account; a credit indicates a transfer of money out of your origination account.debit, credit, nullevent_typespending, cancelled, failed, posted, reversedcountcount, the most recent events will be returned.25 25 1 offsetcount=25 and offset=0, the first 25 events will be returned. When count=25 and offset=25, the next 25 bank transfer events will be returned.0 0 origination_account_iddirectionoutbound: for API-initiated transfers
inbound: for payments received by the FBO account.inbound, outbound, null1const request: BankTransferEventListRequest = {2 start_date: start_date,3 end_date: end_date,4 bank_transfer_id: bank_transfer_id,5 account_id: account_id,6 bank_transfer_type: bank_transfer_type,7 event_types: event_types,8 count: count,9 offset: offset,10 origination_account_id: origination_account_id,11 direction: direction,12};13try {14 const response = await plaidClient.bankTransferEventList(request);15 const events = response.data.bank_transfer_events;16 for (const event of events) {17 // iterate through events18 }19} catch (error) {20 // handle error21}Response fields and example
bank_transfer_eventsevent_id0 timestamp2006-01-02T15:04:05Z.date-time event_typepending: A new transfer was created; it is in the pending state.cancelled: The transfer was cancelled by the client.failed: The transfer failed, no funds were moved.posted: The transfer has been successfully submitted to the payment network.reversed: A posted transfer was reversed.pending, cancelled, failed, posted, reversedaccount_idbank_transfer_idorigination_account_idbank_transfer_typedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, creditbank_transfer_amountbank_transfer_iso _currency_codefailure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.descriptiondirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, nullrequest_id1{2 "bank_transfer_events": [3 {4 "account_id": "6qL6lWoQkAfNE3mB8Kk5tAnvpX81qefrvvl7B",5 "bank_transfer_amount": "12.34",6 "bank_transfer_id": "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",7 "bank_transfer_iso_currency_code": "USD",8 "bank_transfer_type": "credit",9 "direction": "outbound",10 "event_id": 1,11 "event_type": "pending",12 "failure_reason": null,13 "origination_account_id": "",14 "timestamp": "2020-08-06T17:27:15Z"15 }16 ],17 "request_id": "mdqfuVxeoza6mhu"18}Was this helpful?
/bank_transfer/event/sync
Sync bank transfer events
/bank_transfer/event/sync allows you to request up to the next 25 Plaid-initiated bank transfer events that happened after a specific event_id. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see micro-deposit events.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.after_idevent_id fetched via the sync endpoint, or 0 initially.0 count25 1 25 1const request: BankTransferEventListRequest = {2 after_id: afterID,3 count: 25,4};5try {6 const response = await plaidClient.bankTransferEventSync(request);7 const events = response.data.bank_transfer_events;8 for (const event of events) {9 // iterate through events10 }11} catch (error) {12 // handle error13}Response fields and example
bank_transfer_eventsevent_id0 timestamp2006-01-02T15:04:05Z.date-time event_typepending: A new transfer was created; it is in the pending state.cancelled: The transfer was cancelled by the client.failed: The transfer failed, no funds were moved.posted: The transfer has been successfully submitted to the payment network.reversed: A posted transfer was reversed.pending, cancelled, failed, posted, reversedaccount_idbank_transfer_idorigination_account_idbank_transfer_typedebit or credit. A debit indicates a transfer of money into the origination account; a credit indicates a transfer of money out of the origination account.debit, creditbank_transfer_amountbank_transfer_iso _currency_codefailure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.descriptiondirectionoutbound for API-initiated transfers, or inbound for payments received by the FBO account.outbound, inbound, nullrequest_id1{2 "bank_transfer_events": [3 {4 "account_id": "6qL6lWoQkAfNE3mB8Kk5tAnvpX81qefrvvl7B",5 "bank_transfer_amount": "12.34",6 "bank_transfer_id": "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",7 "bank_transfer_iso_currency_code": "USD",8 "bank_transfer_type": "credit",9 "direction": "outbound",10 "event_id": 1,11 "event_type": "pending",12 "failure_reason": null,13 "origination_account_id": "",14 "timestamp": "2020-08-06T17:27:15Z"15 }16 ],17 "request_id": "mdqfuVxeoza6mhu"18}Was this helpful?
/bank_transfer/migrate_account
Migrate account into Bank Transfers
As an alternative to adding Items via Link, you can also use the /bank_transfer/migrate_account endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as /accounts/balance/get, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to /bank_transfer/migrate_account is not enabled by default; to obtain access, contact your Plaid Account Manager.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.account_numberrouting_numberwire_routing_numberrouting_number.account_typechecking or savings).1const request: BankTransferMigrateAccountRequest = {2 account_number: '100000000',3 routing_number: '121122676',4 account_type: 'checking',5};6try {7 const response = await plaidClient.bankTransferMigrateAccount(request);8 const access_token = response.data.access_token;9} catch (error) {10 // handle error11}Response fields and example
access_tokenaccess_token for the newly created Item.account_idaccount_id for the newly created Item.request_id1{2 "access_token": "access-sandbox-435beced-94e8-4df3-a181-1dde1cfa19f0",3 "account_id": "zvyDgbeeDluZ43AJP6m5fAxDlgoZXDuoy5gjN",4 "request_id": "mdqfuVxeoza6mhu"5}Was this helpful?
/bank_transfer/balance/get
Get balance of your Bank Transfer account
Use the /bank_transfer/balance/get endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created.
The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance.
Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.origination_account_idorigination_account_id must be used to specify the account for which balance will be returned.1const request: BankTransferBalanceGetRequest = {2 origination_account_id,3};4try {5 const response = await plaidClient.bankTransferBalanceGet(request);6 const available_balance = response.data.balance.available;7} catch (error) {8 // handle error9}Response fields and example
balanceavailabletransactableorigination_account_idrequest_id1{2 "balance": {3 "available": "1721.70",4 "transactable": "721.70"5 },6 "origination_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",7 "request_id": "mdqfuVxeoza6mhu"8}Was this helpful?
/sandbox/bank_transfer/simulate
Simulate a bank transfer event in Sandbox
Use the /sandbox/bank_transfer/simulate endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as /bank_transfer/event/sync or /bank_transfer/event/list, no transactions will actually take place and funds will not move between accounts, even within the Sandbox.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.bank_transfer_idevent_typeposted, failed, or reversed.An error will be returned if the event type is incompatible with the current transfer status. Compatible status --> event type transitions include:
pending --> failedpending --> postedposted --> reversedfailure_reason"failed" or "reversed". Null value otherwise.ach_return_codeR01. A return code will be provided if and only if the transfer status is reversed. For a full listing of ACH return codes, see Bank Transfers errors.description1const request: SandboxBankTransferSimulateRequest = {2 bank_transfer_id,3 event_type: 'posted',4 failure_reason: failureReason,5};6try {7 const response = await plaidClient.sandboxBankTransferSimulate(request);8 // empty response upon success9} catch (error) {10 // handle error11}Response fields and example
request_id1{2 "request_id": "LmHYMwBhZUvsM03"3}Was this helpful?
/sandbox/bank_transfer/fire_webhook
Manually fire a Bank Transfer webhook
Use the /sandbox/bank_transfer/fire_webhook endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment.
Request fields and example
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.webhook1const request: SandboxBankTransferFireWebhookRequest = {2 webhook: 'https://www.example.com',3};4try {5 const response = await plaidClient.sandboxBankTransferFireWebhook(request);6 // empty response upon success7} catch (error) {8 // handle error9}Response fields and example
request_id1{2 "request_id": "mdqfuVxeoza6mhu"3}Was this helpful?
Webhooks
BANK_TRANSFERS_EVENTS_UPDATE
Fired when new bank transfer events are available. Receiving this webhook indicates you should fetch the new events from /bank_transfer/event/sync.
webhook_typeBANK_TRANSFERSwebhook_codeBANK_TRANSFERS_EVENTS_UPDATEenvironmentdevelopment, sandbox, production1{2 "webhook_type": "BANK_TRANSFERS",3 "webhook_code": "BANK_TRANSFERS_EVENTS_UPDATE",4 "environment": "production"5}