Payments
The Payment Initiation Service (PIS) allows you to initiate payments directly from the PSU's bank account through the Open Payments platform, with a variety of supported payment options.
For requests to the PIS API, you need an access token with
scopeset topaymentinitiationcorporate.
Initiating payments in the production environment requires completed KYC verification on the PSU's organization. Refer to the KYC guide for information on how to implement this.
Single Payments
The PIS API requires you to specify a payment-service and a payment-product in the path, with each combination representing a distinct type of payment. To create a single payment, the payment-service is always set to payments.
You then need to specify the payment-product for the payment. The general flow for initiating a single payment is the same for all other than international-tp, which includes an additional first step of creating an FX quote.
| payment-product | Flow |
|---|---|
domestic, swedish-giro, sepa-credit-transfers | Create Payment → Authorise Payment → Get Payment Status |
international-tp | Create FX Quote → Create Payment → Authorise Payment → Get Payment Status |
0. Create FX Quote (international TP only)
The international-tp product enables PSUs to initiate cross-currency payments to 180+ countries with built-in, real-time currency conversion — supporting both spot and forward exchange rates (up to 30 days). The first step for a cross-currency payment is to create an FX quote, defining the exchange rate, fees, and the validity period.
Endpoint
POST /psd2/paymentinitiation/v1/fxhttp
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
Request Body
| Name | Type | Description |
|---|---|---|
sourceCurrency | string | The source currency. |
targetCurrency | string | The target currency. |
requestedExecutionDate | string(date) | The requested execution date, for future payments. |
countryCode | string | The target country. |
amount | string | The requested amount. |
curl -X POST "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/fx" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 98afac01-e0bb-4aa2-95fd-0b3204f8a183" \
-d '{
"sourceCurrency": "SEK",
"targetCurrency": "EUR",
"requestedExecutionDate": "2026-01-01",
"countryCode": "NL",
"amount": "130.00"
}'bashResponse
{
"fxQuoteId": "F100000PFM",
"fxRate": "10.87410000",
"fee": "1.50",
"totalAmount": "110.25",
"validFrom": "2024-08-23T14:12:57Z",
"validTo": "2024-08-24T14:12:57Z"
}jsonThe response contains an fxQuoteId which you will need to reference in the request headers of the international-tp payment request.
1. Create Payment
This step initiates the actual payment. Here, you define the payment instructions according to the selected payment-product.
Endpoint
POST /psd2/paymentinitiation/v1/{payment-service}/{payment-product}httpPath Parameters
| Name | Type | Description |
|---|---|---|
payment-service | string | The type of payment to initiate, e.g. payments for single payments. |
payment-product | string | The scheme and format of the payment, e.g. domestic for domestic payments. |
domestic
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
To try out our harmonized payment statuses, include an X-Feature-Flags header set to new-statuses.
Request Body
| Name | Type | Description |
|---|---|---|
instructedAmount | object | The amount and currency of the money to be transferred. |
debtorAccount | object | The account from which the payment will be debited. |
creditorName | string | The full name of the payment recipient. |
creditorAccount | object | The account to which the payment will be credited. |
creditorAgent | string | The BIC of the payment recipient's bank. |
creditorAgentName | string | The name of the payment recipient's bank. |
requestedExecutionDate | string(date) | The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. |
remittanceInformationUnstructured | string | A free-text field for remittance information on the payment. |
debtorAccountMessage | string | A personal message from the payer to themselves. |
curl -X POST "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/payments/domestic" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 37c6468e-a3f4-4232-8834-979e79564274" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "TPP-Redirect-Preferred: false" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"instructedAmount": {
"currency": "SEK",
"amount": "1230.50"
},
"debtorAccount": {
"iban": "SE123456789000532811"
},
"creditorName": "Merchant 123",
"creditorAccount": {
"iban": "SE123456789000222333"
},
"creditorAgent": "HANDSESS",
"creditorAgentName": "Svenska Handelsbanken AB",
"requestedExecutionDate": "2025-05-19",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}'bashswedish-giro
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
Request Body
| Name | Type | Description |
|---|---|---|
instructedAmount | object | The amount and currency of the money to be transferred. |
debtorAccount | object | The account from which the payment will be debited. |
creditorName | string | The full name of the payment recipient. |
creditorGiro | object | The Bankgirot or Plusgirot account to which the payment will be credited. |
creditorAgent | string | The BIC of the payment recipient's bank. |
requestedExecutionDate | string(date) | The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. |
invoiceRef | string | A custom invoice reference. |
ocrRef | string | A Giro OCR reference. |
debtorAccountMessage | string | A personal message from the payer to themselves. |
creditorAccountMessage | string | A personal message from the payer to the recipient. |
curl -X POST "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/payments/swedish-giro" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 7aea2104-7612-4c80-99ea-707d88ddd935" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "TPP-Redirect-Preferred: false" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"instructedAmount": {
"currency": "SEK",
"amount": "130.00"
},
"debtorAccount": {
"iban": "SE40100100103307118608"
},
"creditorName": "Merchant 123",
"creditorGiro": {
"giroNumber": "123-4567",
"giroType": "BANKGIRO"
},
"creditorAgent": "HANDSESS",
"requestedExecutionDate": "2025-11-01",
"invoiceRef": "Invoice Nr 4421",
"ocrRef": "3020000071266464",
"debtorAccountMessage": "Personal note",
"creditorAccountMessage": "Invoice payment"
}'bashinternational-tp
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
FX-Quote-Id | string | The ID of the FX Quote to be used for the payment. Used for international TP payments only. |
Request Body
| Name | Type | Description |
|---|---|---|
instructedAmount | object | The amount and currency of the money to be transferred. |
debtorAccount | object | The account from which the payment will be debited. |
creditorName | string | The full name of the payment recipient. |
creditorAccount | object | The account to which the payment will be credited. |
creditorAddress | object | The address of the payment recipient. |
creditorAgent | string | The BIC of the payment recipient's bank. |
creditorAgentName | string | The name of the payment recipient's bank. |
requestedExecutionDate | string(date) | The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. |
remittanceInformationUnstructured | string | A free-text field for remittance information on the payment. |
debtorAccountMessage | string | A personal message from the payer to themselves. |
curl -X POST "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/payments/international-tp" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 004bd42c-034b-45de-8361-c043615784a6" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "TPP-Redirect-Preferred: false" \
-H "PSU-IP-Address: 152.120.171.187" \
-H "FX-Quote-Id: F100000PFM" \
-d '{
"instructedAmount": {
"currency": "EUR",
"amount": "130.00"
},
"debtorAccount": {
"iban": "SE40100100103307118608"
},
"creditorName": "Merchant 123",
"creditorAccount": {
"iban": "NL02100100109307118603"
},
"creditorAddress": {
"country": "NL"
},
"creditorAgent": "RABONL2U",
"creditorAgentName": "Coöperatieve Rabobank U.A.",
"requestedExecutionDate": "2026-01-01",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}'bashThe payment needs to be signed within one hour of creating the FX quote. If the payment does not reach a finalised state within this timeframe, the FX contract will be voided and a new quote will need to be created.
sepa-credit-transfers
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
Request Body
| Name | Type | Description |
|---|---|---|
instructedAmount | object | The amount and currency of the money to be transferred. |
debtorAccount | object | The account from which the payment will be debited. |
creditorName | string | The full name of the payment recipient. |
creditorAccount | object | The account to which the payment will be credited. |
creditorAgent | string | The BIC of the payment recipient's bank. |
creditorAgentName | string | The name of the payment recipient's bank. |
requestedExecutionDate | string(date) | The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. |
remittanceInformationUnstructured | string | A free-text field for remittance information on the payment. |
debtorAccountMessage | string | A personal message from the payer to themselves. |
curl -X POST "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/payments/sepa-credit-transfers" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 1be5590a-50b0-4fcd-b835-c98ec8b058714" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "TPP-Redirect-Preferred: false" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"instructedAmount": {
"currency": "EUR",
"amount": "130.50"
},
"debtorAccount": {
"iban": "SE123456789000532811"
},
"creditorName": "Merchant 123",
"creditorAccount": {
"iban": "NL123456789000222333"
},
"creditorAgent": "RABONL2U",
"creditorAgentName": "Coöperatieve Rabobank U.A.",
"requestedExecutionDate": "2025-11-01",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}'bashResponse
{
"transactionStatus": "RCVD",
"paymentId": "fa1569fa-6cbd-43fb-98a2-7151ba2da365",
"_links": {
"startAuthorisationWithTransactionAuthorisation": {
"href": "/psd2/paymentinitiation/v1/payments/domestic/fa1569fa-6cbd-43fb-98a2-7151ba2da365/authorisations"
},
"self": {
"href": "/psd2/paymentinitiation/v1/payments/domestic/fa1569fa-6cbd-43fb-98a2-7151ba2da365"
},
"status": {
"href": "/psd2/paymentinitiation/v1/payments/domestic/fa1569fa-6cbd-43fb-98a2-7151ba2da365/status"
}
}
}jsonIf the creditor account is listed on Svensk Handel's watchlist, the response for any payment type will additionally contain a warning message:
"tppMessages": [
{
"category": "WARNING",
"code": "CREDITOR_ACCOUNT_FLAGGED",
"text": "The creditor Falskhandel AB (OrgNr: 556789-1234) was flagged as potentially fraudulent."
}
]json2. Authorise Payment
After creating the payment, it must be authorised by the PSU before it can be used. See the Authorisations guide for instructions on how to complete the authorisation process.
3. Get Payment Status
Once you complete the authorisation flow, check the status of the payment by polling the Get Payment Status endpoint.
Endpoint
GET /psd2/paymentinitiation/v1/{payment-service}/{payment-product}/{paymentId}/statushttpPath Parameters
| Name | Type | Description |
|---|---|---|
payment-service | string | The type of payment to initiate, e.g. payments for single payments. |
payment-product | string | The scheme and format of the payment, e.g. domestic for domestic payments. |
paymentId | string(uuid) | The ID of the payment that was created. |
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
curl -X GET "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/payments/domestic/fa1569fa-6cbd-43fb-98a2-7151ba2da365/status" \ -H "Accept: application/json" \ -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \ -H "Content-Type: application/json" \ -H "X-Request-ID: 06a2321a-e420-4ffd-982b-ba439af70b10" \ -H "X-BicFi: ESSESESS" \ -H "PSU-ID: 123456789001" \ -H "PSU-Corporate-ID: 1234567890" \ -H "TPP-Redirect-Preferred: false" \ -H "PSU-IP-Address: 152.120.171.187"bash
Response
{
"transactionStatus": "ACSC"
}jsonPayments can have a number of different statuses. Here, you want to check if the payment was rejected, in which case transactionStatus would have the value RJCT. If not, then you are done.
Signing Baskets
Alternatively to authorising each payment separately, signing baskets allow several initiated payments to be grouped and authorised in a single SCA flow. Once a signing basket is signed, each payment within it is signed simultaneously, ensuring consistency and reducing friction. All supported payment types can be included in a signing basket.
1. Create Signing Basket
After creating the desired payments as described above, you can create a signing basket and include each paymentId in the request body.
Endpoint
POST /psd2/paymentinitiation/v1/signing-basketshttp
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
Request Body
| Name | Type | Description |
|---|---|---|
paymentIds | array | The IDs of the payments to include in the signing basket. |
curl -X POST "/psd2/paymentinitiation/v1/signing-baskets" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 1fbf35cd-192b-4621-8edc-1885f6b8841c" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "TPP-Redirect-Preferred: false" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"paymentIds": [
"a1569fa-6cbd-43fb-98a2-7151ba2da365",
"880b6a91-23a8-45f2-96bf-2b98c5fc5cc3",
"b0f84f58-addb-442c-8e13-d1f205a1f4ee"
]
}'bash2. Authorise Signing Basket
After creating the signing basket, it must be authorised by the PSU. See the Authorisations guide for instructions on how to complete the authorisation process.
3. Get Signing Basket Status
Once you complete the authorisation flow, check the status of the payment by polling the Get Signing Basket Status endpoint.
Endpoint
GET /psd2/paymentinitiation/v1/signing-baskets/{basketId}/statushttpPath Parameters
| Name | Type | Description |
|---|---|---|
basketId | string | The ID of the signing basket that was created. |
Request Headers
| Name | Type | Description |
|---|---|---|
X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
X-BicFi | string | The BIC of the bank to which the request is addressed. |
PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
TPP-Redirect-Preferred | boolean | Indicates a preference for redirect-based SCA over decoupled when set to true. The bank may not support both types. |
PSU-IP-Address | string(ipv4) | The IP address of the PSU to be forwarded to the bank. Only included if the request was actively initiated by the PSU. |
PSU-User-Agent | string | The forwarded Agent header field of the HTTP request between PSU and TPP, if available. |
curl -X GET "https://api.openbankingplatform.com/psd2/paymentinitiation/v1/signing-baskets/c9669516-a08f-448a-9fa4-d3db36456059/authorisations/a2db692d-84a7-4d2e-bc59-0c420f876cf2" \ -H "Accept: application/json" \ -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \ -H "Content-Type: application/json" \ -H "X-Request-ID: a464b8b0-59fa-4890-9cb7-ae9baf5820f4" \ -H "X-BicFi: ESSESESS" \ -H "PSU-ID: 123456789001" \ -H "PSU-Corporate-ID: 1234567890" \ -H "TPP-Redirect-Preferred: false" \ -H "PSU-IP-Address: 152.120.171.187"bash
Response
{
"transactionStatus": "ACTC"
}jsonSigning baskets can have a number of different statuses. Here, you want to check if the basket was rejected, in which case transactionStatus would have the value RJCT. If not, then you are done.
Also verify each included payment's status via the Get Payment Status endpoint regardless of the signing basket's scaStatus.

