v2.2-rc2 is not ratified and MUST NOT be used for production. Current: v2.1. Changelog
This is v2.2-rc2 — a release candidate for the v2.2 standards, published for review and not yet ratified. It MUST NOT be used as the basis for a production implementation. For the current standards, switch to v2.1 using the version selector. See the v2.1 → v2.2-rc2 changelog for every change in this version.
Bank Data Sharing — Requirements v2.2-rc215 min read
The validation rules that apply to Bank Data Sharing. The Validated by column on each table indicates where each rule is enforced. Read alongside the Consent requirements and the User Journeys.
All requests require an active Trust Framework application with the BDSP role, a valid transport certificate presented on every request via mTLS, and an active signing key for JWT signing.
Consent Creation
/paraud, signing algorithm (PS256), and expiry window.client_assertionclient_assertion_type: urn:ietf:params:oauth:client-assertion-type:jwt-bearer). Authenticates the TPP application — see Client Assertion.scope (in Request JWT)accounts openid.authorization_details[0].type (in Request JWT)urn:openfinanceuae:account-access-consent:v2.2.authorization_details[0].type (e.g. urn:openfinanceuae:account-access-consent:v2.2) restricts the version of the Account Information endpoints the consent can be used to call (specified in the path, e.g. /open-finance/v2.2/accounts). It MUST resolve to an ApiVersion the LFI has published in the Trust Framework for the Account Information API family./par OpenAPI schema. No additional or undocumented parameters are permitted.consent.AccountTypeAccountTypes flag on the LFI's authorisation server entry in the Trust Framework.consent.AccountSubTypeAccountSubTypes metadata on the LFI's authorisation server entry in the Trust Framework.consent.PermissionsReadBalances, ReadBeneficiariesBasic, ReadBeneficiariesDetail, ReadTransactionsBasic, ReadTransactionsDetail, ReadProduct, ReadScheduledPaymentsBasic, ReadScheduledPaymentsDetail, ReadDirectDebits, ReadStandingOrdersBasic, ReadStandingOrdersDetail, ReadStatements, or ReadProductFinanceRates are included, at least one of ReadAccountsBasic or ReadAccountsDetail must also be present.consent.Permissions — ReadProductFinanceRatesReadProductFinanceRates MUST only be requested by TPPs that hold the Access Encrypted Resource Data optional certification with Nebras. An uncertified TPP MUST NOT include this permission in authorization_details; if it does, the API Hub rejects the consent. Only certified TPPs are permitted to receive product finance rates, whether the LFI returns them in cleartext or as an encrypted JWE.consent.Permissions (unsupported)/accounts/{AccountId}/standing-orders published to the Trust Framework yet the consent request includes ReadStandingOrdersBasic or ReadStandingOrdersDetail), the consent validation will fail.consent.BaseConsentIdBaseConsentId, the TPP must reuse that same BaseConsentId rather than the immediate prior ConsentId.consent.ExpirationDateTimeconsent.AuthorizationExpirationDateTime, which must be more than 15 minutes in the future and must not be after consent.ExpirationDateTime.x-fapi-interaction-idList Accounts
/accountsAuthorizationaccounts openid scope. The consent bound to the token must be in Authorized status and the ExpirationDateTime of the Consent must be in the future.v2.2 in /open-finance/account-information/v2.2/accounts) must match the version in the consent's authorization_details[0].type (urn:openfinanceuae:account-access-consent:v2.2).consent.PermissionsReadAccountsBasic or ReadAccountsDetail.x-fapi-interaction-idx-fapi-auth-dateTue, 11 Sep 2012 19:43:31 UTC.x-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount, Savings, CreditCard, Finance, Mortgage.Get Account
/accounts/{AccountId}Authorizationaccounts openid scope. The consent bound to the token must be in Authorized status and the ExpirationDateTime of the Consent must be in the future.authorization_details[0].type.consent.PermissionsReadAccountsBasic or ReadAccountsDetail.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount, Savings, CreditCard, Finance, Mortgage.Get Balances
/accounts/{AccountId}/balancesAuthorizationaccounts openid scope. The consent bound to the token must be in Authorized status and not expired.consent.PermissionsReadBalances.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount, Savings, CreditCard, Finance, Mortgage.Get Beneficiaries
/accounts/{AccountId}/beneficiariesAuthorizationAuthorized consent.consent.PermissionsReadBeneficiariesBasic or ReadBeneficiariesDetail.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount and Savings accounts. Not available for CreditCard, Finance, or Mortgage accounts.Get Direct Debits
/accounts/{AccountId}/direct-debitsAuthorizationAuthorized consent.consent.PermissionsReadDirectDebits.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount and Savings accounts.Get Product
/accounts/{AccountId}/productAuthorizationAuthorized consent.consent.PermissionsReadProduct. ReadProductFinanceRates is required for finance rate data to be included in the response, and is only available to TPPs holding the Access Encrypted Resource Data certification — see Consent Creation.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.ReadProductFinanceRates, the TPP MUST only call this endpoint from an active customer-facing session — the customer must be using the TPP application at the time of the call. Background or scheduled calls are not permitted on a consent that carries ReadProductFinanceRates, because the encrypted-rate flow requires the customer to receive and enter the one-time code in real time. Consequently x-fapi-customer-ip-address and x-fapi-auth-date MUST be set on every such call.x-fapi-interaction-idx-fapi-auth-dateReadProductFinanceRates, because such calls are always customer-present.x-fapi-customer-ip-addressReadProductFinanceRates, because such calls are always customer-present.x-customer-user-agentAccountSubTypeFinanceRates — key requestFinanceRates is returned as a JWE, the TPP must prompt the User to enter the encryption key delivered to them by the LFI (e.g. via SMS or push notification) before decryption can proceed.FinanceRates — local decryptionFinanceRates — data usageFinanceRates — expiryexp value in the JWE header and discard any decrypted data once the expiry threshold has passed. If the data is still required, the TPP must repeat the API operation to retrieve a fresh response — the original consent must still be valid for this to succeed.FinanceRates — session discardexp has been reached.Get Scheduled Payments
/accounts/{AccountId}/scheduled-paymentsAuthorizationAuthorized consent.consent.PermissionsReadScheduledPaymentsBasic or ReadScheduledPaymentsDetail.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount and Savings accounts.Get Standing Orders
/accounts/{AccountId}/standing-ordersAuthorizationAuthorized consent.consent.PermissionsReadStandingOrdersBasic or ReadStandingOrdersDetail.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeCurrentAccount and Savings accounts.Get Transactions
/accounts/{AccountId}/transactionsAuthorizationAuthorized consent.consent.PermissionsReadTransactionsBasic or ReadTransactionsDetail. ReadFXTransactionsBasic, ReadFXTransactionsDetail, or ReadFXRemittanceCharges are required for FX transaction data to be included.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.fromBookingDateTime00:00:00) and must not be after toBookingDateTime. A contradictory range is rejected with 400 Resource.InvalidFormat. Any timezone offset is ignored when filtering.toBookingDateTime00:00:00) and must not be in the future. A future toBookingDateTime is rejected with 400 Resource.InvalidFormat. Any timezone offset is ignored when filtering.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeGet Statements
/accounts/{AccountId}/statementsAuthorizationAuthorized consent.consent.PermissionsReadStatements.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.fromStatementDatetoStatementDate. A contradictory range is rejected with 400 Resource.InvalidFormat. Filtering is open-ended if not provided.toStatementDatetoStatementDate is rejected with 400 Resource.InvalidFormat. Filtering is open-ended if not provided.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeGet Account Parties
/accounts/{AccountId}/partiesAuthorizationAuthorized consent.consent.PermissionsReadParty, ReadPartyUser, ReadPartyUserIdentity, or ReadPartyIdentity.AccountIdGET /accounts under the same consent. See Account Access Validation for the response when the customer does not hold the account.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeGet Parties
/partiesAuthorizationAuthorized consent.consent.PermissionsReadParty, ReadPartyUser, ReadPartyUserIdentity, or ReadPartyIdentity.x-fapi-interaction-idx-fapi-auth-datex-fapi-customer-ip-addressx-customer-user-agentAccountSubTypeAccount Access Validation
AccountId is not held by the customer who authorized the consent403 with errorCode: Consent.PermanentAccountAccessFailure and errorMessage: The account is permanently inaccessible.Account Status Handling
ActiveInactive, Dormant, Suspended403 with errorCode: Consent.AccountTemporarilyBlocked and errorMessage: The account is temporarily blocked.Unclaimed, Deceased, Closed403 with errorCode: Consent.PermanentAccountAccessFailure and errorMessage: The account is permanently inaccessible.