UK Open Banking · BIAN · Go

Open Banking,
decomposed.

A runnable reference that rebuilds the bank as small, independent, consent-first services.

5
Microservices
OBIE
UK Open Banking APIs
BIAN
Service domains
Go 1.25
+ Postgres
~97
Tests, two tiers
What is what

Five services. One trust anchor.

Each capability of the bank is its own service — it owns its data, speaks Open Banking on the wire, and deploys on its own. Nothing is read or paid without an authorised consent that the Consent service has issued.

:8081

Consent

BIAN · Consent Administration

The trust anchor. Owns the lifecycle of every consent — account-access, payment and funds-confirmation — from awaiting → authorised → consumed / revoked. Every other service validates against it.

POST /account-access-consents/authorise/internal/consents/{id}
View repository
:8082

Accounts

OBIE · AISP

Account Information — accounts, balances and transactions, for a consent that permits it.

Repo
:8083

Payments

OBIE · PISP

Payment Initiation — turns a single-use payment consent into an idempotent domestic payment.

Repo
:8084

Funds

OBIE · CBPII

Confirmation of Funds — a yes/no on availability. Asks Accounts; never stores balances itself.

Repo
:8085

Party

BIAN · Party Reference Data

The customer identity behind the accounts — readable only with the ReadParty permission.

Repo
shared library

pkg

vendored into every repo

The shared spine — OBIE response & error envelopes, an exact-decimal money type, HTTP middleware, Postgres helpers and the inter-service clients. Two test tiers: in-memory unit tests, plus Postgres integration tests via testcontainers.

GET /internal/consents/{id} validate validate validate & consume funds available? Consent :8081 · trust anchor Accounts:8082 · AISP Payments:8083 · PISP Funds:8084 · CBPII Party:8085 · Party
Consent is the trust anchor — every service validates against it; Funds also checks balances with Accounts.
Why it matters

Built open. Built safe.

Banking software spent decades as a single, indivisible core. Regulation forced it open — this estate is the architecture that makes the openness standard, safe and sustainable.

01

Standards, not bespoke integrations

Every service speaks the same OBIE contract. A fintech integrates the standard once — not a different proprietary API per bank. Connection cost falls from N×M to N+M.

02

Consent-first, by construction

No service trusts the caller's claim. Each fetches and checks the consent — status, type, permissions, expiry — before acting. Authorisation is a hard gate in code, not a line in a policy.

03

Capabilities as bounded domains

Following BIAN, each capability is an independently ownable service domain with its own data and schema. Teams ship Accounts without touching Payments. The org chart and the architecture finally agree.

04

Replaceable parts, explicit contracts

Behind each service is a clean port: in-memory for tests, Postgres for real, a fake for the upstream. Swap the datastore or rewrite a service — as long as the contract holds.

05

A reference you can run, not just read

It builds, it tests, it boots with zero infrastructure — go run . and you have a working bank service. Turning an abstract standard into something a team can run in a minute is how good architecture actually spreads.

The bank stops being a place you visit — and becomes a set of capabilities you compose.

The thesis of composable, consent-first banking
How banking evolves

Where banking goes next.

The same five-service shape points at where the industry is headed — away from the monolithic core, toward an ecosystem that is embedded, consent-governed, and increasingly acted on by software agents.

01

From a frozen core to a composable bank

When capabilities are independent services, the bank evolves the parts instead of risking the whole. New products become a recombination of existing domains — not another change request against a core no one dares touch.

02

Open ecosystems & embedded finance

Standard, consent-gated APIs let fintechs, marketplaces and non-banks build on the bank's rails. Payments and account insight show up inside the products people already use.

03

Compliance as a feature, not a bolt-on

The consent lifecycle — granted, scoped, time-boxed, revocable, audited — is modelled in the code itself. Regulators get provable control; customers get a clear switch; the bank gets trust it can demonstrate.

04

A foundation for agentic finance

As AI agents begin to move money and read accounts on a customer's behalf, the consent boundary becomes essential infrastructure: an agent operates only within an explicit, permissioned, revocable grant. The same gate that protects a human keeps autonomous software safe.

05

A lower cost of change

Swap Postgres for another store, add a second market's API flavour (Berlin Group, FDX), split a hot domain or scale it alone — each is a local move behind a stable contract, not a bank-wide migration. Evolution becomes routine instead of existential.

Get the code

One repo per service.

Each repository is fully self-contained — its own SQL migrations, a vendored copy of the shared library, a Dockerfile and tests — so it clones and builds on its own.

openbank-consentConsent lifecycle · :8081 openbank-accountsAISP · accounts / balances / transactions · :8082 openbank-paymentsPISP · domestic payments · :8083 openbank-fundsCBPII · confirmation of funds · :8084 openbank-partyParty reference data · :8085
Run any service in one command — zero infrastructure
# clone a service and start it with an in-memory store
git clone https://github.com/Sreenivas-Sadhu-Prabhakara/openbank-consent.git
cd openbank-consent && go run .

# a consent-first journey: create → authorise → use
curl -X POST localhost:8081/account-access-consents \
  -d '{"Data":{"Permissions":["ReadBalances","ReadParty"]},"Risk":{}}'
curl -X POST localhost:8081/internal/consents/{id}/authorise
curl localhost:8082/accounts -H "x-consent-id: {id}"
Questions

Open Banking, explained.

Short answers to what OBIE, BIAN and consent-first microservices actually mean — and what this reference is (and isn't).

What is Open Banking (OBIE)?
Open Banking is a UK regulatory standard, defined by the Open Banking Implementation Entity (OBIE), that lets customers securely share bank data and initiate payments through authorised third parties using standard APIs instead of screen-scraping. openbank-bian implements the OBIE Read/Write Account, Transaction and Payment Initiation APIs.
What is BIAN, and how does it relate to Open Banking?
BIAN (Banking Industry Architecture Network) is a reference framework that decomposes a bank into independent service domains. openbank-bian maps the OBIE APIs onto BIAN service domains — Consent Administration, Payment Order and Party Reference Data — so each capability is an independently deployable microservice.
What do AISP, PISP and CBPII mean?
They are the three regulated Open Banking roles. AISP (Account Information Service Provider) reads accounts, balances and transactions; PISP (Payment Initiation Service Provider) initiates payments; CBPII (Card-Based Payment Instrument Issuer) checks confirmation of funds. openbank-bian ships one service per role plus a central Consent service.
What does a “consent-first” architecture mean?
Every service independently fetches and validates an authorised consent — its status, type, permissions and expiry — before reading data or moving money. Authorisation is enforced in code as a hard gate, never assumed from the caller.
Is openbank-bian production-ready?
No — it is an educational reference implementation. The FAPI security profile (OAuth2/OIDC, MTLS, signed request objects) is intentionally stubbed, and it is not affiliated with or certified by OBIE / Open Banking Limited or BIAN. Do not use it as-is for real customer data or live payments.
What stack does it use, and can I run it without infrastructure?
It is built as Go 1.25 microservices with an optional Postgres backend and ~97 tests across two tiers (in-memory unit tests plus Postgres integration tests via testcontainers). Each service runs with zero infrastructure: git clone, go run ., and an in-memory store boots a working Open Banking service in seconds.