Plaid Ledger
API reference for Plaid Ledger
For how-to guidance, see the Ledger documentation.
Plaid Ledger | |
---|---|
/transfer/ledger/deposit | Deposit funds into a ledger balance held with Plaid |
/transfer/ledger/distribute | Move available balance between platform and its originator |
/transfer/ledger/get | Retrieve information about the ledger balance held with Plaid |
/transfer/ledger/withdraw | Withdraw funds from a ledger balance held with Plaid |
/transfer/ledger/event/list | Retrieve a list of ledger balance events |
/transfer/ledger/deposit
Deposit funds into a Plaid Ledger balance
Use the /transfer/ledger/deposit
endpoint to deposit funds into Plaid Ledger.
Request fields
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.originator_client_id
funding_account_id
funding_account_id
s in the Accounts page of the Plaid Dashboard, under the "Account ID" column. If this field is left blank, the funding account associated with the specified Ledger will be used. If an originator_client_id
is specified, the funding_account_id
must belong to the specified originator.ledger_id
ledger_id
s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance.amount
description
10
idempotency_key
The API supports idempotency for safely retrying the request without accidentally performing the same operation twice. For example, if a request to create a ledger deposit fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single deposit is created.
50
network
For requests submitted as either
ach
or same-day-ach
the cutoff for Same Day ACH is 3:30 PM Eastern Time and the cutoff for Standard ACH transfers is 8:30 PM Eastern Time. It is recommended to submit a request at least 15 minutes before the cutoff time in order to ensure that it will be processed before the cutoff. Any request that is indicated as same-day-ach
and that misses the Same Day ACH cutoff, but is submitted in time for the Standard ACH cutoff, will be sent over Standard ACH rails and will not incur same-day charges.ach
, same-day-ach
1const request: TransferLedgerDepositRequest = {2 amount: '12.34',3 network: 'ach',4 idempotency_key: 'test_deposit_abc',5 description: 'deposit',6};7try {8 const response = await client.transferLedgerDeposit(request);9 const sweep = response.data.sweep;10} catch (error) {11 // handle error12}
Response fields and example
sweep
A sweep is associated with many sweep events (events of type
swept
or return_swept
) which can be retrieved by invoking the /transfer/event/list
endpoint with the corresponding sweep_id
.swept
events occur when the transfer amount is credited or debited from your sweep account, depending on the type
of the transfer. return_swept
events occur when a transfer is returned and Plaid undoes the credit or debit.The total sum of the
swept
and return_swept
events is equal to the amount
of the sweep Plaid creates and matches the amount of the entry on your sweep account ledger.id
funding_account_id
ledger_id
created
date-time
amount
If amount is not present, the sweep was net-settled to zero and outstanding debits and credits between the sweep account and Plaid are balanced.
iso_currency_code
settled
date
expected_funds _available_date
date
status
"pending"
- The sweep is currently pending
"posted"
- The sweep has been posted
"settled"
- The sweep has settled. This is the terminal state of a successful credit sweep.
"returned"
- The sweep has been returned. This is the terminal state of a returned sweep. Returns of a sweep are extremely rare, since sweeps are money movement between your own bank account and your own Ledger.
"funds_available"
- Funds from the sweep have been released from hold and applied to the ledger's available balance. (Only applicable to deposits.) This is the terminal state of a successful deposit sweep.
"failed"
- The sweep has failed. This is the terminal state of a failed sweep.pending
, posted
, settled
, funds_available
, returned
, failed
, null
trigger
"manual"
- The sweep is created manually by the customer
"incoming"
- The sweep is created by incoming funds flow (e.g. Incoming Wire)
"balance_threshold"
- The sweep is created by balance threshold setting
"automatic_aggregate"
- The sweep is created by the Plaid automatic aggregation process. These funds did not pass through the Plaid Ledger balance.manual
, incoming
, balance_threshold
, automatic_aggregate
description
network_trace_id
For
ach
or same-day-ach
transfers, this is the ACH trace number.
For rtp
transfers, this is the Transaction Identification number.
For wire
transfers, this is the IMAD (Input Message Accountability Data) number.failure_reason
"failed"
or "returned"
. Null value otherwise.failure_code
R01
. A failure code will be provided if and only if the sweep status is returned
. See ACH return codes for a full listing of ACH return codes and RTP/RfP error codes for RTP error codes.description
request_id
1{2 "sweep": {3 "id": "8c2fda9a-aa2f-4735-a00f-f4e0d2d2faee",4 "funding_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",5 "ledger_id": "563db5f8-4c95-4e17-8c3e-cb988fb9cf1a",6 "created": "2020-08-06T17:27:15Z",7 "amount": "-12.34",8 "iso_currency_code": "USD",9 "settled": null,10 "status": "pending",11 "trigger": "manual",12 "description": "deposit",13 "network_trace_id": null14 },15 "request_id": "saKrIBuEB9qJZno"16}
/transfer/ledger/distribute
Move available balance between ledgers
Use the /transfer/ledger/distribute
endpoint to move available balance between ledgers, if you have multiple. If you’re a platform, you can move funds between one of your ledgers and one of your customer’s ledger.
Request fields
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.from_ledger_id
to_ledger_id
amount
idempotency_key
The API supports idempotency for safely retrying the request without accidentally performing the same operation twice. For example, if a request to create a ledger distribute fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single distribute is created.
50
description
1const request: TransferLedgerDistributeRequest = {2 from_client_id: '6a65dh3d1h0d1027121ak184',3 to_client_id: '415ab64b87ec47401d000002'4 amount: '12.34',5 idempotency_key: 'test_distribute_abc',6 description: 'distribute',7};8try {9 const response = await client.transferLedgerDistribute(request);10} catch (error) {11 // handle error12}
Response fields and example
request_id
1{2 "request_id": "saKrIBuEB9qJZno"3}
/transfer/ledger/get
Retrieve Plaid Ledger balance
Use the /transfer/ledger/get
endpoint to view a balance on the ledger held with Plaid.
Request fields
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.ledger_id
ledger_id
s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance.originator_client_id
1try {2 const response = await client.transferLedgerGet({}});3 const available_balance = response.data.balance.available;4 const pending_balance = response.data.balance.pending;5} catch (error) {6 // handle error7}
Response fields and example
ledger_id
balance
name
is_default
request_id
1{2 "ledger_id": "563db5f8-4c95-4e17-8c3e-cb988fb9cf1a",3 "name": "Default",4 "is_default": true,5 "balance": {6 "available": "1721.70",7 "pending": "123.45"8 },9 "request_id": "saKrIBuEB9qJZno"10}
/transfer/ledger/withdraw
Withdraw funds from a Plaid Ledger balance
Use the /transfer/ledger/withdraw
endpoint to withdraw funds from a Plaid Ledger balance.
Request fields
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.originator_client_id
funding_account_id
funding_account_id
s in the Accounts page of the Plaid Dashboard, under the "Account ID" column. If this field is left blank, the funding account associated with the specified Ledger will be used. If an originator_client_id
is specified, the funding_account_id
must belong to the specified originator.ledger_id
ledger_id
s in the Accounts page of your Plaid Dashboard. If this field is left blank, this will default to id of the default ledger balance.amount
description
10
idempotency_key
The API supports idempotency for safely retrying the request without accidentally performing the same operation twice. For example, if a request to create a ledger withdraw fails due to a network connection error, you can retry the request with the same idempotency key to guarantee that only a single withdraw is created.
50
network
For transfers submitted as
ach
or same-day-ach
, the Standard ACH cutoff is 8:30 PM Eastern Time.For transfers submitted as
same-day-ach
, the Same Day ACH cutoff is 3:30 PM Eastern Time. It is recommended to send the request 15 minutes prior to the cutoff to ensure that it will be processed in time for submission before the cutoff. If the transfer is processed after this cutoff but before the Standard ACH cutoff, it will be sent over Standard ACH rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. The transaction limit for a Same Day ACH transfer is $1,000,000. Authorization requests sent with an amount greater than $1,000,000 will fail.For transfers submitted as
rtp
, Plaid will automatically route between Real Time Payment rail by TCH or FedNow rails as necessary. If a transfer is submitted as rtp
and the counterparty account is not eligible for RTP, the /transfer/authorization/create
request will fail with an INVALID_FIELD
error code. To pre-check to determine whether a counterparty account can support RTP, call /transfer/capabilities/get
before calling /transfer/authorization/create
.Wire transfers are currently in early availability. To request access to
wire
as a payment network, contact your Account Manager. For transfers submitted as wire
, the type
must be credit
; wire debits are not supported. The cutoff to submit a wire payment is 4:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. The transaction limit for a wire is $999,999.99. Authorization requests sent with an amount greater than $999,999.99 will fail.ach
, same-day-ach
, rtp
, wire
1const request: TransferLedgerWithdrawRequest = {2 amount: '12.34',3 network: 'ach',4 idempotency_key: 'test_deposit_abc',5 description: 'withdraw',6};7try {8 const response = await client.transferLedgerWithdraw(request);9 const sweep = response.data.sweep;10} catch (error) {11 // handle error12}
Response fields and example
sweep
A sweep is associated with many sweep events (events of type
swept
or return_swept
) which can be retrieved by invoking the /transfer/event/list
endpoint with the corresponding sweep_id
.swept
events occur when the transfer amount is credited or debited from your sweep account, depending on the type
of the transfer. return_swept
events occur when a transfer is returned and Plaid undoes the credit or debit.The total sum of the
swept
and return_swept
events is equal to the amount
of the sweep Plaid creates and matches the amount of the entry on your sweep account ledger.id
funding_account_id
ledger_id
created
date-time
amount
If amount is not present, the sweep was net-settled to zero and outstanding debits and credits between the sweep account and Plaid are balanced.
iso_currency_code
settled
date
expected_funds _available_date
date
status
"pending"
- The sweep is currently pending
"posted"
- The sweep has been posted
"settled"
- The sweep has settled. This is the terminal state of a successful credit sweep.
"returned"
- The sweep has been returned. This is the terminal state of a returned sweep. Returns of a sweep are extremely rare, since sweeps are money movement between your own bank account and your own Ledger.
"funds_available"
- Funds from the sweep have been released from hold and applied to the ledger's available balance. (Only applicable to deposits.) This is the terminal state of a successful deposit sweep.
"failed"
- The sweep has failed. This is the terminal state of a failed sweep.pending
, posted
, settled
, funds_available
, returned
, failed
, null
trigger
"manual"
- The sweep is created manually by the customer
"incoming"
- The sweep is created by incoming funds flow (e.g. Incoming Wire)
"balance_threshold"
- The sweep is created by balance threshold setting
"automatic_aggregate"
- The sweep is created by the Plaid automatic aggregation process. These funds did not pass through the Plaid Ledger balance.manual
, incoming
, balance_threshold
, automatic_aggregate
description
network_trace_id
For
ach
or same-day-ach
transfers, this is the ACH trace number.
For rtp
transfers, this is the Transaction Identification number.
For wire
transfers, this is the IMAD (Input Message Accountability Data) number.failure_reason
"failed"
or "returned"
. Null value otherwise.failure_code
R01
. A failure code will be provided if and only if the sweep status is returned
. See ACH return codes for a full listing of ACH return codes and RTP/RfP error codes for RTP error codes.description
request_id
1{2 "sweep": {3 "id": "8c2fda9a-aa2f-4735-a00f-f4e0d2d2faee",4 "funding_account_id": "8945fedc-e703-463d-86b1-dc0607b55460",5 "ledger_id": "563db5f8-4c95-4e17-8c3e-cb988fb9cf1a",6 "created": "2020-08-06T17:27:15Z",7 "amount": "12.34",8 "iso_currency_code": "USD",9 "settled": null,10 "status": "pending",11 "trigger": "manual",12 "description": "withdraw",13 "network_trace_id": null14 },15 "request_id": "saKrIBuEB9qJZno"16}
/transfer/ledger/event/list
List transfer ledger events
Use the /transfer/ledger/event/list
endpoint to get a list of ledger events for a specific ledger based on specified filter criteria.
Request fields
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.originator_client_id
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
date-time
end_date
date-time
ledger_id
ledger_event_id
source_type
"TRANSFER"
- The source of the ledger event is a transfer
"SWEEP"
- The source of the ledger event is a sweep
"REFUND"
- The source of the ledger event is a refundTRANSFER
, SWEEP
, REFUND
source_id
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 events will be returned.0
0
1const request: TransferLedgerEventListRequest = {2 originator_client_id: "8945fedc-e703-463d-86b1-dc0607b55460",3 start_date: '2019-12-06T22:35:49Z',4 end_date: '2019-12-12T22:35:49Z',5 count: 14,6 offset: 2,7 ledger_id: "563db5f8-4c95-4e17-8c3e-cb988fb9cf1a",8 ledger_event_id: "3gE5gnRzNyfXpBK5wEEKcymJ5albGVUqg77gr",9 source_type: "transfer",10 source_id: "460cbe92-2dcc-8eae-5ad6-b37d0ec90fd9",11 };12try {13 const response = await plaidClient.transferLedgerEventList(request);14 const events = response.data.ledger_events;15 for (const event of events) {16 // iterate through events17 }18} catch (error) {19 // handle error20}
Response fields and example
ledger_events
ledger_event_id
ledger_id
amount
transfer_id
refund_id
sweep_id
description
pending_balance
available_balance
type
timestamp
date-time
has_more
request_id
1{2 "ledger_events": [3 {4 "ledger_event_id": "3gE5gnRzNyfXpBK5wEEKcymJ5albGVUqg77gr",5 "ledger_id": "563db5f8-4c95-4e17-8c3e-cb988fb9cf1a",6 "amount": "100.00",7 "type": "deposit",8 "transfer_id": "460cbe92-2dcc-8eae",9 "description": "Converted to available",10 "pending_balance": "100.00",11 "available_balance": "100.00",12 "timestamp": "2023-12-01T10:00:00Z"13 }14 ],15 "has_more": false,16 "request_id": "mdqfuVxeoza6mhu"17}