Ce contenu a été traduit par une intelligence artificielle. Si vous repérez une erreur, merci de nous le signaler pour nous aider à améliorer notre support. En cas de doute, la version originale en anglais fait foi.
Voici la traduction en français de votre description du flux de paiement :
Le flux de paiement de base détaille les messages nécessaires que votre logiciel de caisse (POS) doit gérer pour fonctionner efficacement :
Login (Connexion) : démarre une session opérationnelle avec le terminal, permettant de traiter des transactions depuis la caisse.
Payment (Paiement) : transaction de vente, utilisant une carte ou un autre instrument pour finaliser un achat au point de vente.
Abort (Abandon) : arrête et annule immédiatement une transaction en cours avant que la phase d'autorisation ne soit lancée.
TransactionStatus (Statut de la transaction) : vérifie le résultat final ou le dernier état de traitement connu d'une transaction précédente ; généralement déclenché après une perte de communication entre la caisse (POS) et le terminal (POI).
Reversal (Extourne / Annulation) : annule une transaction récemment approuvée en recréditant les fonds sur le compte ou la carte du client avant que la transaction ne soit compensée financièrement (settlement).
Refund (Remboursement) : restitue les fonds à un client suite à une vente qui a déjà été compensée, généralement lors d'un retour produit.
Logout (Déconnexion) : cette requête ferme la session opérationnelle active sur le terminal, concluant le service du caissier ou la période d'utilisation.
Avec ces 7 messages, votre logiciel de caisse couvrira le périmètre d'intégration standard. Vous trouverez les détails de ces messages ci-dessous. Nous proposons également des fonctionnalités complémentaires qui pourraient vous intéresser pour apporter plus de valeur ou de sécurité à vos clients.
1. Login
Le LoginRequest est la première étape obligatoire pour initier la communication avec le terminal de paiement (POI) et établir une session opérationnelle.
Cette opération doit être déclenchée au démarrage de l'application ou chaque fois que le caissier se connecte au système de caisse (POS). Son objectif principal est de transmettre l'identité du système (détails du logiciel de caisse) et le contexte opérationnel (ID de l'opérateur, Date/Heure) au POI, garantissant ainsi que toutes les transactions suivantes sont correctement enregistrées et autorisées..
Click to View: Login Request/Response Sequence Diagram
This diagram illustrates the mandatory synchronous exchange used to establish the session:
A. Login Request
Header
L'objet standard SaleToPOIRequest.MessageHeader, avec le champ MessageClass défini sur Service et le champ MessageCategory sur Login.
Body
Ce tableau détaille les champs requis au sein de l'objet LoginRequest, qui permet d'identifier le logiciel de caisse (POS) et l'opérateur pour la nouvelle session.
| Field Name | Type | Required | Description |
|---|---|---|---|
DateTime |
String | Yes | The current date and time of the POS system at the moment the session is opened, in UTC following ISO 8601. |
OperatorID |
String | No | Identification of the specific cashier or operator (e.g., "Cashier001"). |
OperatorLanguage |
String | Yes |
Defines the language preference of the cashier/operator (e.g., EN, PL), in ISO 639-1 codes, using two alpha characters.
|
SaleSoftware.ApplicationName |
String | Yes | The name of the POS application sending the request (e.g., "POS Simulator"). |
SaleSoftware.ProviderIdentification |
String | Yes | Identification of the software provider (e.g., "POS Provider ID"). |
SaleSoftware.SoftwareVersion |
String | Yes | The version number of the POS application (e.g., "22.1.1.0"). |
Login request example JSON
This section contains the detailed JSON payload needed for the login request:
{
"MessageHeader": {
"ProtocolVersion": "3.1",
"MessageClass": "Service",
"MessageCategory": "Login",
"MessageType": "Request",
"ServiceID": "823",
"SaleID": "POS_123",
"POIID": "POI_123"
},
"LoginRequest": {
"DateTime": "2024-12-16T15:24:50.0+01:00",
"OperatorID": "Cashier001",
"OperatorLanguage": "EN",
"SaleSoftware": [
{
"ApplicationName": "POS Simulator",
"ProviderIdentification": "POS Provider ID",
"SoftwareVersion": "22.1.1.0"
}
],
}
}
Review the full schema on the API specification page for required fields.
Login request example XML
This section contains the detailed XML payload needed for the login request:
<?xml version="1.0" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader ProtocolVersion="3.1" MessageClass="Service" MessageCategory="Login" MessageType="Request" ServiceID="9343" SaleID="ECR001" POIID="456"></MessageHeader> <LoginRequest OperatorLanguage="EN" OperatorID="Cashier001"> <DateTime>2025-03-03T10:39:46Z</DateTime> <SaleSoftware ProviderIdentification="CashRegisterCompany" ApplicationName="ECR Simulator" SoftwareVersion="0.0.5"></SaleSoftware> <SaleTerminalData> <SaleCapabilities/> </SaleTerminalData> </LoginRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
B. Login Response
La réponse de connexion (Login Response) confirme que la session opérationnelle a été établie avec succès, fournissant au système de caisse (POS) des informations essentielles sur le statut et le logiciel du terminal de paiement (POI).
Deux résultats différents peuvent être attendus :
Succès : Une réponse avec
Response.Result: « Success ».Échec : Si une erreur d'analyse (parsing) survient, une
EventNotificationavecEventToNotify: « Reject » est renvoyée.
Le MessageHeader que vous recevez dans la réponse reprend les valeurs que vous avez fournies dans la requête. La seule exception est le MessageType, qui est « Response ».
Body
Ce tableau détaille les champs requis au sein de l'objet LoginResponse, qui identifie le logiciel de caisse (POS) et l'opérateur pour la nouvelle session. Vous trouverez un exemple de requête après le tableau.
| JSON Path | Type | Description |
|---|---|---|
Response.Result |
Enum | Status of the login request. Must be Success to proceed with transactions. |
POISystemData.POIStatus.GlobalStatus |
Enum | The current overall health status of the terminal and its systems. |
POISystemData.DateTime |
String | The current date and time maintained by the POI (often used for synchronization). |
POISystemData.POISoftware |
String | Information related to the software of the POI. |
Login response example JSON
This section contains the detailed JSON payload needed for the payment flow:
{
"MessageHeader": {
"MessageCategory": "Login",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI_123",
"ProtocolVersion": "3.1",
"SaleID": "POS_123",
"ServiceID": "823"
},
"LoginResponse": {
"POISystemData": {
"DateTime": "2025-11-28T14:12:59.6+01:00",
"POISoftware": {
"ApplicationName": "Pay On Site",
"CertificationCode": "",
"ProviderIdentification": "Market Pay",
"SoftwareVersion": "4.1.0-71ce1a2b9-dev"
},
"POIStatus": {
"GlobalStatus": "OK"
}
},
"Response": {
"Result": "Success"
}
}
}
Review the full schema on the API specification page for required fields.
Login response example XML
Each XML message payload has to be preceded by 4 bytes containing the number of bytes of the following XML message. The encoding is binary, big endian. This allows the application layer to always be able to determine if a complete XML message has been received before parsing it, regardless of the underlying protocol.
<SaleToPOIResponse>
<LoginResponse>
<POISystemData>
<DateTime>2025-03-03T11:39:46.3+01:00</DateTime>
<POISoftware ApplicationName="Pay On Site" CertificationCode="" ProviderIdentification="Market Pay" SoftwareVersion="2.0.6.1-3e0963690-qa"/>
<POIStatus GlobalStatus="OK"/>
</POISystemData>
<Response Result="Success"/>
</LoginResponse>
<MessageHeader MessageCategory="Login" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="9343"/>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
EventNotification
Lorsqu'une requête de connexion (Login Request) échoue, le terminal de paiement (POI) répond avec un message EventNotification spécifique, signalant que le message a été rejeté ou n'a pas pu être traité. C'est généralement la méthode utilisée par le terminal pour signaler immédiatement au système de caisse (POS) une erreur de structure ou d'analyse (parsing) irrécupérable.
Le MessageHeader que vous recevez pour une
EventNotificationreprend les valeurs que vous avez fournies dans la requête. Les deux seules exceptions sont le MessageCategory, qui devientEventNotification, et le MessageType, qui devientResponse.
| Field Name | Type | Description |
|---|---|---|
EventNotification.EventToNotify |
String | The specific event that caused the rejection; here, Reject, indicating the Login message could not be parsed or validated by the POI. |
EventNotification.TimeStamp |
String | Date and time the POI detected the error and generated this notification. |
Event notification example
If parsing error will happen during POI application handles incoming message, EventNotification will be returned:
{
"MessageHeader": {
"MessageCategory": "EventNotification",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI_123",
"ProtocolVersion": "3.1",
"SaleID": "POS001",
"ServiceID": "823"
},
"EventNotification": {
"TimeStamp": "2025-04-02T15:48:47.596+02:00",
"EventToNotify": "Reject"
}
}
Review the full schema on the API specification page for required fields.
Ces erreurs surviennent lorsque le POI est injoignable ou que les paramètres de session sont incorrects :
Format de message invalide : Des champs obligatoires (ex :
DateTime,SaleSoftware) sont manquants dans la requêteLoginRequest, ou la structure est corrompue.POI injoignable : Le terminal est éteint, déconnecté du réseau, ou son adresse IP est inconnue ou incorrecte.
Conflit de session : Le terminal est déjà connecté avec un autre
SaleID(ID de caisse), ou l'application du POI est occupée.
Au démarrage du POI, un certain temps peut s'écouler avant qu'il ne soit pleinement opérationnel et prêt à recevoir un message. Si vous rencontrez ce cas de figure, nous vous conseillons d'ajouter un délai et un mécanisme de rétentative pour la requête de connexion.
2. Payment
La requête de paiement (Payment Request) est le message de transaction principal utilisé pour initier un large éventail d'opérations financières sur le terminal de paiement (POI). Elle permet au logiciel de caisse (POS) de lancer des opérations telles qu'un paiement standard, une finalisation d'acquisition de carte, un remboursement, une pré-autorisation ou une finalisation de pré-autorisation.
Dans cette section, nous nous concentrerons sur le paiement standard. Les autres types sont détaillés dans des chapitres dédiés.
A. Payment Request
Header
L'objet standard SaleToPOIRequest.MessageHeader, avec MessageClass défini sur Service et MessageCategory sur Payment.
Body
Pour initier un paiement avec succès, le corps de la requête (PaymentRequest) doit contenir des données définissant le contexte de la vente ainsi que les détails financiers, plus précisément le montant de la transaction et l'identifiant unique de la transaction.
Ce tableau détaille les champs requis au sein de l'objet PaymentRequest.
| Field Name | Required |
Type |
Description |
|---|---|---|---|
PaymentTransaction.AmountsReq.RequestedAmount |
Yes |
Number |
Total monetary value of the transaction requested for payment. |
PaymentTransaction.AmountsReq.Currency |
Yes |
String |
Currency of the requested amount (e.g., EUR, NOK...) in ISO 4217. |
SaleData.SaleTransactionID.TimeStamp |
Yes |
String |
Date and time of the request in UTC format. |
SaleData.SaleTransactionID.TransactionID |
Yes |
String |
The unique transaction reference ID from the POS. Currently limited to 35 characters as per ISO 20022 standard. |
PaymentData.PaymentType |
No |
Enum |
Defines the nature of the transaction. Default is |
Payment Request example JSON
{
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Request",
"POIID": "Terminal_01",
"ProtocolVersion": "3.1",
"SaleID": "POS001",
"ServiceID": "86"
},
"PaymentRequest": {
"PaymentData": {
"PaymentType": "Normal"
},
"PaymentTransaction": {
"AmountsReq": {
"Currency": "EUR",
"RequestedAmount": 12.34
}
},
"SaleData": {
"SaleTransactionID": {
"TimeStamp": "2025-11-29T22:05:55.029",
"TransactionID": "12345"
}
}
}
}
Review the full schema on the API specification page for required fields.
Payment Request example XML
<?xml version="1.0" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader MessageClass="Service" MessageCategory="Payment" MessageType="Request" ServiceID="9345" SaleID="ECR001" POIID="456"></MessageHeader> <PaymentRequest> <SaleData OperatorID="666"> <SaleTransactionID TransactionID="Transaction123" TimeStamp="2025-03-03T10:39:59Z"></SaleTransactionID> </SaleData> <PaymentTransaction> <AmountsReq Currency="EUR" RequestedAmount="12.34"></AmountsReq> </PaymentTransaction> <PaymentData></PaymentData> <MarketpayPaymentExtensions></MarketpayPaymentExtensions> </PaymentRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
B. Intermediate Status
Lorsqu'une transaction de paiement s'exécute de manière asynchrone, le terminal de paiement (POI) utilise des messages de type Display Request pour informer le système de caisse (POS) de l'interaction requise de la part du client ou de l'état actuel du terminal. Le POS peut interpréter ces informations pour mettre à jour l'affichage client ou l'interface du caissier, puis continuer à attendre le résultat final.
Header
Le MessageHeader que vous recevez dans la réponse reprend les valeurs que vous avez fournies dans la requête. Les exceptions sont le MessageCategory, qui est Display, et le MessageType, qui est Request.
Body
| Field Name | Type | Description |
|---|---|---|
DisplayOutput.Device |
Enum |
The logical device where the information should be presented (e.g., CashierDisplay, CustomerDisplay...) |
DisplayOutput.InfoQualify |
Enum | Qualification of the information being sent (e.g., Status, Input...). |
DisplayOutput.ResponseRequiredFlag |
Boolean | Indicates if the POS is expected to send a reply message after processing the display. |
DisplayOutput.OutputContent.OutputFormat |
Enum | The format of the content being sent (e.g., text, reference ID, or menu). |
DisplayOutput.OutputContent.OutputText |
String |
The actual text message or instruction to be displayed, can be: WaitingForCard, PINRequired BankAuthorization, ApplicationSelection
|
Event notification example JSON
{
"MessageHeader": {
"MessageCategory": "Display",
"MessageClass": "Service",
"MessageType": "Request",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "823"
},
"DisplayRequest": {
"DisplayOutput": {
"Device": "CashierDisplay",
"InfoQualify": "Status",
"ResponseRequiredFlag": "false",
"OutputContent": {
"OutputFormat": "MessageRef",
"OutputText": "WaitingForCard",
"PredefinedContent": {
"ReferenceID": "1"
}
}
}
}
}
Review the full schema on the API specification page for required fields.
Event notification example XML
<SaleToPOIRequest>
<DisplayRequest>
<DisplayOutput Device="CashierDisplay" InfoQualify="Status" ResponseRequiredFlag="false">
<OutputContent OutputFormat="MessageRef">
<OutputText>WaitingForCard</OutputText>
<PredefinedContent ReferenceID="1"/>
</OutputContent>
</DisplayOutput>
</DisplayRequest>
<MessageHeader MessageCategory="Display" MessageClass="Service" MessageType="Request" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="9351"/>
</SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
C. Payment Response
La réponse de paiement (Payment Response) est le message final et définitif envoyé par le terminal (POI) à la caisse (POS), confirmant l'issue d'une demande financière initiée par cette dernière. Elle marque la fin du flux de paiement et fournit toutes les données nécessaires au POS pour conclure la vente.
Les résultats attendus sont communiqués via le champ principal Response.Result :
Success (Succès) : Les fonds ont été capturés, réservés ou remboursés avec succès. La réponse contient tous les détails de la transaction et les reçus.
Failure (Échec) : L'opération n'a pas pu être menée à bien (ex : carte refusée, délai d'attente de la transaction dépassé). La réponse inclut des informations de diagnostic via les champs
AdditionalResponseetErrorCondition(si présents).
Le MessageHeader que vous recevez dans la réponse reprend les valeurs que vous avez fournies dans la requête. La seule exception est le MessageType, qui est « Response ».
Body
Le corps de la PaymentResponse fournit un enregistrement complet de la transaction. Le POS doit interpréter cette réponse pour identifier le résultat de l'opération et imprimer les reçus. Le tableau ci-dessous détaille les champs attendus au sein de l'objet PaymentResponse.
| Field Name | Type | Key Information & POS Action |
|---|---|---|
Response.Result |
Enum | Transaction Outcome: Confirms the final status of the operation (Success, Failure or Partial). Must be checked first. |
PaymentResult.OnlineFlag |
Boolean | Exact amount authorized (key information for Partial results) |
PaymentResult.PaymentAcquirerData.ApprovalCode |
String | Authorization code assigned during payment processing |
PaymentResult.PaymentAcquirerData.ApprovalCode |
String | Authorization code assigned during payment processing |
POIData.POITransactionID.TransactionID |
String | Transaction ID assigned by the terminal, must be stored by POS. It is required for all follow-up operations (Reversal, Preauthorization completion...). |
PaymentResult.PaymentInstrumentData.PaymentInstrumentType |
String | Type of payment instrument: Card, Mobile, StoredValue ... |
PaymentResult.PaymentInstrumentData.CardData.EntryMode |
Enum | Entry mode of the payment instrument information: ICC, Contactless, Scanned ... |
PaymentResult.PaymentInstrumentData.CardData.PaymentBrand |
String | Card Type: Identifies the payment brand (e.g., VISA, MASTERCARD). Used for routing and receipt display. |
PaymentReceipt |
Array | Contains the text lines for the CashierReceipt and CustomerReceipt. |
PaymentReceipt.RequiredSignatureFlag |
Boolean | indicates whether the transaction requires customer's signature on the printed receipt. |
MarketpayPaymentExtensions.BankID |
String | Contains information on customer's card: ApplicationID, BankID and PANSequenceNumber |
Payment Response example JSON
{
"SaleToPOIResponse": {
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "456",
"ProtocolVersion": "3.1",
"SaleID": "ECR001",
"ServiceID": "9345"
},
"PaymentResponse": {
"MarketpayPaymentExtensions": {
"ApplicationID": "A0000000041010",
"BankID": "513640",
"PANSequenceNumber": "01"
},
"PaymentReceipt": [
{
"DocumentQualifier": "CashierReceipt",
"RequiredSignatureFlag": false,
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": true,
"Text": "MERCHANT RECEIPT"
},
{
"EndOfLineFlag": true,
"Text": "--------------------------------"
},
{
"EndOfLineFlag": true,
"Text": "Candy Shop"
},
{
"EndOfLineFlag": true,
"Text": "75002 Paris"
},
{
"EndOfLineFlag": true,
"Text": "REFERENCE: 1"
},
{
"EndOfLineFlag": true,
"Text": "TID: 30010909"
},
{
"EndOfLineFlag": true,
"Text": "DEVICE NAME: 2290348732"
},
{
"EndOfLineFlag": true,
"Text": "MERCHANT: 000000001231344"
},
{
"EndOfLineFlag": true,
"Text": "PAN: XXXXXXXXXXXX7462 01"
},
{
"EndOfLineFlag": true,
"Text": "AID: A0000000041010"
},
{
"EndOfLineFlag": true,
"Text": "CARD TYPE: MASTERCARD"
},
{
"EndOfLineFlag": true,
"Text": "PAYMENT"
},
{
"EndOfLineFlag": true,
"Text": "CONTACTLESS"
},
{
"EndOfLineFlag": true,
"Text": "AMOUNT:€ 12,34"
},
{
"EndOfLineFlag": true,
"Text": "Approved"
},
{
"EndOfLineFlag": true,
"Text": "213462"
},
{
"EndOfLineFlag": true,
"Text": "TIME: 11:40:06"
},
{
"EndOfLineFlag": true,
"Text": "DATE: 03.03.2025"
},
{
"EndOfLineFlag": true,
"Text": "AUTHENTICATION METHOD: NO"
},
{
"EndOfLineFlag": true,
"Text": "CARDHOLDER VERIFICATION"
},
{
"EndOfLineFlag": true,
"Text": "PLEASE RETAIN FOR YOUR RECORDS"
}
]
}
},
{
"DocumentQualifier": "CustomerReceipt",
"RequiredSignatureFlag": false,
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": true,
"Text": "RECU PORTEUR"
},
{
"EndOfLineFlag": true,
"Text": "--------------------------------"
},
{
"EndOfLineFlag": true,
"Text": "Candy Shop"
},
{
"EndOfLineFlag": true,
"Text": "75002 Paris"
},
{
"EndOfLineFlag": true,
"Text": "RÉFÉRENCE: 1"
},
{
"EndOfLineFlag": true,
"Text": "TID: 30010909"
},
{
"EndOfLineFlag": true,
"Text": "NOM DE L'APPAREIL: 2290348732"
},
{
"EndOfLineFlag": true,
"Text": "MARCHAND: 000000001231344"
},
{
"EndOfLineFlag": true,
"Text": "PAN: XXXXXXXXXXXX7462 01"
},
{
"EndOfLineFlag": true,
"Text": "AID: A0000000041010"
},
{
"EndOfLineFlag": true,
"Text": "TYPE DE CARTE: MASTERCARD"
},
{
"EndOfLineFlag": true,
"Text": "PAIEMENT"
},
{
"EndOfLineFlag": true,
"Text": "SANS CONTACT"
},
{
"EndOfLineFlag": true,
"Text": "MONTANT:€ 12,34"
},
{
"EndOfLineFlag": true,
"Text": "Approuvé"
},
{
"EndOfLineFlag": true,
"Text": "213462"
},
{
"EndOfLineFlag": true,
"Text": "TIME: 11:40:06"
},
{
"EndOfLineFlag": true,
"Text": "DATE: 03.03.2025"
},
{
"EndOfLineFlag": true,
"Text": "METHODE"
},
{
"EndOfLineFlag": true,
"Text": "D'AUTHENTIFICATION: AUCUNE"
},
{
"EndOfLineFlag": true,
"Text": "VÉRIFICATION DU TITULAIRE DE LA"
},
{
"EndOfLineFlag": true,
"Text": "CARTE"
},
{
"EndOfLineFlag": true,
"Text": "VEUILLEZ CONSERVER POUR VOS"
},
{
"EndOfLineFlag": true,
"Text": "DOSSIERS"
}
]
}
}
],
"PaymentResult": {
"MerchantOverrideFlag": false,
"OnlineFlag": true,
"AmountsResp": {
"AuthorizedAmount": "12.34",
"Currency": "EUR"
},
"PaymentAcquirerData": {
"AcquirerID": "40105611508",
"AcquirerPOIID": "30010909",
"MerchantID": "000000001231344",
"ApprovalCode": "213462"
},
"PaymentInstrumentData": {
"PaymentInstrumentType": "Card",
"CardData": {
"EntryMode": "Contactless",
"MaskedPAN": "XXXXXXXXXXXX7462",
"PaymentBrand": "MASTERCARD"
}
}
},
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-03-03T11:40:06.500",
"TransactionID": "1"
}
},
"Response": {
"Result": "Success",
"AdditionalResponse": "000"
},
"SaleData": {
"OperatorID": "666",
"SaleTransactionID": {
"TimeStamp": "2025-03-03T10:39:59Z",
"TransactionID": "Transaction123"
}
}
}
}
}
Review the full schema on the API specification page for required fields.
Payment Response example XML
<SaleToPOIResponse>
<MessageHeader MessageCategory="Payment" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="9345"/>
<PaymentResponse>
<MarketpayPaymentExtensions ApplicationID="A0000000041010" BankID="513640" PANSequenceNumber="01"/>
<PaymentReceipt DocumentQualifier="CashierReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">MERCHANT RECEIPT</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">Candy Shop</OutputText>
<OutputText EndOfLineFlag="true">75002 Paris</OutputText>
<OutputText EndOfLineFlag="true">REFERENCE: 1</OutputText>
<OutputText EndOfLineFlag="true">TID: 30010909</OutputText>
<OutputText EndOfLineFlag="true">DEVICE NAME: 2290348732</OutputText>
<OutputText EndOfLineFlag="true">MERCHANT: 000000001231344</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462 01</OutputText>
<OutputText EndOfLineFlag="true">AID: A0000000041010</OutputText>
<OutputText EndOfLineFlag="true">CARD TYPE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">PAYMENT</OutputText>
<OutputText EndOfLineFlag="true">CONTACTLESS</OutputText>
<OutputText EndOfLineFlag="true">AMOUNT:€ 12,34</OutputText>
<OutputText EndOfLineFlag="true">Approved</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">TIME: 11:40:06</OutputText>
<OutputText EndOfLineFlag="true">DATE: 03.03.2025</OutputText>
<OutputText EndOfLineFlag="true">AUTHENTICATION METHOD: NO</OutputText>
<OutputText EndOfLineFlag="true">CARDHOLDER VERIFICATION</OutputText>
<OutputText EndOfLineFlag="true">PLEASE RETAIN FOR YOUR RECORDS</OutputText>
</OutputContent>
</PaymentReceipt>
<PaymentReceipt DocumentQualifier="CustomerReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">RECU PORTEUR</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">Candy Shop</OutputText>
<OutputText EndOfLineFlag="true">75002 Paris</OutputText>
<OutputText EndOfLineFlag="true">RÉFÉRENCE: 1</OutputText>
<OutputText EndOfLineFlag="true">TID: 30010909</OutputText>
<OutputText EndOfLineFlag="true">NOM DE L'APPAREIL: 2290348732</OutputText>
<OutputText EndOfLineFlag="true">MARCHAND: 000000001231344</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462 01</OutputText>
<OutputText EndOfLineFlag="true">AID: A0000000041010</OutputText>
<OutputText EndOfLineFlag="true">TYPE DE CARTE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">PAIEMENT</OutputText>
<OutputText EndOfLineFlag="true">SANS CONTACT</OutputText>
<OutputText EndOfLineFlag="true">MONTANT:€ 12,34</OutputText>
<OutputText EndOfLineFlag="true">Approuvé</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">TIME: 11:40:06</OutputText>
<OutputText EndOfLineFlag="true">DATE: 03.03.2025</OutputText>
<OutputText EndOfLineFlag="true">METHODE</OutputText>
<OutputText EndOfLineFlag="true">D'AUTHENTIFICATION: AUCUNE</OutputText>
<OutputText EndOfLineFlag="true">VÉRIFICATION DU TITULAIRE DE LA</OutputText>
<OutputText EndOfLineFlag="true">CARTE</OutputText>
<OutputText EndOfLineFlag="true">VEUILLEZ CONSERVER POUR VOS</OutputText>
<OutputText EndOfLineFlag="true">DOSSIERS</OutputText>
</OutputContent>
</PaymentReceipt>
<PaymentResult MerchantOverrideFlag="false" OnlineFlag="true">
<AmountsResp AuthorizedAmount="12.34" Currency="EUR"/>
<PaymentAcquirerData AcquirerID="40105611508" AcquirerPOIID="30010909" MerchantID="000000001231344">
<ApprovalCode>213462</ApprovalCode>
</PaymentAcquirerData>
<PaymentInstrumentData PaymentInstrumentType="Card">
<CardData EntryMode="Contactless" MaskedPAN="XXXXXXXXXXXX7462" PaymentBrand="MASTERCARD"/>
</PaymentInstrumentData>
</PaymentResult>
<POIData>
<POITransactionID TimeStamp="2025-03-03T11:40:06.500" TransactionID="1"/>
</POIData>
<Response Result="Success">
<AdditionalResponse>000</AdditionalResponse>
</Response>
<SaleData OperatorID="666">
<SaleTransactionID TimeStamp="2025-03-03T10:39:59Z" TransactionID="Transaction123"/>
</SaleData>
</PaymentResponse>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
D. Error handling
Voici la traduction en français de votre documentation technique :
Lorsqu'une opération de paiement échoue, le système de caisse (POS) doit catégoriser l'erreur afin de déterminer l'action de récupération appropriée et éviter tout écart financier.
Erreur de conflit de communication
Cette défaillance survient avant même que le terminal de paiement (POI) ne puisse commencer à traiter la logique de la transaction. Le terminal est alors occupé par une autre opération.
Transaction refusée (Decline)
Le POI délivre un message de réponse final contenant le champ de résultat définitif défini sur Result: "Failure".
Cause : La carte a été refusée par l'émetteur, un serveur de paiement était injoignable, ou une erreur spécifique à l'hôte a empêché l'autorisation.
Diagnostic : Le corps de la réponse contient des champs de diagnostic tels que
AdditionalResponseet, potentiellement,ErrorConditionexpliquant la raison du refus.
Notification d'événement (Event Notification)
Cela signale que le POI n'a pas pu comprendre la structure du message envoyé par le POS. Le POI envoie un message EventNotification avec le champ EventToNotify défini sur Reject.
Cause : Le message de demande de paiement était syntaxiquement incorrect, il manquait un champ obligatoire, ou les données ont été corrompues pendant la transmission.
Action requise : Le POS doit inspecter la charge utile (payload) envoyée au POI, corriger l'erreur structurelle (formatage, champs obligatoires, etc.), puis tenter à nouveau la transaction.
Event notification example JSON
{
"MessageHeader": {
"MessageCategory": "EventNotification",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"EventNotification": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"EventToNotify": "Reject"
}
}
Review the full schema on the API specification page for required fields.
3. Abort
Vous pouvez ensuite envoyer une requête d'abandon (Abort Request) pour interrompre une transaction en cours. Lorsque cette requête est reçue avant que la transaction ne soit envoyée en autorisation, le paiement est annulé. Si le client a inséré sa carte mais n'a pas encore validé son code PIN, l'opération peut toujours être abandonnée.
Pour les transactions complexes commençant par une acquisition de carte (Card Acquisition, un paiement en deux étapes), la requête d'abandon standard est ignorée. Reportez-vous à la documentation sur l'acquisition de carte pour plus d'informations.
A. Abort Request
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Abort.
Body
This table details the fields required within the AbortRequest object.
| Field Name | Type | Required | Description for POS (How to use it) |
|---|---|---|---|
MessageReference.MessageCategory |
Enum | Yes | Must match the category of the transaction being stopped (e.g., "Payment", "Reversal"). |
MessageReference.ServiceID |
String | Yes | The unique ServiceID of the original transaction. |
MessageReference.SaleID |
String | Yes | Identification of the Sale Terminal that initiated the operation. |
AbortRequest.AbortReason |
String | Yes | A free-text field or code explaining why the transaction is being aborted (e.g., "MerchantAbort"). |
The example shows how to cancel an in-progress payment with a ServiceID of 830.
AbortRequest for Payment example JSON
{
"MessageHeader": {
"MessageClass": "Service",
"MessageCategory": "Abort",
"MessageType": "Request",
"ServiceID": "831",
"SaleID": "POS_01",
"POIID": "Terminal_01"
},
"AbortRequest": {
"MessageReference": {
"MessageCategory": "Payment",
"ServiceID": "830",
"SaleID": "POS_01",
},
"AbortReason": "MerchantAbort"
}
}
Review the full schema on the API specification page for required fields.
AbortRequest for Payment example XML
<?xml version="3.1" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader MessageClass="Service" MessageCategory="Abort" MessageType="Request" ServiceID="3909" SaleID="ECR001" POIID="456"></MessageHeader> <AbortRequest> <MessageReference MessageCategory="Payment" ServiceID="830" SaleID="ECR_01" POIID="456"></MessageReference> <AbortReason>MerchantAbort</AbortReason> </AbortRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
B. Abort Reponse
Check the responses:
- A successful abort request returns a response with a
200 OKHTTP status code and no body. - The payment request returns a response containing:
-
Result: Failure -
ErrorCondition: Aborted
-
Abort Response example JSON
{
"SaleToPOIResponse": {
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "456",
"ProtocolVersion": "3.1",
"SaleID": "ECR_01",
"ServiceID": "3908"
},
"PaymentResponse": {
"MarketpayPaymentExtensions": {},
"PaymentResult": {
"OnlineFlag": false,
"PaymentType": "Normal"
},
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-03-29T13:40:12.118",
"TransactionID": "1"
}
},
"Response": {
"ErrorCondition": "Aborted",
"Result": "Failure"
},
"SaleData": {
"OperatorID": "Cashier_01",
"SaleTransactionID": {
"TimeStamp": "2025-03-29T12:40:09Z",
"TransactionID": "123"
}
}
}
}
}
Review the full schema on the API specification page for required fields.
Abort Response example XML
<SaleToPOIResponse>
<MessageHeader MessageCategory="Payment" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="3908"/>
<PaymentResponse>
<MarketpayPaymentExtensions/>
<PaymentResult OnlineFlag="false" PaymentType="Normal"/>
<POIData>
<POITransactionID TimeStamp="2025-03-29T13:40:12.118" TransactionID="1"/>
</POIData>
<Response ErrorCondition="Aborted" Result="Failure"/>
<SaleData OperatorID="666">
<SaleTransactionID TimeStamp="2025-03-29T12:40:09Z" TransactionID="123"/>
</SaleData>
</PaymentResponse>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
To double-check the payment was indeed cancelled, make a transaction status request. The TransactionStatusRequest.MessageReference object should contain:
- ServiceID: The
ServiceIDof the payment you tried to cancel. - MessageCategory: Set to Payment
C. Error handling
Cancel from the terminal
To cancel an in-progress payment on a terminal:
- with keypad: on the keypad, select the Cancel key (red button)
- touchscreen only: on the transaction screen: click on Cancel transaction button
If this is successful:
- The terminal shows a Cancelled message on the display.
- The payment request returns a response containing:
-
Result: Failure -
ErrorCondition: Cancel
-
Handling failed cancel requests
If your cancel request failed (and the payment was approved), you will need to refund the payment.
4. Transaction Status
The Status Request is a critical operation used by your Point of Sale (POS) to ask about the final result or status of a previously initiated transaction when that result was not received. This function can be used to recover from different scenario:
Timeout
Connection loss or failure
System failure or program crash
Status Request asks the Payment Terminal (POI) to provide the transaction's current state: whether the transaction was processed (Success or Failure), is still in progress, or was not found on the terminal. If the transaction was processed, the POS receives the original transaction response (e.g., the complete PaymentResponse or ReversalResponse body) detailing the final outcome. POS should automatically checks the status of a transaction any time it fails to receive a transaction response
Transaction status request might be used to extract previous transaction response from terminal. In current POI implementation only last message will be returned
A. Transaction Status Request
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to TransactionStatus.
Body
The body of the Transaction Status Request is sent as an empty object ({}) because the request to retrieve the last transaction's status relies solely on the contextual identifiers already provided in the MessageHeader (such as POIID and SaleID).
Status request example JSON
{
"MessageHeader": {
"ProtocolVersion": "3.1",
"MessageClass": "Service",
"MessageCategory": "TransactionStatus",
"MessageType": "Request",
"ServiceID": "838",
"SaleID": "POS_01",
"POIID": "POI_01"
},
"TransactionStatusRequest": {}
}
Review the full schema on the API specification page for required fields.
Status request example XML
<?xml version="1.0" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader MessageClass="Service" MessageCategory="TransactionStatus" MessageType="Request" ServiceID="3911" SaleID="ECR001" POIID="456"></MessageHeader> <TransactionStatusRequest></TransactionStatusRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
B. Transaction Status Responses
The POI returns an immediate response with the message that was missed by the POS: a TransactionStatusResponse or an EventNotification
A TransactionStatusResponse.Response with a Result of Success indicates that the transaction reached an end state: approved, cancelled, or declined.
The TransactionStatusResponse contains the original transaction's final message in the RepeatedMessageResponse object. To determine the result of the transaction, use the original transaction response, provided in the RepeatedResponseMessageBody. For example:
- PaymentResponse.Response has
ResultSuccess: the payment succeeded. - PaymentResponse.Response has
ResultFailure, readErrorConditionto determine the reason failure (cancel by customer, ...).
Positive Payment - TransactionStatus Response example
{
"MessageHeader": {
"MessageCategory": "TransactionStatus",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"TransactionStatusResponse": {
"RepeatedMessageResponse": {
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"PaymentResponse": {
"MarketpayPaymentExtensions": {
"ApplicationID": "A0000000031010",
"BankID": "476173",
"PANSequenceNumber": "01",
"TVR": "AAAAAAA=",
"CardAcquisitionReference": {
"TimeStamp": "2025-11-28T13:51:59Z",
"TransactionID": "83"
}
},
"PaymentReceipt": [
{
"DocumentQualifier": "CashierReceipt",
"RequiredSignatureFlag": "false",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": "true",
"Value": "RECEIPT ITEM"
}
]
}
},
{
"DocumentQualifier": "CustomerReceipt",
"RequiredSignatureFlag": "false",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": "true",
"Value": "RECEIPT ITEM"
}
]
}
}
],
"PaymentResult": {
"MerchantOverrideFlag": "false",
"OnlineFlag": "true",
"AmountsResp": {
"AuthorizedAmount": "11.99",
"Currency": "EUR"
},
"PaymentAcquirerData": {
"AcquirerID": "40105611508",
"AcquirerPOIID": "HELP911",
"MerchantID": "000000000000001",
"ApprovalCode": "213462"
},
"PaymentInstrumentData": {
"PaymentInstrumentType": "Card",
"CardData": {
"EntryMode": "Contactless",
"MaskedPAN": "XXXXXXXXXXXX0027",
"PaymentBrand": "VISA"
}
}
},
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"Response": {
"Result": "Success",
"AdditionalResponse": "000"
},
"SaleData": {
"OperatorID": "456",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
},
"SponsoredMerchant": {
"Address": "9 RUE DU 4 SEPTEMBRE\n75002 PARIS",
"CommonName": "MARKET PAY PRECERT",
"CountryCode": "NO",
"MerchantCategoryCode": "4411",
"RegisteredIdentifier": "198703093982001"
}
}
}
},
"Response": {
"Result": "Success"
}
}
}
Review the full schema on the API specification page for required fields.
Positive Reversal - TransactionStatus Response example
{
"MessageHeader": {
"MessageCategory": "TransactionStatus",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"TransactionStatusResponse": {
"RepeatedMessageResponse": {
"MessageHeader": {
"MessageCategory": "Reversal",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"ReversalResponse": {
"ReversedAmount": "11.99",
"CustomerOrder": {
"ForecastedAmount": "11.99",
"StartDate": "2025-11-28T14:12:59.6+01:00"
},
"MarketpayPaymentExtensions": {
"AcquirerId": "40105611508",
"ApplicationID": "A0000000031010",
"Currency": "EUR",
"OriginalTransactionType": "Credit",
"PaymentInstrumentData": {
"PaymentInstrumentType": "Card",
"CardData": {
"PaymentBrand": "VISA",
"SensitiveCardData": {
"PAN": "XXXXXXXXXXXX0027",
"CardSeqNumb": "01",
"ExpiryDate": "2412"
}
}
}
},
"OriginalPOITransaction": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"PaymentReceipt": [
{
"DocumentQualifier": "CashierReceipt",
"RequiredSignatureFlag": "false",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": "true",
"Value": "RECEIPT ITEM"
}
]
}
},
{
"DocumentQualifier": "CustomerReceipt",
"RequiredSignatureFlag": "false",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": "true",
"Value": "RECEIPT ITEM"
}
]
}
}
],
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"Response": {
"Result": "Success"
},
"SaleData": {
"OperatorID": "456",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
},
"SponsoredMerchant": {
"Address": "9 RUE DU 4 SEPTEMBRE\n75002 PARIS",
"CommonName": "MARKET PAY PRECERT",
"CountryCode": "NO",
"MerchantCategoryCode": "4411",
"RegisteredIdentifier": "198703093982001"
}
}
}
},
"Response": {
"Result": "Success"
}
}
}
Review the full schema on the API specification page for required fields.
Positive card acquisition transaction status response
{
"MessageHeader": {
"MessageCategory": "TransactionStatus",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"TransactionStatusResponse": {
"RepeatedMessageResponse": {
"MessageHeader": {
"MessageCategory": "CardAcquisition",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"CardAcquisitionResponse": {
"MarketpayPaymentExtensions": {
"ApplicationID": "A0000000031010",
"BankID": "476173",
"PANSequenceNumber": "01",
"CardAcquisitionReference": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9990"
}
},
"PaymentInstrumentData": {
"PaymentInstrumentType": "Card",
"CardData": {
"EntryMode": "Contactless",
"MaskedPAN": "XXXXXXXXXXXX0027"
}
},
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"Response": {
"Result": "Success",
"AdditionalResponse": "PFJlc3BvbnNlPgogICA8RGVzY3JpcHRpb24+VG9rZW4gcmVzcG9uc2UgY29ycnVwdGVkLiBGYWlsZWRUb2tlbkdlbmVyYXRpb25SZXNwb25zZShlcnJvcklEPSwgcmV0dXJuQ29kZT0sIHJldHVybk1lc3NhZ2U9MSBleGNlcHRpb25zIG9jY3VycmVkLiAsIHN0YXJ0VGltZT0sIGVuZFRpbWU9KTwvRGVzY3JpcHRpb24+CiAgIDxMb3lhbHR5RXJyb3JGbGFnPnRydWU8L0xveWFsdHlFcnJvckZsYWc+CjwvUmVzcG9uc2U+"
},
"SaleData": {
"OperatorID": "456",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
}
}
},
"Response": {
"Result": "Success"
}
}
}
Review the full schema on the API specification page for required fields.
Transaction not found
A TransactionStatusResponse.Response with an ErrorCondition of NotFound indicates that we were not able to find the transaction with the SaleID and ServiceID you specified.
When the transaction is not found, this means that either:
- The
POIID,SaleIDorServiceIDyou specified in the transaction status request are incorrect. Check that you provided thePOIID,SaleID, andServiceIDfrom the original transaction in theTransactionStatusRequest.MessageReference. - POI did not receive the original transaction request. The cause can be a dropped internet connection or an unexpected power loss. You can retry the original transaction.
The example response below indicates that this transaction was not found.
Transaction not found - TransactionStatus Example
{
"MessageHeader": {
"MessageCategory": "TransactionStatus",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "838"
},
"TransactionStatusResponse": {
"Response": {
"Result": "Failure",
"ErrorCondition": "NotFound"
}
}
}
Review the full schema on the API specification page for required fields.
Error handling
If the POI application detects a parsing error while handling an incoming message, an EventNotification will be returned, as shown in the example below.
Event notification example
If parsing error will happen during POI application handles incoming message, EventNotification will be returned:
{
"MessageHeader": {
"MessageCategory": "EventNotification",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POS_01",
"ProtocolVersion": "3.1",
"SaleID": "123",
"ServiceID": "838"
},
"EventNotification": {
"timeStamp": "2025-04-02T15:48:47.596+02:00",
"eventToNotify": "Reject"
}
}
Review the full schema on the API specification page for required fields.
5. Reversal
A Reversal can be used to cancels a previous Payment, Loyalty or Stored Value transaction. It used to undo a transaction that was processed and successfully approved by the system.
It is primarily used to correct errors, process customer returns, or undo a transaction immediately after it was committed. Unlike an Abort Request (which terminates an in-progress transaction), a Reversal is only applicable to a transaction that has reached a final success state.
Payment transaction can be voided by a reversal as long as reconciliation has not been done. After the clearing of the transaction by the Acquirer, the payment transaction can only be voided by a refund transaction, which requires a new payment transaction.
A. Reversal Request
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Reversal.
Body
This table details the fields required within the LoginRequest object, which identifies the POS software and the operator for the new session.
| Field Name | Type | Required | Description for POS (Purpose) |
|---|---|---|---|
OriginalPOITransaction.POITransactionID.TransactionID |
String | Yes | The unique Transaction ID the POI assigned to the original transaction (e.g., "9990"). |
OriginalPOITransaction.POITransactionID.TimeStamp |
String | Yes | The Date and Time the POI recorded the original transaction. |
ReversalReason |
Enum | Yes | Explains why the transaction is being cancelled (e.g., merchant error, customer cancellation, unable to complete). |
ReversedAmount |
Number | No | The specific amount to reverse. If omitted, the entire original Authorized Amount is assumed. |
Currency |
String | No | The currency of the original transaction. |
SaleData.SaleTransactionID.TransactionID |
String | Yes | The ID assigned by the POS for this Reversal Request itself (for tracking the reversal attempt), e.g., "9991" |
Reversal Request example JSON
{
"MessageHeader": {
"MessageCategory": "Reversal",
"MessageClass": "Service",
"MessageType": "Request",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "823"
},
"ReversalRequest": {
"Currency": "EUR",
"ReversedAmount": 11.99
"OriginalPOITransaction": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9990"
},
"SaleID": "POS_01"
},
"ReversalReason": "Unable2Compl",
"SaleData": {
"OperatorID": "Cashier_01",
"SaleReferenceID": "19",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
}
}
}
Review the full schema on the API specification page for required fields.
Reversal Request example XML
<?xml version="1.0" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader MessageClass="Service" MessageCategory="Reversal" MessageType="Request" ServiceID="3913" SaleID="ECR001" POIID="456"></MessageHeader> <ReversalRequest ReversalReason="MerchantCancel" ReversedAmount="10.02"> <SaleData OperatorID="666"> <SaleTransactionID TransactionID="123" TimeStamp="1970-01-01T00:00:00Z"></SaleTransactionID> </SaleData> <OriginalPOITransaction LastTransactionFlag="false"> <POITransactionID TransactionID="2" TimeStamp="1970-01-01T00:00:00Z"></POITransactionID> </OriginalPOITransaction> <CustomerOrder StartDate="2025-03-29T12:41:46Z" ForecastedAmount="10.02" Currency="EUR"></CustomerOrder> <MarketpayPaymentExtensions></MarketpayPaymentExtensions> </ReversalRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
Reversal when you do not know the POI TransactionID
In case of a communication or technical issue, the payment or card acquisition request can remain in-progress. When this happens, the terminal cannot be used until the request times out on its own, usually after 120 seconds. Because you haven't received the response yet, you do not have the TransactionID required to reverse the transaction.
You can get the TransactionID of the original request by sending a transaction status request. You can then follow up with request to reverse the operation.
B. Reversal Response
The Reversal Response is the final message confirming the outcome of a reversal request, indicating whether the attempt to cancel the original transaction was successful or failed.
Header
The MessageHeader you receive in the response echoes the values you provided in the request. The exceptions is the MessageType, which is Response.
Body
| Field Name | Type | Description |
|---|---|---|
Response.Result |
Enum | Transaction Outcome, confirms the final status of the reversal operation. Must be Success to confirm cancellation. |
ReversedAmount |
Number | Amount Reversed: precise amount that was successfully credited back to the customer's account/card. |
OriginalPOITransaction.POITransactionID.TransactionID |
String | Transaction ID, from POI, of the original payment that was cancelled. Used for financial linking. |
POIData.POITransactionID.TransactionID |
String | Transaction ID of the Reversal operation itself provided by POI. |
PaymentReceipt |
Array | Receipt Content: Contains the text necessary for printing both the Cashier and Customer reversal receipts. |
Reversal Response example JSON
{
"MessageHeader": {
"MessageCategory": "Reversal",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POS01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"ReversalResponse": {
"CustomerOrder": {},
"MarketpayPaymentExtensions": {
"AcquirerId": "40105611508",
"ApplicationID": "A0000000041010",
"Currency": "EUR",
"OriginalTransactionType": "Debit",
"PaymentInstrumentData": {
"CardData": {
"PaymentBrand": "2",
"SensitiveCardData": {
"PAN": "XXXXXXXXXXXX1034",
"CardSeqNumb": "01",
"ExpiryDate": "2512"
}
},
"PaymentInstrumentType": "Card"
}
},
"OriginalPOITransaction": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9990"
},
"SaleID": "POS001"
},
"PaymentReceipt": [
{
"DocumentQualifier": "CashierReceipt",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": true,
"Text": "POTWIERDZENIE DLA"
},
{
"EndOfLineFlag": true,
"Text": "SPRZEDAWCY"
},
{
"EndOfLineFlag": true,
"Text": "BRAK PARAGONU DO"
},
{
"EndOfLineFlag": true,
"Text": "ZAKUPU"
},
{
"EndOfLineFlag": true,
"Text": "MARKET PAY PRECERT"
},
{
"EndOfLineFlag": true,
"Text": "9 RUE DU 4 SEPTEMBRE"
},
{
"EndOfLineFlag": true,
"Text": "75002 PARIS"
},
{
"EndOfLineFlag": true,
"Text": "MASTERCARD"
},
{
"EndOfLineFlag": true,
"Text": "BEZSTYKOWY"
},
{
"EndOfLineFlag": true,
"Text": "XXXXXXXXXXXX1034"
},
{
"EndOfLineFlag": true,
"Text": "AID: A0000000041010"
},
{
"EndOfLineFlag": true,
"Text": "29-11-2025 00:56"
},
{
"EndOfLineFlag": true,
"Text": "NUMER REFERENCYJNY: 9"
},
{
"EndOfLineFlag": true,
"Text": "TRANSACTION"
},
{
"EndOfLineFlag": true,
"Text": "TYPE: ANULOWANIE"
},
{
"EndOfLineFlag": true,
"Text": "KWOTA:NOK 103,30"
},
{
"EndOfLineFlag": true,
"Text": "Zaakceptowana"
}
]
},
"RequiredSignatureFlag": false
},
{
"DocumentQualifier": "CustomerReceipt",
"OutputContent": {
"OutputFormat": "Text",
"OutputText": [
{
"EndOfLineFlag": true,
"Text": "POTWIERDZENIE DLA"
},
{
"EndOfLineFlag": true,
"Text": "UŻYTKOWNIKA KARTY"
},
{
"EndOfLineFlag": true,
"Text": "BRAK PARAGONU DO"
},
{
"EndOfLineFlag": true,
"Text": "ZAKUPU"
},
{
"EndOfLineFlag": true,
"Text": "MARKET PAY PRECERT"
},
{
"EndOfLineFlag": true,
"Text": "9 RUE DU 4 SEPTEMBRE"
},
{
"EndOfLineFlag": true,
"Text": "75002 PARIS"
},
{
"EndOfLineFlag": true,
"Text": "MASTERCARD"
},
{
"EndOfLineFlag": true,
"Text": "BEZSTYKOWY"
},
{
"EndOfLineFlag": true,
"Text": "XXXXXXXXXXXX1034"
},
{
"EndOfLineFlag": true,
"Text": "AID: A0000000041010"
},
{
"EndOfLineFlag": true,
"Text": "29-11-2025 00:56"
},
{
"EndOfLineFlag": true,
"Text": "NUMER REFERENCYJNY: 9"
},
{
"EndOfLineFlag": true,
"Text": "TRANSACTION"
},
{
"EndOfLineFlag": true,
"Text": "TYPE: ANULOWANIE"
},
{
"EndOfLineFlag": true,
"Text": "KWOTA:NOK 103,30"
},
{
"EndOfLineFlag": true,
"Text": "Zaakceptowana"
}
]
},
"RequiredSignatureFlag": false
}
],
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"Response": {
"Result": "Success"
},
"ReversedAmount": "11.99",
"SaleData": {
"OperatorID": "456",
"SaleReferenceID": "19",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
},
"SponsoredMerchant": {
"Address": "9 RUE DU 4 SEPTEMBRE\n75002 PARIS",
"CommonName": "MARKET PAY PRECERT",
"CountryCode": "NO",
"MerchantCategoryCode": "4411",
"RegisteredIdentifier": "198703093982001"
}
}
}
}
Review the full schema on the API specification page for required fields.
Reversal Response example XML
<SaleToPOIResponse>
<MessageHeader MessageCategory="Reversal" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="3913"/>
<ReversalResponse>
<PaymentReceipt DocumentQualifier="CashierReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">MERCHANT RECEIPT</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">Candy Shop</OutputText>
<OutputText EndOfLineFlag="true">75002 Paris</OutputText>
<OutputText EndOfLineFlag="true">REFERENCE: 2</OutputText>
<OutputText EndOfLineFlag="true">TID: 30010910</OutputText>
<OutputText EndOfLineFlag="true">DEVICE NAME: 1760317010</OutputText>
<OutputText EndOfLineFlag="true">MERCHANT: 000000001231344</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462</OutputText>
<OutputText EndOfLineFlag="true">AID: A0000000041010</OutputText>
<OutputText EndOfLineFlag="true">CARD TYPE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">CANCELLATION</OutputText>
<OutputText EndOfLineFlag="true">CONTACTLESS</OutputText>
<OutputText EndOfLineFlag="true">AMOUNT:€ 10,02</OutputText>
<OutputText EndOfLineFlag="true">Approved</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">PLEASE RETAIN FOR YOUR RECORDS</OutputText>
</OutputContent>
</PaymentReceipt>
<PaymentReceipt DocumentQualifier="CustomerReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">CARDHOLDER RECEIPT</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">Candy Shop</OutputText>
<OutputText EndOfLineFlag="true">75002 Paris</OutputText>
<OutputText EndOfLineFlag="true">REFERENCE: 2</OutputText>
<OutputText EndOfLineFlag="true">TID: 30010910</OutputText>
<OutputText EndOfLineFlag="true">DEVICE NAME: 1760317010</OutputText>
<OutputText EndOfLineFlag="true">MERCHANT: 000000001231344</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462</OutputText>
<OutputText EndOfLineFlag="true">AID: A0000000041010</OutputText>
<OutputText EndOfLineFlag="true">CARD TYPE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">CANCELLATION</OutputText>
<OutputText EndOfLineFlag="true">CONTACTLESS</OutputText>
<OutputText EndOfLineFlag="true">AMOUNT:€ 10,02</OutputText>
<OutputText EndOfLineFlag="true">Approved</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">PLEASE RETAIN FOR YOUR RECORDS</OutputText>
</OutputContent>
</PaymentReceipt>
<POIData>
<POITransactionID TimeStamp="2025-03-29T13:40:44.374" TransactionID="2"/>
</POIData>
<Response Result="Success"/>
</ReversalResponse>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
Reversal not found
A ReversalResponse.Response with an ErrorCondition of NotAllowed indicates that we were not able to find the transaction with the SaleID and ServiceID you specified.
When the transaction is not found, this means that either:
- The
POIID,SaleIDorServiceIDyou specified in the transaction status request are incorrect. Check that you provided thePOIID,SaleID, andServiceIDfrom the original transaction in theTransactionStatusRequest.MessageReference. - POI did not receive the original transaction request. The cause can be a dropped internet connection or an unexpected power loss. You can retry the original transaction.
The example response below indicates that this transaction was not found.
Reversal not found - Example
{
"MessageHeader": {
"MessageCategory": "Reversal",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POS01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "823"
},
"ReversalResponse": {
"PaymentReceipt": [],
"Response": {
"AdditionalResponse": "Transaction not found in database",
"ErrorCondition": "NotAllowed",
"Result": "Failure"
},
"SaleData": {
"OperatorID": "456",
"SaleReferenceID": "19",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
}
}
}
Review the full schema on the API specification page for required fields.
Error handling
If the POI application detects a parsing error while handling an incoming message, an EventNotification will be returned, as shown in the example below.
Event notification example
If parsing error will happen during POI application handles incoming message, EventNotification will be returned:
{
"MessageHeader": {
"MessageCategory": "EventNotification",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI01",
"ProtocolVersion": "3.0",
"SaleID": "POS001",
"ServiceID": "823"
},
"EventNotification": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"EventToNotify": "Reject"
}
}
Review the full schema on the API specification page for required fields.
6. Refund
A Refund Request is handled by sending a standard Payment Request, but with the specific transaction type set to "Refund". You will find below a limited information below, refer to the previous Payment Request section for more details.
A. Refund Request
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Payment.
Body
To successfully initiate a payment, the PaymentRequest body must contain data defining the sale context and the PaymentType set as Refund.
This table details the fields required within the PaymentRequest object.
| Field Name | Required |
Type |
Description |
|---|---|---|---|
PaymentTransaction.AmountsReq.RequestedAmount |
Yes |
Number |
Total monetary value of the transaction requested. |
PaymentTransaction.AmountsReq.Currency |
Yes |
String |
Currency of the requested amount (e.g., EUR, NOK...) in ISO 4217. |
SaleData.SaleTransactionID.TimeStamp |
Yes |
String |
Date and time of the request in UTC format. |
SaleData.SaleTransactionID.TransactionID |
Yes |
String |
The unique transaction reference ID from the POS. Currently limited to 35 characters as per ISO 20022 standard. |
PaymentData.PaymentType |
No |
Enum |
|
Payment Request example JSON
{
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Request",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "823"
},
"PaymentRequest": {
"PaymentData": {
"PaymentType": "Refund"
},
"PaymentTransaction": {
"AmountsReq": {
"Currency": "EUR",
"RequestedAmount": "11.99"
}
},
"SaleData": {
"OperatorID": "Cashier_01",
"OperatorLanguage": "EN",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
}
}
}
Review the full schema on the API specification page for required fields.
Payment Request example XML
<SaleToPOIResponse>
<MessageHeader MessageCategory="Payment" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="3930"/>
<PaymentResponse>
<MarketpayPaymentExtensions ApplicationID="A0000000041010" BankID="513640" PANSequenceNumber="01"/>
<PaymentReceipt DocumentQualifier="CashierReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">MERCHANT RECEIPT</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">MARKET PAY PRECERT</OutputText>
<OutputText EndOfLineFlag="true">9 RUE DU 4 SEPTEMBRE</OutputText>
<OutputText EndOfLineFlag="true">75002 PARIS</OutputText>
<OutputText EndOfLineFlag="true">REFERENCE: 19</OutputText>
<OutputText EndOfLineFlag="true">TID: 00022302</OutputText>
<OutputText EndOfLineFlag="true">DEVICE NAME: 1760317010</OutputText>
<OutputText EndOfLineFlag="true">MERCHANT: 000000001999065</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462 01</OutputText>
<OutputText EndOfLineFlag="true">CARD TYPE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">REFUND</OutputText>
<OutputText EndOfLineFlag="true">CONTACTLESS</OutputText>
<OutputText EndOfLineFlag="true">AMOUNT:€ 10,00</OutputText>
<OutputText EndOfLineFlag="true">Approved</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">TIME: 29-03-2025 14:00</OutputText>
<OutputText EndOfLineFlag="true">PLEASE SIGN BELOW</OutputText>
<OutputText EndOfLineFlag="true"> </OutputText>
<OutputText EndOfLineFlag="true"> </OutputText>
<OutputText EndOfLineFlag="true"> </OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">SIGNATURE REQUIRED</OutputText>
<OutputText EndOfLineFlag="true">PLEASE RETAIN FOR YOUR RECORDS</OutputText>
</OutputContent>
</PaymentReceipt>
<PaymentReceipt DocumentQualifier="CustomerReceipt" RequiredSignatureFlag="false">
<OutputContent OutputFormat="Text">
<OutputText EndOfLineFlag="true">RECU PORTEUR</OutputText>
<OutputText EndOfLineFlag="true">--------------------------------</OutputText>
<OutputText EndOfLineFlag="true">MARKET PAY PRECERT</OutputText>
<OutputText EndOfLineFlag="true">9 RUE DU 4 SEPTEMBRE</OutputText>
<OutputText EndOfLineFlag="true">75002 PARIS</OutputText>
<OutputText EndOfLineFlag="true">RÉFÉRENCE: 19</OutputText>
<OutputText EndOfLineFlag="true">TID: 00022302</OutputText>
<OutputText EndOfLineFlag="true">NOM DE L'APPAREIL: 1760317010</OutputText>
<OutputText EndOfLineFlag="true">MARCHAND: 000000001999065</OutputText>
<OutputText EndOfLineFlag="true">PAN: XXXXXXXXXXXX7462 01</OutputText>
<OutputText EndOfLineFlag="true">TYPE DE CARTE: MASTERCARD</OutputText>
<OutputText EndOfLineFlag="true">REMBOURSEMENT</OutputText>
<OutputText EndOfLineFlag="true">SANS CONTACT</OutputText>
<OutputText EndOfLineFlag="true">MONTANT:€ 10,00</OutputText>
<OutputText EndOfLineFlag="true">Approuvé</OutputText>
<OutputText EndOfLineFlag="true">213462</OutputText>
<OutputText EndOfLineFlag="true">TIME: 29-03-2025 14:00</OutputText>
<OutputText EndOfLineFlag="true">VEUILLEZ CONSERVER POUR VOS</OutputText>
<OutputText EndOfLineFlag="true">DOSSIERS</OutputText>
</OutputContent>
</PaymentReceipt>
<PaymentResult MerchantOverrideFlag="false" OnlineFlag="true" PaymentType="Refund">
<AmountsResp AuthorizedAmount="10.00" Currency="EUR"/>
<PaymentAcquirerData AcquirerID="40105611508" AcquirerPOIID="00022302" MerchantID="000000001999065">
<ApprovalCode>213462</ApprovalCode>
</PaymentAcquirerData>
<PaymentInstrumentData PaymentInstrumentType="Card">
<CardData EntryMode="Contactless" MaskedPAN="XXXXXXXXXXXX7462" PaymentBrand="MASTERCARD"/>
</PaymentInstrumentData>
</PaymentResult>
<POIData>
<POITransactionID TimeStamp="2025-03-29T14:00:46.391" TransactionID="19"/>
</POIData>
<Response Result="Success">
<AdditionalResponse>000</AdditionalResponse>
</Response>
<SaleData OperatorID="666">
<SaleTransactionID TimeStamp="2025-03-29T13:00:47Z" TransactionID="123"/>
</SaleData>
</PaymentResponse>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
7. Logout
You should trigger a Logout Request when a terminal session is complete and before the POS system closes, switches users, or initiates a long period of inactivity. During a session, you can do multiple operations (payments, loyalty check...). A session is usually opened for a full day, or for a cashier' shift.
The primary function of the Logout Request endpoint is session termination, which is mandatory to maintain system security and stability.
A. Logout request
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Logout.
Body
The LogoutRequest body is sent as an empty object ({}) to signal the intention to terminate the current session.
Logout request example JSON
This section contains the detailed JSON payload needed for the logout request:
{
"MessageHeader": {
"MessageClass": "Service",
"MessageCategory": "Logout",
"MessageType": "Request",
"ServiceID": "825",
"SaleID": "POS_01",
"POIID": "POI_01"
},
"LogoutRequest": {}
}
Review the full schema on the API specification page for required fields.
Logout request example XML
This section contains the detailed XML payload needed for the logout request:
<?xml version="1.0" encoding="UTF-8"?> <SaleToPOIRequest xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <MessageHeader MessageClass="Service" MessageCategory="Logout" MessageType="Request" ServiceID="9346" SaleID="ECR001" POIID="456"></MessageHeader> <LogoutRequest></LogoutRequest> </SaleToPOIRequest>
Review the full schema on the API specification page for required fields.
B. Logout Response
The POI returns a final response confirming the session is closed.
Expected Result: A response with
Response.Result: "Success".Failure: If a parsing error occurs, an
EventNotificationwithEventToNotify: "Reject"is returned.
The
MessageHeaderyou receive in the response echoes the values you provided in the request. The only exception is theMessageType, which is Response.
Body
The Logout Response body confirms the successful or failed termination of the session by containing a mandatory Response object which specifies the final Result (e.g., "Success" or "Failure").
Logout response example JSON
<SaleToPOIResponse>
<LogoutResponse>
<Response Result="Success"/>
</LogoutResponse>
<MessageHeader MessageCategory="Logout" MessageClass="Service" MessageType="Response" POIID="456" ProtocolVersion="3.1" SaleID="ECR001" ServiceID="9346"/>
</SaleToPOIResponse>
Review the full schema on the API specification page for required fields.
Logout response example JSON
{
"MessageHeader": {
"MessageCategory": "Logout",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "825"
},
"LogoutResponse": {
"Response": {
"Result": "Success"
}
}
}
Review the full schema on the API specification page for required fields.
Event notification
An Event Notification in response to a Logout Request signals that the Payment Terminal (POI) failed to process the request due to a fundamental message error, rather than a normal business failure.
The most common cause is a parsing error (e.g., incorrect JSON/XML structure, missing mandatory field in the header, or corrupted encoding). This typically results in an EventToNotify value of "Reject". The POI is unable to validate the request against its schema, so it returns the EventNotification to notify the POS of the structural error.
Event notification example
If parsing error will happen during POI application handles incoming message, EventNotification will be returned:
{
"MessageHeader": {
"MessageCategory": "EventNotification",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "823"
},
"EventNotification": {
"TimeStamp": "2025-04-02T15:48:47.596+02:00",
"EventToNotify": "Reject"
}
}
Review the full schema on the API specification page for required fields.