Payment Initiation API Specification - v1.1.0

Payment Initiation API Specification - v1.1.0

Version Control

Version

Date

Author

Comments

Version

Date

Author

Comments

1.0.0

23 Jun 2017

Open Banking Read/Write API Team

This is the Baseline version. No Changes from v1.0-rc4.

1.1.0

31 Aug 2017

Open Banking Read/Write API Team

Includes 9 fixes, 5 clarifications and 14 enhancements. Please see the release note for details. Changes from v1.1-rc2: More explicit wording around Non-Repudiation not to be implemented for v1.x

Release Note

This release note explains what's new in the Payment Initiation API Specifications v1.1.0.

Fixes

  • In Accounts Transactions sequence diagram, removed Step 4 Request data response to the PSU.

  • Corrected the case for Links.First, Links.Last, Links.Next, Links.Prev, Links.Self and Meta.TotalPages (updated Basics/Pagination, Basics / Return & Error Codes / 400 (Bad Request) v/s 404 (Not Found), and Data Model / High Level Payload Structure / Response Structure).

  • Removed special characters in the Frequency field for Data Model / Data Payload - Resources / Standing Orders / Data Dictionary.

  • Corrected the Pattern for the ActiveOrHistoricCurrencyCode class from [A-Z]{3,3} to ^[A-Z]{3,3}$ to limit the field to 3 characters.

  • Corrected the Pattern for the CountryCode class to be specified as ^[A-Z]{2,2}$ instead of [A-Z]{2,2} to limit the field to 2 characters.

  • In Usage Examples, have corrected "AwaitingAuthentication" to "AwaitingAuthorisation"

  • Updated Usage Example for /products endpoint to align with Data Dictionary.

  • Updated Pagination Response JSON payload to correctly separate one of the JSON properties by inclusion of a comma.

  • Corrected a mis-spelling from "UFT-8" to "UTF-8".

Clarifications

  • Added details and updated examples on the various date formats used outside of the JSON payload (updated Examples, Basics / Date formats, and Basics / Non-repudiation / Process for signing a payload).

  • Clarified that Timezone offsets of -00:00 are not permitted in ISO-8601 (updated Examples, and all default dates in Data Model / Data payload - resources).

  • Clarified that all dates in HTTP headers are represented as RFC 7231 Full Dates. For example: Sun 3 Sep 2017 19:43:31 UTC

  • Clarified that a status of 403 should not be used to indicate a time-out of the access token, and that a 403 indicates that re-authentication of the PSU will not help.

  • Clarified that digital signatures must NOT be implemented for v1.x specification.

Enhancements

  • Metadata fields in the /transactions response now include an earliest available transaction date AND a latest available transaction date (updated Examples, Data Model / High Level Payload Structure / Response Structure / Meta, and default values specified in the Data Payload sections).

  • Added a new section to cater for reversals (Security & Access Control / Consent Authorization / Permissions / Reversing Entries).

  • Added a new section to specify the default character set as UTF-8 (Basics / Character Encoding). 

  • All datetime fields returned by the API must have the Timezone specified (updated Examples and added a new section Basics / Date Format).

  • Specified min and max page sizes for pagination (updated section on Basics / Pagination).

  • Sort Code and Account Number are now stored in the Account identification section together (in the Identification field), and a new SchemeName has been created for SortCodeAccountNumber (updated Examples, Data Model / Data Payload - Resources / Accounts / Data Dictionary, Data Model / Data Payload - Resources / Beneficiaries / Data Dictionary, Data Model / Data Payload - Resources / Standing Orders / Data Dictionary, and Data Model / Data Payload - Enumerations).

  • Extended the Standing Order Frequency pattern to include weekends and clarified pattern description (updated Data Model / Data Payload - Resources / Standing Orders / Data Dictionary).

  • Changed the BankTransactionCode to be the ISO 20022 code description, with all delimiters removed (updated Data Model / Data Payload - Resources / Transactions).

  • Add a Retry-After header for the HTTP 429 Too Many Requests response (updated Basics / Return & Error Codes, Basics / Headers / Response Headers, and Alternate Error Flows showing 429 as an optional implementation).

  • Added 405 and 406 as status codes (updated section on Basics / Response Headers).

  • Added clarifications to the Pagination section to state that the self link must be included in the response (Updated section Basic / Pagination).

  • Added a section describing resource URL path structures.

  • Added regex pattern for all Amount based fields under the Data Model / Data Payload. Removed pattern definition TotalDigits: 18 FractionDigits: 5.

  • Swagger Specification updated to include the Swagger Specification version number in the base of the URL (i.e. linked to this Specification).

Overview

This Payment Initiation API Specification describes the flows and payloads for initiating a single immediate domestic payment.

The API endpoints described here allow a PISP to: 

  • Register an intent to setup a payment instruction 

  • Subsequently submit the payment instruction for processing

  • Optionally retrieve the status of a payment setup or submission.

Document Overview

This document consists of the following parts:

Overview: Provides an overview of the scope of the API and the key decisions and principles that contributed to the specification.

Basics: The section begins with an introduction to how the API is to used to initiate a single, immediate, domestic payment. It goes on to identify the resources and operations that are permitted on those resources and various special cases.

Security & Access Control: Specifies the means for PISPs and PSUs to authenticate themselves and provide consent.

Swagger Specifications: Provides links to the swagger specifications for the APIs.

Data Model: Describes the data model for the API payloads.

Usage Examples: Examples for normal flows, and alternate flows.

Design Principles

RESTful APIs

The API adheres to RESTful API concepts where possible and sensible to do so.

However, the priority is to have an API that is simple to understand and easy to use. In instances where following RESTful principles would be convoluted and complex, the principles have not been followed.

References:

  • The highest level Data Description Language used is the JSON Schema : http://json-schema.org/

  • Best Practice has also been taken from the Data Description Language for APIs; JSON API : http://jsonapi.org/

  • The Interface Description Language used is the Swagger Specification version 2.0 (also known as Open API) : http://swagger.io/ and 

     

Standards

The OBIE principles for developing the new API standards:

  • OBIE will adopt existing standards where relevant/appropriate to minimise re-inventing the wheel.

  • The initial scope of these Standards is limited to current OBIE scope - i.e., meeting CMA remedies. However, the intention is that the scope of the Standards will extend to either include or align to initiatives to cover a wider scope (i.e., PSD2).

  • The Standards currently being reviewed include ISO20022, and FAPI.

  • OBIE will favour developer/user experience over and above adoption of existing Standards, in order to create a more future proof Standard.

  • OBIE will work with other relevant bodies to align with, contribute to and/or adopt other Standards work, especially relating to creation of Standards around APIs and JSON payloads.

ISO 20022

The CMA Order requires the CMA9 Banks to be aligned with the Regulatory and Technical Standards (RTS) under PSD2.

A previous draft of the EBA RTS required that the interface "shall use ISO 20022 elements, components or approved message definitions". In keeping with that requirement, the API payloads are designed using the ISO 20022 message elements and components where available.

The principles we have applied to re-use of ISO message elements and components are:

  • Where relevant - the API payloads have been flattened so that they are more developer friendly. This has been a request from the developer community, and the stakeholders involved in the design workshop.

  • Only elements that are required for the functioning of the API endpoint will be included in the API payload. API endpoints are defined for specific use-cases (not to be generically extensible for all use-cases). Hence - only elements that are required for a single immediate payment initiation are included in the Payment API payload for v1.0 (as this is the agreed scope for our v1.0 specification).

  • We will modify ISO 20022 elements where the existing standard does not cater for an API context (such as filtering, pagination etc.). An example is having latitude and longitude in decimal format - as this is how developers will work with latitude and longitude; or using simple types (e.g., a single date-time field) instead of a complex type (e.g., a choice field with a nesting of date and time).

Extensibility

Version 1.0 of the Payment API only caters for the setup and submission of a single, immediate, domestic payment.

However, it is intended that the API flows will be extended to cater for more complex use-cases in subsequent releases - and we have kept this in mind during the design. It is expected that the API payloads will evolve to cater for other payment types (e.g., future dated, recurring, bulk etc.)

Idempotency

POST operations on both the /payments and /payment-submissions endpoint are designed to be idempotent. 

Details on idempotency can be founds in the section on Basics / Idempotency.

Non-Repudiation

Important

API requests and responses MUST NOT be digitally signed for implementation of the v1.x specification.

This section is for future reference only.

Digital signatures will facilitate non-repudiation for Open Banking APIs. 

However, the solution for digital signatures (if required in a future release) has been agreed and the approach required to achieve this is described in Basics / Non-repudiation.

Payment API - Scheme Agnostic

The API will be designed so that it is agnostic to the underlying payment scheme that is responsible for carrying out the payment.

In doing so - this means we will not design field lengths and payloads to only match the Faster Payments message, and will instead rely on the field lengths and definitions in ISO 20022. Due diligence has been carried out to ensure that the API has the necessary fields to function with Bacs payments - as per agreed scope.

We will provide further mapping guidance to ensure that differences are understood between the Open Banking Payment API standard, and FPS and Bacs schemes in the "Mapping to Schemes & Standards" section.

Status Codes

The API uses two status codes that serve two different purposes:

  • The HTTP Status Code reflects the outcome of the API call (the HTTP operation on the resource). The Security Working Group have stated that granular error codes may expose threat vectors - so these are limited to the HTTP Status Codes for v1.0.

  • The Status field in the Payment API payloads reflect the status of the payments and payment-submissions resources. This Status will be limited to the ISO 20022 PaymentStatusCode code-list enumeration for v1.0.

Scope

The APIs in this document allow a PISP to initiate a single, immediate, domestic payments made in GBP.

Out of Scope

This v1.0 specification does not cater for:

  • Payments that involve currency exchange.

  • Payments that involve currencies other than GBP (no validation of EUR payment schemes has been completed for v1.0).

  • Payments that are not single, immediate, domestic payments made in GBP - i.e., payments that are:

    • In bulk - single debit, multiple credit

    • Future dated or deferred

    • Recurring.

  • Multi-authentication flows have been designed - but the full implications of the multi-authentication flows have not been worked through - so these are not included in this version.

  • Non-functional requirements and specification of caching and throttling.

Basics

Overview

The figure below provides a general outline of a payment flow using the Payment APIs.

Steps

Step 1: Request Payment Intitation

  • This flow begins with a PSU consenting to a payment being made. The request is sent through a PISP.

  • The debtor account details can optionally be specified at this stage.

Step 2: Setup Single Payment Initiation

  • The PISP connects to the ASPSP that services the PSU's payment account and creates a new payments resource. This informs the ASPSP that one of its PSUs intends to make a payment. The ASPSP responds with an identifier for the resource (the PaymentId - which is the intent identifier).

  • This step is carried out by making a POST request to the payments resource.

Step 3: Authorise Consent

  • The PISP redirects the PSU to the ASPSP. The redirect includes the PaymentId generated in the previous step. This allows the ASPSP to correlate the payment that was setup. The ASPSP authenticates the PSU. This could be an SCA if the ASPSP determines that none of the SCA exemptions apply. The ASPSP updates the state of the payments resource internally to indicate that the payment has been authorized.

  • The PSU selects the debtor account at this stage - if it has not been previously specified in Step 1.

  • The PSU is redirected back to the PISP.

Step 4: Create Payment Submission

  • Once the PSU is redirected to the PISP, the PISP creates a payment-submissions resource to indicate that the payment created in the steps above should be submitted for processing.

  • This is carried out by making a POST request to the payment-submissions resource.

  • ASPSP returns the PaymentSubmissionId to the PISP.

Step 5: Get Payment Submission Status

  • If the ASPSP provides a status API, the PISP can check the status of the payment (with the PaymentId) or payment-submission (with the PaymentSubmissionId).

  • This is carried out by making a GET request to the payments or payment-subsmissions resource.

Sequence Diagram

Payment Initiation - High Level Flow
participant PSU participant PISP participant ASPSP Authorisation Server participant ASPSP Resource Server note over PSU, ASPSP Resource Server Step 1: Request payment initiation end note PSU -> PISP: Send payment initiation request note over PSU, ASPSP Resource Server Setup single payment initiation end note PISP <-> ASPSP Authorisation Server: Establish TLS 1.2 MA PISP -> ASPSP Authorisation Server: Initiate Client Credentials Grant ASPSP Authorisation Server -> PISP: access-token PISP <-> ASPSP Resource Server: Establish TLS 1.2 MA PISP -> ASPSP Resource Server: POST /payments ASPSP Resource Server -> PISP: HTTP 201 (Created), PaymentId PISP -> PSU: HTTP 302 (Found), Redirect (PaymentId) note over PSU, ASPSP Resource Server Step 3: Authorize consent end note PSU -> ASPSP Authorisation Server: Follow redirect (PaymentId) PSU <-> ASPSP Authorisation Server: authenticate PSU <-> ASPSP Authorisation Server: SCA if required PSU <-> ASPSP Authorisation Server: Select debtor account ASPSP Authorisation Server -> PSU: HTTP 302 (Found), Redirect (authorization-code) PSU -> PISP: Follow redirect (authorization-code) PISP <-> ASPSP Authorisation Server: Establish TLS 1.2 MA PISP -> ASPSP Authorisation Server: Exchange authorization-code for access token ASPSP Authorisation Server -> PISP: access-token note over PSU, ASPSP Resource Server Step 4: Create payment submission end note PISP <-> ASPSP Resource Server: Establish TLS 1.2 MA PISP -> ASPSP Resource Server: POST /payment-submissions ASPSP Resource Server -> PISP: HTTP 201 (Created), PaymentSubmissionId note over PSU, ASPSP Resource Server Step 5: Get payment submission status end note opt PISP <-> ASPSP Resource Server: Establish TLS 1.2 MA PISP -> ASPSP Resource Server: GET /payment-submissions/{PaymentSubmissionId} ASPSP Resource Server -> PISP: HTTP 200 (OK) payment-submissions resource end opt

Actors

Actor

Abbreviation

Type

Specializes

Description

Actor

Abbreviation

Type

Specializes

Description

Payment Service User

PSU

Person

N/A

A natural or legal person making use of a payment service as a payee, payer or both (PSD2 Article 4(10))

Payment Service Provider

PSP

Legal Entity

N/A

A legal entity (and some natural persons) that provide payment services as defined by PSD2 Article 4(11)

Account Servicing Payment Service Provider

ASPSP

Legal Entity

PSP

An ASPSP is a PSP that provides and maintains a payment account for a payment services user (PSD 2 Article 4(15).

The CMA 9 are all ASPSPs.

Third Party Providers / Trusted Third Parties

TPP

Legal Entity

PSP

A party other than an ASPSP that provides payment related services.

The term is not actually defined in PSD2, but is generally deemed to include all payment service providers that are 3rd parties (the ASPSP and the PSU to whom the account belongs being the first two parties)

Payment Initiation Service Provider

PISP

Legal Entity

TPP

A TPP that provides Payment Initiation Services.

PSD2 does not offer a formal definition. Article 4(18) quite circularly defines a PISP as a PSP that provides Payment Initiation Services.

Account Information Service Provider

AISP

Legal Entity

TPP

A TPP that provides Account Information Services.

Again, PSD2 defines AISPs in Article 4(19) circularly as a PSP that provides account information services

Character Encoding

The API requests and responses must use a  UTF-8 character encoding. This is the default character encoding for JSON (RFC 7158 - Section 8.1)

However, an ASPSP's downstream system may not accept some UTF-8 characters, such as emoji characters (e.g. "Happy Birthday 🎂🎂!" may not be an acceptable Payment Reference). If the ASPSP rejects the message with a UTF-8 character that cannot be processed, the ASPSP should respond with an HTTP 400 (Bad Request) status code.

Date Formats

All dates in the JSON payloads are represented in ISO 8601 date-time format. All date-time fields in responses must include the timezone. An example is below:

2017-04-05T10:43:07+00:00



All dates in the HTTP headers are represented as RFC 7231 Full Dates. An example is below:

Sun, 10 Sep 2017 19:43:31 UTC



JWT claims are expressed as a JSON number representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the date/time.

Resource URI Path Structure

The resources defined by these APIs can be addressed through a path structure consisting of the following parts:

  • An optional ASPSP specific path prefix

  • The constant string "open-banking"

  • The version of the APIs expressed as /v[major-version].[minor-version]/

  • The resource name

Examples:

/superbank/open-banking/v1.1/payments

/open-banking/v1.0/payments

/apis/open-banking/v1.1/payments

Payment Limits

The standard does not provide a uniform limit for payments that can be supported through this API.

Each ASPSP must determine an appropriate limit that they support based on their individual practices, standards and limitations.

Headers

Request Headers

Header Value

Notes

POST Requests

GET Requests

Header Value

Notes

POST Requests

GET Requests

x-fapi-financial-id

The unique id of the ASPSP to which the request is issued.

The unique id will be issued by OB.

If the value does not match the expected value (based on the Client ID or network certificate of the caller, the ASPSP must reject the request with a 403 (Not Authorized) status code.

Mandatory

Mandatory

x-fapi-customer-last-logged-time

The time when the PSU last logged in with the TPP.

Optional

Optional

x-fapi-customer-ip-address

The PSU's IP address if the PSU is currently logged in with the TPP.

Optional

Optional

x-fapi-interaction-id

An RFC4122 UID used as a correlation id.

If provided, the ASPSP must "play back" this value in the x-fapi-interaction-id response header.

Optional

Optional

Authorization

Standard HTTP Header; Allows Credentials to be provided to the Authorisation / Resource Server depending on the type of resource being requested. For OAuth 2.0 / OIDC, this comprises of either the Basic / Bearer Authentication Schemes.

Mandatory

Mandatory

Content-Type

Standard HTTP Header; Represents the format of the payload being provided in the request.

This must be set to application/json.

Mandatory

Do not use

Accept

Standard HTTP Header; Determine the Content-Type that is required from the Server.

If set, it must have the value: application/json.

If set to any other value, ASPSP must respond with a 406 Not Acceptable.

Optional.

Optional

Optional

x-idempotency-key

Custom HTTP Header; Unique request identifier to support idempotency.

Mandatory for POST requests.

Mandatory

Do not use

x-jws-signature

Header containing a detached JWS signature of the body of the payload.

Mandatory for requests that contain a payload.

A policy decision is under consideration on whether API requests and responses will be digitally signed to provide a simpler means of non-repudiation.

This header will only be applicable if the policy decision is to implement non-repudiation through digital signatures.

Not for v1.x

Not for v1.x

(Reference: Section 6.3 - Financial API — Part 1: Read Only API Security Profile (Implementer’s Draft).)

Response Headers

Header Value

Notes

Mandatory ?

Header Value

Notes

Mandatory ?

Content-Type

Standard HTTP Header; Represents the format of the payload returned in the response.

The ASPSP must return Content-type: application/json as a content header.

Mandatory.

Mandatory

x-jws-signature

Header containing a detached JWS signature of the body of the payload.

Mandatory for requests that contain a payload.

A policy decision is under consideration on whether API requests and responses will be digitally signed to provide a simpler means ofnon-repudiation.

This header will only be applicable if the policy decision is to implement non-repudiation through digital signatures.

Not for v1.x

x-fapi-interaction-id

An RFC4122 UID used as a correlation id.

This must be the same value provided in the x-fapi-interaction-id request header.

Conditionally Mandatory

Retry-After

Header indicating the time (in seconds) that the TPP should wait before retrying an operation.

The ASPSP should include this header along with responses with the HTTP status code of 429 (Too many requests).

Optional

Return & Error Codes

The following are the HTTP response codes for the different HTTP methods - across all Payment API endpoints.

Situation

HTTP Status

Notes

Returned by POST

Returned by GET

Situation

HTTP Status

Notes

Returned by POST

Returned by GET

Query completed successfully

200 OK



No

Yes

Normal execution. The request has succeeded.

201 Created

The operation results in the creation of a new resource.

Yes

No

Delete operation completed successfully

204 No Content



No

No

Request has malformed, missing or non-compliant JSON body or URL parameters

400 Bad Request

The requested operation will not be carried out.

Yes

No

Authorization header missing or invalid token

401 Unauthorized

The operation was refused access.

Re-authenticating the PSU may result in an appropriate token that can be used.

Yes

Yes

Token has incorrect scope or a security policy was violated.

403 Forbidden

The operation was refused access.

Re-authenticating the PSU is unlikely to remediate the situation.

Yes

Yes

The TPP tried to access the resource with a method that is not supported.

405 Method Not Allowed



Yes