PSD2

Overview

Sparebanken Norge and Bulder Bank offers PSD2 services by use of our PSD2 APIs based on the Berlin Group NextGenPSD2 standard, as a dedicated PSD2 interface for all TPPs. Note that Sparebanken Norge is operating on two separate PSD2 interfaces until the technical merger of Sparebanken Vest and Sparebanken Sør is completed as planned in Q4 2026:

  1. Sparebanken Norge (Sør) (former Sparebanken Sør) is operating on Tieto Evry Open Banking Portal https://openbanking.sor.no/developer/

  2. Sparebanken Norge (former Sparebanken Vest) and Bulder Bank offers PSD2 services by use of PSD2 APIs https://developer.spvapi.no/documentation/psd2/ based on the Berlin Group NextGenPSD2 standard, as a dedicated PSD2 interface for all TPPs.

One common PSD2 interface is currently planned in Q4 2026. We will inform all TPPs well ahead of the technical merger into one common interface.

Sparebanken Norge and Bulder Bank’s dedicated interfaces (APIs) are continously being developed. We strive to provide interfaces that suits the use cases of all our TPPs, enabling good customer experiences for our common customers.

Please see TPP requirements for accessing APIs below.

Important notice to TPPs using our ordinary interfaces: During the early development of our PSD2 APIs in 2019-2020 as our dedicated PSD2 interface, some TPPs connected to our ordinary interfaces as the only (or primary) interface of their PSD2 services. We strongly advice all TPPs using our ordinary interfaces as the only (or primary) interface for their PSD2 services, to start the transition to our dedicated interface in our PSD2 APIs as the primary interface of their PSD2 services. Sparebanken Norge and Bulder Bank will offer PSD2 services by use of our PSD2 APIs as a dedicated PSD2 interface for all TPPs.

TPP Requirements for PSD2 APIs

In order to authenticate towards Sparebanken Norge and Bulder Banks PSD2 APIs in production, the TPP must:

  • Be in possession of one or more valid, qualified QWAC eIDAS certificates in accordance with ETSI TS 119 495
  • Use a QWAC certificate to establish mutually authenticated TLS connections (mTLS)
  • Support at least TLS 1.2, and strong cipher suites (subject to continuous change)

Subscribe to updates at our status page

Information about ongoing incidents, planned maintenance and change announcements will be published on our statuspage. We recommend that you subscribe to these updates to stay informed.

Account Information Services (AIS)

With these services you will be able to retrieve balances and transactions from your end users’ account. Read about our account information services here

The difference between the two endpoints is mainly the SCA solution and each endpoint uses each bank’s respective SCA solution.

Endpoint for dedicated interface Sparebanken Norge: https://psd2.spvapi.no

Endpoint for dedicated interface Bulder Bank: https://psd2-bulder.spvapi.no

Request Limits

The header PSU-IP-Address must be present when a PSU is requesting information. PSU-IP-Address shall be the IP address of the device used by the PSU to access the TPP service. If the TPP wants to make a request without a PSU present, the PSU-IP-Address header shall not be set.

There are cases where a TPP can make requests without the PSU-IP-Address that does not generally require SCA. However, some restrictions apply:

  • GET /v1/accounts is limited to

    • No more than 4 calls per 24-hour period
    • Accounts for which the PSU has given consent to access
  • GET /v1/accounts/{accountId}/balances is limited to

    • No more than 4 calls per 24-hour period
    • Accounts for which the PSU has given consent to access
  • GET /v1/accounts/{accountId}/transactions is limited to

    • No more than 4 calls per 24-hour period
    • Transactions no more than 90 days old

Payment Initiation Services (PIS)

These services allows end users to initiate payments from their accounts at Sparebanken Norge. The service will ask for a strong customer authentication as long as no exemption is applied. Read about our payment initiation services here

The difference between the two endpoints is mainly the SCA solution and each endpoint uses each bank’s respective SCA solution.

Endpoint for dedicated interface Sparebanken Norge: https://psd2.spvapi.no

Endpoint for dedicated interface Bulder Bank: https://psd2-bulder.spvapi.no

Status Codes

Non-final payment status codes are updated asynchronously, which is why you need to poll for status updates after payment user approval. Different payment products have different statuses, and SCA exemptions may result in instantly completed payments. See XS2A Framework Implementation Guidelines, Sections 14.12 and 14.13 for details on the payment statuses.

Status Codes Description

Code Name ISO 20022 Definition Instruction
ACSC AcceptedSettlementCompleted Settlement on the debtor’s account has been completed. No need for further polling
ACCC AcceptedCreditSettlementCompleted Settlement on the creditor’s account has been completed. No need for further polling
ACCP AcceptedCustomerProfile The preceding technical validation and customer profile checks have been successful. Not in use
ACSP AcceptedSettlementInProcess All preceding checks, such as technical validation and customer profile were successful and payment initiation has been accepted for execution. Consider polling
ACTC AcceptedTechnicalValidation Authentication and syntactical and semantical validations have been successful. No need for further polling
ACWC AcceptedWithChange The instruction has been accepted but a change will be made, such as date or remittance not sent. No need for further polling
ACWP AcceptedWithoutPosting The payment instruction included in the credit transfer has been accepted without being posted to the creditor customer’s account. No need for further polling
ACFC AcceptedFundsChecked The preceding check of technical validation and customer profile have been successful and the automatic funds check was positive. Not in use
RCVD Received Payment initiation has been received by the bank. Continue polling
PART PartiallyAccepted A number of transactions have been accepted, but some transactions have not yet achieved ‘accepted’ status. This code may be used only in case of bulk payments. It is only used in a situation where all mandated authorisations have been applied, but some payments have been rejected. Continue polling
PATC PartiallyAcceptedTechnicalCorrect The payment initiation needs multiple authentications, where some but not yet all have been performed. Syntactical and semantical validations have been successful. Continue polling
PDNG Pending The payment initiation or individual transaction included in the payment initiation is pending. Further checks and a status update will be performed. Continue polling
RJCT Rejected Payment initiation or an individual transaction included in the payment initiation has been rejected. No need for further polling
CANC Cancelled Payment initiation has been cancelled before execution No need for further polling

Payment Status Transitions

These are the status transitions that you most commonly will see, and which it makes sense to act upon as a TPP. Note that RJCT is not part of these flows as it can happen at any time before ACSC, and should thus be handled generally as an error.

Normal payment

In general, payments should be expected to follow this state flow.

Step Code Next Action Updatable Comment
1 RCVD Start authorisation Yes Authorize if startAuthorisation link is present
2 ACSP or PDNG Poll until next status Yes (ACSP) / N (PDNG) PDNG if due date is current date
3 ACSC N/A No Payment is completed
Payment with instant completion

Some payments get completed instantly which means polling for status is irrelevant.

Step Code Next Action Updatable Comment
1 RCVD Start authorisation Yes Authorize if startAuthorisation link is present
2 ACSC N/A No Payment is completed
Payment with SCA Exemption
Step Code Next Action Updatable Comment
1 ACSP or PDNG Poll until next status Yes (ACSP) / No (PDNG) PDNG if due date is current date
2 ACSC N/A No Payment is completed
Payment without posting to creditor’s account
Step Code Next Action Updatable Comment
1 RCVD Start authorisation Yes Authorize if startAuthorisation link is present
2 ACWP N/A No Payment is completed
Payment with multiple signatures required
Step Code Next Action Updatable Comment
1 RCVD Start authorisation Yes Authorize if startAuthorisation link is present
2 PATC Start authorisation again for next PSU Yes
3 ACSP Poll until next status Yes
4 ACSC N/A No Payment is completed
Periodic payment
Step Code Next Action Updatable Comment
1 RCVD Start authorisation Yes Authorize if startAuthorisation link is present
2 ACSP N/A Yes
Cancel Payment Before Payment Authorisation
Step Code Next Action Updatable Comment
1 RCVD Delete Yes
2 CANC N/A No Payment is cancelled

Error Codes and Responses

The XS2A Framework Implementation Guidelines describes the error codes and responses that are used in the Berlin Group NextGenPSD2 standard. The error codes are described in detail in the Berlin Group NextGenPSD2 documentation. Those lists can be found below where “Message Code” is the value of the code field in the API response.

Service Unspecific Error Codes

Message Code HTTP Response Code Description
CERTIFICATE_INVALID 401 The contents of the signature/corporate seal certificate are not matching PSD2 general PSD2 or attribute requirements.
ROLE_INVALID 401 The TPP does not have the correct PSD2 role to access this service.
CERTIFICATE_EXPIRED 401 Signature/corporate seal certificate is expired.
CERTIFICATE_BLOCKED 401 Signature/corporate seal certificate has been blocked by the ASPSP or the related NCA.
CERTIFICATE_REVOKED 401 Signature/corporate seal certificate has been revoked by QSTP.
CERTIFICATE_MISSING 401 Signature/corporate seal certificate was not available in the request but is mandated for the corresponding field.
SIGNATURE_INVALID 401 Application layer eIDAS Signature for TPP authentication is not correct.
SIGNATURE_MISSING 401 Application layer eIDAS Signature for TPP authentication is mandated by the ASPSP but is missing.
FORMAT_ERROR 400 Format of certain request fields are not matching the XS2A requirements. An explicit path to the corresponding field might be added in the return message. This applies to headers and body entries. It also applies in cases where entries are referring to erroneous or non-existing data instances, e.g. a malformed IBAN.
PARAMETER_NOT_CONSISTENT 400 Parameters submitted by TPP are not consistent. This applies only for query parameters.
PARAMETER_NOT_SUPPORTED 400 The parameter is not supported by the API provider. This code should only be used for parameters that are described as “optional if supported by API provider.”
PSU_CREDENTIALS_INVALID 401 The PSU-ID cannot be matched by the addressed ASPSP or is blocked, or a password response OTP was not correct. Additional information might be added.
SERVICE_INVALID 400 (if payload) or 405 (if HTTP method) The addressed service is not valid for the addressed resources or the submitted data.
SERVICE_BLOCKED 403 This service is not reachable for the addressed PSU due to a channel independent blocking by the ASPSP. Additional information might be given by the ASPSP.
CORPORATE_ID_INVALID 401 The PSU-Corporate-ID cannot be matched by the addressed ASPSP.
CONSENT_UNKNOWN 403 (if path) or 400 (if payload) The Consent-ID cannot be matched by the ASPSP relative to the TPP.
CONSENT_INVALID 401 The consent was created by this TPP, but is not valid for the addressed service/resource.
CONSENT_EXPIRED 401 The consent was created by this TPP, but has expired and needs to be renewed.
RESOURCE_UNKNOWN 404 (if account-id in path), 403 (if other resource in path) or 400 (if payload) The addressed resource is unknown relative to the TPP. An example for a payload reference is creating a signing basket with an unknown resource identification.
RESOURCE_EXPIRED 403 (if path) or 400 (if payload) The addressed resource is associated with the TPP but has expired, not addressable anymore.
RESOURCE_BLOCKED 400 The addressed resource is not addressable by this request since it is blocked e.g. by a grouping in a signing basket.
TIMESTAMP_INVALID 400 Timestamp not in accepted time period.
PERIOD_INVALID 400 Requested time period out of bound.
SCA_METHOD_UNKNOWN 400 Addressed SCA method in the Authentication Method Select Request is unknown or cannot be matched by the ASPSP with the PSU.
STATUS_INVALID 409 The addressed resource does not allow additional authorisation.

Payment Initiation Service Specific HTTP Error Codes

Message Code HTTP Response Code Description
PRODUCT_INVALID 403 The addressed payment product is not available for the PSU .
PRODUCT_UNKNOWN 404 The addressed payment product is not supported by the ASPSP.
PAYMENT_FAILED 400 The payment initiation POST request failed during the initial process. Additional information may be provided by the ASPSP.
KID_MISSING 400 The payment initiation has failed due to a missing KID. This is a specific message code for the Norwegian market, where ASPSP can require the payer to transmit the KID.
KID_INVALID 400 The payment initiation has failed due to an invalid KID. This is a specific message code for the Norwegian market, where ASPSP can require the payer to transmit the KID.
EXECUTION_DATE_INVALID 400 The requested execution date is not a valid execution date for the ASPSP.
CANCELLATION_INVALID 405 The addressed payment is not cancellable e.g. due to cut off time passed or legal constraints.

Account Information Service Specific HTTP Error Codes

Message Code HTTP Response Code Description
SESSIONS_NOT_SUPPORTED 400 The combined service flag may not be used with this ASPSP.
ACCESS_EXCEEDED 429 The access on the account has exceeded the consented frequency without PSU involvement per day.
REQUESTED_FORMATS_INVALID 406 The requested formats in the Accept header entry do not match the offered formats.

Signing Basket Specific HTTP Error Codes

Message Code HTTP Response Code Description
REFERENCE_MIX_INVALID 400 The used combination of referenced objects is not supported in the ASPSPs signing basket function.
REFERENCE_STATUS_INVALID 409 At least one of the references is already fully authorised.

Sandbox Environment for PSD2 APIs

A sandbox environment for the dedicated PSD2 interface is available. The sandbox environment has the same TPP requirements for use as our production environment. (At the moment we do not trust test QWACs) No sign-up or registration is needed. The Sandbox environment covers both Sparebanken Norge, and Bulder Banks API experience. It only provides a single sandbox SCA solution.

For more information about the sandbox environment check this Github repository.

Endpoint for sandbox interface: https://psd2-sandbox.spvapi.no

Details for Contingency Solution

Authentication when using our ordinary interfaces for PSD2 access to accounts

Third Party Providers (TPPs) must authenticate themselves before accessing the Payment Service User’s (PSUs) online banking data. There is no “natural” approach to this in traditional user centric online banking websites, so a more untraditional authentication approach needs to be taken for this access.

This access will also be our fallback solution until we are exempted from having a fallback.

Requirements for TPPs using Sparebanken Norge’s fallback mechanism

For every HTTP request made to Sparebanken Norge, the following two request headers must be included:

SPV-PSD2-Fallback-TPP-Cert: Base64 encoded JWK Qseal certificate

The TPPs Qseal certificate (including intermediates) must be presented in the JSON Web Key (JWK) format, using the “x5c” (X.509 Certificate Chain) Parameter (see RFC 7517, Section 4.7). The JWK should be UTF-8 encoded and then Base64 encoded for inclusion in the HTTP header.

SPV-PSD2-Fallback-TPP-Qseal: TPP issued JWT

To prove possession of the Qseal certificate private key, a JSON Web Token (JWT) must be constructed. It must be signed with the Qseal private key, using one of the following algorithms (see RFC 7518, Section 3.1):

  • RS256 (RSASSA-PKCS1-v1_5 using SHA-256)
  • ES256 (ECDSA using P-256 and SHA-256)

The JWT must include the following header fields (kid/x5t are example values only):

{
  "alg": "RS256",
  "kid": "E7B3AE9190916FDB58091EEE5FA7A55B56A736B3",
  "x5t": "57OukZCRb9tYCR7uX6elW1anNrM",
  "typ": "JWT"
}

The JWT must include the following claims:

  • “iss”: The full name of the TPP, as registered in the Qseal certificate.
  • “aud”: spv fallback prod for production use
  • “exp”: Expiry must be set to no longer than one hour from the time the token was issued. (A new token should be created after one hour, if needed).
  • “nbf”: Not before, should be set to the time of issuance.
  • “iat”: Issued at, should be set to the time of issuance.
  • “jti”: JWT ID - a 128-bit randomly generated ID.

Inclusion of both headers enables us to verify that the TPP has a valid Qseal certificate and also controls its private key.