open banking

One Link flow in, one API out.

Institution search, OAuth, credential forms, MFA challenges, account selection, and scoped consent all happen inside Link. Your server handles two tokens and then reads normalized accounts, balances, and connection state over POST + JSON.

requests

Search the catalog, then connect an account.

Both samples run against the shipped API. Swap the key for one of your own from the dashboard.

# Browse the catalog the Link modal searches. Filter by country and type.
curl https://connect.feels.money/v1/institutions/search \
-H "Authorization: Bearer $FEELCONNECT_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "monzo",
"types": ["bank"],
"country_codes": ["GB"]
}'

institutions/search matches on the institution name and its search terms, orders by the same popularity that ranks Link’s own results, and caps at 20 institutions per call. An empty query browses the most popular institutions for the filters you passed. The catalog it reads is the one published at /institutions.

the flow

What Link does so you do not have to.

Five screens, one postMessage protocol, and no credential ever reaching your infrastructure.

  • Institution search. Typed groups — banks, payment apps, investments, crypto, business — with real marks served from our origin and monograms as the fallback.
  • Authentication. Whatever the connector needs: an OAuth hand-off, a credential form, a wallet address, or a CSV / OFX / QFX upload. The step type is decided by the connector, not by your code.
  • MFA. Code or question challenges loop until the connector is satisfied. In the sandbox, user_mfa / pass_good with code 1234 exercises the whole path.
  • Account selection. The user picks which accounts to share. Everything else on the login stays invisible to you.
  • Consent. The product scopes from your link_token are shown in plain language before anything is shared, and the accepted set is stored on the item and enforced on every read.
  • Hand-back. The SDK verifies both the origin and the source window of every message, then delivers fc:success { public_token, metadata } to your callback.

catalog

What is in the institution catalog.

Counted from the live catalog this deployment serves — the same rows institutions/search returns.

institutions
938
countries
61
connectors
17
products
9
The twelve largest markets in the catalog by institution count. Being listed means the institution is searchable and routable — connecting it live still needs the relevant provider credentials.
CountryInstitutions in the catalog
United States564
United Kingdom104
Canada32
Germany32
Australia31
European Union25
India23
France20
Spain18
Italy15
Netherlands15
Singapore14

What live coverage actually depends on

FeelConnect does not hold bank connections of its own. Every institution in the catalog carries an ordered chain of connectors, and live traffic goes to the first one whose credentials are present in the deployment you are calling.

Some connectors an operator can switch on alone in minutes — GoCardless Bank Account Data (UK and EU banks, free self-signup under their PSD2 licence), Coinbase, Kraken, PayPal, public-address crypto wallets, and CSV / OFX / QFX import. Others need a signed business relationship before they will serve production data, including Plaid, MX, Finicity, Akoya, and Stripe Financial Connections. Where an institution has no enabled connector, a live call returns provider_error rather than pretending.

The sandbox is the exception and it is always on: test keys resolve to the simulated network regardless of credentials, so the full integration is buildable on day one. See going live for the provider-by-provider breakdown.

handling

How the sensitive parts are handled.

Stated as mechanisms rather than badges: these are properties of the code, not certifications.

  • Provider tokens, stored access tokens, and webhook secrets are encrypted with AES-256-GCM at rest.
  • API keys and item access tokens are kept as SHA-256 lookup hashes with a display prefix and last four — the full value exists once, at creation.
  • Webhook deliveries are signed FC-Signature: v1=hex(hmacSHA256(secret, "timestamp.body")) and must be rejected outside a five-minute window. Retries run at 0s, 1m, 5m, 30m, and 2h.
  • Institution logos are served from this origin, so displaying one never reveals a user’s IP — or which bank they are about to connect — to a third-party CDN.
  • Test keys can never reach a real institution: the registry resolves the test environment to the sandbox regardless of what credentials exist.

The sandbox is the honest place to start: 24 months of deterministic history per item, every product, OAuth and MFA simulation, and no approval queue. Environments and sandbox covers the test credentials and how items are seeded.

faq

Questions developers actually ask.