PIS API specific documentation Sweden, Denmark and Norway
Changes from the previous version
This is the change log of the PIS API (domestic), allowing PSD2-regulated TPPs to initiate payments on behalf of the PSU. The top most item is the latest change and the API changes described in it are relative to the version directly below.
Version 6.1
New version
Overview
The /payments/domestic-credit-transfers can be used to initiate a domestic payment. The response contains the payment details which include, for example, payment amount and creditor details among other things.
API endpoints
The PIS API contains the following endpoints:
| Endpoint | Supported HTTP Methods |
|---|---|
/payments/domestic-credit-transfers | POST |
Here is a part of the JSON payload format which can be posted to this endpoint, “_type” is an internal defined representation of the account type.
{
…
"creditor": {
"account": {
"_type": "BBAN_SE",
"currency": "SEK",
"value": "13370233835"
}
…
}After the payment is initiated by POST request to this endpoint, it will be available by doing GET request to the common /payments endpoint which returns a list of pending payments.
PIS API Scenarios
The scenarios are implemented on PIS API to allow for easier testing of the applications. Developers can request a specific scenario (or list of scenarios) for certain API calls, for example, when confirming a transfer of funds the developer can request that the transaction processing to fail due to missing funds and the corresponding payment status will be represented in the payment details.
There are the following scenarios available in PIS API related to payment signing and execution.
PaymentSigningExpiresPaymentMissingFundsPaymentOnHoldPaymentDecoupledSigningPaymentOnHold2CCYes,PaymentOnHold2CCNo
PaymentSigningExpires scenario means that the user never signs the payment by MTA (Nordea code app).
PaymentMissingFunds in this scenario payment is signed, but there are no funds available.
PaymentOnHold in this scenario payment is signed, but the payment is put on hold by Nordea for some reason (for example, fraud).
PaymentDecoupledSigning in this scenario the payment is signed automatically as there is no signing url to activate with decoupled signing.
PaymentOnHold2CCYes in this scenario the payment status will be ‘OnHold’ due to second channel confirmation by the User, it will be ‘Paid’/‘Confirmed’ automatically after 60 seconds.
PaymentOnHold2CCNo in this scenario the payment status will be ‘OnHold’ due to second channel confirmation by the User, it will be ‘Rejected’ automatically after 60 seconds.
There are the following scenarios available for adding a mock UI signing flow to the payment confirmation. Adding any of the UI scenarios to the confirmation flow, then calling /confirm is no longer adequate to sign the payment, The mock UI flow has to be followed.
AuthenticationWithUI
SigningWithUI
AuthenticationWithUI mimics the 2SCA flow and includes authentication before signing.
SigningWithUI shows the mock signing screen only and mimics the 1SCA flow. The signing screen also has built in functionality to check a few scenarios whilst mock signing the payment.
There is additionally a scenario available for mocking the date being rolled.
ExecutionDateRolling
ExecutionDateRolling rolls the planned_execution_date compared to the requested_execution_date to mimic that the payment cannot be processed the requested date.
Any scenario is specified either as part of request header or as a query parameter.
![]()
Note that the scenarios are available only in the sandbox APIs. They will never be available in the production APIs.
Use `X-Response-Scenarios` for header parameter or query parameter to request scenarios to be applied.Nordea payment type field combinations
| Endpoint (/payments/{paymentType}) | Nordea Type | FI | SE | DK | NO | Comments | debtor.account_type | creditor.account_type | .amount (mandatory, max. value) | .currency | .creditor.message | .name (of beneficiary | .reference.value | .reference_type |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| /domestic-credit-transfers | Domestic account transfer | X | “BBAN_SE” or “IBAN” | “BBAN_SE” or “IBAN” | 99 999 999 999,99 | “SEK” | optional (max. 140) | mandatory | N/A | N/A | ||||
| /domestic-credit-transfers | Domestic account transfer | X | If reference is supplied, then message is not applicable, and vice versa. | “BBAN_DK” or “IBAN” | “BBAN_DK” or “IBAN” | 9 999 999 999,99 | “DKK” | optional (max. 140) | Mandatory (Max. 140 characters, Express max 70 characters) | optional | “RF” | |||
| /domestic-credit-transfers | Domestic account transfer (With/Without advice) | X | If comment is added, it is considered to be With advice. | “BBAN_NO” or “IBAN” | “BBAN_NO” or “IBAN” | 9 999 999,99 | “NOK” | optional, see comment (max. 140) | optional | N/A | N/A | |||
| /domestic-credit-transfers | KID | X | “BBAN_NO” or “IBAN” | “BBAN_NO” or “IBAN” | 9 999 999,99 | “NOK” | N/A | mandatory | mandatory | “OCR” | ||||
| /domestic-credit-transfers | BankGiro | X | If OCR reference and value is supplied, then message is not applicable, and vice versa. Some accounts have OCR reference as mandatory as per request of the creditor. | “BBAN_SE” or “IBAN” | “BGNR” | 99 999 999 999,99 | “SEK” | optional (max. 140) | N/A | optional | “OCR” | |||
| /domestic-credit-transfers | PlusGiro | X | If OCR reference and value is supplied, then message is not applicable, and vice versa. Some accounts have OCR reference as mandatory as per request of the creditor. | “BBAN_SE” or “IBAN” | “PGNR” | 99 999 999 999,99 | “SEK” | optional (max. 25) | mandatory | optional | “OCR” | |||
| /domestic-credit-transfers | Giro | X | Transfer form for Denmark. Note that debtor.message is mandatory for all Giro payments. | “BBAN_DK” or “IBAN” | “GIRO_DK” | 9 999 999,99 | “DKK” | only for 01, 73 and 75 (max. 105) | N/A | mandatory for 04, 15, 71 and 75 others N/A | “01”, “04”, “15”, “71”, “73” or “75” | |||
| /sepa-credit-transfers | SEPA | X | FI uses SEPA for domestic payments as well. It is not allowed to use both Creditor reference and Creditor message when initiating a Sepa credit transfer. | “IBAN” | “IBAN” | 999 999 999,99 | “EUR” | optional (max. 140) | mandatory | mandatory | “INVOICE” or “RF” | |||
| /domestic-credit-transfer | Single SCA domestic | X | X | X | See above payments types for limits and restrictions. | “IBAN”,“BBAN_SE” | “IBAN”,“PGNR”,“BGNR” | N/A | “SEK”/“DKK”/“NOK” | optional (max. 140) | Mandatory for Express max. 70 characters allowed | optional | “OCR” | |
| /sepa-credit-transfer | Single SCA SEPA | X | SEPA | “IBAN” | “IBAN” | N/A | “EUR” | optional (max. 140) | mandatory | mandatory | “INVOICE” or “RF” | |||
| /cross-border-credit-transfers | 2SCA and Single SCA Cross-border | X | X | X | X | “IBAN” or BBAN_DK or BBAN_NO or BBAN_SE | “IBAN” or “BBAN_OTHER” Norway exception: When IBAN is used as Creditor Account in Cross-border payment, the Creditor Bank Address -attribute should be left empty. | N/A | The valid supported values are listed in the API Reference -document | mandatory or optional | mandatory | N/A | N/A | |
| /owntransfer/ | Own transfer | X | Own Transfer in Finland: From account shall be a Finnish account in IBAN format and in EUR, To account shall be in IBAN format, within Nordea Finland in EUR. Currency can only be EUR | “IBAN” | “IBAN” | mandatory | “EUR” | optional (max. 35) | N/A | N/A | N/A |
Payment status description
| Payment Status | Description | Confirmable | Deletable |
|---|---|---|---|
| PendingConfirmation | A payment was created. Confirmation step has not yet been started. | Yes | Yes |
| PendingSecondConfirmation | The payment was already confirmed, but requires a second confirmation. The process activation is identical to PendingConfirmation, however this second confirmation require an individual second confirmation, so do not send more than one payment in the confirmation payment list request. Only apply to FI payments. | Yes | Yes |
| PendingUserApproval | The PSU-signing process has started. | No | Yes, but if you already redirected or supplied a signing url to the PSU, they will still be able to proceed with the signing flow, however the payment will NOT be executed. Please do what you can to make sure the PSU does not continue with the signing, if you decided to delete the payment. |
| OnHold | Payment was put on hold by bank, for example due to fraud suspicion. The PSU needs to contact the bank, or maybe reply a sms. | No | No |
| UserApprovalFailed | Payment process failed. It’s possible to try again. See tpp_messages in response for further details. | Yes | Yes |
| UserApprovalTimeout | A specific time frame is set for the signing process, in which the PSU needs to sign the payment. If timeline is exceeded the signing process expires and has to be restarted. This will also be the status in the user started the signing process, manbut did not complete it. | Yes | Yes |
| UserApprovalCancelled | The PSU deliberately rejected signing the payment during the signing flow. | Yes | Yes |
| Paid | The payment has been properly initiated, confirmed, signed and debited. Status Paid does not confirm receipt of payment by the payee. There is though one exception for Sepa credit transfer with Instant-urgency. If the beneficiary bank confirms the credit in 10 seconds, the payment is getting the final status of Paid. There can still be events that lead to a non-performance of the payment. For example, even after the payers account was debited, different types of mandatory monitoring may lead to a situation where a payment is not performed. | No | No |
| Confirmed | The payment has been properly initiated, confirmed, signed, but is pending final execution. Could be a future dated payment, or due to bulk clearing of payments (i.e. not instant). | No | Future dated can be deleted. If for today then no, but if the customer contacts the bank it can be stopped |
| Rejected | As stated the payment has been rejected. See the tpp_messages for further details. This payment cannot be (re-)confirmed. | No | No |
| InsufficientFunds | The PSU cannot fund this payment from the chosen account. | No | Yes |
| LimitExceeded | The PSU, the account, or the channel has a limit that has been exceeded. This is technically (re-)confirmable, but it requires something has been changed, for instance the limit is raised or a new month has begun. | Yes | Yes |
| Unknown | On rare occasions the core payment engine in Nordea returns a status that has not been mapped to any of the above payment statuses. It could be caused by the fact that some processes run in parallel in the core payment engine. Most of these statuses are likely to be changed in a matter of milliseconds. Please re-query the status again until one of the above statuses is received instead. | N/A | N/A |
| Cancelled | The payment was cancelled. | No | No |
| Stopped | The payment was stopped. | No | No |
Recurring payments
The recurring payments - sometimes also known as standing order - information consist of two additional values; the count and the recurrence_type.
Note: A simple way to find the next occurrence of the recurring payment in the payment list would be to add an
external_idwhen initiating the payment. Theexternal_idwill be present on all occurrences of this payment.
T7he count has to be a minimum of 2, as the first payment is executed on the requested execution date as a normal payment, and creates another payment immediately afterwards.
The number of payments remaining can be found in the count field if payment list or details are requested. It will decrease by 1 for each version of the payment that has been Paid.
The normal maximum value for count is 98, but the number 9999 (four nines) is used to indicate an infinite series of identical payments that will not stop until deleted by the submitter.
This special ‘count’ will not decrease with each Paid payment, and will continue to return the number 9999.
Note: Use
/deleteinterfaces to remove the next version of the payment (only_next_occurrence=TRUE), or removing the entire series (only_next_occurrence=FALSE).
Recurring payments deleting rules:
- When deleting a pending recurring payment, this always deletes the entire series.
- When deleting a recurring payment in Finland, this always deletes the entire series.
| recurrence_type | FI | SE | DK | NO | Description |
|---|---|---|---|---|---|
| DAILY | X | Every banking day | |||
| WEEKLY | X | X | Weekly, based on the day of the requested execution date (or the next banking day) | ||
| BIWEEKLY | X | Every 2 weeks on the weekday of the request execution date (or the next banking day). For Norway BIWEEKLY is only supported for the own account transfers. | |||
| MONTHLY_SAME_DAY | X | X | X | X | Monthly, based on the day of requested execution date (or the next banking day). For Sweden MONTHLY_SAME_DAY is not supported for the own account transfers. |
| MONTHLY_EOM | X | Monthly on the last banking day of the month | |||
| QUARTERLY_SAME_DAY | X | X | Every 3 months on the requested execution date (or the next banking day). | ||
| QUARTERLY_EOM | X | Every 3 months on the the last banking day of the month | |||
| TRI_ANNUALLY_SAME_DAY | X | Every 4 months on the requested execution date (or the next banking day) | |||
| SEMI_ANNUALLY_SAME_DAY | X | X | Every 6 months on the requested execution date (or the next banking day) | ||
| SEMI_ANNUALLY_EOM | X | Every 6 months on the the last banking day of the month | |||
| YEARLY_SAME_DAY | X | X | Once a year on the requested execution date (or the next banking day) | ||
| YEARLY_EOM | X | Once a year on the the last banking day of the month | |||
| EVERY_MINUTE_SANDBOX_ONLY | X | X | X | X | Testing in Sandbox only! Every minute, a recurrence of the payment will be Paid and the next occurrence created until the counter reaches 0. |
![]()
In Sandbox: We have added EVERY_MINUTE_SANDBOX_ONLY to `recurrence_type` for you to test the `count` and `status` of the payments in the sandbox. As confirmed payments in sandbox automatically gets `Paid` after a few second, the recurring payments will automatically run until the `count` reaches 0. Please avoid using 9999 too many times whilst testing, and EVERY_MINUTE_SANDBOX_ONLY is not accepted in production.Confirmation of Availability of Funds
Confirmation of Availability of Funds has been added to this endpoint.
Two new optional fields have been added
- request_availability_of_funds
- availability_of_funds
Confirmation of Availability is available for version 5.
Payment initiation
If 2SCA initiation payment endpoint is available and the request contains the new field, request_availability_of_funds set to true and SBX scenario specified “FundsNotAvalable” in request header when the endpoint is invoked, then the payment initiation response is returned with new field availability_of_funds is set false.
If 2SCA initiation payment endpoint is available and the request contains the new field, request_availability_of_funds set to true and SBX scenario is not specified when the endpoint is invoked, then the payment initiation response returned with new field availability_of_funds is set true.
Get payment details
If 2SCA get payment details endpoint is available and SBX scenario is specified FundsNotAvailable and payment status is not Rejected or Executed, when the endpoint is invoked with query parameter request_availability_of_funds true, then the response of Get Payment Details is returned with funds info availability_of_funds set false.
If 2SCA get payment details endpoint is available and SBX scenario is not specified and payment status is not Rejected or Executed, when the endpoint is invoked with query parameter request_availability_of_funds true, then the response of Get Payment Details is returned with funds info availability_of_funds set true.
The examples for Payment initiation and Get payment details of Confirmation of Availability of Funds are updated in this documentation in Denmark examples.
PIS API examples Denmark
Denmark: initiate a new payment
In this example, we initiate a new payment.
This endpoint URL has the following form:
https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers/This endpoint supports GET, POST and DELETE HTTP Methods. Here we use POST since we create a new payment.
Here is an example request (domestic). The example contains Confirmation of Availability of Funds:
$ curl 'https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature=\"<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>' \
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 25,
"currency": "DKK"
},
"requested_execution_date": "2026-08-11",
"creditor": {
"account": {
"_type": "BBAN_DK",
"currency": "DKK",
"value": "30013001783718"
},
"message": "crd msg",
"name": "Beneficiary name"
},
"debtor": {
"account": {
"_type": "BBAN_DK",
"currency": "DKK",
"value": "20301544118028"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}And the sample response looks like this (domestic):
"group_header": {
"message_identification": "6489590af1a709422d85c7fb20ec35d5",
"creation_date_time": "2026-08-11T07:14:06.847512982Z",
"http_code": 201
},
"response": {
"_id": "069ad99f-4fb2-46c2-a7f2-55c019a662a1",
"external_id": "some id",
"entry_date_time": "2026-08-11T07:14:06.846495324Z",
"debtor": {
"account": {
"currency": "DKK",
"value": "20301544118028",
"_type": "BBAN_DK"
},
"message": "Message for debtor"
},
"creditor": {
"account": {
"currency": "DKK",
"value": "30013001783718",
"_type": "BBAN_DK"
},
"message": "crd msg"
},
"instructed_amount": {
"amount": "25",
"currency": "DKK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/069ad99f-4fb2-46c2-a7f2-55c019a662a1"
}
]
}
}Here is an example request (Giro):
$ curl 'https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature=\"<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>' \
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 15,
"currency": "DKK"
},
"requested_execution_date": "2026-08-11",
"creditor": {
"account": {
"value": "7000413",
"_type": "GIRO_DK"
},
"reference": {
"_type": "15",
"value": "7047178577750189"
},
"name": "Beneficiary name"
},
"debtor": {
"account": {
"_type": "BBAN_DK",
"currency": "DKK",
"value": "20301544118028"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}And the response looks like this (Giro):
{
"group_header": {
"message_identification": "97ad55b4411372b5b0574ad3615f3eba",
"creation_date_time": "2026-08-11T07:47:16.202514974Z",
"http_code": 201
},
"response": {
"_id": "2dfa79e5-3fba-4c20-b7ec-773f28c46f5c",
"external_id": "some id",
"entry_date_time": "2026-08-11T07:47:16.201332244Z",
"debtor": {
"account": {
"currency": "DKK",
"value": "20301544118028",
"_type": "BBAN_DK"
},
"message": "Message for debtor"
},
"creditor": {
"account": {
"currency": "DKK",
"value": "7000413",
"_type": "GIRO_DK"
},
"reference": {
"value": "7047178577750189",
"_type": "15"
}
},
"instructed_amount": {
"amount": "15",
"currency": "DKK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/2dfa79e5-3fba-4c20-b7ec-773f28c46f5c"
}
]
}
}
Note that the
payment_statusisPendingConfirmation, it means the payment confirming(signing) process has to be started by you the TPP.
PIS API examples Sweden
Sweden: initiate a new payment
In this example, we initiate a new payment.
This endpoint URL has the following form:
https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfersThis endpoint supports GET, POST and DELETE HTTP Methods. Here we use POST since we want to create a new payment.
And here is example request (domestic):
$ curl 'https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature="<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>'
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 24.5,
"currency": "SEK"
},
"creditor": {
"account": {
"_type": "BBAN_SE",
"currency": "SEK",
"value": "30600123596"
},
"message": "crd msg",
"name": "Beneficiary name"
},
"debtor": {
"account": {
"_type": "BBAN_SE",
"currency": "SEK",
"value": "41351300039"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}
And the response looks like this:
{
"group_header": {
"message_identification": "9dc5fb40487bdc3840c61090cd5aacf1",
"creation_date_time": "2026-08-11T09:20:39.095847669Z",
"http_code": 201
},
"response": {
"_id": "9fa723f6-a738-4ac8-b1ff-7969bbd43774",
"external_id": "some id",
"entry_date_time": "2026-08-11T09:20:39.095175702Z",
"debtor": {
"account": {
"currency": "SEK",
"value": "41351300039",
"_type": "BBAN_SE"
},
"message": "Message for debtor"
},
"creditor": {
"account": {
"currency": "SEK",
"value": "30600123596",
"_type": "BBAN_SE"
},
"name": "Beneficiary name",
"message": "crd msg"
},
"instructed_amount": {
"amount": "24.5",
"currency": "SEK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/9fa723f6-a738-4ac8-b1ff-7969bbd43774"
}
]
}
}
Another example request (BankGiro):
$ curl 'https://api.nordeaopenbanking.com/personal/v4/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature="<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>'
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 24.5,
"currency": "SEK"
},
"creditor": {
"account": {
"value": "51965770",
"_type": "BGNR"
},
"name": "BANKGIRO cust",
"reference": {
"value": "109939429740003",
"_type": "OCR"
}
},
"debtor": {
"account": {
"_type": "BBAN_SE",
"currency": "SEK",
"value": "41351300039"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}And the response looks like this (BankGiro):
{
"group_header": {
"message_identification": "868b3a04e82f728bca04dac877cefe70",
"creation_date_time": "2026-08-11T09:26:33.59702264Z",
"http_code": 201
},
"response": {
"_id": "af318cd5-18b7-4b3a-8cad-5f441567a4f7",
"external_id": "some id",
"entry_date_time": "2026-08-11T09:26:33.596317526Z",
"debtor": {
"account": {
"currency": "SEK",
"value": "41351300039",
"_type": "BBAN_SE"
},
"message": "Message for debtor"
},
"creditor": {
"account": {
"currency": "SEK",
"value": "51965770",
"_type": "BGNR"
},
"name": "BANKGIRO cust",
"reference": {
"value": "109939429740003",
"_type": "OCR"
}
},
"instructed_amount": {
"amount": "24.5",
"currency": "SEK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/af318cd5-18b7-4b3a-8cad-5f441567a4f7"
}
]
}
}
Another example request (PlusGiro):
{
"instructed_amount": {
"amount": 224.5,
"currency": "SEK"
},
"creditor": {
"account": {
"value": "9366006",
"_type": "PGNR"
},
"name": "PLUSGIRO payment",
"reference": {
"value": "109939429740003",
"_type": "OCR"
}
},
"debtor": {
"account": {
"_type": "BBAN_SE",
"currency": "SEK",
"value": "41351300039"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}
And the response looks like this (PlusGiro):
{
"group_header": {
"message_identification": "d0d73153a860203a1e1c26588c03f3bc",
"creation_date_time": "2026-08-11T09:28:16.546100475Z",
"http_code": 201
},
"response": {
"_id": "e229928f-e69c-498d-b8d9-96687d37dfa4",
"external_id": "some id",
"entry_date_time": "2026-08-11T09:28:16.545223468Z",
"debtor": {
"account": {
"currency": "SEK",
"value": "41351300039",
"_type": "BBAN_SE"
},
"message": "Message for debtor"
},
"creditor": {
"account": {
"currency": "SEK",
"value": "9366006",
"_type": "PGNR"
},
"name": "PLUSGIRO payment",
"reference": {
"value": "109939429740003",
"_type": "OCR"
}
},
"instructed_amount": {
"amount": "224.5",
"currency": "SEK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/e229928f-e69c-498d-b8d9-96687d37dfa4"
}
]
}
}
Note that the
payment_statusisPendingConfirmation, it means the payment confirming(signing) process has to be started by you the TPP.
PIS API examples Norway
Norway: initiate a new payment
In this example, we initiate a new payment.
This endpoint URL has the following form:
https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfersThis endpoint supports GET, POST and DELETE HTTP Methods. Here we use POST since we create a new payment.
Here is an example request (domestic credit transfers):
$ curl 'https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature="<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>'
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 16.29,
"currency": "NOK"
},
"requested_execution_date": "2026-08-11",
"creditor": {
"account": {
"_type": "BBAN_NO",
"currency": "NOK",
"value": "60010503178"
},
"message": "With advice",
"name": "Beneficiary name"
},
"currency": "NOK",
"debtor": {
"account": {
"_type": "BBAN_NO",
"currency": "NOK",
"value": "60301132843"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}
And the response looks like this (domestic credit transfer):
{
"group_header": {
"message_identification": "47a25431316519bfb4fcf7236883c97c",
"creation_date_time": "2026-08-11T09:52:55.86753917Z",
"http_code": 201
},
"response": {
"_id": "821aba33-47bd-4a16-b4b0-d83f6ae01e67",
"external_id": "some id",
"entry_date_time": "2026-08-11T09:52:55.866604992Z",
"debtor": {
"account": {
"currency": "NOK",
"value": "60301132843",
"_type": "BBAN_NO"
}
},
"creditor": {
"account": {
"currency": "NOK",
"value": "60010503178",
"_type": "BBAN_NO"
},
"name": "Beneficiary name",
"message": "With advice"
},
"instructed_amount": {
"amount": "16.29",
"currency": "NOK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/821aba33-47bd-4a16-b4b0-d83f6ae01e67"
}
]
}
}
Here is an example request (KID):
$ curl 'https://api.nordeaopenbanking.com/personal/v6/payments/domestic-credit-transfers' -i -X POST \
-H 'X-Nordea-Originating-Host: <host>' \
-H 'X-Nordea-Originating-Date: <now>' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <access_token>' \
-H 'digest: <generated_digest>' \
-H 'signature: keyId=\"<your_clientapp_keyid>\",algorithm=\"rsa-sha256\",headers=\"(request-target) x-nordea-originating-host x-nordea-originating-date\",signature="<generated_signature>"' \
-H 'X-IBM-Client-Id: <your_client_id>' \
-H 'X-IBM-Client-Secret: <your_client_secret>'
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"instructed_amount": {
"amount": 16.29,
"currency": "NOK"
},
"requested_execution_date": "2026-08-11",
"creditor": {
"account": {
"_type": "BBAN_NO",
"currency": "NOK",
"value": "60030505428"
},
"name": "Test Name",
"reference": {
"_type": "OCR",
"value": "018"
}
},
"currency": "NOK",
"debtor": {
"account": {
"_type": "BBAN_NO",
"currency": "NOK",
"value": "60301132843"
},
"message": "Message for debtor"
},
"external_id": "some id",
"urgency": "standard"
}
And the response looks like this (KID):
{
"group_header": {
"message_identification": "e4b1d1dc565191458f5cc691706b6739",
"creation_date_time": "2026-08-11T09:54:34.914801352Z",
"http_code": 201
},
"response": {
"_id": "af409f5d-68d5-47ab-8e95-4c5583d66e8b",
"external_id": "some id",
"entry_date_time": "2026-08-11T09:54:34.91354395Z",
"debtor": {
"account": {
"currency": "NOK",
"value": "60301132843",
"_type": "BBAN_NO"
}
},
"creditor": {
"account": {
"currency": "NOK",
"value": "60030505428",
"_type": "BBAN_NO"
},
"name": "Test Name",
"reference": {
"value": "018",
"_type": "OCR"
}
},
"instructed_amount": {
"amount": "16.29",
"currency": "NOK"
},
"payment_status": "PendingConfirmation",
"urgency": "standard",
"requested_execution_date": "2026-08-11",
"planned_execution_date": "2026-08-11",
"tpp_messages": [],
"_links": [
{
"rel": "self",
"href": "/v6/payments/af409f5d-68d5-47ab-8e95-4c5583d66e8b"
}
]
}
}
Note that the
payment_statusisPendingConfirmation, it means the payment confirming(signing) process has to be started by you the TPP.