Premium APIsPayment RefundPayment Refund API v1

Payment Refund API - details

The Refund API facilitates client applications to initiate a refund of a credit transfer payment from a Nordea corporate account. There are number of conditions and rules to follow when formulating the payment instruction to refund a payment. These details are explained within this API specification.

The consuming Client Application can use API requests to:

  • Create a refund payment instruction - single SEPA credit transfer instructions only
  • Track the refund status

Payment Refund API is in a pilot phase and is only available for specific pilot customers. To use the Refund API a Nordea corporate customer with accounts in Finland is needed as well as having received SEPA credit transfers which are to be returned to the payer. The service is limited to Finland, but our ambition is to expand the service to other Nordic countries and currencies.

Changes from previous version

Version 1.3 - Adjusted test data.

Key changes: Dynamic test data.

  • Updated test data (Dynamic Original Date)

Version 1.2 - Fields and test data updates.

Key changes: Input fields, request and response fields.

  • Updated RAPI request structure
  • Updated RAPI response structure
  • Updated test data

Version 1.1 - Available only in Sandbox, fields and test data updates.

Key changes: Input fields, request and response fields.

  • Updated scope of input attributes
  • Updated RAPI request structure
  • Updated RAPI response structure
  • Updated test data
  • Added information about limitations: up to last 24 months available data

Version 1.0 - Available only in Sandbox

The Payment Refund API is a newly introduced service to support Payments Initiation Services. Refund API provides access to two endpoints:

  • Send refund payment instruction
  • Get payment status

API endpoints

The prerequisite for integration, is:

  • client’s capability to keep track of refund payment ID by which they can query for payer info for given refund payment.
  • client’s capability to keep track of payment archive ID which needs to be provided in the refund request, so the original payment can be linked to the refund.
  • client needs to be able to provide correct values of required parameters which consist of:
    • “payment_archive_id”
    • “payment_account”
    • “currency”
    • “amount”
    • “original_payment_date”
    • “message”
EndpointMethodDescription
/corporate/payment-refunds/v1/refundsPOSTSend refund payment request to bank.
/corporate/payment-refunds/v1/refunds/{id}GETGet refund payment status from bank using given payment id.

Payment confirmation

When Nordea receives refund request through the API, the refund payment is initiated. Before sending the initiated payment for processing, authorization check is done based on technical-user permissions. If technical-user has confirmation permission for refund payment, the payment is sent for processing. Technical-user permissions will be managed using Nordea’s user administration tool.

Note that in Sandbox environment it is not required to create technical-user. Correct technical user is provided in data examples.

Payment Refund API examples

Here you can find examples how to use the Payment Refund API endpoints.

Example: Send refund payment request

This endpoint supports POST HTTP method and URL has the following form:

POST /corporate/payment-refunds/v1/refunds

The following headers must be used:

Content-Type: application/json
X-IBM-Client-Id: {client_id}
X-IBM-Client-Secret: {client_secret}
Digest: {digest} 
Signature: {signature}
Technical-user-id: {technical_user_id}
X-Nordea-Originating-Date: {date} 
X-Nordea-Originating-Host: {host}

The body of the request:

{
    "payment_archive_id": "202103152588CEP10005",
    "payment_account": "FI9819513119469790",
    "amount": "5647",
    "original_payment_date": "2024-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}
  • Payment archive id field is a mandatory and must be a valid archive id from received payment.
  • Payment account field is mandatory. Value must correspond with the creditor account in the original payment.
  • Currency field is optional. But currently RAPI service supports only SEPA payments, so currency field should be provided with “EUR”.
  • Amount field is mandatory and must be equal to the original payment amount.
  • Original payment date is mandatory and must be equal to the original payment date.
  • Message field is optional. Refund API will add default message of “Refund payment”. User defined message will be appended to this text.

Where the payment request is valid the response will be 201 SUCCESS and formatted like the example below:

{
    "group_header": {
        "message_identification": "8e1a9c71dcfee8f66152b346a68084b2",
        "creation_date_time": "2024-04-11T10:32:37.127421403Z",
        "http_code": 201
    },
    "response": {
        "refund_payment": {
            "id": "a413ea0a29294c4dae258f39dabe73ea00",
            "amount": 5647,
            "currency": "EUR",
            "message": "Refund payment. Limit of 140 characters",
            "debtor": {
                "debtor_name": "Mark Webber",
                "account": {
                    "currency": "EUR",
                    "type": "IBAN",
                    "value": "FI9819513119469790"
                }
            },
            "payment_status": "PAYMENT_PROCESSING",
            "payment_status_reason": "Payment was accepted for execution.",
            "status_timestamp": "2024-04-11T10:32:37.120420615Z"
        },
        "original_payment": {
            "archive_id": "202103152588CEP10005",
            "amount": 5647.00,
            "currency": "EUR"
        }
    }
}

Example: Get refund payment status request

This endpoint supports POST HTTP method and URL has the following form:

GET /corporate/payment-refunds/v1/refunds/{id}

The following headers must be used:

X-IBM-Client-Id: {client_id}
X-IBM-Client-Secret: {client_secret} 
Signature: {signature}
Technical-user-id: {technical_user_id}
X-Nordea-Originating-Date: {date} 
X-Nordea-Originating-Host: {host}

Where the status request is valid the response will be 200 SUCCESS and formatted like the example below:

{
    "group_header": {
        "message_identification": "5f6a6f8409f14f31f726e111f0f7af10",
        "creation_date_time": "2024-04-11T10:37:09.238989931Z",
        "http_code": 200
    },
    "response": {
        "refund_payment": {
            "id": "a7953c56069b42168e173f83170ec0e600",
            "amount": 5647.00,
            "currency": "EUR",
            "message": "Refund payment. Limit of 140 characters",
            "debtor": {
                "debtor_name": "Mark Webber",
                "account": {
                    "currency": "EUR",
                    "type": "IBAN",
                    "value": "FI9819513119469790"
                }
            },
            "payment_status": "PAYMENT_PROCESSING",
            "payment_status_reason": "Payment was accepted for execution.",
            "status_timestamp": "2024-04-11T10:35:22.394583Z"
        },
        "original_payment": {
            "archive_id": "202103152588CEP10005",
            "amount": 5647.00,
            "currency": "EUR"
        }
    }
}

Sample test data

Following table provides test data to be used when testing Refund API in Sandbox environment.

When sending refund request in Sandbox archive id must be one of the values listed in the table.

For all requests (POST & GET) use Technical-user-id value according to the table below.

Sent refund payments are cleared from database every midnight in Sandbox env. Please be aware that you can’t request a status update on a refund payment sent during previous days. Please use dynamically updated test data as follow.

Archive IDOriginal AmountOriginal AccountDynamic Original DateTechnical-user-id
202103152588CEP1000150FI9820401800063766today - 750 days (more than 24 months)51014839302
202103152588CEP10002125FI9820006008007885today - 5 days44420010764772010
202103152588CEP10003500FI2112345600000785today - 720 days (almost 24 months)51014839302
202103152588CEP10004650.50FI1410093000123458today - 5 days44420010764772010
202103152588CEP100055647FI9819513119469790today - 5 days51014839302
202103152588CEP10006657FI9819112952913632today - 5 days44420010764772010
202103152588CEP1000765FI9819093000000343today - 5 days51014839302
202103152588CEP10008213.20FI9817913186076084today - 5 days44420010764772010
202103152588CEP10009200.20FI9817455200000195today - 5 days51014839302
202103152588CEP100101234FI9815723000312512today - 5 days44420010764772010

Additional request examples

Create refund payment (system doesn’t find original payment)

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds

Headers:

Technical-user-id:51014839302

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

Body:

{
    "payment_archive_id": "202103152588CEP19999",
    "payment_account": "FI9819513119469790",
    "amount": "5647",
    "original_payment_date": "2024-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "c29b036853dc6fa4a1fed53024ab2c0a",
        "creation_date_time": "2024-04-11T10:42:39.285809753Z",
        "http_code": 201
    },
    "response": {
        "refund_payment": {
            "id": "d3fed453ddae416b9025b0fa34f1eaa300",
            "amount": 5647,
            "currency": "EUR",
            "message": "Refund payment. Limit of 140 characters",
            "debtor": {
                "account": {
                    "currency": "EUR",
                    "type": "IBAN",
                    "value": "FI9819513119469790"
                }
            },
            "payment_status": "PAYMENT_PROCESSING",
            "payment_status_reason": "Payment was accepted for execution.",
            "status_timestamp": "2024-04-11T10:42:39.275402866Z"
        }
        "original_payment": {
            "archive_id": "202103152588CEP19999",
            "amount": 5647,
            "currency": "EUR"
        }
    }
}
Get refund payment

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds/{id}

the ‘id’ parameter is generated by RAPI during creation of refund payment and should be taken from the response of ‘Create refund payment’ from value of

Headers:

Technical-user-id:51014839302

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

Response:

{
    "group_header": {
        "message_identification": "a7e378fd7a05867c0f34cdf28850bd85",
        "creation_date_time": "2024-04-11T10:47:11.874999194Z",
        "http_code": 200
    },
    "response": {
        "refund_payment": {
            "id": "d3fed453ddae416b9025b0fa34f1eaa300",
            "amount": 5647.00,
            "currency": "EUR",
            "message": "Refund payment. Limit of 140 characters",
            "debtor": {
                "account": {
                    "currency": "EUR",
                    "type": "IBAN",
                    "value": "FI9819513119469790"
                }
            },
            "payment_status": "PAYMENT_PROCESSING",
            "payment_status_reason": "Payment was accepted for execution.",
            "status_timestamp": "2024-04-11T10:42:39.275403Z"
        }
        "original_payment": {
            "archive_id": "202103152588CEP19999",
            "amount": 5647.00,
            "currency": "EUR"
        }
    }
}
Get refund payment when none is found by provided ID

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds/12345

Headers:

Technical-user-id:51014839302

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

Response:

{
    "group_header": {
        "message_identification": "2a4844f09d91dbec3d2a3c2cfc738cba",
        "creation_date_time": "2024-04-11T10:51:10.781462157Z",
        "http_code": 404
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds/12345"
        },
        "failures": [
            {
                "code": "error.notfound",
                "description": "Payment not found based on id: 12345"
            }
        ]
    }
}
Create refund with data that don’t correspond to the original payment:

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds

Headers:

Technical-user-id:51014839302

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

payment account not matching

Request body:

{
    "payment_archive_id": "202103152588CEP10005",
    "payment_account": "FI2112345600000785",
    "amount": "5647",
    "original_payment_date": "2024-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "6aedff773a42f1d9a3e85e95ae14cc12",
        "creation_date_time": "2024-04-11T10:56:15.380374845Z",
        "http_code": 400
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds"
        },
        "failures": [
            {
                "code": "error.validation",
                "description": "Request data does not match original payment data. <account>"
            }
        ]
    }
}
payment amount not matching

Request body:

{
    "payment_archive_id": "202103152588CEP10005",
    "payment_account": "FI9819513119469790",
    "amount": "5647.01",
    "original_payment_date": "2024-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "3411122467b50abe9d4d326529a748af",
        "creation_date_time": "2024-04-11T10:59:03.091697151Z",
        "http_code": 400
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds"
        },
        "failures": [
            {
                "code": "error.validation",
                "description": "Payment amount: 5647.01 differs from the original amount: 5647.00"
            }
        ]
    }
}
payment amount wrong format

Request body:

{
    "payment_archive_id": "202103152588CEP10005",
    "payment_account": "FI9819513119469790",
    "amount": "5647.000",
    "original_payment_date": "2024-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "9752b9d2ea1d12c348becdc910ffbb7c",
        "creation_date_time": "2024-04-11T11:00:10.354205522Z",
        "http_code": 400
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds"
        },
        "failures": [
            {
                "code": "error.validation",
                "description": "has illegal scale (i.e. number of fractional digits) for the given amount",
                "path": "amount",
                "type": "ValidScale"
            }
        ]
    }
}
payment date not matching

Request body:

{
    "payment_archive_id": "202103152588CEP10005",
    "payment_account": "FI9819513119469790",
    "amount": "5647",
    "original_payment_date": "2024-01-02",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "147a29068971a1160f0e9073f65e7aa6",
        "creation_date_time": "2024-04-11T11:16:07.979978528Z",
        "http_code": 400
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds"
        },
        "failures": [
            {
                "code": "error.validation",
                "description": "Request data does not match original payment data. <payment date>"
            }
        ]
    }
}
Technical user id not authorized to view refund payment. User with technical ID does not have correct permission to view the account.

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds/{id}

Headers:

Technical-user-id:44420010764772010

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

Response:

{
    "group_header": {
        "message_identification": "a9b50159c41b18a0f56f5255108ffb52",
        "creation_date_time": "2024-04-11T11:27:17.804403205Z",
        "http_code": 403
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds/a413ea0a29294c4dae258f39dabe73ea00"
        },
        "failures": [
            {
                "code": "error.resource.denied",
                "description": "No permission to account"
            }
        ]
    }
}
Create refund payment older than 24 months

Request URI: localhost:8080/corporate/payment-refunds/v1/refunds

Headers:

Technical-user-id:51014839302

X-IBM-Client-Id:{client_id}

X-IBM-Client-Secret:{secret_id}

Request body:

{
    "payment_archive_id": "202103152588CEP10001",
    "payment_account": "FI9820401800063766",
    "amount": "50",
    "original_payment_date": "2020-01-01",
    "currency": "EUR",
    "message": "Limit of 140 characters"
}

Response:

{
    "group_header": {
        "message_identification": "85b474b24d203751d2b40efd3dfed769",
        "creation_date_time": "2024-04-11T11:31:34.787002977Z",
        "http_code": 400
    },
    "error": {
        "request": {
            "url": "/corporate/payment-refunds/v1/refunds"
        },
        "failures": [
            {
                "code": "error.validation",
                "description": "Payments older than 24 months are not possible to refund."
            }
        ]
    }
}