Funding options at a glance
| Source | Best for | Settlement time |
|---|---|---|
| Card (Stripe, Adyen) | Small amounts, immediate funding | Instant |
| Bank (US ACH) | Large amounts, low fees | 1-3 business days |
| Bank (EU SEPA) | Euro funding | 1-2 business days |
| Bank (LATAM Pix / SPEI) | Brazilian / Mexican flows | Minutes |
| Crypto wallet | Pre-existing stablecoin | On-chain confirmation (seconds-minutes) |
| Hosted on-ramp (Coinbase, Stripe, Crossmint) | Consumer-facing signup-to-funded | Variable |
Step 1 — Register a funding source
Source types and required fields
type | provider | Required conditional fields |
|---|---|---|
card | stripe, adyen | setup_token |
bank_account_us | plaid, stripe | public_token or link_id |
bank_account_eu | plaid, stripe | public_token |
bank_account_latam | belvo | link_id |
crypto_wallet | circle (custodial) | wallet_address, network |
Step 2 — Verify the source
Bank accounts typically require verification (micro-deposits or identity check):unverified → verified | blocked.
Step 3 — Initiate funding
Once verified:amount_cents) — 50000 = $500.00 USD. Avoid float precision issues.
Response:
Step 4 — Watch settlement
pending → processing → completed | failed.
Or subscribe to funding.transaction.completed webhook.
Hosted on-ramp (consumer-facing)
For consumer flows where the end-user completes funding in a branded Sly-hosted page — useful when you don’t want to build card/bank capture UI yourself.Coinbase on-ramp (fiat → USDC → your wallet)
{ session_token, session_url }. Redirect the user; they complete funding in Coinbase’s flow; the wallet is credited on confirmation.
Stripe crypto on-ramp
Similar pattern, different provider:Crossmint order (card → USDC, web + mobile friendly)
Off-ramp (USDC → fiat)
The inverse — move from a Sly wallet out to a bank:Embedded widget session
For a Plaid / Belvo link flow embedded in your UI:Estimate fees before funding
Cross-currency funding
Funding a USDC wallet from a USD bank account = on-ramp + FX.quote_id on the funding transaction to lock in the rate.
List providers + supported pairs
Endpoints
| Endpoint | Purpose |
|---|---|
POST /v1/funding/sources | Register source |
GET /v1/funding/sources | List sources |
POST /v1/funding/sources/:id/verify | Trigger verification |
POST /v1/funding/transactions | Initiate funding |
GET /v1/funding/transactions/:id | Transaction status |
POST /v1/funding/widget-sessions | Plaid/Belvo link session |
POST /v1/funding/onramp-session | Coinbase on-ramp |
POST /v1/funding/stripe-onramp-session | Stripe on-ramp |
POST /v1/funding/crossmint-order | Crossmint order |
POST /v1/funding/offramp-session | Off-ramp (USDC → fiat) |
POST /v1/funding/estimate-fees | Fee preview |
POST /v1/funding/conversion-quote | FX quote |
GET /v1/funding/providers | List providers |
GET /v1/funding/conversion-rates | List supported currency pairs |
Common pitfalls
- Forgetting
idempotency_keyon funding transactions — retries create duplicate debits - Rounding in amount — always use
amount_cents, never floats - Stale quotes — FX quotes expire in ~30 seconds; re-quote before large moves
- Unverified source — sources in
unverifiedstate can’t fund; verify first - Provider-specific KYC — some providers require additional KYC beyond Sly’s; check the source’s verification_status
