Download OpenAPI specification:Download
This is Payall's public API for Machine to Machine communication.
Payall platform supports different flows depending on customer needs. Please consult the flows relevant to your operational model with our team first.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
/v2/oauth/token endpoint).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
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.
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.
PanTokenized event and sends it to your server.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.
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>
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.
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.
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.
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.
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.
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.
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.
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} />;
}
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.
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));
<!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>
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.
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.
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.
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.
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}$.
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"
}
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."
}
}
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. |
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.
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.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.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.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.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 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.identity_document.issue_date from a date-time to a date
(YYYY-MM-DD) on payer and recipient payloads.identity_document.expiry_date from a date-time to a date
(YYYY-MM-DD) on payer and recipient payloads.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.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./v2/payers (POST, PATCH).
The POST endpoint now returns the created payer entity.account_details to the BusinessPayer entity./v2/exchange-rates/{id} (PATCH).
This allows updating the exchange_rate_id for a payment.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.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.configurationError translation key. Translations may now contain
digits, punctuation and symbols, e.g. Pay €10.50!, up to 100
characters.Cancel event is
sent.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.100vw by 100vh: it takes the full
width of its container and the height of the form. Set iframeStyle for
a fixed size.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.
For any questions or issues, please contact us through our customer support portal or email us at support@payallps.com.
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",
}
}
}
| 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 |
{- "recipient": {
- "type": "Person",
- "registration_address": {
- "city": {
- "title": "i18n.city",
- "description": null,
- "mask": "^[\\p{L}/:().,='+0-9\\s-]{1,35}$",
- "required": true,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 255,
- "data_values": null,
- "placeholder": null
}, - "street": {
- "title": "i18n.streetAddress",
- "description": null,
- "mask": "^[\\p{L}\\/:()#.,='+0-9\\s-]{1,100}$",
- "required": true,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 255,
- "data_values": null,
- "placeholder": null
}, - "country": {
- "title": "i18n.countryOfResidence",
- "description": null,
- "mask": null,
- "required": true,
- "data_type": "COUNTRY",
- "min_length": null,
- "max_length": null,
- "data_values": null,
- "placeholder": null
}, - "postal_code": {
- "title": "i18n.postalCode",
- "description": null,
- "mask": null,
- "required": false,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 255,
- "data_values": null,
- "placeholder": null
}, - "unit_number": {
- "title": "i18n.unitNumber",
- "description": null,
- "mask": "^([a-zA-Z0-9\\s\\-.])*$",
- "required": false,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 20,
- "data_values": null,
- "placeholder": null
}, - "building_name": {
- "title": "i18n.buildingName",
- "description": null,
- "mask": null,
- "required": false,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 255,
- "data_values": null,
- "placeholder": null
}, - "state_province": {
- "title": "i18n.stateOrProvince",
- "description": null,
- "mask": null,
- "required": false,
- "data_type": "STRING",
- "min_length": 2,
- "max_length": 255,
- "data_values": null,
- "placeholder": null
}, - "building_number": {
- "title": "i18n.buildingNumber",
- "description": null,
- "mask": "^([a-zA-Z0-9\\s\\-.])*$",
- "required": false,
- "data_type": "STRING",
- "min_length": 1,
- "max_length": 20,
- "data_values": null,
- "placeholder": null
}
}
}, - "payment_instrument": {
- "category": "BankAccount",
- "iban": {
- "title": "i18n.iban",
- "description": "i18n.internationalBankAccountNumber",
- "mask": "^IT[0-9]{2}[A-Z][0-9]{10}[a-zA-Z0-9]{12}",
- "required": true,
- "data_type": "IBAN",
- "min_length": null,
- "max_length": null,
- "data_values": null,
- "placeholder": null
}
}, - "kyt": {
- "payment_purpose": {
- "title": "i18n.purposeOfPayment",
- "description": "i18n.purposeOfPayment",
- "mask": null,
- "required": true,
- "data_type": "SELECT",
- "min_length": null,
- "max_length": null,
- "data_values": [
- {
- "key": "business_investment",
- "value": "Business/Investment"
}, - {
- "key": "salary",
- "value": "Salary"
}, - {
- "key": "payment_of_goods_and_services",
- "value": "Payment of goods and services"
}, - {
- "key": "employee_colleague",
- "value": "Employee Colleague"
}, - {
- "key": "savings",
- "value": "Savings"
}, - {
- "key": "education",
- "value": "Education"
}, - {
- "key": "payment_of_bills",
- "value": "Payment of bills"
}, - {
- "key": "wedding_expenses",
- "value": "Wedding Expenses"
}, - {
- "key": "medical_expenses",
- "value": "Medical Expenses"
}, - {
- "key": "funeral_expenses",
- "value": "Funeral Expenses"
}, - {
- "key": "purchase_of_property",
- "value": "Purchase of Property"
}, - {
- "key": "payment_of_loan",
- "value": "Payment of Loan"
}, - {
- "key": "household_maintenance",
- "value": "Household Maintenance"
}, - {
- "key": "family_maintenance",
- "value": "Family Maintenance"
}
], - "placeholder": null
}
}, - "example": {
- "recipient": {
- "type": "Person",
- "first_name": "John",
- "last_name": "Doe",
- "middle_name": "James",
- "mobile_number": "373261912905",
- "email": "user@mailinator.com",
- "registration_address": {
- "city": "",
- "street": "",
- "country": "",
- "postal_code": "",
- "unit_number": "",
- "building_name": "",
- "state_province": "",
- "building_number": ""
}
}, - "payment_instrument": {
- "category": "BankAccount",
- "currency": "",
- "iban": ""
}, - "kyt": {
- "payment_purpose": ""
}
}
}Use this method to initiate a single Payment.
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 Onboarding a payer requires your credentials to carry the Because this is a create, an When this field is omitted the payer is the owner of the account named by
If the request states a source currency (via | |
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 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 Matching is done based on the required fields for Alternatively | |
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 Alternatively | |
| recipient_id | string <uuid> [Optional] Id of exiting recipient. Alternatively |
| payment_instrument_id | string <uuid> [Optional] Id of existing payment instrument. When payment_instrument_id is provided then
|
| source_account_id | string <uuid> Id of the account to use as source of funds. Required unless |
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
You can either use the 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 You can either use the Response with HTTP code 400 will be sent if provided exchange rate expired. |
required | object (KYT) Transaction information required for KYT process. |
{- "end_to_end_id": "PA-ecf87cf814cd4d95a970ac7e8d7e7ef3",
- "client_payment_id": "string",
- "payer": {
- "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}, - "recipient": {
- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}, - "payment_instrument": {
- "category": "BankAccount",
- "currency": "string",
- "mobile_number": "string",
- "phone_operator": "string"
}, - "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
- "source_account_id": "75fca71f-6b38-4768-804d-ffb93d0aa579",
- "operation": {
- "type": "Forward",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_currency": "PLN"
}, - "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b",
- "carded_rate_id": "7a29f3e3-7ccc-4f67-af1d-6df58596d191",
- "kyt": {
- "destination_country": "GB",
- "payment_purpose": "family_maintenance",
- "commercial_activity": "transportation",
- "payment_description": "string",
- "beneficiary_bank_account_type": "checking",
- "supporting_documents": [
- {
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "invoice"
}
], - "source_of_funds": "salary",
- "relationship_with_sender": "father"
}
}{- "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": {
- "payer": {
- "currency": "EUR",
- "value": 10023
}, - "recipient": {
- "currency": "EUR",
- "value": 10023
}
}, - "exchange_rate": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}, - "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
- "code": "string",
- "decline_issuer": "string",
- "auto_confirmed": true,
- "error": {
- "code": "00005",
- "message": "Only recipient_id or recipient values are allowed but not both.",
- "trace_id": "df570c03-5a03-4cea-8df0-c162d05127ac",
- "details": {
- "property1": "string",
- "property2": "string"
}
}
}| id required | string <uuid> |
{- "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": {
- "payer": {
- "currency": "EUR",
- "value": 10023
}, - "recipient": {
- "currency": "EUR",
- "value": 10023
}
}, - "exchange_rate": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}, - "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
- "code": "string",
- "decline_issuer": "string",
- "auto_confirmed": true,
- "error": {
- "code": "00005",
- "message": "Only recipient_id or recipient values are allowed but not both.",
- "trace_id": "df570c03-5a03-4cea-8df0-c162d05127ac",
- "details": {
- "property1": "string",
- "property2": "string"
}
}
}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.
| id required | string <uuid> |
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 This field can be updated only for payments with expired exchange rate. |
{- "supporting_documents": [
- {
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "invoice"
}
], - "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}{- "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": {
- "payer": {
- "currency": "EUR",
- "value": 10023
}, - "recipient": {
- "currency": "EUR",
- "value": 10023
}
}, - "exchange_rate": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}, - "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
- "code": "string",
- "decline_issuer": "string",
- "auto_confirmed": true,
- "error": {
- "code": "00005",
- "message": "Only recipient_id or recipient values are allowed but not both.",
- "trace_id": "df570c03-5a03-4cea-8df0-c162d05127ac",
- "details": {
- "property1": "string",
- "property2": "string"
}
}
}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.
| id required | string <uuid> ID of the payment to confirm. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}{- "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": {
- "payer": {
- "currency": "EUR",
- "value": 10023
}, - "recipient": {
- "currency": "EUR",
- "value": 10023
}
}, - "exchange_rate": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}, - "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "payment_instrument_id": "9107be81-0e98-4406-8bb9-e4d1c6795a62",
- "code": "string",
- "decline_issuer": "string",
- "auto_confirmed": true,
- "error": {
- "code": "00005",
- "message": "Only recipient_id or recipient values are allowed but not both.",
- "trace_id": "df570c03-5a03-4cea-8df0-c162d05127ac",
- "details": {
- "property1": "string",
- "property2": "string"
}
}
}| 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. |
{- "pagination": {
- "pageNumber": 0,
- "totalPages": 0,
- "totalElements": 0,
- "pageSize": 0,
- "offset": 0
}, - "accounts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "category": "BankAccount",
- "currency": "string",
- "mobile_number": "string",
- "phone_operator": "string"
}
]
}| 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. |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "category": "BankAccount",
- "currency": "string",
- "mobile_number": "string",
- "phone_operator": "string"
}
]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. |
{- "recipient_id": "b6731cb5-d462-49ea-afb8-7933b670b560",
- "category": "BankAccount",
- "currency": "string",
- "mobile_number": "string",
- "phone_operator": "string",
- "country": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "category": "BankAccount",
- "currency": "string",
- "mobile_number": "string",
- "phone_operator": "string"
}| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}The exchange rate can be later used to initiate a new payment. Obtaining the exchange rate before payment is optional.
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:
source_amount) to target_currency GBPsource_account_id's currency) for the target_amount being 10 GBPsource_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 |
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 | 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 |
{- "source_account_id": "75fca71f-6b38-4768-804d-ffb93d0aa579",
- "source_currency": "EUR",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "recipient_instrument_id": "string",
- "payment_instrument_category": "BankAccount",
- "payment_type": "B2B",
- "target_currency": "GBP",
- "destination_country": "GB"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}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.
| exchange_rate_id | string <uuid> ID of the exchange rate to confirm. |
{- "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}Cancel the exchange rate to unblock funds on the source account. This operation is allowed only for exchange rates that have been confirmed.
| exchange_rate_id | string <uuid> ID of the exchange rate to cancel. |
{- "exchange_rate_id": "516fcd42-a1e5-4a7c-9b28-b7869f5f651b"
}{- "rates": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "from_currency": "USD",
- "to_currency": "EUR",
- "valid_from": "2023-03-01T00:00:00Z",
- "valid_to": "2023-03-01T04:00:00Z",
- "payment_instrument_category": "BankAccount",
- "rate": 0.8783,
- "tiers": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "from_amount": 100023,
- "rate": 0.8801
}
]
}
]
}| page_number | integer >= 1 Default: 1 Page number. |
| page_size | integer [ 1 .. 100 ] Default: 20 Page size. |
[- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
]| page_number | integer >= 1 Default: 1 Page number. |
| page_size | integer [ 1 .. 100 ] Default: 20 Page size. |
{- "pagination": {
- "pageNumber": 0,
- "totalPages": 0,
- "totalElements": 0,
- "pageSize": 0,
- "offset": 0
}, - "accounts": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
]
}| 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. |
{- "pagination": {
- "pageNumber": 0,
- "totalPages": 0,
- "totalElements": 0,
- "pageSize": 0,
- "offset": 0
}, - "recipients": [
- {
- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}
]
}| 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. |
[- {
- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}
]Identity representing a natural person.
| type required | string (Type) Enum: "Person" "Business" |
| external_id | string ID from external system. |
string <email> | |
| first_name required | string |
| last_name required | string |
| middle_name | string |
| mobile_number | string |
| dob | string <date> |
string | |
object (Address) | |
object (IdentityDocument) |
{- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}| id required | string <uuid> |
{- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}| id required | string <uuid> |
Person update request.
| type required | string Value: "Person" |
object (Address) | |
object (IdentityDocument) |
{- "type": "Person",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}{- "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": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}
}This operation fetches amount limits for recipient.
| id required | string <uuid> The ID of the recipient for which to provide payment limits |
| 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 |
| 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 |
{- "minimum": {
- "currency": "EUR",
- "value": 10023
}, - "maximum": {
- "currency": "EUR",
- "value": 10023
}
}Payer accounts will be created automatically however depending on configurations of your account, the payer may first be subject to KYC or KYB checks.
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 |
object (IdentityDocument) | |
| date_of_birth | string <date> |
| source_of_income | string |
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 |
| employer_industry | string |
{- "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "accounts": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
], - "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "accounts": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
], - "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}| id required | string <uuid> |
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 |
object (IdentityDocument) | |
| date_of_birth | string <date> |
| source_of_income | string |
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 |
| employer_industry | string |
{- "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "accounts": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
], - "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}This operation fetches amount limits for payer.
| id required | string <uuid> The ID of the payer for which to provide payment limits |
| 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 |
| 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 |
{- "minimum": {
- "currency": "EUR",
- "value": 10023
}, - "maximum": {
- "currency": "EUR",
- "value": 10023
}
}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.
| id | string <uuid> ID of the payer to get. |
| external_id | string External ID of the payer to get. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "accounts": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "owner_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
- "owner_name": "John Doe vs Trade Company",
- "created": "2023-10-27T08:57:09.374902",
- "number": "CC002200MONE00012398064447EUR",
- "name": "Digital Account",
- "currency": "EUR",
- "balance": {
- "currency": "EUR",
- "value": 10023
}
}
], - "type": "Business",
- "external_id": "string",
- "first_name": "string",
- "middle_name": "string",
- "last_name": "string",
- "phone_number": "string",
- "registration_address": {
- "city": "string",
- "street": "string",
- "country": "string",
- "postal_code": "string",
- "unit_number": "string",
- "building_name": "string",
- "state_province": "string",
- "building_number": "string"
}, - "nationality": "string",
- "government_id": "string",
- "identity_document": {
- "type": "string",
- "type_version_number": "string",
- "country_issuing": "string",
- "number": "string",
- "national_id_number": "string",
- "national_id_number_type": "string",
- "series": "string",
- "issue_date": "2019-08-24",
- "place_of_issue": "string",
- "authority_of_issue": "string",
- "expiry_date": "2019-08-24",
- "driver_license_number": "string",
- "driver_license_serial_number": "string",
- "driver_license_version_number": "string"
}, - "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"
}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:
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.
| event_type required | string Enum: "StatusChange" "Documents" |
| tenant_id required | string |
| 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
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-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 |
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.| status required | string Enum: "Created" "PendingCompliance" "Completed" "Declined" "ExchangeRateExpired" "PendingSettlement" "PendingClearingInstitution" "PendingFinance" "PendingServiceProvider" "PendingDocument" "PendingReceivingInstitution" "PendingRFI" "Returned" "Rejected"
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.
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.
|
| 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 |
| 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 |
| recipient_id | string <uuid> Id of the recipient of the payment in Payall system. This is the same identifier that is returned as |
| 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
Sent for payments that carry a quote; absent otherwise. |
{- "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": {
- "code": "string",
- "message": "string"
}, - "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "quote": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "source_amount": {
- "currency": "EUR",
- "value": 10023
}, - "target_amount": {
- "currency": "EUR",
- "value": 10023
}, - "expiration_date": "2019-08-24T14:15:22Z"
}
}| event_type required | string Value: "Publish" Event type for the rates |
| tenant_id required | string Tenant identifier |
Currency exchange rates data
required | Array of objects (CardedRate) |
{- "rates": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "from_currency": "USD",
- "to_currency": "EUR",
- "valid_from": "2023-03-01T00:00:00Z",
- "valid_to": "2023-03-01T04:00:00Z",
- "payment_instrument_category": "BankAccount",
- "rate": 0.8783,
- "tiers": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "from_amount": 100023,
- "rate": 0.8801
}
]
}
]
}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.
| clientId required | string <uuid> |
| 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 We recommend validating the card number with the Luhn algorithm before encrypting it. |
| expiration_date | string ISO/EIC 7813 Expiration date of the card |
{- "card_number": "ZiudIxi1h3P57k8OwmfOx1wpqIBeTGMu560uvdQoGYm2wfg/AIj8QkFpi2XTaCT4sO9drQvLSH9rSk3njQOGpSUmCzlPsA6ahG7Mg/0fMP2V6ahdMUmgmZPU1KVqL48p0pwjgSG6pTbLj6ROQFpPNkhs3ilrrQccKg7FamV34WC6hzEVyVRreR54LQeOAIFX5zQLOD4ldV/z8ikYdktKiFMkghQnF2oqzsd/rNTkL2DwzWTahgiA6gYZpoOhXt4rr1KoENC4hV4yT7iefyIFCGQu7EzeD15XB3v2+Q0Xj9ifOynADek3Mjxn6Bmg7fELGuUEkkxFgeLZrxrEcqAFbg==",
- "expiration_date": "12/30"
}{- "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 encryption key and parameters for a specific id
| id required | string <uuid> |
{- "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
}