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
Bank linking is gated by the Meld bank-linking entitlement on the user. Without it, calls return403 Forbidden with error code GATE-403-001.
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.
Endpoint surface
| Aspect | Endpoint |
|---|---|
| Link configuration | GET /v0/accounts/link/config — provider=meld, requires_institution_selection=true |
| Institution discovery | GET /v0/bank-linking/institutions |
| Initiate link | POST /v0/accounts/link — returns 202 Accepted with widget_url |
| Token exchange | Implicit via Meld webhook (BANK_LINKING_ACCOUNTS_UPDATED) |
| Processor token | POST /v0/bank-linking/accounts/{account_id}/processor-token |
| Account management | /v0/accounts/* — list, get, sync, delete |
/v0/bank-linking/* namespace covers Meld-specific operations (institutions, processor tokens). The /v0/accounts/* namespace covers ongoing account management.
Related
- Meld overview
- Reference
- KYC passthrough — why the widget does not re-verify the user