Bank linking is in private preview.
Why this exists
Sumvin’s account model treats a linked bank account as a first-class resource — it can serve as a fiat settlement destination for off-ramp (off-ramp is in private preview), as a balance source for budgets and insights, and as the funding origin for ACH-style payment flows that consume a processor token. Routing those flows through one ramp that Sumvin operates means the partner integrates against/v0/accounts/* and /v0/bank-linking/* rather than against an external provider directly.
Provider routing
The bank-linking entitlement on the user gates the/v0/bank-linking/* endpoints — institution discovery, processor token issuance, and the connection-lifecycle operations. Without it, those calls return 403 Forbidden with error code GATE-403-001. The /v0/accounts/link/config and /v0/accounts/link entry points are not entitlement-gated.
End-to-end flow
1
Discover institutions
Fetch the catalog — filter by region, supported products, or name search. The catalog is cached server-side; it is safe to call on every render of your bank-picker UI.
GET /v0/bank-linking/institutions2
Initiate the link
Pass the chosen
institution_id. Sumvin returns 202 Accepted with a widget_url and connect_token. Embed the widget URL in your client to surface the hosted institution-connect flow to the user.POST /v0/accounts/link3
User completes the connect flow
The user authenticates with their bank inside the ramp widget. On success, Sumvin receives a
BANK_LINKING_CONNECTION_COMPLETED event on its webhook endpoint. This event is informational — account data lands in the next step.4
Account data arrives
A
BANK_LINKING_ACCOUNTS_UPDATED event arrives with the populated account list. Sumvin upserts each account against the user, mapping the provider’s account types into Sumvin’s account_type taxonomy. The accounts then surface on the list endpoint.GET /v0/accounts/5
Transactions become available (optional)
For institutions and products that support it, a
BANK_LINKING_TRANSACTIONS_AGGREGATED event (and ..._HISTORICAL_... for backfill) arrives. Sumvin triggers a background sync to pull and persist transactions against each account.6
Issue a processor token (optional)
To use the linked account as a payment source for a downstream processor (for example, an ACH payment partner), pass the processor name. Sumvin mints the token and returns it.
POST /v0/bank-linking/accounts/{account_id}/processor-tokenPolling for completion
Bank linking is asynchronous from the partner’s perspective — the link response is202, not the final account state. After the user closes the widget, poll the accounts list; new accounts appear once the BANK_LINKING_ACCOUNTS_UPDATED event is delivered. The poll link in the link response points at /v0/accounts?status=pending_connection for that purpose.
POST /v0/accounts/link — Initiate the link (returns 202).
GET /v0/accounts/ — Poll for completion.
Partner-facing webhooks for these events are not yet available; polling is the supported pattern.
Connection lifecycle
After the initial link, Sumvin tracks the connection’s status from theBANK_LINKING_CONNECTION_STATUS_CHANGE webhook:
If the connection moves to
refresh_required, the user needs to re-authenticate. Surface the user-facing prompt off the account’s status field, then call POST /v0/bank-linking/connections/{connection_id}/repair to get a fresh widget_url and connect_token and re-open the connect widget against the existing connection (it returns 201 Created). Alternatively, POST /v0/bank-linking/connections/{connection_id}/refresh triggers a background refresh of the connection and returns 202 Accepted.
When the user disconnects the account, Sumvin tears down the connection upstream and soft-deletes the corresponding accounts.
DELETE /v0/accounts/{account_id} — Disconnect a linked account.
Endpoint surface
The
/v0/bank-linking/* namespace covers ramp-specific operations (institutions, processor tokens, and connection lifecycle). The /v0/accounts/* namespace covers ongoing account management.
Related
- Atomic Money ramps overview
- Reference
- KYC passthrough — why the widget does not re-verify the user