How it works
One contract in front. An adapter behind it.
The banking app only ever speaks our canonical Banking API. Everything specific to your core lives in one adapter, chosen per tenant by configuration. Swap the adapter and the app, its tests and its security model stay the same.
Architecture
-
The app asks for a resource
The browser calls
GET /. It never learns which core is behind the API, and it never holds a core credential.api/ v1/ accounts/ {id}/ balance -
The API checks the session
The customer comes from the session, not from the URL. Ask for someone else’s account and you get the same 404 as a missing one, plus a denial in the audit trail.
-
The adapter translates
It calls the core with credentials from a Kubernetes Secret, maps the answer to canonical models and keeps decimals as exact strings. Upstream calls time out at 5 seconds; reads retry twice.
-
Writes are never blindly retried
A transfer goes to the core once, with its operation reference as the idempotency key. If the answer is lost, the worker looks the transfer up by that reference instead of sending it again.
The mapping
Same resource, one canonical call, two different cores.
Canonical paths sit under /api/v1 and are scoped to the signed-in customer. The upstream calls are
what each adapter makes today; each adapter release ships its own field-by-field mapping document.
The Mambu adapter is built and tested against a contract mock from Mambu’s published v2 API specification; validation against a live Mambu sandbox is in progress. The CDR adapter is tested against a CDR data-holder test double.
| Resource | App calls (canonical) | mambu-v2 Kesef Bank Fictional bank | cdr-banking Riverbank Fictional bank |
|---|---|---|---|
| Customer | GET / |
GET / |
GET / |
| Accounts and balances | GET /GET /GET / |
GET / |
GET /GET / |
| Transactions | GET / |
GET / |
GET / |
| Loans | GET /GET / |
GET /GET / |
GET / |
| Own-account transfer | POST /POST /GET / |
POST /Idempotency-Key = operation referencePOST / |
Not offered: CDR Banking is read-only |
| Cards | GET /POST /POST / |
Not offered: Mambu v2 has no card freeze | Not offered: no cards endpoint in CDR Banking |
- mambu-v2 Kesef Bank Fictional bank
- cdr-banking Riverbank Fictional bank
-
Customer
- App calls (canonical)
GET /me - mambu-v2 Mambu v2 adapter
GET /clients/ {clientId} - cdr-banking CDR Banking adapter
GET /common/ customer (x-v 1)
-
Accounts and balances
- App calls (canonical)
GET /accounts GET /accounts/ {accountId} GET /accounts/ {accountId}/ balance - mambu-v2 Mambu v2 adapter
GET /deposits? accountHolderType=CLIENT& accountHolderId={clientId} - cdr-banking CDR Banking adapter
GET /banking/ accounts (x-v 2) GET /banking/ accounts/ balances (x-v 1)
-
Transactions
- App calls (canonical)
GET /accounts/ {accountId}/ transactions - mambu-v2 Mambu v2 adapter
GET /deposits/ {id}/ transactions - cdr-banking CDR Banking adapter
GET /banking/ accounts/ {id}/ transactions (x-v 1)
-
Loans
- App calls (canonical)
GET /loans GET /loans/ {loanId} - mambu-v2 Mambu v2 adapter
GET /loans? accountHolderType=CLIENT& accountHolderId={clientId} GET /loans/ {id}/ schedule - cdr-banking CDR Banking adapter
GET /banking/ accounts/ {id} (x-v 4) for lending products
-
Own-account transfer
- App calls (canonical)
POST /transfer-quotes POST /transfers GET /transfers/ {operationId} - mambu-v2 Mambu v2 adapter
POST /Idempotency-Key = operation referencedeposits/ {fromId}/ transfer-transactions POST /deposits/ transactions:search (status lookup by externalId) - cdr-banking CDR Banking adapter
- Not offered: CDR Banking is read-only
-
Cards
- App calls (canonical)
GET /cards POST /cards/ {cardId}/ freeze POST /cards/ {cardId}/ unfreeze - mambu-v2 Mambu v2 adapter
- Not offered: Mambu v2 has no card freeze
- cdr-banking CDR Banking adapter
- Not offered: no cards endpoint in CDR Banking
CDR paths are relative to the data holder’s /cds-au/v1 base. Mambu paths are relative to the tenant’s Mambu v2 API base and are checked against Mambu’s published v2 specification.
Mambu and CDR are named to describe compatibility only; we are not a Mambu partner or a CDR accredited data recipient.
Capabilities
No greyed-out buttons.
Each adapter declares what its core can do. GET /capabilities passes that to the app, which leaves
out any entry point the core can’t serve. The server still checks every action, so a hidden feature is also a
refused one.
mambu-v2GET /api/v1/capabilities
{
"enabledModules": [
"customer", "accounts", "transactions",
"payments", "loans"
],
"transferCurrencies": ["AUD"]
}
Shows Move money and Transfer history.
cdr-bankingGET /api/v1/capabilities
{
"enabledModules": [
"customer", "accounts", "transactions",
"loans"
],
"transferCurrencies": []
}
No transfer or card entry points at all. That’s a difference in the core, not a defect.
Responses abridged to the fields that differ.