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

When using Payall PCI Vault iframe your systems do not have access to raw PAN anywhere throughout the process. All sensitive operations related to collecting, transmitting and storing of sensitive data are managed by Payall. In this case the PCI exposure to you is minimal, however we still encourage you to get yourself familiar with PCI DSS and fill in the PCI Self Assessment Questionnaire A when working with cards and using our Vault.

PCI Vault iframe flow

Script initialisation

Embed the following script in your HTML page to initialise the Payall Vault client:

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

Prepare the HTML element to hold the iframe:

<div id="payall-vault"></div>

Initialise the client with the following JavaScript code. Use clientId value provided by our integration team. The provided ID below is just a sample and will not work:

const clientId = 'f0396c8e-a87b-402d-9692-520cbc000000';
const vault = PayallVault.init(clientId, 'payall-vault');

Invoking PayallVault.init() will immediately generate an iframe inside the provided element ID. The frame is generated with the following style:

 iframe.style.width = "100vw";
 iframe.style.height = '100vh';
 iframe.style.border = "none";

Attach event handlers to handle the events emitted by the UI within the iframe. Key events are PanTokenized , Cancel and Error:

vault.addEventHandler('PanTokenized', function (event) {
    // Put your busines logic here.
    console.log('Received PanTokenized event:', event);
    // You should store the token in your system for later use.
});

valut.addEventHandler('Error', function (event) {
    // Handle the error event here.
    console.error('Error event:', event);
});

vault.addEventHandler('Cancel', function (event) {
  // This means that the user clicked "Cancel" button and you should react accordingly.
    console.log('Received Cancel event:', event);
  document.getElementById('payall-vault').innerHTML = '';
});

List of available events

PayallVault class exposes the list available events under Events property:

console.log(PayallVault.Events);
// Set {"PanTokenized", "Error", "Cancel"}

Full HTML example

Putting things together

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Demo iframe launcher</title>
    <script src="https://static.sandbox.payall.com/vault/js/dist/vault-client.js"></script>
    <!--
        This is just a demo implementation of the client-side vault initialization.
        This part is not on Payall to implement - it should be a part
        of the client-side application.

        This is just meant for testing only.
    -->
    <script>
        window.onload = function() {

            console.log("Available events from the vault:");
            console.log(PayallVault.Events);

            document.getElementById('launch-iframe').addEventListener('click', function () {
                const clientId = document.getElementById('clientId').value;
                let vault = PayallVault.init(clientId, 'payall-vault');

                vault.addEventHandler('PanTokenized', function (event) {
                    console.log('Received PanTokenized event:', event);
                    document.getElementById('iframe-messages').innerText
                        += "\nPanTokenized event:" + JSON.stringify(event.message);
                });

                vault.addEventHandler('Cancel', function (event) {
                    console.log('Received Cancel event:', event);
                    document.getElementById('iframe-messages').innerHTML = '';
                    document.getElementById('payall-vault').innerHTML = '';
                });

                vault.addEventHandler('Error', function (event) {
                    console.log('Received Error event:', event);
                    document.getElementById('iframe-messages').innerText
                        += "\nError event:" + JSON.stringify(event.message);

                    if(event.message.message === 'Configuration error') {
                        document.getElementById('payall-vault').innerHTML = '';
                    }
                });
            });
        }
    </script>
</head>
<body>
    <label for="clientId">Client ID:</label>
    <input type="text" id="clientId" value="f0396c8e-a87b-402d-9692-520cbc000000">
    <button id="launch-iframe">Launch iframe</button>
    <div id="iframe-messages"></div>
    <div id="payall-vault"></div>
</body>
</html>

Additional options

Translations

Translations can be provided to the iframe to localize the UI. The vault supports any language that is supported by the browser. The default language is English. List of available translation keys is available under static field PayallVault.TranslationKeys.

console.log("Available translation keys:", PayallVault.TranslationKeys);

All keys are optional. If a key is not provided, the default value will be used.

[
    'panLabel',
    'expiryLabel',
    'cancelLabel',
    'encryptLabel',
    'expiryDateInPast',
    'cardNumberEmpty',
    'invalidCardNumber',
    'expiryDateRequired',
    'invalidNumericValues',
    'invalidMonth',
    'genericError',
]

The vault expect to receive translations as Map<string, string>.
The following example shows how to provide translations:

const es_translations = new Map([
    ['panLabel',            "Número de Tarjeta de Crédito"],
    ['expiryLabel',         "Fecha de Expiración"],
    ['cancelLabel',         "Cancelar"],
    ['encryptLabel',        "Encriptar"],
    ['expiryDateInPast',    "La fecha de expiración no puede ser en el pasado"],
    ['cardNumberEmpty',     "El número de tarjeta no puede estar vacío"],
    ['invalidCardNumber',   "Número de tarjeta inválido"],
    ['expiryDateRequired',  "La fecha de expiración es requerida"],
    ['invalidNumericValues',"Valores numéricos inválidos"],
    ['invalidMonth',        "Mes inválido"],
    ['genericError',        "Error genérico"],
]);

// This is just a sample client ID. Replace it with your own.
const clientId = 'f0396c8e-a87b-402d-9692-520cbc000000';
const vault = PayallVault.init(
    clientId, 'payall-vault',
    {
        translations: es_translations
    }
);

Text direction

Some languages require RTL (right-to-left) text direction.
The vault supports RTL text direction via the dir option.
Default value is ltr (left-to-right).

// This is just a sample client ID. Replace it with your own.
const clientId = 'f0396c8e-a87b-402d-9692-520cbc000000';
const vault = PayallVault.init(
    clientId, 'payall-vault',
    {
        translations: he_translations,
        dir: 'rtl',
    }
);

Hiding Cancel button

It is possible to hide the Cancel button by setting the hideCancelButton option to true.

// This is just a sample client ID. Replace it with your own.
const clientId = 'f0396c8e-a87b-402d-9692-520cbc000000';
const vault = PayallVault.init(
    clientId, 'payall-vault',
    {
        hideCancelButton: true
    }
);

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.
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
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
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

  • 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

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.

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.

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
required
string <uuid>

Id of the account to use as source of funds.

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",
  • "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",
  • "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",
  • "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",
  • "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.

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)

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",
  • "timestamp": "2019-08-24T14:15:22Z",
  • "code": "string",
  • "external_error": {
    },
  • "source_amount": {
    },
  • "target_amount": {
    }
}

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.

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 validation of card number using Luhn algorithm before encrypting using Luhn algorithm.

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 validation of card number using Luhn algorithm before encrypting using Luhn algorithm.

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
}