Transfer Sandbox
Use Sandbox to test your transfer integration
Simulating money movement, events, and webhooks
When creating transfers in Sandbox, see the /transfer/authorization/create documentation on how to generate approved or declined authorization responses.
In the Sandbox environment, no real banks are involved and no events are triggered automatically. By default, all transfers, refunds, and sweeps created in Sandbox remain at the pending status until you actively change them. This can be most easily accomplished through the Plaid Dashboard, where you can simulate next steps and common failure scenarios for any transfer that you've created in the Sandbox environment.

If you would like to change the status of a transfer through the API, you can call the following endpoints to simulate events and fire transfer webhooks manually.
| Action to simulate | Simulation endpoint |
|---|---|
| Transfer events | /sandbox/transfer/simulate |
| Refund events | /sandbox/transfer/refund/simulate |
| Ledger withdrawals sweep events | /sandbox/transfer/ledger/withdraw/simulate |
| Ledger deposits sweep events | /sandbox/transfer/ledger/deposit/simulate |
| Ledger pending-to-available funds movements | /sandbox/transfer/ledger/simulate_available |
| Webhooks | /sandbox/transfer/fire_webhook |
When you change the status of a Sandbox transfer, either through the Dashboard or the API, the corresponding webhook will not fire. You must use the /sandbox/transfer/fire_webhook API to send a Transfer webhook in Sandbox.
For a full list of transfer simulations available in Sandbox, see Sandbox endpoints.
For a general overview of the Plaid Sandbox environment, see Sandbox overview.
Transfer cannot be tested in the Development environment.
Testing Plaid Ledger flow of funds
While testing Plaid Ledger in Sandbox, you can always call the following endpoints at any time to verify expected behavior:
/transfer/getto validate the transfer status change/transfer/sweep/getto validate the deposit/withdrawal status change/transfer/ledger/getto validate the Ledger balance change
Issuing payouts with a Plaid Ledger
Adding funds to the Plaid Ledger
All new Plaid Ledgers have a starting balance of $100 in Sandbox. Once this is depleted, or if you wish to simulate a larger transfer, you will need to fund the Ledger before testing the payout.
- Call
/transfer/ledger/depositto create a sweep that adds funds to a Plaid Ledger balance. The funds will immediately show up in thependingbalance. - Call
/sandbox/transfer/ledger/deposit/simulatewithsweep.postedas theevent_type. - Call
/sandbox/transfer/ledger/deposit/simulatewithsweep.settledas theevent_type. This will move your sweep tosettledstatus. - Call
/sandbox/transfer/ledger/simulate_availablein order to simulate the passage of time and transition the funds frompendingtoavailable.
Issuing a payout
- Call
/transfer/authorization/createwithtype=creditand your desired network. To simulate an insufficient funds failure, call/transfer/authorization/createwith an amount larger than your current available balance. - Call
/transfer/create. This will immediately create a transfer and decrement the available balance.
Receiving payments via Plaid Ledger
- Call
/transfer/authorization/createwithtype=debit. - Call
/transfer/create. This will immediately create a transfer and increment your pending balance in the Plaid Ledger. - Call
/sandbox/transfer/simulatewithpostedas theevent_type. - Call
/sandbox/transfer/simulatewithsettledas theevent_type. This will move your transfer tosettledstatus. The funds will remain inpendinguntil the hold is elapsed. - Call
/sandbox/transfer/ledger/simulate_availableto simulate the passage of time and convert the Ledger balance toavailable. If you are a Platform Payments customer, this will convert all pending balances in all Plaid Ledgers. - Call
/transfer/ledger/withdrawto create a sweep that withdraws funds from the Plaid Ledger balance. The endpoint will immediately decrement the available balance and create a sweep withpendingstatus. - Call
/sandbox/transfer/ledger/withdraw/simulatewithsweep.postedas theevent_type. - Call
/sandbox/transfer/ledger/withdraw/simulatewithsweep.settledas theevent_type. This will move your sweep tosettledstatus.
In Production, transfer and sweep status will be updated automatically to reflect the real processing status, and the pending balance will automatically become available after the client-specific hold day.
Simulating a return with Plaid Ledger
- Follow steps 1-3 in Receiving payments via Plaid Ledger section to create a debit and move it to
posted. - (Optional) To simulate a return after the funds were made available, follow steps 4-5 as well. If you would like to simulate a return before the funds were made available, omit this step.
- Call
/sandbox/transfer/simulatewithreturnedas theevent_type. This will move the transfer status to returned and decrement pending balance, which you can verify by calling/transfer/ledger/get.
Testing Instant Payouts
Testing Instants Payouts works the same way as testing ACH Transfers.
To test the /transfer/capabilities/get endpoint in Sandbox, log in using the user_good user Sandbox account (see Sandbox simple test credentials for more information), and use the first 2 checking and savings accounts in the "First Platypus Bank" institution (ending in 0000 or 1111), which will return true. Any other account will return false.
Simulating recurring transfers
In the Sandbox environment, recurring transfers can be simulated by using a test_clock object.
A test_clock is a mock clock that has a virtual_time field, indicating the current timestamp on this test clock. You can attach a test_clock to a recurring_transfer in Sandbox by providing a test_clock_id when calling /transfer/recurring/create.
You can advance the virtual_time on a test_clock to a higher value by calling /sandbox/transfer/test_clock/advance, but you can never decrease the virtual_time.
When a test clock is advanced, all active recurring transfers attached to this clock will generate new originations as if the time had elapsed in Production. For instance, assuming a test clock is attached to a weekly recurring transfer, if the test clock is advanced by 14 days, you should see two new transfers being created.
Note that advancing a test clock does not change the status of the transfer objects created by a recurring transfer. Transfers will stay in pending status unless you call /sandbox/transfer/simulate to simulate a transfer status update.
Sample Sandbox recurring transfer scenarios
Create a test clock using
/sandbox/transfer/test_clock/create, with avirtual_timeof"2022-11-14T07:00:00-08:00", which is 2022-11-14 7AM PST (Monday).Create a weekly recurring transfer on every Tuesday using
/transfer/recurring/createwith thetest_clock_idreturned from step 1. The recurring schedule starts on 2022-11-15, and ends on 2022-11-30.Advance the test clock to
"2022-11-15T23:59:00-08:00", which is the end of day 2022-11-15 PST (Tuesday).Since we advanced the test clock to the last minute of Tuesday and the recurring transfer is also scheduled on every Tuesday, we expect to see 1 transfer being created. Inspect the recurring transfer created in step 2 with
/transfer/recurring/get. Confirm thetransfer_idsfield now has 1 element, and thestatusfield is"active".Advance the test clock to
"2022-11-29T23:59:00-08:00", which is the end of day 2022-11-29 PST (Tuesday).Inspect the recurring transfer created in step 2 with
/transfer/recurring/get. Confirm that thetransfer_idsfield now has 3 elements, and thestatusfield is now"expired".Advance the test clock to
"2022-12-06T23:59:00-08:00", which is the end of day 2022-12-06 PST (Tuesday).Inspect the recurring transfer created in step 2 with
/transfer/recurring/get. Confirm that thetransfer_idsfield still has 3 elements, and the status field remains"expired".
Testing Platform Payments end-user onboarding
The following test scenarios are specific to Platform customers only.
In Sandbox, Reseller partners must use /transfer/originator/create instead of the /partner/customer/create and /partner/customer/enable endpoints that they would use in Production.
Simulating onboarding end-customers using your own KYB
- Call
/transfer/originator/createto create the end-customeroriginator_client_id. - Call
/transfer/diligence/submit.
In the Sandbox environment, it is not necessary to call /transfer/diligence/document/upload, but the endpoint will work if used.
Simulating onboarding end-customers using Plaid's KYB
In Sandbox, you can create an end-customer by calling the /transfer/originator/create and then /transfer/questionnaire/create. You will not be able to go through the onboarding UI in Sandbox: the test end-customer will automatically be approved. If you need to test the onboarding UI, you can do so in Production.