Payall M2M Authentication API (2.0)

Download OpenAPI specification:Download

This is Payall's public API for Machine to Machine communication.

Getting started

Payall platform supports different flows depending on customer needs. Please consult the flows relevant to your operational model with our team first.

Payment flow with Payall UI onboarding

This is the most common scenario in which Payall takes care of the onboarding process of the payers. In this scenario all payments are made on behalf of payers that have been previously onboarded to Payall platform.

Payment flow with Payall UI onboarding

Payment flow with API onboarding

In this flow payers are being onboarded by the client and all the KYB/KYC data is sent to Payall platform via API. In this scenario all payments are made on behalf of payers that have been previously onboarded to Payall platform.

Payment flow with API onboarding

Payment flow without onboarding

In this scenario payments can be made on behalf of payers that have not been onboarded to Payall platform. For this scenario the API consumer is responsible for providing all the relevant payer details required for selected payment channel with each payment call.

Exchange rates

Our api supports payments with both implicit and explicit exchange rates. Use implicit exchange rates when the exact exchange rate of the payment does not need to be approved. Those would be usually cases of automated systems that make scheduled or unattended payments without user interactions.

Implicit exchange rate

For implicit exchange rate you only need one call to single-payment endpoint. Our system will immediately process the payment using the best exchange rate available at that moment in time. Response from the single-payment call will contain exchange rate information that you can check at any time.

Explicit exchange rate

Explicit exchange rate flow is best suited for scenarios in which the payer wants or needs to accept the exchange rate of the payment before the payment is processed. Please note that depending on the payment processor, the payment channel and your contract agreement you may expect different exchange rate expiration times ranging from 60 seconds to few hours. Take that into account when designing user flows on your side.

Refer to exchange-rates API endpoint for more information on how to obtain exchange rates and single-payment endpoint on how to initiate a payment with specific exchange rate.

Explicit exchange rate flow

Expired exchange rates

In case of unfortunate situation of delaying the payment due to insufficient KYC/KYB/KYT data or any other circumstances that would lead to expiry of the exchange rate used during payment initiation (applies to explicit exchange rate flow) our system will emit an event when the payment is ready to process allow you to reinitialise exchange rate approval process on your side.

After new exchange rate is approved you can PATCH your payment by providing new exchange rate ID.

Expired exchange rate flow

Document upload

In some cases in order to process a payment there may be a compliance requirement to provide additional documents. This is usually applies to payments of bigger amounts or payments to certain countries. Consult your contract agreement with Payall to find out in which scenarios this applies for your payments.

Payment with mandatory document upload

For payments that require additional documents you will have to first upload the documents and then initiate the payment. This is a two-step process. Consult documents API endpoint for more information on how to upload documents.

Payment with mandatory document upload

Payment with KYT request for documents

In some cases payment processors or KYT rules may trigger a request for additional documents to be provided for your payment. In such cases you will receive a notification with a list of documents that are required to process the payment. Each document will have a unique case UUID that you need to use when calling document upload endpoint.

It is the same endpoint as in the case of mandatory document upload. Consult documents API endpoint for more information on how to upload documents.

Payment with KYT request for documents

Document upload through Payall UI

Additional documents can also be provided through Payall UI either by the payer or by the backoffice users. Consult your contract agreement with Payall to find out which UI options are available for your organisation.

Failed KYT document checks

In case of failed document checks the process of requesting new documents will repeat. Payments that did not receive additional documents in time will be cancelled automatically. Consult your program configuration for more information on how long your payment will wait for documents.

Authentication

This API uses OAuth 2 with the Client Credentials flow (defined in OAuth 2.0 RFC 6749, section 4.4). In order to gain access token you need to pass along Client ID and Client Secret to authenticate /v2/oauth/token endpoint.

Client credentials authentication flow
  1. Your application authenticates with the Authorisation endpoint using its Client ID and Client Secret (/v2/oauth/token endpoint).
  2. Authorisation Server validates the Client ID and Client Secret.
  3. Authorisation Server responds with an Access Token.
  4. Your application can use the access token to call an API on behalf of itself.
  5. The API responds with requested data.

Authorization header

The Authorization header for the token request requires you to apply base64 encoding to the {client_id}:{client_secret} string. Please note that when generating the encoded string via command line you may end up with unexpected newline characters that will not let you obtain the access token. In that case make sure to use the following command for testing:

echo -n "{client_id}:{client_secret}" | base64

PAN Tokenization

Depending on your PCI compliance level and the way you handle card data, Payall offers two ways to tokenize sensitive payment card data like PAN (Primary Account Number) / card number.

For customers who want to limit their PCI exposure and associated compliance requirements, Payall offers a PCI Vault iframe solution. This solution is suitable for customers who do not have a PCI DSS certification and want to avoid handling sensitive card data themselves.

For customers who have a valid PCI DSS certification and want to handle card data on their side, Payall offers a Tokenization API. This API allows you to tokenize sensitive payment card data prior to initiating a payment. Tokens are used to represent payment card data in a secure way. The token can be used to make payments without exposing the actual card data.

PCI Vault iframe

Collect payment cards without the card number ever touching your systems. Payall shows the card form in an iframe, encrypts the card and gives your page a token.

All sensitive operations related to collecting, transmitting and storing card data are managed by Payall, so your PCI exposure is minimal. We still encourage you to get familiar with PCI DSS and fill in the PCI Self Assessment Questionnaire A when working with cards and using our Vault.

How it works

  1. Your page loads the Payall script and shows the card form, an iframe served by Payall.
  2. The customer enters the card. The iframe encrypts it with your public key.
  3. The iframe sends the encrypted card to Payall, which tokenizes it.
  4. Your page receives the token in a PanTokenized event and sends it to your server.
  5. Your server stores the token and uses it for payments through the Payall API.

Your page never sees the card number: it cannot read the iframe, and the iframe only gives it the token, a masked number and the card brand.

PCI Vault iframe flow

Quick start

Load the script, add an element for the form and initialize it with your client ID:

<script src="https://static.payall.com/vault/v2/js/dist/vault-client.js"></script>

<div id="card-form"></div>

<script>
    const vault = PayallVault.init({
        clientId: 'your-client-id',
        container: '#card-form',
    });

    vault.addEventHandler('PanTokenized', function (event) {
        // Send the token to your server and store it there.
        console.log(event.message.token, event.message.masked_pan, event.message.brand);
    });
    vault.addEventHandler('Error', function (event) {
        console.error(event.message.code, event.message.message);
    });
    vault.addEventHandler('Cancel', function () {
        vault.destroy();
    });
</script>

Environments

The examples on this page use the production script. While you integrate and test, use the sandbox script with your sandbox client ID; switch both to production when you go live.

Environment Use it for Script URL
Production Live payments https://static.payall.com/vault/v2/js/dist/vault-client.js
Sandbox Integration and testing, with test cards such as 4111 1111 1111 1111 and any future expiry date https://static.sandbox.payall.com/vault/v2/js/dist/vault-client.js

To try the appearance, translations and layout options before you write any code, open the playground at https://static.sandbox.payall.com/vault/v2/index.html and enter your sandbox client ID. It shows the form with the options you pick and the matching PayallVault.init call.

Always load the script from Payall. Do not copy it into your own bundle: Payall ships fixes to it without any change on your side.

This page documents version 2 of the script. Version 1, at /vault/js/dist/vault-client.js on the same hosts, is deprecated: do not use it for new integrations. It keeps working unchanged, so existing integrations are not affected, but they should migrate to version 2; the change log lists the differences and how to migrate. Breaking changes ship as a new version under a new path, so the script at a given URL never changes in an incompatible way.

Initialization

PayallVault.init takes one configuration object and returns the vault:

const vault = PayallVault.init({ clientId: 'your-client-id', container: '#card-form' });
Key Description Default
clientId Required. Your client ID, provided by Payall.
container Required. Where the form goes: a CSS selector such as #card-form, or the element itself, e.g. a React or Vue ref. Its content is replaced.
translations Texts of the form, see Translations below. English
dir ltr or rtl. Card numbers and expiry dates always read left to right. ltr
hideCancelButton true hides the Cancel button. false
appearance Colors, corners, size, spacing, font and button layout, see Appearance below. Payall look
iframeStyle width, height and border of the iframe, see Size below. full width, height of the form, no border

init throws an error when clientId or container is missing, or when no element matches the selector.

Opening the form again

Call vault.destroy() when the form is closed. It removes the iframe and stops the event handlers. Call PayallVault.init again to show a new, empty form.

Events

Register handlers with vault.addEventHandler(name, handler). The handler receives the event:

{
    "eventSource": "Payall",
    "event": "PanTokenized",
    "message": {
        "token": "b3b1b3b1-3b1b-3b1b-3b1b-3b1b3b1b3b1b",
        "masked_pan": "4532 **** **** 9707",
        "brand": "Visa"
    }
}
Event message When
PanTokenized token, masked_pan, brand The card was tokenized. Store the token on your server.
Error message, code Something went wrong, see the codes below.
Cancel message The customer pressed Cancel. The form is cleared before the event is sent.
Error code Meaning What to do
configuration The client ID is missing or unknown, or the configuration could not be loaded. Check the client ID and the environment. The form cannot be used.
validation A field is invalid. The message is also shown in the form, one event per field. Nothing: the customer corrects the field.
tokenization Payall could not tokenize the card. The message is shown in the form. Let the customer retry, or retry later.

The event names are also available in PayallVault.Events.

Size

The iframe fills the width of its container, and its height follows the form, for example when the expiry date fields appear. Set the space around the form with the padding appearance option and the height of the inputs and buttons with size. Use iframeStyle for a width, a fixed height or a border. Every key is optional:

PayallVault.init({
    clientId: 'your-client-id',
    container: '#card-form',
    iframeStyle: { width: '400px', height: '320px', border: '1px solid #D0D5DD' },
});

border accepts any CSS border value, e.g. none or 1px solid #D0D5DD. With a fixed height the iframe no longer follows the form and may scroll.

Appearance

Every key is optional; keys you leave out keep the Payall look. Invalid values and unknown keys are ignored with a warning in the browser console.

PayallVault.init({
    clientId: 'your-client-id',
    container: '#card-form',
    appearance: {
        colorPrimary: '#0055FF',
        colorInputBorder: '#D0D5DD',
        inputBorderRadius: 8,
        buttonBorderRadius: 8,
        padding: 16,
        size: 'large',
        buttonLayout: 'vertical',
    },
});
Key Applies to If not set Allowed values
colorPrimary Encrypt button background; default for the Cancel button and the focused input #4A99AC hex color, e.g. #0055FF
colorEncryptButtonText Encrypt button text #FFFFFF hex color
colorCancelButtonBackground Cancel button background #FFFFFF hex color
colorCancelButtonText Cancel button text and border colorPrimary hex color
colorInputText Text typed into the inputs, expiry date separator #22242A hex color
colorInputBackground Input background #FFFFFF hex color
colorInputBorder Input border #BDC7CB hex color
colorLabel Input labels #555F69 hex color
colorPlaceholder Input placeholders #87949E hex color
colorError Border of an invalid input and error messages #F63F6C hex color
colorFocus Outline of the focused input colorPrimary hex color
inputBorderRadius Input corners, in pixels 8 whole number from 0 to 32
buttonBorderRadius Button corners, in pixels; 32 gives fully rounded ends in every size 32 whole number from 0 to 32
size Height of the inputs and buttons: small is 32px for compact layouts, medium is 40px, large is 48px, recommended for touch screens medium small, medium or large
padding Space between the iframe edge and the form, in pixels 0 whole number from 0 to 48
fontFamily Labels, buttons and error messages Poppins Poppins, Arial or system-ui
buttonLayout Buttons side by side, or stacked with Encrypt on top horizontal horizontal or vertical

Hex colors use the #RGB or #RRGGBB format. The card number and expiry inputs always use a monospace font.

Translations

Pass the texts to replace as an object. Every key is optional; missing keys keep the English text.

PayallVault.init({
    clientId: 'your-client-id',
    container: '#card-form',
    translations: {
        panLabel: 'Número de tarjeta',
        expiryLabel: 'Fecha de expiración',
        encryptLabel: 'Guardar tarjeta',
        cancelLabel: 'Cancelar',
    },
});
Key Where it is shown Default text
panLabel Card number label Card Number
expiryLabel Expiry date label Expiry Date
encryptLabel Encrypt button Encrypt
cancelLabel Cancel button Cancel
cardNumberEmpty Error: card number is empty Card number is empty
invalidCardNumber Error: card number is invalid Invalid card number
expiryDateRequired Error: expiry month or year is missing Expiry Date fields are required.
invalidNumericValues Error: expiry month or year is not a number Please enter valid numeric values.
invalidMonth Error: month is not between 01 and 12 Month must be between 01 and 12.
expiryDateInPast Error: expiry date is in the past Expiry date must be in the future.
configurationError Error: the form could not be configured Configuration error
genericError Error: tokenization failed Something went wrong

Translations are shown as plain text, in any script, with punctuation and symbols such as Card number (16 digits) or Pay €10.50!. Only < and >, line breaks and invisible formatting characters are removed, and each translation is cut at 100 characters. If nothing is left, the English text is used. The keys are also available in PayallVault.TranslationKeys.

React

Load the script once, pass the element from a ref, and destroy the form when the component unmounts:

import { useEffect, useRef } from 'react';

const SCRIPT_URL = 'https://static.payall.com/vault/v2/js/dist/vault-client.js';
let scriptLoading = null;

function loadPayallVault() {
    if (!scriptLoading) {
        scriptLoading = new Promise((resolve, reject) => {
            const script = document.createElement('script');
            script.src = SCRIPT_URL;
            script.onload = () => resolve();
            script.onerror = () => reject(new Error('Could not load the Payall Vault script'));
            document.head.appendChild(script);
        });
    }
    return scriptLoading;
}

export function CardForm({ clientId, onToken }) {
    const container = useRef(null);

    useEffect(() => {
        let vault = null;
        let unmounted = false;
        loadPayallVault().then(() => {
            if (unmounted) return;
            vault = PayallVault.init({ clientId, container: container.current });
            vault.addEventHandler('PanTokenized', event => onToken(event.message.token));
        });
        return () => {
            unmounted = true;
            if (vault) vault.destroy();
        };
    }, [clientId]);

    return <div ref={container} />;
}

Mobile apps

Show the form in a WebView that loads a small HTML page with the same code as on a website, and forward the events to the app. The page must be loaded over HTTPS, or with an HTTPS base URL, because the card is encrypted with the Web Crypto API, which only works in secure contexts.

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://static.payall.com/vault/v2/js/dist/vault-client.js"></script>
</head>
<body style="margin: 0">
<div id="card-form"></div>
<script>
    const vault = PayallVault.init({
        clientId: 'your-client-id',
        container: '#card-form',
        appearance: { size: 'large', padding: 16, buttonLayout: 'vertical' },
    });
    ['PanTokenized', 'Error', 'Cancel'].forEach(function (name) {
        vault.addEventHandler(name, function (event) {
            const data = JSON.stringify(event);
            if (window.ReactNativeWebView) {
                window.ReactNativeWebView.postMessage(data);            // React Native
            } else if (window.webkit && window.webkit.messageHandlers.payall) {
                window.webkit.messageHandlers.payall.postMessage(data); // iOS WKWebView
            } else if (window.PayallBridge) {
                window.PayallBridge.onEvent(data);                      // Android @JavascriptInterface
            }
        });
    });
</script>
</body>
</html>

Host the page on your HTTPS domain, or load it as a string with an HTTPS base URL (loadHTMLString(_:baseURL:) on iOS, loadDataWithBaseURL on Android, source={{ html, baseUrl }} in React Native). Do not open the iframe URL directly: its parameters are internal and may change.

TypeScript

Type declarations are published next to the script, at https://static.payall.com/vault/v2/js/dist/vault-client.d.ts, and at the same path on sandbox. Save the file in your project and reference it to get autocompletion and type checks:

/// <reference path="./vault-client.d.ts" />

const vault = PayallVault.init({ clientId: 'your-client-id', container: '#card-form', appearance: { size: 'large' } });
vault.addEventHandler('PanTokenized', event => saveToken(event.message.token));

Full example

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Add a card</title>
    <script src="https://static.payall.com/vault/v2/js/dist/vault-client.js"></script>
</head>
<body>
    <button id="add-card">Add a card</button>
    <div id="card-form"></div>
    <script>
        let vault = null;

        document.getElementById('add-card').addEventListener('click', function () {
            if (vault) vault.destroy();
            vault = PayallVault.init({
                clientId: 'your-client-id',
                container: '#card-form',
                appearance: { colorPrimary: '#0055FF', padding: 16 },
                iframeStyle: { width: '400px' },
            });
            vault.addEventHandler('PanTokenized', function (event) {
                fetch('/cards', { method: 'POST', body: JSON.stringify({ token: event.message.token }) });
                vault.destroy();
            });
            vault.addEventHandler('Error', function (event) {
                if (event.message.code === 'configuration') {
                    console.error('The card form is not configured:', event.message.message);
                }
            });
            vault.addEventHandler('Cancel', function () {
                vault.destroy();
            });
        });
    </script>
</body>
</html>

Tokenization API

If you collect card numbers on your side, you need to interact with the Payall Vault API to tokenize sensitive payment card data prior to initiating a payment. Tokens are used to represent payment card data in a secure way. The token can be used to make payments without exposing the actual card data. See PCI Vault Tokenization API for more information.

Tokenization API flow

Please note that in order to use the Vault API and encrypt sensitive PAN data on your side you need to have a valid PCI DSS certification. Otherwise, you can use the Payall PCI Vault iframe solution instead.

Payall is certified PCI DSS Level 1 Service Provider.

Encryption

The Payall Vault API uses asymmetric encryption to secure the PAN data. You are required to encrypt the PAN using a public key and algorithm provided by Payall in response to the GET Configuration request.

Note that keys may be rotated without prior notice and you should always fetch the latest configuration before encrypting the PAN.

At the time of writing the algorithm used is RSAES-OAEP with SHA-256 hash.

Validation

Prior to sending the PAN to the Payall Vault API you should validate and sanitize the PAN data. The PAN should be a valid card number - we suggest to verify it using Luhn algorithm.

Sanitization

Before encrypting the PAN you should remove all non-numeric characters including any leading and trailing spaces. Expected pattern match is ^[1-9][0-9]{7,19}$.

Error codes

Error response

When interacting with our API you may encounter the following error responses:

{
  "code": "PUB4004",
  "message": "The payer type is missing or incorrect.",
  "timestamp": "2025-02-03T15:07:57.735569007Z"
}

3rd party errors

In some cases, when the error is caused by a 3rd party system, the error code will be PUB9001 and will contain additional information from the external system:

{
  "code": "PUB9001",
  "message": "External system error.",
  "timestamp": "2025-02-03T15:07:57.735569007Z",
  "data": {
    "code": "150008",
    "message": "Internal Configuration Error."
  }
}

Error codes list

The following table lists the error codes that the API can return:

Error code Message
PUB1 General or unhandled error. Please contact administrator.
PUB2 Security error. Please contact administrator.
PUB3 Not found error. See error message for details.
PUB4 External system client error. Please contact administrator.
PUB5 External system server error. Please contact administrator.
PUB20 Data validation error. Please contact administrator.
PUB21 Data validation error.
PUB6 External 500 error. Please contact administrator.
PUB7 Unauthorized access to external service. Please contact administrator.
PUB8 Forbidden access to external service. Please contact administrator.
PUB9 Mapping payload exception. Please contact administrator.
PUB10 Method not allowed. Please contact administrator.
PUB1001 System configuration error. Please contact administrator.
PUB1010 The payment channel was not found. Please contact administrator.
PUB1011 Payment channel misconfiguration. Please contact administrator.
PUB1021 Payment schema misconfiguration. Please contact administrator.
PUB2001 Access control error. Please contact administrator.
PUB2002 Access denied. Please contact administrator.
PUB2003 Onboarding a payer is not allowed for this API key, the ONBOARDING scope is required. Please contact administrator.
PUB4001 General input validation error. See error message for details.
PUB4002 Payload unreadable. See error message for details.
PUB4003 Data binding error. See error message for details.
PUB4004 The payer type is missing or incorrect
PUB4005 The business payer's legal name is missing
PUB4006 The business payer's incorporation country is missing
PUB4007 The business payer's incorporation country is incorrect
PUB4008 The business payer's registration number is missing
PUB4009 The business payer's registration address is missing
PUB4010 The business payer's registration date is incorrect
PUB4011 The business payer's phone number is incorrect
PUB4012 The person's first name is missing
PUB4013 The person's last name is missing
PUB4014 The person's phone number is missing
PUB4015 The person's phone number is incorrect
PUB4016 The person's registration address is missing
PUB4017 The person's government ID is missing
PUB4018 The person's date of birth is missing
PUB4019 The person's date of birth is incorrect
PUB4020 The person's email is missing
PUB4021 The recipient type is missing or incorrect
PUB4022 The business recipient's legal name is missing
PUB4023 The business recipient's trade name is missing
PUB4024 The business recipient's phone number is missing
PUB4025 The business recipient's phone number is incorrect
PUB4026 The business recipient's email is missing
PUB4027 The business recipient's registration number is missing
PUB4028 The business recipient's registration address is missing
PUB4029 The business recipient's incorporation country is missing
PUB4030 The business recipient's incorporation country is incorrect
PUB4031 The person's first name is missing
PUB4032 The person's last name is missing
PUB4033 The person's mobile number is missing
PUB4034 The person's mobile number is incorrect
PUB4035 The person's email is missing
PUB4036 The person's date of birth is incorrect
PUB4037 The person's registration address is missing
PUB4038 The city in the registration address is missing
PUB4039 The city in the registration address is incorrect
PUB4040 The country in the registration address is missing
PUB4041 The country in the registration address is incorrect
PUB4042 The street address in the registration address is missing
PUB4043 The street address in the registration address is incorrect
PUB4044 The unit number in the registration address is incorrect
PUB4045 The building number in the registration address is incorrect
PUB4046 The payer type is incorrect, there is a mismatch between Person and Business type
PUB4047 The recipient type is incorrect, there is a mismatch between Person and Business type
PUB4048 The payment instrument category is missing or incorrect
PUB4049 The payment instrument recipient ID is missing
PUB4050 The payment instrument currency is missing
PUB4051 The payment instrument currency is incorrect
PUB4052 The payment instrument country is incorrect
PUB4053 The payment instrument mobile number is missing
PUB4054 The payment instrument mobile number is incorrect
PUB4055 The payment instrument bank country is incorrect
PUB4056 The payment instrument token is missing
PUB4057 The payment instrument recipient ID is incorrect
PUB4058 The payment instrument bank account type is incorrect
PUB4059 The person's email is duplicated
PUB4060 The person's email is incorrect
PUB4095 The business payer's email is incorrect
PUB4061 The business recipient's email is incorrect
PUB4062 The person's email is incorrect
PUB4063 The payer must be at least 18 years old. Please check the date of birth
PUB4064 The recipient must be at least 18 years old. Please check the date of birth
PUB4065 The instrument category ID conflicts with the existing payment instrument: only one of recipient_instrument_id or payment_instrument_category should be provided
PUB4066 The payment type conflicts with the one defined by the payer and recipient: only one of source_account_id or recipient_instrument_id should be provided when payment_type is present
PUB4067 The source currency conflicts with a part of the source amount object: only one of source_currency or source_amount object should be provided
PUB4068 The source account object currency conflicts with the one associated with source_account_id: only one of source_account_id or source_currency should be provided
PUB4069 The recipient instrument ID is incorrect
PUB4070 The source account ID is missing
PUB4071 The source account ID is incorrect
PUB4072 The source currency is missing
PUB4073 The source currency is incorrect
PUB4074 The source amount is missing
PUB4075 The source amount is incorrect
PUB4076 The source currency is incorrect
PUB4077 The target currency is missing
PUB4078 The target currency is incorrect
PUB4079 The target amount is missing
PUB4080 The target amount is incorrect
PUB4081 The target currency is incorrect
PUB4082 The destination country is missing
PUB4083 The destination country is incorrect
PUB4084 The payment instrument category is missing
PUB4085 The payment instrument category is incorrect
PUB4086 The payment type is missing
PUB4087 The payment type is incorrect
PUB4088 The source account is not found
PUB4089 The payment instrument is not found
PUB4090 The payment program is not found
PUB4091 The source account currency does not match the one in the request: source_account_id was provided together with source_amount but the source_amount currency is different from the one of the source account
PUB4092 The target currency [%s] does not match the recipient instrument currency [%s]
PUB4093 The source currency cannot be found in the request
PUB4094 The target currency cannot be found in the request
PUB4096 The recipient ID is incorrect
PUB4097 The payment instrument ID is incorrect
PUB4098 The source account ID is missing
PUB4099 The source account ID is incorrect
PUB4100 The currency is missing
PUB4101 The currency is incorrect
PUB4102 The amount is missing
PUB4103 The amount is incorrect
PUB4104 The operation type is missing
PUB4105 The operation type is incorrect
PUB4106 The currency of the target_amount object is missing
PUB4107 The currency of the target_amount object is incorrect
PUB4108 The amount of the target_amount object is missing
PUB4109 The amount of the target_amount object is incorrect
PUB4110 The target currency of the operation object is incorrect
PUB4111 The currency of the source_amount object is missing
PUB4112 The currency of the source_amount object is incorrect
PUB4113 The amount of the source_amount object is missing
PUB4114 The amount of the source_amount object is incorrect
PUB4115 The source currency of the operation object is incorrect
PUB4116 The exchange rate ID is incorrect
PUB4117 The KYT object is missing
PUB4118 The destination country is missing
PUB4119 The destination country is incorrect
PUB4120 The payment purpose is missing
PUB4121 The payment purpose is incorrect
PUB4122 The commercial activity is missing
PUB4123 The payment description is missing
PUB4124 The beneficiary bank account type is incorrect
PUB4125 The source of funds is incorrect
PUB4126 The relationship with the sender is incorrect
PUB4127 The recipient and recipient_id can't be provided at the same time
PUB4128 The amount and exchange_rate_id can't be provided at the same time
PUB4129 The amount and operation object can't be provided at the same time
PUB4130 The exchange_rate_id and operation can't be provided at the same time
PUB4131 The amount, exchange_rate_id, or operation is required
PUB4132 The payment instrument ID is required when exchange_rate_id is provided
PUB4133 For a FORWARD payment, the source amount is required
PUB4134 For a FORWARD payment, the target currency is required
PUB4135 For a REVERSE payment, the target amount is required
PUB4136 For a REVERSE payment, the source currency is required
PUB4137 The payment instrument or its ID is required
PUB4138 The recipient information or recipient_id is required
PUB4139 The payment instrument ID conflicts with the data provided. If you provide the payment_instrument_id, there is no need to provide the recipient, recipient_id, or payment instrument
PUB4140 The source account was not found
PUB4141 The payment program was not found
PUB4142 The exchange rate was not found
PUB4143 The exchange rate has not been confirmed
PUB4144 The exchange rate has been canceled, please request a new rate and try again
PUB4145 Duplicate reference
PUB4146 The payer date of birth cannot be in the future. Please check the date of birth
PUB4147 The recipient date of birth cannot be in the future. Please check the date of birth
PUB4219 The payer's identity document expiry date cannot be in the past. Please check the expiry date
PUB4220 The recipient's identity document expiry date cannot be in the past. Please check the expiry date
PUB4221 The payer's identity document issue date cannot be in the future. Please check the issue date
PUB4222 The recipient's identity document issue date cannot be in the future. Please check the issue date
PUB4235 The payer and source_account_id can't be provided at the same time
PUB5001 General internal error. See error message for details.
PUB5002 The operation not allowed for this account
PUB5003 The operation not allowed for this entity type
PUB5011 The operation allowed for expired exchange rates only
PUB5012 The exchange rate is incorrect
PUB5013 The exchange rate state is incorrect for the operation
PUB5014 The exchange rate has been expired, please request a new rate and try again
PUB5021 The payer was not found
PUB5022 The recipient was not found
PUB5031 The operation is not allowed for this payment state
PUB5041 The payment instrument ID is incorrect
PUB5045 Validation error
PUB5046 Payment instrument validation error
PUB5047 Exchange rate validation error
PUB5048 The amount is lower than the defined payer limit
PUB5049 The amount is lower than the limit allowed for the selected payment method
PUB5050 The amount is greater than the limit allowed for the selected payment method
PUB5051 The amount exceeds the payer's maximum allowed for 30 calendar days by %s %s
PUB5052 The amount is lower than the defined recipient limit
PUB5053 The amount exceeds the recipient maximum allowed for 30 calendar days by %s %s
PUB5054 Single payment validation error
PUB5055 Insufficient funds in the source account
PUB5056 Entity with given external id has been onboarded already
PUB9001 External system error.

Change log

Our mission is to always provide backwards compatible APIs. We commit not to deploy breaking changes within major versions unless such change is mandatory in order to fix critical security or compliance issue.

However, please note that as with every product this API is evolving. New endpoints will be published and new parameters added. Therefore, when integrating with our APIs you should always be ready to accept new fields in responses that may not be documented yet.

v2 API

  • 20-10-2026:
    • Added corporation, partnership, sole_proprietorship and non_incorporated_entity to the organization_legal_structure values of the BusinessPayer schema (POST /v2/payers). Any other value is rejected. The values are additive, so existing integrations are unaffected.
  • 04-09-2026:
    • Added payer_id, recipient_id and quote to the StatusChangeEvent schema of the Events API (/v2/payall/payment/StatusChange/{tenant_id}). payer_id and recipient_id are the Payall identifiers of the two parties of the payment, the same ones returned when the payment was created. quote carries the exchange rate quote the payment is priced with — its id, source_amount, target_amount and expiration_date — so the event can be matched against the rate quoted before the payment was initiated. The fields are additive, so existing integrations are unaffected.
  • 03-09-2026:
    • Added auto_confirmed to the PaymentResponse schema (/v2/single-payment). true when the caller holds the auto-confirm scope and the payment was confirmed automatically right after creation; false when it was instead parked at PendingConfirmation, awaiting an explicit confirm call.
    • Added POST /v2/payments/confirm, guarded by the PAYMENTS scope, to confirm a payment parked at PendingConfirmation. The payment is named by id in the request body. Rejected with a 405 for payments in any other state, and with a 404 for an ID not available to your credentials.
  • 02-09-2026:
    • Added payer to the PaymentRequest schema (/v2/single-payment), allowing a payment to be initiated on behalf of a specific payer instead of the owner of the account resolved from your credentials. The payer is onboarded through the same path as POST /v2/payers, so it is provisioned with its own payment instrument and account, and an external_id that is already onboarded is rejected with PUB5056 rather than reused. The field is optional, so existing requests are unaffected.
    • Onboarding a payer this way requires the ONBOARDING scope on top of the PAYMENTS scope the endpoint already requires; without it the request is rejected with the new PUB2003 and HTTP 403.
    • payer and source_account_id are mutually exclusive, and exactly one of them is required. A payment made on behalf of a payer is funded by the account provisioned for that payer during onboarding, so no source account is named; sending both is rejected with the new PUB4235. source_account_id remains required for requests that do not name a payer.
  • 07-07-2026:
    • Changed identity_document.issue_date from a date-time to a date (YYYY-MM-DD) on payer and recipient payloads.
  • 06-07-2026:
    • Changed identity_document.expiry_date from a date-time to a date (YYYY-MM-DD) on payer and recipient payloads.
  • 02-07-2026:
    • Added identity_document to the PersonPayer schema (/v2/payers), exposing structured identity document details (type, number, country issuing, issue/expiry dates, etc.) on both the create request and the GET response.
    • Deprecated government_id on PersonPayer in favour of identity_document. government_id is still accepted; when identity_document is omitted it is used as the identity document number.
  • 10-05-2024:
    • Added payer management endpoints: /v2/payers (POST, PATCH). The POST endpoint now returns the created payer entity.
    • Added account_details to the BusinessPayer entity.
  • 18-09-2034 Added a new endpoint to refresh exchange rates by ID: /v2/exchange-rates/{id} (PATCH). This allows updating the exchange_rate_id for a payment.
  • 14-09-2023 Added GET new exchange rate based on existing expired rate.
  • 24-08-2023 Added POST payment documents upload endpoint and extend PATCH payment to support the documents flow.
  • 05-05-2023 Moved Discovery service docs to separate section
  • 25-04-2023 Added Exchange rates push event
  • 24-04-2023 Added Compliance API
  • 29-03-2023 Added Events API
  • 20-03-2023 Added Discovery service endpoint
  • 01-12-2022 Version 2.0 published

PCI Vault iframe

  • 21-10-2026:
    • Published version 2 of the card form script at https://static.payall.com/vault/v2/js/dist/vault-client.js, and at https://static.sandbox.payall.com/vault/v2/js/dist/vault-client.js on sandbox. The PCI Vault iframe guide documents version 2.

    • New in version 2:

      • appearance option to match the form to your site: colors, corner radius, input and button size, padding, font and button layout.
      • The iframe fills the width of its container and its height follows the form, so it no longer needs a fixed size.
      • container accepts a CSS selector or an element, e.g. a React or Vue ref.
      • vault.destroy() removes the form and its event handlers, so the form can be opened again with a new PayallVault.init call.
      • Error events carry a code: configuration, validation or tokenization.
      • New configurationError translation key. Translations may now contain digits, punctuation and symbols, e.g. Pay €10.50!, up to 100 characters.
      • Cancel clears the card details and errors before the Cancel event is sent.
      • TypeScript declarations published next to the script, at https://static.payall.com/vault/v2/js/dist/vault-client.d.ts.
    • Breaking changes compared with version 1:

      • PayallVault.init(clientId, elementId, options) is replaced by PayallVault.init(config), which takes a single configuration object.
      • container is required. There is no default payall-vault element.
      • theme is removed. Use appearance instead.
      • translations must be a plain object. A Map is no longer accepted.
      • The iframe no longer defaults to 100vw by 100vh: it takes the full width of its container and the height of the form. Set iframeStyle for a fixed size.
      • The default layout changed: inputs take the full width and the Encrypt and Cancel buttons share one row. Set appearance.buttonLayout to vertical to stack the buttons.
    • To migrate, change the script URL and the init call. Version 1:

      // <script src="https://static.payall.com/vault/js/dist/vault-client.js"></script>
      const vault = PayallVault.init('your-client-id', 'card-form', {
          translations: new Map([['encryptLabel', 'Save card']]),
          theme: 'payall',
      });
      

      Version 2:

      // <script src="https://static.payall.com/vault/v2/js/dist/vault-client.js"></script>
      const vault = PayallVault.init({
          clientId: 'your-client-id',
          container: '#card-form',
          translations: { encryptLabel: 'Save card' },
          appearance: { colorPrimary: '#0055FF' },
      });
      

      Event handlers and the events they receive are unchanged.

    • Version 1, at https://static.payall.com/vault/js/dist/vault-client.js and https://static.sandbox.payall.com/vault/js/dist/vault-client.js, is deprecated. New integrations must use version 2. Version 1 remains available and unchanged, so existing integrations keep working without any change, but they should migrate to version 2 as described above.

    • Fixes and backwards compatible additions within a major version are delivered automatically at the same URL. Breaking changes ship as a new major version under a new path, such as /v3/, while earlier versions stay available.

Contact Us

For any questions or issues, please contact us through our customer support portal or email us at support@payallps.com.

Authorization

Get an access token

This endpoint is used to get an access token.

Authorizations:
basicAuth

Responses

Response samples

Content type
application/json
{
  • "access_token": "string",
  • "token_type": "Bearer",
  • "expires_in": 300
}

Discovery

Get required payment fields

Provides information about the fields required to make a payment based on supplied parameters. Different payment channels will yield various results based on payment processors and compliance requirements.

Data provided by this endpoint can be used to build UI for customers to provide relevant payment data or to just collect it from internal system to execute the payment swiftly by avoiding holdups due to missing data.

Please note that response from this endpoint will not include base fields required by Recipient entities (like first or last name of a person).

Sample response for B2P payment of 100 PLN to Poland from EUR account:

{
    "dob": {
      "title": "Date of birth",
      "data_type": "DATE",
    },
    "registration_address": {
      "city": {
        "mask": "^[a-zA-Z\/\\\\-:().,='+0-9\\\\s]{1,35}$",
        "title": "City",
        "data_type": "STRING",
        "max_length": 255,
        "min_length": 1,
      },
      "street": {
        "mask": "^[a-zA-Z\/\\-:().,='+0-9\\s]{1,35}$",
        "title": "Street name",
        "data_type": "STRING",
        "max_length": 255,
        "min_length": 1,
      },
      "country": {
        "title": "Country of residence",
        "data_type": "COUNTRY",
      }
    }
}

Sample response for B2B payment of 100 PLN to Poland from EUR account:

{
    "registration_address": {
      "city": {
        "mask": "^[a-zA-Z\/\\\\-:().,='+0-9\\\\s]{1,35}$",
        "title": "City",
        "data_type": "STRING",
        "max_length": 255,
        "min_length": 1,
      },
      "street": {
        "mask": "^[a-zA-Z\/\\-:().,='+0-9\\s]{1,35}$",
        "title": "Street name",
        "data_type": "STRING",
        "max_length": 255,
        "min_length": 1,
      },
      "country": {
        "title": "Country of residence",
        "data_type": "COUNTRY",
      }
    }
}
Authorizations:
OAuth2
query Parameters
recipient_country
required
string <iso-3166-alpha-2>
Example: recipient_country=IT
payment_type
required
string
Enum: "B2P" "B2B" "P2B" "P2P"
payer_currency
required
string <iso-4217> = 3 characters
Example: payer_currency=USD
instrument_category
required
string
Enum: "BankAccount" "MobileWallet" "CashPickup" "Card"
amount
required
integer
Example: amount=100023

Amounts are always in the smallest currency unit. Example: 1000.23 USD is represented as 100023 cents.

recipient_currency
required
string <iso-4217> = 3 characters
Example: recipient_currency=EUR

Responses

Response samples

Content type
application/json
{
  • "recipient": {
    },
  • "payment_instrument": {
    },
  • "kyt": {
    },
  • "example": {
    }
}

Payments

Initiate a single payment

Use this method to initiate a single Payment.

Authorizations:
OAuth2
Request Body schema: application/json
required
One of

All amounts should be provided in the smallest currency unit. For example, 1000.23 EUR should be provided as 100023.

Please note that this request contains mutually exclusive fields as described in the table:

Field recipient_id recipient payment_instrument payment_instrument_id
recipient_id ✗ ✓ ✗
recipient ✗ ✓ ✗
payment_instrument ✓ ✓ ✗
payment_instrument_id ✗ ✗ ✗

✓ the two fields can be sent together, ✗ they are mutually exclusive.

At least payment_instrument_id is required or any other combination of recipient and payment instrument information as described in the table.

payer and source_account_id are mutually exclusive, and exactly one of them is required. Provide source_account_id to pay from one of your own accounts, or provide payer to pay on behalf of a payer onboarded from this request - which is then funded by the account onboarding provisions for it. Sending both is rejected with PUB4235. See the payer field for the prerequisites of paying on behalf of another party.

If you're building a flow with explicit exchange rates then you should either use the exchange_rate_id or carded_rate_id but not both. Providing both will result in an error with 409 status code.

When using exchange_rate_id the operation field should not be provided. Providing both will result in an error with 409 status code.

end_to_end_id
string (EndToEndId) <= 35 characters

End To End Identification This filed follows ISO 20022 guidelines.

Unique identification, as assigned by the initiating party, to unambiguously identify the transaction. This identification is passed on, unchanged, throughout the entire end-to-end chain.

Usage: The end-to-end identification can be used for reconciliation or to link tasks relating to the transaction. It can be included in several messages related to the transaction.

If not provided, a random UUID based identifier will be generated.

client_payment_id
string

External reference identifying the payment in your (the client) system.

PersonPayer (object) or BusinessPayer (object)

[Optional] Payer information.

The payer is the party the payment is made on behalf of. Providing it onboards the payer exactly as POST /v2/payers does: the payer is persisted and provisioned with its own payment instrument and account.

Onboarding a payer requires your credentials to carry the ONBOARDING scope in addition to the PAYMENTS scope this endpoint already needs. Without it the request is rejected with PUB2003 and HTTP 403. Contact your Payall representative to have the scope added.

Because this is a create, an external_id that is already onboarded is rejected with PUB5056 rather than reused - use POST /v2/payers and PATCH /v2/payers/{id} to manage payers you intend to pay repeatedly, then leave this field out. When no external_id is provided a new payer is created on every request, including on a retry of the same request.

When this field is omitted the payer is the owner of the account named by source_account_id, and no onboarding takes place.

payer and source_account_id are mutually exclusive: the payment is funded by the account provisioned for the payer during onboarding, so there is no source account for you to name. Sending both is rejected with PUB4235.

If the request states a source currency (via operation), the payer must hold an account in that currency; otherwise the request is rejected with PUB4140.

Person (object) or Business (object)

[Optional] New recipient information.

This recipient will be persisted for the future and linked to the payment instrument provided via the payment_instrument field. When creating new recipient you can not reuse existing payment instrument as it will be already tied to other existing recipient.

If recipient data matches existing recipient in the system then existing recipient will be used and it's ID will be returned in the corresponding PaymentResponse.

Matching is done based on the required fields for Person or Business respectively.

Alternatively recipient_id can be used instead to send payment to existing recipient. recipient and recipient_id are mutually exclusive fields.

MobileWallet (object) or BankAccount (object) or CashPickup (object) or Card (object)

[Optional] New payment instrument information. This payment instrument will be persisted and linked to the recipient provided via the recipient or recipient_id fields.

Alternatively payment_instrument_id can be used instead to reuse existing payment instrument.

recipient_id
string <uuid>

[Optional] Id of exiting recipient.

Alternatively recipient can be used instead to send payment to a new recipient. recipient and recipient_id are mutually exclusive fields.

payment_instrument_id
string <uuid>

[Optional] Id of existing payment instrument.

When payment_instrument_id is provided then recipient_id, recipient and payment_instrument are not allowed because existing instances of PaymentInstrument are tied to specific existing recipients.

source_account_id
string <uuid>

Id of the account to use as source of funds.

Required unless payer is provided, and mutually exclusive with it - sending both is rejected with PUB4235. A payment made on behalf of a payer is funded by the account provisioned for that payer during onboarding.

ForwardPaymentOperation (object) or ReversePaymentOperation (object)
exchange_rate_id
string <uuid>

[Optional] Id of the exchange rate to use for the payment. If not provided then the best available exchange rate will be used.

Note that this is the ID of the exchange rate obtained from the /v2/exchange-rates endpoint. For carded rates use the carded_rate_id.

You can either use the exchange_rate_id or carded_rate_id but not both.

Response with HTTP code 400 will be sent if provided exchange rate expired.

carded_rate_id
string <uuid>

[Optional] Id of the carded exchange rate to use for the payment. If not provided then the best available carded exchange rate will be used.

Note that this is the ID of the exchange rate obtained from the carded rates feed. For non-carded rates use the exchange_rate_id.

You can either use the exchange_rate_id or carded_rate_id but not both.

Response with HTTP code 400 will be sent if provided exchange rate expired.

required
object (KYT)

Transaction information required for KYT process.

Responses

Request samples

Content type
application/json
Example
{
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "client_payment_id": "string",
  • "payer": {
    },
  • "recipient": {
    },
  • "payment_instrument": {
    },
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
  • "source_account_id": "75fca71f-6b38-4768-804d-ffb93d0aa579",
  • "operation": {
    },
  • "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b",
  • "carded_rate_id": "7a29f3e3-7ccc-4f67-af1d-6df58596d191",
  • "kyt": {
    }
}

Response samples

Content type
application/json
{
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "client_payment_id": "string",
  • "transaction_id": "string",
  • "instruction_id": "string",
  • "uetr": "bb1ccd4b-5072-4731-944f-45425c2b9e97",
  • "integration_id": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "initiated_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "status": "string",
  • "fees": {
    },
  • "exchange_rate": {
    },
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
  • "code": "string",
  • "decline_issuer": "string",
  • "auto_confirmed": true,
  • "error": {
    }
}

Get payment information by its ID

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "client_payment_id": "string",
  • "transaction_id": "string",
  • "instruction_id": "string",
  • "uetr": "bb1ccd4b-5072-4731-944f-45425c2b9e97",
  • "integration_id": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "initiated_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "status": "string",
  • "fees": {
    },
  • "exchange_rate": {
    },
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
  • "code": "string",
  • "decline_issuer": "string",
  • "auto_confirmed": true,
  • "error": {
    }
}

Update payment details

Update Payment after it has been stopped due to insufficient KYC/B/T information. This call allows updating only KY related information. If additional recipient information is required please use PATCH Recipient operation.

This operation is allowed only for transactions in KYT pending status.

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>
Request Body schema: application/json
required
Array of objects (SupportingDocument)

Documents that will be considered as proof for the payment.

This field may be required depending on your KYT settings. Consult the discovery endpoint for more information.

This field can be updated only for payments with pending KYT for which a request for additional documents was issued.

exchange_rate_id
string <uuid>

New exchange rate ID in case previous one expired. New exchange rate must use the same parameters as original one. Use /v2/exchange-rates/{id}/refresh endpoint to obtain new exchange rate.

This field can be updated only for payments with expired exchange rate.

Responses

Request samples

Content type
application/json
{
  • "supporting_documents": [
    ],
  • "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}

Response samples

Content type
application/json
{
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "client_payment_id": "string",
  • "transaction_id": "string",
  • "instruction_id": "string",
  • "uetr": "bb1ccd4b-5072-4731-944f-45425c2b9e97",
  • "integration_id": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "initiated_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "status": "string",
  • "fees": {
    },
  • "exchange_rate": {
    },
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
  • "code": "string",
  • "decline_issuer": "string",
  • "auto_confirmed": true,
  • "error": {
    }
}

Confirm a payment parked at PendingConfirmation

Confirms a payment that was created without the auto-confirm scope and is currently PendingConfirmation, releasing it for processing.

This operation is allowed only for payments currently in the PendingConfirmation status.

Authorizations:
OAuth2
Request Body schema: application/json
required
id
required
string <uuid>

ID of the payment to confirm.

Responses

Request samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Response samples

Content type
application/json
{
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "client_payment_id": "string",
  • "transaction_id": "string",
  • "instruction_id": "string",
  • "uetr": "bb1ccd4b-5072-4731-944f-45425c2b9e97",
  • "integration_id": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "initiated_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z",
  • "status": "string",
  • "fees": {
    },
  • "exchange_rate": {
    },
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
  • "code": "string",
  • "decline_issuer": "string",
  • "auto_confirmed": true,
  • "error": {
    }
}

Payments instruments

Get list of payment instruments

Authorizations:
OAuth2
query Parameters
recipient_id
string <uuid>

ID of the recipient to get payment instruments belonging to this recipient.

page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

Responses

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "accounts": [
    ]
}

Get list of payment instruments

Authorizations:
OAuth2
query Parameters
recipient_id
string <uuid>

ID of the recipient to get payment instruments belonging to this recipient.

page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a payment instrument

Authorizations:
OAuth2
Request Body schema: application/json
One of

Abstract class. Use it's implementations instead.

recipient_id
required
string <uuid>

ID of an existing recipient that this instrument belongs to. It is required for new payment instrument creation.

category
required
string (PaymentInstrumentCategory)
Enum: "BankAccount" "MobileWallet" "CashPickup" "Card"
currency
string
mobile_number
required
string
phone_operator
string
country
string

If a country is provided, pre-validation of the request is performed.

Responses

Request samples

Content type
application/json
Example
{
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "category": "BankAccount",
  • "currency": "string",
  • "mobile_number": "string",
  • "phone_operator": "string",
  • "country": "string"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Get payment instrument by its ID

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "category": "BankAccount",
  • "currency": "string",
  • "mobile_number": "string",
  • "phone_operator": "string"
}

Exchange

Get exchange rate information by its ID

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "source_amount": {
    },
  • "target_amount": {
    },
  • "expiration_date": "2019-08-24T14:15:22Z"
}

Get new exchange rate based on already existing rate.

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "source_amount": {
    },
  • "target_amount": {
    },
  • "expiration_date": "2019-08-24T14:15:22Z"
}

Request exchange rate information.

The exchange rate can be later used to initiate a new payment. Obtaining the exchange rate before payment is optional.

Authorizations:
OAuth2
Request Body schema: application/json
required

Use either source_amount and target_currency or just target_amount to receive rate in the currency of the source account referenced by the source_account_id.

source_amount represents a value in the currency from which the exchange is made. target_amount represents a value in the currency to which the exchange is made.

Examples:

  1. Exchange 10 EUR (source_amount) to target_currency GBP
  2. Get amount in EUR (source_account_id's currency) for the target_amount being 10 GBP

source_currency and source_account_id are mutually exclusive. Also there is no need to provide source_currency if you're providing source_amount as it is already contains currency. Providing both will result in an error with 409 status code.

recipient_instrument_id and payment_instrument_category are mutually exclusive. Providing both will result in an error with 409 status code. This is because instrument category is already part of existing payment instrument.

payment_type is not needed when providing source_account_id and recipient_instrument_id and payment_type. Providing both will result in an error with 409 status code. This is because payment type is defined by payer and recipient types.

source_account_id
string <uuid>

ID of the account to use as source of funds.

Provide either source or target amount to receive the opposite value.

source_currency
string <iso-4217> = 3 characters

Currency of the source amount.

This field is required only if both source_amount and source_account_id are NOT provided. This is useful if you're not using currency exchange markup based on payer segmentation (ie high volume business payers having different rates than individuals).

object (Amount)
object (Amount)
recipient_instrument_id
string

Represents recipient's payment instrument id of already existent entity.

This field is for backward compatibility and will be removed in the future. Please use payment_instrument_category instead.

payment_instrument_category
string (PaymentInstrumentCategory)
Enum: "BankAccount" "MobileWallet" "CashPickup" "Card"
payment_type
string (PaymentType)
Enum: "B2B" "B2P" "P2B" "P2P"
target_currency
string <iso-4217> = 3 characters
destination_country
required
string <iso-3166-alpha-2>

Destination country for the payment. 3166-1 alpha-2 value. Hint: It is GB, not UK.

Responses

Request samples

Content type
application/json
{
  • "source_account_id": "75fca71f-6b38-4768-804d-ffb93d0aa579",
  • "source_currency": "EUR",
  • "source_amount": {
    },
  • "target_amount": {
    },
  • "recipient_instrument_id": "string",
  • "payment_instrument_category": "BankAccount",
  • "payment_type": "B2B",
  • "target_currency": "GBP",
  • "destination_country": "GB"
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "source_amount": {
    },
  • "target_amount": {
    },
  • "expiration_date": "2019-08-24T14:15:22Z"
}

Confirm exchange rate

Confirm the exchange rate to lock it for future use. This operation is required if you want to use the exchange rate for a payment after exchange rate quote expires. This is valid only for quoted rates program configurations.

This operation will block funds on the source account. The funds will be release automatically if the payment is not initiated within the timeframe configured for your program.

If needed you can cancel the quote to unblock funds earlier.

Authorizations:
OAuth2
Request Body schema: application/json
required
exchange_rate_id
string <uuid>

ID of the exchange rate to confirm.

Responses

Request samples

Content type
application/json
{
  • "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}

Cancel exchange rate

Cancel the exchange rate to unblock funds on the source account. This operation is allowed only for exchange rates that have been confirmed.

Authorizations:
OAuth2
Request Body schema: application/json
required
exchange_rate_id
string <uuid>

ID of the exchange rate to cancel.

Responses

Request samples

Content type
application/json
{
  • "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}

Get carded exchange rates

Authorizations:
OAuth2

Responses

Response samples

Content type
application/json
{
  • "rates": [
    ]
}

Accounts

Get list of payment accounts

Authorizations:
OAuth2
query Parameters
page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get list of payment accounts

Authorizations:
OAuth2
query Parameters
page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

Responses

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "accounts": [
    ]
}

Recipients

Get list of recipients

Authorizations:
OAuth2
query Parameters
page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

id
string <uuid>

ID of the recipient to get.

external_id
string

External ID of the recipient to get.

Responses

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "recipients": [
    ]
}

Get list of recipients

Authorizations:
OAuth2
query Parameters
page_number
integer >= 1
Default: 1

Page number.

page_size
integer [ 1 .. 100 ]
Default: 20

Page size.

id
string <uuid>

ID of the recipient to get.

external_id
string

External ID of the recipient to get.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a recipient

Authorizations:
OAuth2
Request Body schema: application/json
One of

Identity representing a natural person.

type
required
string (Type)
Enum: "Person" "Business"
external_id
string

ID from external system.

email
string <email>
first_name
required
string
last_name
required
string
middle_name
string
mobile_number
string
dob
string <date>
string
object (Address)
object (IdentityDocument)

Responses

Request samples

Content type
application/json
Example
{
  • "type": "Person",
  • "external_id": "string",
  • "email": "user@example.com",
  • "first_name": "string",
  • "last_name": "string",
  • "middle_name": "string",
  • "mobile_number": "string",
  • "dob": "2019-08-24",
  • "occupation": "general_worker",
  • "registration_address": {
    },
  • "identity_document": {
    }
}

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Get recipient information by its ID

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "type": "Person",
  • "external_id": "string",
  • "email": "user@example.com",
  • "first_name": "string",
  • "last_name": "string",
  • "middle_name": "string",
  • "mobile_number": "string",
  • "dob": "2019-08-24",
  • "occupation": "general_worker",
  • "registration_address": {
    },
  • "identity_document": {
    }
}

Update a recipient

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>
Request Body schema: application/json
One of

Person update request.

type
required
string
Value: "Person"
object (Address)
object (IdentityDocument)

Responses

Request samples

Content type
application/json
Example
{
  • "type": "Person",
  • "registration_address": {
    },
  • "identity_document": {
    }
}

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "type": "Person",
  • "external_id": "string",
  • "email": "user@example.com",
  • "first_name": "string",
  • "last_name": "string",
  • "middle_name": "string",
  • "mobile_number": "string",
  • "dob": "2019-08-24",
  • "occupation": "general_worker",
  • "registration_address": {
    },
  • "identity_document": {
    }
}

Delete a recipient

This operation is allowed only for recipients without payments (past, pending, scheduled or recurring)

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Get recipient amount limits

This operation fetches amount limits for recipient.

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

The ID of the recipient for which to provide payment limits

query Parameters
payment_type
required
string (PaymentType)
Enum: "B2B" "B2P" "P2B" "P2P"
country
required
string <iso-3166-alpha-2>
Example: country=GB

Country for the payment. ISO-3166-1 alpha-2 value. Hint: It is GB, not UK.

instrument_category
required
string (PaymentInstrumentCategory)
Enum: "BankAccount" "MobileWallet" "CashPickup" "Card"
currency
required
string <iso-4217> = 3 characters
Example: currency=EUR

The currency for which the limit should be provided. If there is no limit set in specified currency then limit will be returned in the base currency set for this account. Currency format ISO-4217

Responses

Response samples

Content type
application/json
{
  • "minimum": {
    },
  • "maximum": {
    }
}

Payers

Create a payer

Payer accounts will be created automatically however depending on configurations of your account, the payer may first be subject to KYC or KYB checks.

Authorizations:
OAuth2
Request Body schema: application/json
One of

Base contract for person payer creation

type
required
string
Enum: "Business" "Person"
external_id
string

ID from external system.

first_name
required
string
middle_name
string
last_name
required
string
phone_number
string
object (Address)
nationality
string
government_id
string
Deprecated

Deprecated. Use identity_document instead. When identity_document is omitted, this value is used as the identity document number.

object (IdentityDocument)
date_of_birth
string <date>
source_of_income
string
email
string
place_of_birth
string
string
relationship_with_beneficiary
string
employer_name
string
employer_country
string <iso-3166-alpha-2>

Country of registration. 3166-1 alpha-2 value. Hint: It is GB, not UK.

employer_industry
string

Responses

Request samples

Content type
application/json
Example
{
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "accounts": [
    ],
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Get payer by its ID

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "accounts": [
    ],
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Update a payer

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>
Request Body schema: application/json
One of

Base contract for person payer creation

type
required
string
Enum: "Business" "Person"
external_id
string

ID from external system.

first_name
required
string
middle_name
string
last_name
required
string
phone_number
string
object (Address)
nationality
string
government_id
string
Deprecated

Deprecated. Use identity_document instead. When identity_document is omitted, this value is used as the identity document number.

object (IdentityDocument)
date_of_birth
string <date>
source_of_income
string
email
string
place_of_birth
string
string
relationship_with_beneficiary
string
employer_name
string
employer_country
string <iso-3166-alpha-2>

Country of registration. 3166-1 alpha-2 value. Hint: It is GB, not UK.

employer_industry
string

Responses

Request samples

Content type
application/json
Example
{
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "accounts": [
    ],
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Get payer amount limits

This operation fetches amount limits for payer.

Authorizations:
OAuth2
path Parameters
id
required
string <uuid>

The ID of the payer for which to provide payment limits

query Parameters
payment_type
required
string (PaymentType)
Enum: "B2B" "B2P" "P2B" "P2P"
country
required
string <iso-3166-alpha-2>
Example: country=GB

Country for the payment. ISO-3166-1 alpha-2 value. Hint: It is GB, not UK.

instrument_category
required
string (PaymentInstrumentCategory)
Enum: "BankAccount" "MobileWallet" "CashPickup" "Card"
currency
required
string <iso-4217> = 3 characters
Example: currency=EUR

The currency for which the limit should be provided. If there is no limit set in specified currency then limit will be returned in the base currency set for this account. Currency format ISO-4217

Responses

Response samples

Content type
application/json
{
  • "minimum": {
    },
  • "maximum": {
    }
}

Get payer by its ID or external ID

This endpoint allows to retrieve payer by its ID or external ID. Either id or external_id must be provided. If both are provided then they both must match the same payer.

Authorizations:
OAuth2
query Parameters
id
string <uuid>

ID of the payer to get.

external_id
string

External ID of the payer to get.

Responses

Response samples

Content type
application/json
Example
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "accounts": [
    ],
  • "type": "Business",
  • "external_id": "string",
  • "first_name": "string",
  • "middle_name": "string",
  • "last_name": "string",
  • "phone_number": "string",
  • "registration_address": {
    },
  • "nationality": "string",
  • "government_id": "string",
  • "identity_document": {
    },
  • "date_of_birth": "2019-08-24",
  • "source_of_income": "string",
  • "email": "string",
  • "place_of_birth": "string",
  • "occupation": "general_worker",
  • "relationship_with_beneficiary": "string",
  • "employer_name": "string",
  • "employer_country": "PL",
  • "employer_industry": "string"
}

Compliance

Upload new compliance document

Use this method to upload documents.

Supported file types are: PDF, PNG, JPEG.

Authorizations:
OAuth2
Request Body schema:
string <binary>

Responses

Response samples

Content type
application/json
{
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}

Events

Payment event

Post payment related events.

Payall will retry to deliver the event for 24 hours until receiving HTTP response code 200. After 24 hours there will be no further attempts to deliver the event. Attempts are repeated as follows:

  • Every 10 seconds for first minute
  • Every minute for the following 9 minutes
  • Every 10 minutes for the following 50 minutes
  • Every hour for the following 23 hours

Payall expects the response within 3 seconds. Lack of response within 3 seconds is considered to be failed delivery attempt.

No response body is expected.

Authorizations:
ApiKeyAuth
path Parameters
event_type
required
string
Enum: "StatusChange" "Documents"
tenant_id
required
string
header Parameters
X-Attempt-Number
required
integer

Delivery attempt number. First attempt value is 1.

X-Signature
string

HMAC signature of the request body. Sent only when HMAC request signing is enabled for your webhook configuration.

The value has the form <scheme>=<hex-digest>, for example sha256=9f86d081884c7d659a2feaa0c55ad015..., where:

  • <scheme> identifies the hash function used, one of: md5, sha1, sha224, sha256, sha384, sha512, sha512-224, sha512-256, sha3-224, sha3-256, sha3-384, sha3-512.
  • <hex-digest> is the lowercase hex HMAC computed over the exact UTF-8 bytes of the request body using the shared secret you configured.

To verify, recompute the HMAC over the received raw body with your shared secret and compare using a constant-time comparison.

The header name is X-Signature by default but can be changed in your webhook configuration.

X-Timestamp
integer <int64>

UTC Unix timestamp, in seconds, captured when the event was signed and sent. Sent only when HMAC request signing is enabled.

Use it to reject stale or replayed deliveries, for example by discarding requests whose timestamp falls outside an acceptable clock-skew window.

X-Nonce
string <uuid>

Unique per-delivery identifier (UUID). Sent only when HMAC request signing is enabled.

Use it together with X-Timestamp for replay protection: remember recently seen nonces and reject duplicates.

Request Body schema:

The event payload. Its serialization format depends on the template type configured for your webhook:

  • application/json for the default and Mastercard templates.
  • application/xml for the ISO 20022 template, where payment status events are delivered as an ISO 20022 FIToFIPaymentStatusReport (pacs.002.001.16) document.
One of
status
required
string
Enum: "Created" "PendingCompliance" "Completed" "Declined" "ExchangeRateExpired" "PendingSettlement" "PendingClearingInstitution" "PendingFinance" "PendingServiceProvider" "PendingDocument" "PendingReceivingInstitution" "PendingRFI" "Returned" "Rejected"

ExchangeRateExpired status means that an action by the payer is required in order to approve new exchange rate in order to proceed with the payment.

Exchange rate will usually expire for payments that will have to undergo additional KYT checks. Event related to this status will be emitted only after the KYT process finishes meaning that the date of the event and exchange rate expiry date will not match.

PendingSettlement status means that the payment can be processed but needs the settlement account to be funded first. This status will be applicable depending on configuration of the originating institution program.

In case you are controlling the settlement funding on your side this status informs you that you need to fund the settlement account in order to process the payment.

PendingClearingInstitution status means that the payment was processed on our side and sent to the clearing institution.

PendingFinance status means that the payment requires manual approval by the finance officer of the originating institution. This status will be applicable depending on configuration of the originating institution program.

PendingServiceProvider status means that the payment has been processed on our side and sent to the service provider for further processing before sending to the Clearing Institution. This status will be applicable depending on configuration of the originating institution program.

PendingDocument status means that the payment requires additional documents to be uploaded before it can be processed. Refer to the DocumentsEvent and /v2/documents endpoint for more details.

PendingReceivingInstitution status means that the payment was accepted by the clearing institution and is pending processing by the receiving institution.

PendingRFI status means that the payment is on hold pending additional information (Request for Information).

Returned status means that the payment was returned.

Rejected status means that the payment was rejected. The code field identifies the reason of rejection.

id
required
string <uuid>

Id of the payment in Payall system.

client_payment_id
required
string

External reference provided when initiating the payment.

transaction_id
string

External reference provided when initiating the payment. (Same as client_payment_id)

instruction_id
string

Id of the instruction registered in Payall system.

end_to_end_id
string (EndToEndId) <= 35 characters

End To End Identification This filed follows ISO 20022 guidelines.

Unique identification, as assigned by the initiating party, to unambiguously identify the transaction. This identification is passed on, unchanged, throughout the entire end-to-end chain.

Usage: The end-to-end identification can be used for reconciliation or to link tasks relating to the transaction. It can be included in several messages related to the transaction.

If not provided, a random UUID based identifier will be generated.

uetr
string <uuid> (UETR)

Universally unique identifier to provide an end-to-end reference of a payment transaction.

integration_id
string

Identifier used in communication with the Clearing Institution.

payer_id
string <uuid>

Id of the payer of the payment in Payall system.

This is the same identifier that is returned as payer.id when the payment was created, and the one accepted by the payer endpoints (/v2/payers).

recipient_id
string <uuid>

Id of the recipient of the payment in Payall system.

This is the same identifier that is returned as recipient.id when the payment was created.

timestamp
required
string <date-time>

The date-time of the event.

Notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z

code
string

Optional status code associated with the event. For example in case of rejected payments it will identify the reason of rejection.

object
object (Amount)
object (Amount)
object

Exchange rate quote the payment is priced with, as returned by /v2/exchange-rates. id is the quote used for the payment, so it can be matched against the rate you were quoted before initiating it.

Sent for payments that carry a quote; absent otherwise.

Responses

Request samples

Content type
Example
{
  • "status": "Created",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "client_payment_id": "string",
  • "transaction_id": "string",
  • "instruction_id": "string",
  • "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
  • "uetr": "bb1ccd4b-5072-4731-944f-45425c2b9e97",
  • "integration_id": "string",
  • "payer_id": "7bded2ff-6743-4a0e-a147-77540fb16606",
  • "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
  • "timestamp": "2019-08-24T14:15:22Z",
  • "code": "string",
  • "external_error": {
    },
  • "source_amount": {
    },
  • "target_amount": {
    },
  • "quote": {
    }
}

Exchange rates

Post carded exchange rates

Authorizations:
ApiKeyAuth
path Parameters
event_type
required
string
Value: "Publish"

Event type for the rates

tenant_id
required
string

Tenant identifier

Request Body schema: application/json
required

Currency exchange rates data

required
Array of objects (CardedRate)

Responses

Request samples

Content type
application/json
{
  • "rates": [
    ]
}

Tokenization

Tokenize card details

Tokenize provided card details. Returns a token that can be used to reference the card in other API methods.

Calling this endpoint directly means handling and encrypting card data on your side, which requires a valid PCI DSS certification. Without one, use the PCI Vault iframe: it collects and encrypts the card for you and calls this endpoint itself.

This endpoint is not idempotent.

Card number needs to be stripped of any non-digit characters before encrypting. Expected pattern match is ^[1-9][0-9]{7,19}$.

We recommend validating the card number with the Luhn algorithm before encrypting it.

We don't do card brand validation during this call. Any brand will be accepted by the vault but the payment may fail if the token is used for a payment with a vendor that does not support given brand.

path Parameters
clientId
required
string <uuid>
Request Body schema: application/json
required
card_number
required
string

Encrypted card number using client public key.

Card number needs to be stripped of any non-digit characters before encrypting. Expected pattern match is ^[1-9][0-9]{7,19}$.

We recommend validating the card number with the Luhn algorithm before encrypting it.

expiration_date
string

ISO/EIC 7813 Expiration date of the card

Responses

Request samples

Content type
application/json
{
  • "card_number": "ZiudIxi1h3P57k8OwmfOx1wpqIBeTGMu560uvdQoGYm2wfg/AIj8QkFpi2XTaCT4sO9drQvLSH9rSk3njQOGpSUmCzlPsA6ahG7Mg/0fMP2V6ahdMUmgmZPU1KVqL48p0pwjgSG6pTbLj6ROQFpPNkhs3ilrrQccKg7FamV34WC6hzEVyVRreR54LQeOAIFX5zQLOD4ldV/z8ikYdktKiFMkghQnF2oqzsd/rNTkL2DwzWTahgiA6gYZpoOhXt4rr1KoENC4hV4yT7iefyIFCGQu7EzeD15XB3v2+Q0Xj9ifOynADek3Mjxn6Bmg7fELGuUEkkxFgeLZrxrEcqAFbg==",
  • "expiration_date": "12/30"
}

Response samples

Content type
application/json
{
  • "token": "f7b3b3b4-0b3d-4b3b-8b3b-3b3b3b3b3b3b",
  • "created_at": "2021-03-03T16:27:54.378693Z",
  • "masked_pan": "5425 **** **** 8113",
  • "client_id": "f0396c8e-a87b-402d-9692-520cbc0947b5",
  • "brand": "Visa"
}

Get configuration

Get encryption key and parameters for a specific id

path Parameters
id
required
string <uuid>

Responses

Response samples

Content type
application/json
{
  • "encryption_key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuNernozTqNnb17qzYof4sYlB7QueXE+7l8B2pa4kaNwGfsquMpD9S6hXKUY2zKlCSovs811+rNWt1x6oxj3H3RSOH6J8RlG+29cDF5OXySeORON8dmPLCtZ4uXMQ4JYtlAlcPNgKJgQmnrnQJ4btb+S3FYZJ0rJyx+wpRJith4BUl0/QA3ldfLQAeWWf+6wXXhkB2n4u0zBGYd3v+L/TdqHDDrJuLVFkG2tXaBvNTQETwyPHJA06cAeqSyHneKb1RIznYL/QxUBoPAfTYdrI9cV5gUJ6bolFMrzSU9QlOR/SEjtXWjEE9sH39QLPqAJvijT1XUDNJOIeFB4E+pxGrQIDAQAB",
  • "created_at": "2019-08-24T14:15:22Z",
  • "encryption_algorithm": "RSAES_OAEP_SHA_256",
  • "require_expiration_date": false
}