Skip to main content
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.
Plaid Link funding sequence
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.
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 pendingprocessingcompleted. 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.
Next → Place orders.