The ISO Payments API allows you to initiate secure, structured payments by submitting payment instructions in JSON format from which an ISO 20022 pain.001 file is generated and uploaded to the online bank for authorization.
For requests to the PIS API, you need an access token with scope set to paymentinitiation corporate.
Initiating ISO 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.
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/fx http
Name Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party.
Name Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party.
Request Body
Name Type Description sourceCurrencystring The source currency. targetCurrencystring The target currency. requestedExecutionDatestring(date) The requested execution date, for future payments. countryCodestring The target country. amountstring 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"
}' bash
Response
{
"fxQuoteId": "F100000PFM",
"fxRate": "10.87410000",
"fee": "1.50",
"totalAmount": "110.25",
"validFrom": "2024-08-23T14:12:57Z",
"validTo": "2024-08-24T14:12:57Z"
} json
The 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 is where you create the payment you wish to upload in file format.
domestic EndpointName Type Description X-Request-IDstring The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. PSU-IP-Addressstring 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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
Request BodyName Type Description instructedAmountobject The amount and currency of the money to be transferred. debtorAccountobject The account from which the payment will be debited. creditorNamestring The full name of the payment recipient. creditorAccountobject The account to which the payment will be credited. creditorAgentstring The BIC of the payment recipient's bank. creditorAgentNamestring The name of the payment recipient's bank. requestedExecutionDatestring The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. remittanceInformationUnstructuredstring A free-text field for remittance information on the payment. debtorAccountMessagestring A personal message from the payer to themselves.
curl -X POST "https://api.openbankingplatform.com/iso/payments" \
-H "Accept: application/json" \
-H "Authorization: Bearer <eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0>..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 2e02a131-a35a-450f-a736-9a06086f3337" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-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-06-10",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}' bash
swedish-giro EndpointName Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. PSU-IP-Addressstring(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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
Request BodyName Type Description instructedAmountobject The amount and currency of the money to be transferred. debtorAccountobject The account from which the payment will be debited. creditorNamestring The full name of the payment recipient. creditorGiroobject The Bankgirot or Plusgirot account to which the payment will be credited. creditorAgentstring The BIC of the payment recipient's bank. requestedExecutionDatestring(date) The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. invoiceRefstring A custom invoice reference. ocrRefstring A Giro OCR reference. debtorAccountMessagestring A personal message from the payer to themselves. creditorAccountMessagestring A personal message from the payer to the recipient.
curl -X POST "https://api.openbankingplatform.com/iso/payments" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 7891fc3d-85a3-4b8d-bf70-cd3805631607" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"instructedAmount": {
"currency": "SEK",
"amount": "1230.50"
},
"debtorAccount": {
"iban": "SE123456789000532811"
},
"creditorName": "Merchant 123",
"creditorGiro": {
"giroNumber": "123-4567",
"giroType": "BANKGIRO"
},
"creditorAgent": "HANDSESS",
"requestedExecutionDate": "2025-06-10",
"invoiceRef": "Invoice Nr 4421",
"ocrRef": "Personal note",
"debtorAccountMessage": "Personal note";
"creditorAccountMessage": "Invoice payment"
}' bash
international-tp EndpointPOST /iso/payments/international-tp http Name Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. FX-Quote-Idstring The ID of the FX Quote to be used for the payment. Used for international TP payments only. PSU-IP-Addressstring(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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
Request BodyName Type Description instructedAmountobject The amount and currency of the money to be transferred. debtorAccountobject The account from which the payment will be debited. creditorNamestring The full name of the payment recipient. creditorAccountobject The account to which the payment will be credited. creditorAddressobject The address of the payment recipient. creditorAgentstring The BIC of the payment recipient's bank. creditorAgentNamestring The name of the payment recipient's bank. requestedExecutionDatestring(date) The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. remittanceInformationUnstructuredstring A free-text field for remittance information on the payment. debtorAccountMessagestring A personal message from the payer to themselves.
curl -X POST "https://api.openbankingplatform.com/iso/payments/international-tp" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: 69de0a9d-a5e0-47cd-bdf8-f33dc4028e0c" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "FX-Quote-Id: F100000PFM" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"instructedAmount": {
"currency": "SEK",
"amount": "1230.50"
},
"debtorAccount": {
"iban": "SE123456789000532811"
},
"creditorName": "Merchant 123",
"creditorAccount": {
"iban": "NL123456789000222333"
},
"creditorAddress": {
"country": "NL"
},
"creditorAgent": "RABONL2U",
"creditorAgentName": "Coöperatieve Rabobank U.A.",
"requestedExecutionDate": "2025-06-10",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}' bash The 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 EndpointName Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. PSU-IP-Addressstring(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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
Request BodyName Type Description instructedAmountobject The amount and currency of the money to be transferred. debtorAccountobject The account from which the payment will be debited. creditorNamestring The full name of the payment recipient. creditorAccountobject The account to which the payment will be credited. creditorAgentstring The BIC of the payment recipient's bank. creditorAgentNamestring The name of the payment recipient's bank. requestedExecutionDatestring(date) The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. remittanceInformationUnstructuredstring A free-text field for remittance information on the payment. debtorAccountMessagestring A personal message from the payer to themselves.
curl -X POST "https://api.openbankingplatform.com/iso/payments" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: a062542e-8669-43e0-b67d-593d03af0e0f" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-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-05-19",
"remittanceInformationUnstructured": "Ref Number Merchant",
"debtorAccountMessage": "Personal note"
}' bash
Response
{
"transactionStatus": "RCVD",
"paymentId": "a3cf0daa-6d43-4156-afd4-1d859ad448a8",
"_links": {
"confirmPayment": {
"href": "/iso/payments/confirm"
},
"self": {
"href": "/iso/payments/a3cf0daa-6d43-4156-afd4-1d859ad448a8"
}
}
} json
2. Confirm Payment
After creating the desired ISO payment(s), confirm it to generate and upload a pain.001 file to the online bank. Multiple existing payments can be included in the file by specifying them in the paymentIds body parameter.
Endpoint
PUT /iso/payments/confirm http
Name Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. PSU-IP-Addressstring(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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
Request Body
Name Type Description paymentIdsarray The IDs of the payments to include in the confirmation. batchBookingPreferredboolean Indicates a preference to execute the payment as a batch booking when set to true.
curl -X PUT "https://api.openbankingplatform.com/iso/payments/confirm" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: e26e0f4b-7fbd-4a23-8939-aa7e5275825c" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "PSU-IP-Address: 152.120.171.187" \
-d '{
"paymentIds": [
"a3cf0daa-6d43-4156-afd4-1d859ad448a8",
"186901d2-2022-412f-a321-60062ef1ba1c",
"84b1133c-9ef8-41dd-8dc1-0b64a8d955d3"
],
"batchBookingPreferred": "false"
}' bash
Response
{
"tppMessages": [
{
"category": "INFORMATION",
"code": "FILE_UPLOADED",
"text": "OPE20250609T1057016350301Z"
}
]
} json
3. Authorise Payment
After successfully confirming the payments, the PSU then needs to log into their online bank and authorize the file.
4. Get Payment
Lastly, check the status of each payment included in the file.
Endpoint
GET /iso/payments/{paymentId} http
Path Parameters
Name Type Description paymentIdstring The ID of the payment that was created.
Name Type Description X-Request-IDstring(uuid) The ID of the request, unique to the call, as determined by the initiating party. X-BicFistring The BIC of the bank to which the request is addressed. PSU-IDstring The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. PSU-Corporate-IDstring The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. PSU-IP-Addressstring(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-Agentstring The forwarded Agent header field of the HTTP request between PSU and TPP, if available.
curl -X GET "https://api.openbankingplatform.com/iso/payments/a3cf0daa-6d43-4156-afd4-1d859ad448a8" \
-H "Accept: application/json" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIn0..." \
-H "Content-Type: application/json" \
-H "X-Request-ID: c2ef85d1-dfc8-450d-b820-c90edc0f7de2" \
-H "X-BicFi: ESSESESS" \
-H "PSU-ID: 123456789001" \
-H "PSU-Corporate-ID: 1234567890" \
-H "PSU-IP-Address: 152.120.171.187" bash
Response
{
"transactionStatus": "ACSC"
} json
Payments 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.