Plaid logo
Docs
ALL DOCS

Bank Transfers

  • Introduction to Bank Transfers
  • Idempotency and Retries
  • Webhooks in Bank Transfers
  • API Reference
Plaid logo
Docs
Close search modal
Ask Bill!
Ask Bill!
Hi! I'm Bill! You can ask me all about the Plaid API. Try asking questions like:
  • How do I enable IDV selfie checks?
  • What is Remember Me?
  • What's the difference between an Item and an access token?
Note: Bill isn't perfect. He's just a robot platypus that reads our docs for fun. You should treat his answers with the same healthy skepticism you might treat any other answer on the internet. This chat may be logged for quality and training purposes. Please don't send Bill any PII -- he's scared of intimacy. All chats with Bill are subject to Plaid's Privacy Policy.
Plaid.com
Log in
Get API Keys
Open nav

Bank Transfer (beta) endpoints

API Reference guide for the Bank Transfer (beta) product

Endpoints
/bank_transfer/createInitiate a bank transfer
/bank_transfer/cancelCancel a bank transfer
/bank_transfer/getRetrieve data about a bank transfer
/bank_transfer/listFind bank transfers matching specified criteria
/bank_transfer/event/listRetrieve bank transfer events matching specified criteria
/bank_transfer/event/syncRetrieve bank transfer events after a given bank transfer event
/bank_transfer/migrate_accountCreate an Item to use with Bank Transfers from a known account number and routing number
/bank_transfer/balance/getRetrieve the balance on your Plaid bank transfer account
/sandbox/bank_transfer/simulateSimulate a bank transfer event
/sandbox/bank_transfer/fire_webhookSimulate a Bank Transfers webhook
Webhooks
BANK_TRANSFERS_EVENTS_UPDATENew bank transfer events available

Endpoints

/bank_transfer/create

Create a bank transfer

Use the /bank_transfer/create endpoint to initiate a new bank transfer.

bank_transfer/create

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
idempotency_key
requiredstring
A random key provided by the client, per unique bank transfer. Maximum of 50 characters.
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.


Max length: 50
access_token
requiredstring
The Plaid access_token for the account that will be debited or credited.
account_id
requiredstring
The Plaid account_id for the account that will be debited or credited.
type
requiredstring
The type of bank transfer. This will be either 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.

Possible values: debit, credit
network
requiredstring
The network or rails used for the transfer. Valid options are ach, same-day-ach, or wire.

Possible values: ach, same-day-ach, wire
amount
requiredstring
The amount of the bank transfer (decimal string with two digits of precision e.g. "10.00").
iso_currency_code
requiredstring
The currency of the transfer amount – should be set to "USD".
description
requiredstring
The transfer description. Maximum of 10 characters.

Max length: 10
ach_class
string
Specifies the use case of the transfer. Required for transfers on an ACH network. For more details, see ACH SEC codes.
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. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.


Possible values: ccd, ppd, tel, web
user
requiredobject
The legal name and other information for the account holder.
legal_name
requiredstring
The account holder’s full legal name. If the transfer ach_class is ccd, this should be the business name of the account holder.
email_address
string
The account holder’s email.
routing_number
string
The account holder's routing number. This field is only used in response data. Do not provide this field when making requests.
custom_tag
string
An arbitrary string provided by the client for storage with the bank transfer. May be up to 100 characters.

Max length: 100
metadata
object
The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: The JSON values must be Strings (no nested JSON objects allowed) Only ASCII characters may be used Maximum of 50 key/value pairs Maximum key length of 40 characters Maximum value length of 500 characters
origination_account_id
string
Plaid’s unique identifier for the origination account for this transfer. If you have more than one origination account, this value must be specified. Otherwise, this field should be left blank.
Select group for content switcher
Select Language
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 error
20}
bank_transfer/create

Response fields and example

bank_transfer
object
Represents a bank transfer within the Bank Transfers API.
id
string
Plaid’s unique identifier for a bank transfer.
ach_class
string
Specifies the use case of the transfer. Required for transfers on an ACH network. For more details, see ACH SEC codes.
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. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.


Possible values: ccd, ppd, tel, web
account_id
string
The account ID that should be credited/debited for this bank transfer.
type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit
user
object
The legal name and other information for the account holder.
legal_name
string
The account holder’s full legal name. If the transfer ach_class is ccd, this should be the business name of the account holder.
email_address
nullablestring
The account holder’s email.
routing_number
string
The account holder's routing number. This field is only used in response data. Do not provide this field when making requests.
amount
string
The amount of the bank transfer (decimal string with two digits of precision e.g. "10.00").
iso_currency_code
string
The currency of the transfer amount, e.g. "USD"
description
string
The description of the transfer.
created
string
The datetime when this bank transfer was created. This will be of the form 2006-01-02T15:04:05Z

Format: date-time
status
string
The status of the transfer.

Possible values: pending, posted, cancelled, failed, reversed
network
string
The network or rails used for the transfer. Valid options are ach, same-day-ach, or wire.

Possible values: ach, same-day-ach, wire
cancellable
boolean
When true, you can still cancel this bank transfer.
failure_reason
nullableobject
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
nullablestring
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
custom_tag
nullablestring
A string containing the custom tag provided by the client in the create request. Will be null if not provided.
metadata
nullableobject
The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: The JSON values must be Strings (no nested JSON objects allowed) Only ASCII characters may be used Maximum of 50 key/value pairs Maximum key length of 40 characters Maximum value length of 500 characters
origination_account_id
string
Plaid’s unique identifier for the origination account that was used for this transfer.
direction
nullablestring
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/cancel

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API 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
requiredstring
Plaid’s unique identifier for a bank transfer.
Select group for content switcher
Select Language
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 error
9}
bank_transfer/cancel

Response fields and example

request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/get

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API 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
requiredstring
Plaid’s unique identifier for a bank transfer.
Select group for content switcher
Select Language
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 error
9}
bank_transfer/get

Response fields and example

bank_transfer
object
Represents a bank transfer within the Bank Transfers API.
id
string
Plaid’s unique identifier for a bank transfer.
ach_class
string
Specifies the use case of the transfer. Required for transfers on an ACH network. For more details, see ACH SEC codes.
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. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.


Possible values: ccd, ppd, tel, web
account_id
string
The account ID that should be credited/debited for this bank transfer.
type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit
user
object
The legal name and other information for the account holder.
legal_name
string
The account holder’s full legal name. If the transfer ach_class is ccd, this should be the business name of the account holder.
email_address
nullablestring
The account holder’s email.
routing_number
string
The account holder's routing number. This field is only used in response data. Do not provide this field when making requests.
amount
string
The amount of the bank transfer (decimal string with two digits of precision e.g. "10.00").
iso_currency_code
string
The currency of the transfer amount, e.g. "USD"
description
string
The description of the transfer.
created
string
The datetime when this bank transfer was created. This will be of the form 2006-01-02T15:04:05Z

Format: date-time
status
string
The status of the transfer.

Possible values: pending, posted, cancelled, failed, reversed
network
string
The network or rails used for the transfer. Valid options are ach, same-day-ach, or wire.

Possible values: ach, same-day-ach, wire
cancellable
boolean
When true, you can still cancel this bank transfer.
failure_reason
nullableobject
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
nullablestring
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
custom_tag
nullablestring
A string containing the custom tag provided by the client in the create request. Will be null if not provided.
metadata
nullableobject
The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: The JSON values must be Strings (no nested JSON objects allowed) Only ASCII characters may be used Maximum of 50 key/value pairs Maximum key length of 40 characters Maximum value length of 500 characters
origination_account_id
string
Plaid’s unique identifier for the origination account that was used for this transfer.
direction
nullablestring
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/list

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
start_date
string
The start datetime of bank transfers to list. This should be in RFC 3339 format (i.e. 2019-12-06T22:35:49Z)

Format: date-time
end_date
string
The end datetime of bank transfers to list. This should be in RFC 3339 format (i.e. 2019-12-06T22:35:49Z)

Format: date-time
count
integer
The maximum number of bank transfers to return.

Minimum: 1
Maximum: 25
Default: 25
offset
integer
The number of bank transfers to skip before returning results.

Default: 0
Minimum: 0
origination_account_id
string
Filter bank transfers to only those originated through the specified origination account.
direction
string
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
Select group for content switcher
Select Language
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 transfers
14 }
15} catch (error) {
16 // handle error
17}
bank_transfer/list

Response fields and example

bank_transfers
[object]
id
string
Plaid’s unique identifier for a bank transfer.
ach_class
string
Specifies the use case of the transfer. Required for transfers on an ACH network. For more details, see ACH SEC codes.
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. Authorization was obtained in writing either in person or via an electronic document signing, e.g. Docusign, by the consumer. Can be used for credits or debits.
"web" - Internet-Initiated Entry. The transfer debits a consumer’s bank account. Authorization from the consumer is obtained over the Internet (e.g. a web or mobile application). Can be used for single debits or recurring debits.
"tel" - Telephone-Initiated Entry. The transfer debits a consumer. Debit authorization has been received orally over the telephone via a recorded call.


Possible values: ccd, ppd, tel, web
account_id
string
The account ID that should be credited/debited for this bank transfer.
type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit
user
object
The legal name and other information for the account holder.
legal_name
string
The account holder’s full legal name. If the transfer ach_class is ccd, this should be the business name of the account holder.
email_address
nullablestring
The account holder’s email.
routing_number
string
The account holder's routing number. This field is only used in response data. Do not provide this field when making requests.
amount
string
The amount of the bank transfer (decimal string with two digits of precision e.g. "10.00").
iso_currency_code
string
The currency of the transfer amount, e.g. "USD"
description
string
The description of the transfer.
created
string
The datetime when this bank transfer was created. This will be of the form 2006-01-02T15:04:05Z

Format: date-time
status
string
The status of the transfer.

Possible values: pending, posted, cancelled, failed, reversed
network
string
The network or rails used for the transfer. Valid options are ach, same-day-ach, or wire.

Possible values: ach, same-day-ach, wire
cancellable
boolean
When true, you can still cancel this bank transfer.
failure_reason
nullableobject
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
nullablestring
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
custom_tag
nullablestring
A string containing the custom tag provided by the client in the create request. Will be null if not provided.
metadata
nullableobject
The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: The JSON values must be Strings (no nested JSON objects allowed) Only ASCII characters may be used Maximum of 50 key/value pairs Maximum key length of 40 characters Maximum value length of 500 characters
origination_account_id
string
Plaid’s unique identifier for the origination account that was used for this transfer.
direction
nullablestring
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/event/list

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
start_date
string
The start datetime of bank transfers to list. This should be in RFC 3339 format (i.e. 2019-12-06T22:35:49Z)

Format: date-time
end_date
string
The end datetime of bank transfers to list. This should be in RFC 3339 format (i.e. 2019-12-06T22:35:49Z)

Format: date-time
bank_transfer_id
string
Plaid’s unique identifier for a bank transfer.
account_id
string
The account ID to get events for all transactions to/from an account.
bank_transfer_type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit, null
event_types
[string]
Filter events by event type.

Possible values: pending, cancelled, failed, posted, reversed
count
integer
The maximum number of bank transfer events to return. If the number of events matching the above parameters is greater than count, the most recent events will be returned.

Default: 25
Maximum: 25
Minimum: 1
offset
integer
The offset into the list of bank transfer events. When 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.

Default: 0
Minimum: 0
origination_account_id
string
The origination account ID to get events for transfers from a specific origination account.
direction
string
Indicates the direction of the transfer: outbound: for API-initiated transfers inbound: for payments received by the FBO account.

Possible values: inbound, outbound, null
Select group for content switcher
Select Language
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 events
18 }
19} catch (error) {
20 // handle error
21}
bank_transfer/event/list

Response fields and example

bank_transfer_events
[object]
event_id
integer
Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers.

Minimum: 0
timestamp
string
The datetime when this event occurred. This will be of the form 2006-01-02T15:04:05Z.

Format: date-time
event_type
string
The type of event that this bank transfer represents.
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.


Possible values: pending, cancelled, failed, posted, reversed
account_id
string
The account ID associated with the bank transfer.
bank_transfer_id
string
Plaid’s unique identifier for a bank transfer.
origination_account_id
nullablestring
The ID of the origination account that this balance belongs to.
bank_transfer_type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit
bank_transfer_amount
string
The bank transfer amount.
bank_transfer_iso_currency_code
string
The currency of the bank transfer amount.
failure_reason
nullableobject
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
nullablestring
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
direction
nullablestring
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/event/sync

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
after_id
requiredinteger
The latest (largest) event_id fetched via the sync endpoint, or 0 initially.

Minimum: 0
count
integer
The maximum number of bank transfer events to return.

Default: 25
Minimum: 1
Maximum: 25
Select group for content switcher
Select Language
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 events
10 }
11} catch (error) {
12 // handle error
13}
bank_transfer/event/sync

Response fields and example

bank_transfer_events
[object]
event_id
integer
Plaid’s unique identifier for this event. IDs are sequential unsigned 64-bit integers.

Minimum: 0
timestamp
string
The datetime when this event occurred. This will be of the form 2006-01-02T15:04:05Z.

Format: date-time
event_type
string
The type of event that this bank transfer represents.
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.


Possible values: pending, cancelled, failed, posted, reversed
account_id
string
The account ID associated with the bank transfer.
bank_transfer_id
string
Plaid’s unique identifier for a bank transfer.
origination_account_id
nullablestring
The ID of the origination account that this balance belongs to.
bank_transfer_type
string
The type of bank transfer. This will be either 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.

Possible values: debit, credit
bank_transfer_amount
string
The bank transfer amount.
bank_transfer_iso_currency_code
string
The currency of the bank transfer amount.
failure_reason
nullableobject
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
nullablestring
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
direction
nullablestring
Indicates the direction of the transfer: outbound for API-initiated transfers, or inbound for payments received by the FBO account.

Possible values: outbound, inbound, null
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/migrate_account

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
account_number
requiredstring
The user's account number.
routing_number
requiredstring
The user's routing number.
wire_routing_number
string
The user's wire transfer routing number. This is the ABA number; for some institutions, this may differ from the ACH number used in routing_number.
account_type
requiredstring
The type of the bank account (checking or savings).
Select group for content switcher
Select Language
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 error
11}
bank_transfer/migrate_account

Response fields and example

access_token
string
The Plaid access_token for the newly created Item.
account_id
string
The Plaid account_id for the newly created Item.
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

bank_transfer/balance/get

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API 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
string
If multiple origination accounts are available, origination_account_id must be used to specify the account for which balance will be returned.
Select group for content switcher
Select Language
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 error
9}
bank_transfer/balance/get

Response fields and example

balance
object
Information about the balance of a bank transfer
available
string
The total available balance - the sum of all successful debit transfer amounts minus all credit transfer amounts.
transactable
string
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.
origination_account_id
nullablestring
The ID of the origination account that this balance belongs to.
request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

sandbox/bank_transfer/simulate

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API 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
requiredstring
Plaid’s unique identifier for a bank transfer.
event_type
requiredstring
The asynchronous event to be simulated. May be: 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
object
The failure reason if the type of this transfer is "failed" or "reversed". Null value otherwise.
ach_return_code
string
The ACH return code, e.g. 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
string
A human-readable description of the reason for the failure or reversal.
Select group for content switcher
Select Language
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 success
9} catch (error) {
10 // handle error
11}
sandbox/bank_transfer/simulate

Response fields and example

request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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.

sandbox/bank_transfer/fire_webhook

Request fields

client_id
string
Your Plaid API 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
string
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
webhook
requiredstring
The URL to which the webhook should be sent.
Select group for content switcher
Select Language
1const request: SandboxBankTransferFireWebhookRequest = {
2 webhook: 'https://www.example.com',
3};
4try {
5 const response = await plaidClient.sandboxBankTransferFireWebhook(request);
6 // empty response upon success
7} catch (error) {
8 // handle error
9}
sandbox/bank_transfer/fire_webhook

Response fields and example

request_id
string
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
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
string
BANK_TRANSFERS
webhook_code
string
BANK_TRANSFERS_EVENTS_UPDATE
environment
string
The Plaid environment the webhook was sent from

Possible values: sandbox, production
1{
2 "webhook_type": "BANK_TRANSFERS",
3 "webhook_code": "BANK_TRANSFERS_EVENTS_UPDATE",
4 "environment": "production"
5}
Was this helpful?
Developer community
GitHub
GitHub
Stack Overflow
Stack Overflow
YouTube
YouTube
Discord
Discord