Connections
List, read, and remove a user's linked bank connections.
Connections
A connection represents one bank a user has linked to Financy — the
authorized link to that bank, not the money inside it. One connection exposes
several Accounts, and each account has its Transactions. Once a
connection exists, that data becomes readable through the API.
New to the model? Core Concepts defines every entity and explains theconnection vs. account distinction in full.
Connections can be created only through the Financy UI — never via the
API. Users link a bank through the hosted consent journey (or as part of apayment flow). This API lets you list, read, refresh, and delete
connections; there is no create endpoint — bank linking requires the
interactive consent journey.If you need to create connections programmatically (e.g. to aggregate your
customers' data at scale), that's available on the Open Finance platform,
our B2B product — contact us to get access.
All endpoints require a Bearer token — see Authentication. Failed requests
return the standard error shape — see Errors (deleting a connection can also
return 423 Locked).
| Endpoint | Purpose |
|---|---|
GET /v2/connections | List the user's connections. |
GET /v2/connections/{connectionId} | Read one connection. |
DELETE /v2/connections/{connectionId} | Remove a connection. |
POST /chat/connections/refresh | Refresh all connections on demand. Full URL: https://api.open-finance.ai/chat/chat/connections/refresh. |
List connections
GET https://api.open-finance.ai/v2/connections
| Query param | Description |
|---|---|
status | Filter by status, e.g. ACTIVE. |
limit | Max documents to return. |
sort | 1 ascending, -1 descending. |
nextPage | Pagination cursor from the previous response. |
customerId | Filter to a customer (business/national ID) from extended journeys. |
contactId | Filter to a contact phone number from extended journeys. |
Request
curl "https://api.open-finance.ai/v2/connections?status=ACTIVE&limit=20" \
-H "Authorization: Bearer <accessToken>"Response
{
"count": 1,
"nextPage": null,
"items": [
{
"id": "01J8CONN...",
"providerId": "hapoalim",
"status": "ACTIVE",
"mode": "PSD2",
"accounts": 2,
"cards": 1,
"savings": 0,
"loans": 0,
"transactions": 431,
"expiryDate": "2026-10-01T00:00:00.000Z",
"createdAt": "2026-07-01T09:12:00.000Z"
}
]
}| Field | Description |
|---|---|
count | Number of connections returned in items. |
nextPage | Cursor for the next page; null when there are no more. |
items | Array of connection objects (see below). |
Get a connection
GET https://api.open-finance.ai/v2/connections/{connectionId}
curl "https://api.open-finance.ai/v2/connections/01J8CONN..." \
-H "Authorization: Bearer <accessToken>"Key fields on a connection:
| Field | Description |
|---|---|
id | The connection id — pass it as connectionId when filtering accounts/transactions. |
providerId | The linked bank (see Providers & Branches). |
status | Connection status (see the table below). |
mode | PSD2 (open banking) or PLAID. |
accounts / cards / savings / loans / securities | Count of each account type on the connection. |
transactions | Number of transactions collected. |
expiryDate | When the consent expires and needs renewing. |
startDate / lastFetchedDataDate | Data window: earliest collected date and last fetched date (day-granular). |
lastFetchedAt | Full ISO timestamp of the last completed fetch/refresh attempt (success or error). Advances on every attempt, so it can be polled to detect when a refresh finished. |
createdAt / updatedAt | Timestamps in UTC. |
Status values
| Status | Meaning |
|---|---|
CONNECTED | Successfully linked; the consent journey completed. |
ACTIVE | A recurring connection — accounts and transactions refresh daily. |
COMPLETED | A one-time connection — all accounts and transactions were fetched once. |
FETCHING | Connecting to the institution / collecting data. |
INACTIVE | Initialized but dormant, awaiting user action. |
PARTIALLY_AUTHORIZED | Awaiting additional account-owner approvals (5-day window). |
REPLACED | Superseded by a newer connection from the same provider. |
EXPIRED | Consent lapsed — no longer usable. |
REVOKED | The user revoked consent at the provider. |
TERMINATED_BY_USER | The user ended the connection. |
SUSPENDED_BY_PROVIDER | The provider suspended the consent. |
REJECTED | The account owner declined consent at the provider. |
CREDENTIALS_ERROR | Authentication with the bank failed. |
FETCHING_ERROR / ERROR | A processing/retrieval error occurred; see the error field. |
UNKNOWN | State could not be determined. |
CONNECTED,ACTIVE, andCOMPLETEDmean data is readable.ACTIVEstayson the automatic refresh schedule;
COMPLETEDwas a single fetch and will
not update. Treat every other status as "cannot read fresh data right now"
and, once consent hasEXPIRED/ beenREVOKED, prompt the user to reconnect
in the Financy UI.
Refresh connections
POST https://api.open-finance.ai/chat/chat/connections/refresh
Triggers an on-demand refresh of every refreshable connection the user has,
independent of the automatic schedule. This is the same "Refresh now" action
offered in the Financy UI.
Automatic refresh is plan-dependent, not a flat 6-hour pull for everyone.
The aggregation cron ticks every 6 hours starting in the morning
(Asia/Jerusalem). Each plan spends its daily allowance across those ticks:
- Free / Starter — one automatic pass, in the morning.
- Pro — four automatic passes (every 6 hours from the morning).
- Starter can add extra daily slots in Settings (up to four/day).
On-demand refresh does not consume that daily allowance.
Different base path — and the doubled/chatis real. The refreshendpoint is served by the chat API Gateway, not
/v2. That gateway is
mounted athttps://api.open-finance.ai/chat(basePath: chat) and the
route itself is/chat/connections/refresh, so the public URL is
https://api.open-finance.ai/chat/chat/connections/refresh. A request to
/chat/connections/refresh(one/chat) is404. Authentication is
unchanged: the same OAuth2 client-credentialsBearertoken, with the
read:connectionsscope.
A flat 20 credits are charged on accept — debited from the organization's
credit balance, separate from the daily update quota. The call enqueues and
returns immediately (it does not wait for the banks); poll each connection's
lastFetchedAt to detect completion, typically within 1–2 minutes. A refresh
already in flight returns 200 with already_running and is not charged again.
Request
curl -X POST "https://api.open-finance.ai/chat/chat/connections/refresh" \
-H "Authorization: Bearer <accessToken>"Responses
| Status | Body status | Meaning |
|---|---|---|
200 | accepted | Refresh enqueued. Poll lastFetchedAt for completion. |
200 | already_running | A refresh was already in flight — not charged again. |
402 | insufficient_credits | Not enough credits (the response includes cost). |
409 | no_refreshable_connections | The user has no refreshable connection — reconnect a bank first. |
Delete a connection
DELETE https://api.open-finance.ai/v2/connections/{connectionId}
Removes the connection for the current user.
curl -X DELETE "https://api.open-finance.ai/v2/connections/01J8CONN..." \
-H "Authorization: Bearer <accessToken>"Next: read the balances and details of a connection's Accounts.
Updated 10 days ago

