Initiate cross-border payment
curl --request POST \ --url https://api.ztlpay.io/api/v2/payments/cross-border \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'PSU-IP-Address: 192.158.1.38' \ --header 'PSU-User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/63.0' \ --header 'consent-id: 3a797348-ef0c-4f52-b821-fdfcdb98c4d9' \ --data '{ "metadata": { "endToEndId": "example" }, "from": { "account": { "type": "bban", "bic": "ESSESESS", "bban": 12341212345 }, "contactInformation": { "name": "ZTL Payment Solution AS", "address": { "streetName": "Akersgata", "buildingNumber": 32, "city": "Oslo", "postCode": "0180", "country": "NO" }, "telephoneNumber": "+4740000858" }, "currency": "NOK", "organizationNumber": 920970931 }, "to": { "account": { "type": "bban", "bic": "ESSESESS", "bban": 12341212345, "clearingCode": 1234 }, "contactInformation": { "name": "ZTL Payment Solution AS", "address": { "streetName": "Akersgata", "buildingNumber": 32, "city": "Oslo", "postCode": "0180", "country": "NO" } } }, "amount": { "amount": "1000.50", "currency": "NOK" }, "dueDate": "2026-04-15", "remittanceInformation": { "message": "example", "additionalInformation": [ { "type": "TaxCode", "value": "example" } ], "debtorReference": "example" }, "regulatoryReporting": { "code": "14", "information": "example" } }'Initiates a cross-border payment, this includes all transactions involving currency accounts. If the transaction requires exchange it will result in a psd2 domestic payment to ZTL’s client account, these payment must be signed within deadline (2 or 5 minutes), if not it gets automatically cancelled. Payments that do not require exchange will go through the bank as cross-border payments.
We request that when a cross-border payment is initiated and due date is today or tomorrow (if initiated after 16:00) that you give user a warning if balance is less than value of the payment. Reason for this warning is to remind those who are lacking funds that they do not have funds and to avoid the payment being delayed or in worst case cancelled.
See Country and Currencies endpoint supported countries, currencies and constraints.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Example
3a797348-ef0c-4f52-b821-fdfcdb98c4d9A valid consentId
Example
192.158.1.38AAA IP Address of the end-user initiating the payment. DO NOT use any other IP address than what you can collect from the current user session that uses your system (don’t use something stored in your DB). This information is used by the banks to manage traffic and handle security.
The forwarded Agent header field of the HTTP request between PSU and TPP.
Example
Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/63.0Request Body
Section titled “Request Body”object
object
External EndToEndId for the payment
object
object
Bank Identification Code
Example
ESSESESSBank Account number in Bban format
Example
12341212345object
The name of the organization.
Maximum length depends on whether the payment includes currency exchange:
- Without currency exchange: check debtor bank maxInformationFieldLength requirements
- With currency exchange: 70 characters
Example
ZTL Payment Solution ASAddress information for payee
object
Street name
Example
AkersgataBuilding number
Example
32City or town name
Example
OsloPost code
Example
0180Country
Example
NOPhone number for the organization
Example
+4740000858Sender accounts Currency
Example
NOKOrganization number for the company
Example
920970931object
object
Bank Identification Code
Example
ESSESESSBank Account number in Bban format
Example
12341212345Code required for payments to certain countries
Example
1234object
Bank Identification Code
Example
ESSESESSBank account number in Iban format.
Example
SE7250000000012341212345object
The name of the organization.
Maximum length depends on whether the payment includes currency exchange:
- Without currency exchange: check debtor bank maxInformationFieldLength requirements
- With currency exchange: 70 characters
Example
ZTL Payment Solution ASAddress information for payee
object
Street name
Example
AkersgataBuilding number
Example
32City or town name
Example
OsloPost code
Example
0180Country
Example
NOAmount and currency to be paid
object
Amount to be paid
Example
1000.50The currency the amount is specified in
Example
NOKThe due date for the psd2 transaction from user account to ZTL client account. Payout to creditor account are usually 2 business days later
object
object
Type of additional information. Must be compliant with receiving country rules
ReasonText to describe the reason for paymentPurposeA valid PurposeCode of the paymentTaxCodeReceiver Tax code
Example
ReasonValue of the property
Reference text or message intended for display to the debtor only. It can be used to provide debtor-facing payment details or context. Availability depends on bank support and is included only when accepted by the receiving institution.
Information used for regulatory reporting, only applicable in Norway and Sweden. Required for payments above 100 000 NOK in Norway, and 150 000 SEK in Sweden.
object
Code used for regulatory reporting
Example
14Information for regulatory reporting, only applicable in Norway
Responses
Section titled “Responses”Initiated cross-border payment
object
The initial payment status indicates if the payment was accepted, and if it needs to be signed before it will be executed in the bank
object
UnsignedThe user must approve the transaction.InProgressThe payment is ongoing.CompletedThe payment has been completed by the bank.RejectedThe bank rejected the payment.CancelledThe payment has been cancelled.CustomerActionRequiredThe payment requires further action from the user. See statusReason for details.
PartlySignedIndicates that the payments needs additional signing. This requirement may be set up for the bank account.SmsConfirmationRequiredThe user needs additional confirmation with responding SMS received. Only used by a few banksInsufficientFundsThe payment has been stopped by the bank due to lack of funds
Payment status reason, unmapped reason text from bank.
Timestamp when the status was fetched from bank
Amount and currency to be paid
object
Amount to be paid
The currency the amount is specified in
The exchange rate per single unit
Expiry time for quote, the payment may be automatically cancelled by ZTL if it’s not signed before this deadline
The Client account for the funding domestic psd2 transaction related to the payment. Account owned by ZTL.
object
Account information for creditor. Required fields depend on creditorCountry, but bban or iban should always be present.
object
International Bank Account Number
Basic Bank Account Number
Bank Identification Code
Code required for payments to certain countries
Creditor contact information
object
The name of the organization making the payment
The address of the organization making the payment
object
Street name
Building number
City or town name
Post code
Country
Example
{ "paymentStatus": { "status": "Unsigned", "statusReason": "PartlySigned", "timestamp": "2024-03-19T09:34:57.657733682+01:00" }, "costAmount": { "amount": "1000.50", "currency": "NOK" }, "exchangeRate": 1.0346, "quoteExpiryTime": "2023-01-15T09:32:00+01:00", "intermediaryAccount": { "account": { "iban": "SE7250000000012341212345", "bban": 12341212345, "bic": "ESSESESS", "clearingCode": 1234 }, "contactInformation": { "name": "ZTL Payment Solution AS", "address": { "streetName": "Eriksbergsgatan", "buildingNumber": 10, "city": "Sweden", "postCode": 11430, "country": "SE" } } }}Bad Request
object
MAX_AMOUNT_EXCEEDEDMax amount exceeded for currency with due date in future, change due-date to todaySERVICE_CLOSEDService is currently closedUNSUPPORTED_DUE_DATEDue date is not supported for the currency/due-date pairINVALID_CONSENTConsent is invalidAUTHENTICATION_TEMPORARY_UNAVAILABLEAuthentication service is temporary unavailable, most likely due to user already has started another concurrent authentication processUNSUPPORTED_PRODUCT_BY_BANKProduct is not supported by bankACCESS_DENIEDPSU does not have access to resource. Ensure debtorAccount is correct and user have payment access to account.
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "failure": "MAX_AMOUNT_EXCEEDED", "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Max amount exceeded for currency with due date in future, change due-date to today"}Forbidden
object
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "failure": "COMPANY_DISABLED_FOR_INTERNATIONAL_PAYMENTS", "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Invalid account"}Not found
object
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Invalid account"}Headers
Section titled “Headers”Unique RequestId, please provide this Id in case of support requests
Example
3a797348-ef0c-4f52-b821-fdfcdb98c4d9Conflict
object
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Invalid account"}Headers
Section titled “Headers”Unique RequestId, please provide this Id in case of support requests
Example
3a797348-ef0c-4f52-b821-fdfcdb98c4d9Input validation fails
object
The error code
The underlying reason for the error
Path for the error
Example
[ { "code": "InvalidRequest", "reason": "Invalid account", "path": ".from.account" }]Internal server error
object
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Invalid account"}Headers
Section titled “Headers”Unique RequestId, please provide this Id in case of support requests
Example
3a797348-ef0c-4f52-b821-fdfcdb98c4d9Service unavailable
object
Unique RequestId, please provide this Id in case of support requests
The underlying reason for the error
Example
{ "ztlRequestId": "3a797348-ef0c-4f52-b821-fdfcdb98c4d9", "message": "Invalid account"}Headers
Section titled “Headers”Unique RequestId, please provide this Id in case of support requests
Example
3a797348-ef0c-4f52-b821-fdfcdb98c4d9