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 (when that ships), 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 provider that Sumvin operates means the partner integrates against/v0/accounts/* and /v0/bank-linking/* rather than against Meld directly.
Provider routing
The bank-linking endpoint family is shared across providers. Sumvin chooses Meld or Plaid for a given user based on a feature gate — if the user has the Meld bank-linking entitlement, all/v0/accounts/link* calls route through Meld; otherwise they route through Plaid.
End-to-end flow
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/institutionsInitiate 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 Meld’s hosted institution-connect flow to the user.POST /v0/accounts/linkUser completes the connect flow
The user authenticates with their bank inside the Meld widget. On success, Meld posts
BANK_LINKING_CONNECTION_COMPLETED to Sumvin’s webhook endpoint. This event is informational — account data lands in the next step.Account data arrives
Meld posts
BANK_LINKING_ACCOUNTS_UPDATED with the populated account list. Sumvin upserts each account against the user, mapping Meld’s account types into Sumvin’s account_type taxonomy. The accounts then surface on the list endpoint.GET /v0/accounts/Transactions become available (optional)
For institutions and products that support it, Meld posts
BANK_LINKING_TRANSACTIONS_AGGREGATED (and ..._HISTORICAL_... for backfill). Sumvin triggers a background sync to pull and persist transactions against each account.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 asks Meld to mint 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 Meld delivers BANK_LINKING_ACCOUNTS_UPDATED. 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 on the roadmap. Until then, polling is the supported pattern.
Connection lifecycle
After the initial link, Sumvin tracks the connection’s status from Meld’sBANK_LINKING_CONNECTION_STATUS_CHANGE webhook:
| Meld status | Sumvin account status |
|---|---|
ACTIVE | active |
DEGRADED | active |
RECONNECT_REQUIRED | refresh_required |
DISCONNECTED | disconnected |
ERROR | error |
refresh_required, the user needs to re-authenticate. Repair flows (re-opening the Meld widget against an existing connection) are operated server-side; surface the user-facing prompt based on the account’s status field.
When the user disconnects the account, Sumvin asks Meld to delete the connection and soft-deletes the corresponding accounts.
DELETE /v0/accounts/{account_id} — Disconnect a linked account.
Scope boundary versus Plaid
Both Meld and Plaid bank linking flow through the same/v0/accounts/* endpoint family. The differences:
| Aspect | Meld path | Plaid path |
|---|---|---|
GET /v0/accounts/link/config | provider=meld, requires_institution_selection=true | provider=plaid, requires_institution_selection=false |
POST /v0/accounts/link | Returns 202 Accepted with widget_url | Returns 200 OK with link_token |
| Token exchange | Implicit via webhook | Explicit via POST /v0/accounts/link/exchange |
| Institution discovery | GET /v0/bank-linking/institutions | Plaid Link UI handles it |
| Processor token | POST /v0/bank-linking/accounts/{account_id}/processor-token | Plaid native processor token endpoint |
| Account inheritance | Webhook-driven (BANK_LINKING_ACCOUNTS_UPDATED) | Synchronous from link/exchange response |
/v0/bank-linking/* namespace is currently Meld-specific (institutions, processor tokens). The /v0/accounts/* namespace is provider-agnostic and is where ongoing account management lives.
Related
- Meld overview
- Reference
- Client setup — including how Meld customer records are created on first link
- KYC passthrough — runs on the same customer record