FAQ

The questions partners ask while integrating Connect, one answer each, with the page that has the detail.

La documentation partenaires est publiée en anglais.

#Do I need an Enable Banking account?

No. We register your production application under our own aggregator account when we approve your partner request, and the sandbox application on staging activates itself. Getting started describes the states you will see.

#Why is the decryption key mandatory? Can I opt out?

No opt-out. Every user's data is sealed to a key, and the only two candidates are yours or one the user's browser makes and unlocks with a passphrase on every visit. The second is what Connect used to do; it made every first-time user invent a passphrase before they could finish, and left you unable to read anything without it. With your key the user approves and meets their bank, nothing else. Your decryption key.

#There are three "private keys" in these docs — which one is mine?

The recipient key, the P-256 pair you generate on the partner page: that one is yours to keep. The relayed user key exists only for users who connected before you had one. The Enable Banking application key is ours to hold for your application. The glossary keeps them apart.

#Can I use the same key on staging and production?

You can, but do not: the production private half never belongs on a staging host. Each environment has its own partner record, so each needs a key installed there; generate a separate pair. Staging and production.

#What do I store per user?

The token response — and nothing else. Every envelope opens with the key your deployment already loads. A user who connected before your key relays their own privateKey; keep it with their token when it arrives, and nowhere otherwise. What to store per user.

#The relay's privateKey is empty — is that an error?

No, it is the normal case: your users' data is sealed to your key, so there is nothing to relay. The Node client 1.1.0 throws missing_private_key, which it checks last, so catch that code and carry on; 1.2.0 returns it with expectPrivateKey: "optional". Relay fields.

#/oauth/authorize answers temporarily_unavailable

Read the error_description: either the decryption key is not installed on this environment (staging and production each need one), or the partner is suspended. Neither is the user's doing. Authorize errors.

#Creating a Connect client answers 409 recipient_key_required

Install the key first; the client button on the partner page is disabled for the same reason. Generate and install it.

#Why form_post and not a query string?

The relay once carried the user's private key, and a key must never ride a URL: query strings land in browser history, proxy logs and Referer headers. The mode stayed for the same reason the two fields did — a stable contract — and form_post is what every OAuth library supports. Relay fields.

Pin code (challenge=pin_code), in every journey. A magic link opens a new tab that then owns the rest of the flow; a typed code keeps the whole thing in the window that started it. A popup cannot work without it. Start the flow.

#How long should my state record live?

45 minutes. A first-time user signs in, consents, picks a bank and passes its strong customer authentication before your callback runs; ten minutes refuses real journeys. The record is single-use, so a longer window costs nothing. Start the flow.

#Connected, but no transactions

Two things, in order: you must ask for the first sync (syncAll() right after the exchange — transactions never arrive on their own), and then wait for it: lastSyncedAt on the connection is null until it finishes. Connected but empty.

#A read answers 401

The key is gone — revoked by you, by the user on their Connected apps page, by a partner suspension, or expired after 365 days. Drop the bundle and offer to connect again; never retry it. When access ends.

#How do I end the bank's sharing permission when a user disconnects?

Revoke the token and send every open consent's connection_id and eb_session_id in that same revoke — the session ids are sealed to your key, so only you can. Read them from both GET /api/connections (the live one) and GET /api/connections/open-consents (the ones a reconnect or an earlier disconnect left open at the bank) — neither list contains the other. Revoking.

#How do I replace my key?

Generate a new one on the partner page and confirm you hold both. Users move onto it at their next Connect; their data follows only when a later full-history sync re-fetches it (re-sealing what it fetched, deleting what it could not), which some banks refuse — so keep the old key until every account has moved, and decrypt with whichever opens an envelope. Replacing your key.

#I lost my private key

Then the data of every user who connected under it is unreadable, by you, by them and by us; there is no reset. Install a new key so new users work, and send existing users through Connect again — their history is re-sealed only where the bank serves a full re-fetch. Why you hold the key.

#Can a user revoke my access without me?

Yes: under Connected apps on their open-banking.io developers page, where a grant made through you is listed under your client's name. Your next read answers 401. When access ends.

#The Mock ASPSP asks me to sign in at enablebanking.com — and then to "Create Account"

Expected, and first-time only: the sandbox bank has a passwordless sign-in of its own, and an empty mock bank offers to create an account. Add one, then restart the flow from your Connect button; the account persists. Quickstart, step 4.

#Can I use the hosted demo with my staging client?

No — it runs on production as a real partner client of its own. Register your own staging client and run the Express example or the demo's source locally. The reference implementation.

#Can my user connect a second bank through Connect?

Not through the flow: the bank picker opens only when the user has no bank connected, and a returning user goes from consent straight to the relay. Write to [email protected] if your product needs more than one bank per user.

#Are there webhooks?

Not yet. Poll GET /api/accounts after a connect and after a sync, at a page view's cadence. Webhooks.

#Where is the demo's source?

The Express example on these pages is the one-file version. The hosted demo's full source — database, ledger, branding — is published alongside it; the reference implementation says where.