Funding is a bank-link step followed by a deposit. You link a bank through Plaid Link, connect the returned token as a funding source (fs_), then deposit against that funding source.
You need the INVESTOR_ID from earlier, and a verified investor from Verify identity.
Step 1 — Create a link token
Generate the token your frontend passes to Plaid Link.
curl -X POST "$BASE_URL/investors/$INVESTOR_ID/funding-sources/plaid/link-token" \
-H "Authorization: Basic $AUTH" \
-H "Content-Type: application/json" \
-d '{ "enable_hosted_link": false }'
{
"link_token": "link-sandbox-abc123def456",
"hosted_link_url": null
}
Set enable_hosted_link: true to get a hosted_link_url and use Plaid’s hosted redirect flow instead of embedding the widget.
Step 2 — Run Plaid Link on your frontend
Your frontend initializes Plaid Link with the link_token. The user selects their bank and authenticates. On success, Plaid returns a public_token to your frontend. Send that token to your backend for the next step.
The public_token is single-use. Exchange it once — a retry with the same token fails.
Step 3 — Connect the funding source
Exchange the public_token for a persistent funding source. The body is discriminated on type.
curl -X POST "$BASE_URL/investors/$INVESTOR_ID/funding-sources/connect" \
-H "Authorization: Basic $AUTH" \
-H "Content-Type: application/json" \
-d '{
"type": "plaid",
"public_token": "public-sandbox-abc123def456"
}'
{
"id": "fs_7h8g9f0e1d2c3b4a",
"object": "funding_source",
"type": "plaid",
"bank_name": "Wells Fargo",
"account_mask": "6789",
"status": "active",
"created_at": "2026-07-01T10:40:00Z"
}
Store the funding source ID — deposits and withdrawals reference it:
FUNDING_SOURCE_ID="fs_7h8g9f0e1d2c3b4a"
To connect a bank manually instead of via Plaid, send { "type": "manual", "bank_name": "...", "account_holder_name": "...", "account_number": "...", "routing_number": "...", "bank_account_type": "CHECKING" }.
Step 4 — Deposit
Move cash into the wallet with an ACH deposit against the funding source.
curl -X POST "$BASE_URL/investors/$INVESTOR_ID/deposits" \
-H "Authorization: Basic $AUTH" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: dep-$(uuidgen)" \
-d '{
"amount": "5000.00",
"currency": "USD",
"method": "ach",
"description": "Initial deposit",
"funding_source_id": "'"$FUNDING_SOURCE_ID"'"
}'
Response
{
"id": "dep_2b3c4d5e6f7g8h9i",
"object": "deposit",
"amount": "5000.00",
"currency": "USD",
"method": "ach",
"status": "pending",
"funding_source_id": "fs_7h8g9f0e1d2c3b4a",
"created_at": "2026-07-01T10:45:00Z"
}
Deposit status progresses pending → processing → completed. A deposit can also end cancelled or failed. In sandbox, ACH deposits settle within seconds.
Always send an Idempotency-Key header on deposits and withdrawals. If a request times out and you retry, the key guarantees the transfer is created at most once.
For funding methods, wallet balances, and settlement, see Funding and Wallets.