The short answer
Why Finicity is different
A refresh cannot grant access to an account the client has not shared. MX and FDE refresh paths also import newly returned accounts. The v3 Finicity refresh path updates stored accounts; use Full Connect when the client wants to share another account. Mastercard distinguishes Full Connect, Lite, and Fix. Full Connect includes account management. Connect Fix handles connection repair, such as credentials or MFA that need attention.Finicity: open Full Connect for the existing client
CallPOST /v3/clients/{client_id}/connections using the client who owns the existing connection and the bank’s v3 catalog institution_id. Routing selects the source; when it selects Finicity, this opens Full Connect using the client’s existing Finicity customer.
Starting this session does not force a new stored connection. Choose the existing bank in the widget and use its add-account option, such as “Add another Chase account”. When Mastercard returns the same institution login, LedgerSync reuses the existing con_FINICITY_* connection. Existing accounts with the same provider account IDs keep their LedgerSync account rows and IDs; a newly shared account receives a new acc_FINICITY_* ID.
1
Start a session for the existing client
Use the same Replace the example IDs with your client’s and institution’s actual IDs. The response is
client_id; do not create another Client. Supply the bank’s ins_... identifier from GET /v3/institutions, not the existing con_... identifier.202 Accepted with an operation_id. There is no source or existing connection_id field to send in this request. An optional allowlisted redirect_url returns the browser to your app; see Redirect flow.2
Read the operation and open widget_url
Read Read
GET /v3/operations/{operation_id} until it succeeds or fails. On success, open result.connection.action.widget_url from the Finicity result. Use result.connection.source to check which source routing selected.Operation
succeeded means the widget URL is ready. It does not mean the client completed account selection or that new accounts have been saved. The returned con_<uuid> is a session placeholder, not a new canonical bank connection ID. Keep your existing con_FINICITY_* ID; see The two id formats.result.connection.action.expires_at for the widget’s expiry. The separate repair link’s lifetime does not apply to this URL.3
Add an account under the existing bank
In Full Connect, select the existing bank and its add-account option. For example, the existing Chase account list includes “Add another Chase account”. Complete any bank authentication or consent steps and share the additional account. The screens and available accounts depend on the institution; an OAuth bank may handle selection on its own site.
4
Re-list accounts and diff
After the client completes the hosted session, allow time for LedgerSync to save the accounts, then re-read
GET /v3/accounts?client_id=... and compare account IDs with your pre-session snapshot, as below. Do not wait for the operation’s placeholder ID to change.When to use reauthorize
UsePOST /v3/connections/{connection_id}/reauthorize when an existing connection needs repair. It takes no body; send Content-Length: 0. The response contains action.reauth_url and action.expires_at. That repair link can be reopened until it expires. Treat it as a bearer link and share it only through a trusted channel. See Handling failed and disconnected for the response example.
For some institutions, including American Express, a Finicity repair can route through MX. Check the repair response’s source: accounts linked through MX have new connection and account IDs, while the original Finicity connection keeps its old ones. List by client_id across sources in that case. This repair behavior is separate from the Full Connect account-addition flow above.
MX and FDE: a refresh is enough
On MX, a refresh triggers a member aggregation, and the aggregation result re-reads the member’s whole account list and inserts anything unknown. On FDE, a refresh re-runs extraction and inserts sub-accounts it has not seen. In both cases the new account lands on the same connection, so yourcon_ id is unchanged and only the new account carries a new acc_ id.
202 Accepted and an operation_id. The pull is asynchronous, and account.refresh.completed fires when it lands. See Keeping data fresh.
Detect the new account: re-list and diff
1
Snapshot the ids you hold
Before you refresh or open the widget, record the set of
id values from GET /v3/accounts?client_id=.... Page through with next_cursor until has_more is false (see Pagination).2
Re-list after the flow
client_id alone also catches accounts on a new connection if the bank login or source changed. Use connection_id only when you deliberately want to limit the result to that connection.3
Diff on id
Any
acc_ ID in the new list that is not in your snapshot is a newly observed LedgerSync account. Persist it, then read its transactions and statements as they become available. Repeating the ID comparison does not add the same record twice. A new ID on another connection can represent a bank account you already know, so do not assume it is a newly opened bank account.- MX and FDE have a cue. Re-list when
account.refresh.completedarrives for that connection. - Finicity has no dedicated account-added event. Re-list after the client completes the widget or returns to your app, allowing time for account ingestion. If needed, repeat account reads with backoff for a bounded period; do not start another hosted session as a polling mechanism.
What does not work
- Using Finicity
/reauthorizeas an account picker. Connect Fix can end with “No action required” on a healthy connection. - Refreshing a Finicity connection to discover missing accounts. The v3 refresh updates accounts already attached to the connection.
- Treating operation success or
connection.activeas proof of addition. Read and compare accounts after the client completes the session. - Treating every initiate call as a new stored connection. The Full Connect flow reuses a matching existing bank login. Choosing a different login can create another connection, so inspect the returned account identities before importing overlapping transaction history.
Connection lifecycle
Statuses, reauthorize vs re-initiate, and the two id formats.
Keeping data fresh
What a refresh does, and what it does not do, per source.
Webhooks
The full event catalog, and what it deliberately does not contain.
Connect a bank
The hosted link and the initiate to active walkthrough.
