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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.idempotency_key
The 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_token
access_token
for the account that will be debited or credited.account_id
account_id
for the account that will be debited or credited.type
debit
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
, credit
network
ach
, same-day-ach
, or wire
.ach
, same-day-ach
, wire
amount
iso_currency_code
description
10
ach_class
Codes 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
, web
user
legal_name
ach_class
is ccd
, this should be the business name of the account holder.email_address
routing_number
custom_tag
100
metadata
origination_account_id
1const 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_transfer
id
ach_class
Codes 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
, web
account_id
type
debit
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
, credit
user
legal_name
ach_class
is ccd
, this should be the business name of the account holder.email_address
routing_number
amount
iso_currency_code
description
created
2006-01-02T15:04:05Z
date-time
status
pending
, posted
, cancelled
, failed
, reversed
network
ach
, same-day-ach
, or wire
.ach
, same-day-ach
, wire
cancellable
true
, you can still cancel this bank transfer.failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
custom_tag
metadata
origination_account_id
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
request_id
1{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
.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.bank_transfer_id
1const 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_id
1{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
.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.bank_transfer_id
1const 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_transfer
id
ach_class
Codes 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
, web
account_id
type
debit
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
, credit
user
legal_name
ach_class
is ccd
, this should be the business name of the account holder.email_address
routing_number
amount
iso_currency_code
description
created
2006-01-02T15:04:05Z
date-time
status
pending
, posted
, cancelled
, failed
, reversed
network
ach
, same-day-ach
, or wire
.ach
, same-day-ach
, wire
cancellable
true
, you can still cancel this bank transfer.failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
custom_tag
metadata
origination_account_id
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.start_date
2019-12-06T22:35:49Z
)date-time
end_date
2019-12-06T22:35:49Z
)date-time
count
1
25
25
offset
0
0
origination_account_id
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
1const 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_transfers
id
ach_class
Codes 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
, web
account_id
type
debit
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
, credit
user
legal_name
ach_class
is ccd
, this should be the business name of the account holder.email_address
routing_number
amount
iso_currency_code
description
created
2006-01-02T15:04:05Z
date-time
status
pending
, posted
, cancelled
, failed
, reversed
network
ach
, same-day-ach
, or wire
.ach
, same-day-ach
, wire
cancellable
true
, you can still cancel this bank transfer.failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
custom_tag
metadata
origination_account_id
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.start_date
2019-12-06T22:35:49Z
)date-time
end_date
2019-12-06T22:35:49Z
)date-time
bank_transfer_id
account_id
bank_transfer_type
debit
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
, null
event_types
pending
, cancelled
, failed
, posted
, reversed
count
count
, the most recent events will be returned.25
25
1
offset
count
=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_id
direction
outbound
: for API-initiated transfers
inbound
: for payments received by the FBO account.inbound
, outbound
, null
1const 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_events
event_id
0
timestamp
2006-01-02T15:04:05Z
.date-time
event_type
pending
: 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
, reversed
account_id
bank_transfer_id
origination_account_id
bank_transfer_type
debit
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
, credit
bank_transfer_amount
bank_transfer_iso _currency_code
failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.after_id
event_id
fetched via the sync endpoint, or 0 initially.0
count
25
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_events
event_id
0
timestamp
2006-01-02T15:04:05Z
.date-time
event_type
pending
: 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
, reversed
account_id
bank_transfer_id
origination_account_id
bank_transfer_type
debit
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
, credit
bank_transfer_amount
bank_transfer_iso _currency_code
failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
direction
outbound
for API-initiated transfers, or inbound
for payments received by the FBO account.outbound
, inbound
, null
request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.account_number
routing_number
wire_routing_number
routing_number
.account_type
checking
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_token
access_token
for the newly created Item.account_id
account_id
for the newly created Item.request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.origination_account_id
origination_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
balance
available
transactable
origination_account_id
request_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.bank_transfer_id
event_type
posted
, 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
--> failed
pending
--> posted
posted
--> reversed
failure_reason
"failed"
or "reversed"
. Null value otherwise.ach_return_code
R01
. 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.description
1const 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_id
1{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.
client_id
client_id
. The client_id
is required and may be provided either in the PLAID-CLIENT-ID
header or as part of a request body.secret
secret
. The secret
is required and may be provided either in the PLAID-SECRET
header or as part of a request body.webhook
1const 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_id
1{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_type
BANK_TRANSFERS
webhook_code
BANK_TRANSFERS_EVENTS_UPDATE
environment
sandbox
, production
1{2 "webhook_type": "BANK_TRANSFERS",3 "webhook_code": "BANK_TRANSFERS_EVENTS_UPDATE",4 "environment": "production"5}