Cheques remain a common payment method in France, and our API supports their processing through a synchronous exchange that relies on local cheque reader data provided by the POS.
Reach our customer support team if you are interested in cheque processing to enable this service extension.
1. Workflow
The Cheque Payment Flow is a synchronous exchange where the verification and final result are handled by the terminal.
Request: The POS sends a Payment Request request containing the cheque details (Cheque Number and RLMC key).
Processing: The POI (terminal) process cheque transaction by communicating with backend server to reach partners (Verifiance, etc.) while the POS waits.
Final Result: The POI returns Payment Response with the additional information related to Cheques.
-
POS Decision: based on additional information POS should take their final decision:
Accept the cheque: POS register the transaction
Decline the cheque: POS triggers a Cheques Reversal
2. Cheques Request
A Cheques Request is processed as a standard payment request, to which we have to add extra "PaymentData" element in the Request Body
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Payment.
Body
To successfully initiate a PaymentRequest for Cheques, the body must contain the standard data expected for a PaymentRequest. In addition, you have to fulfill dedicated object: PaymentData.PaymentInstrumentData
| Component Object | Required | Type | Description |
|---|---|---|---|
CheckData.CheckCardNumber |
No | String | RLMC key, which can be read on Cheque |
CheckData.TrackData.TrackValue |
Yes | String | Raw cheque number to convert into a magnetic stripe track data format (e.g., from |
PaymentInstrumentType.IdentificationType |
Yes | String | static data to set to "Check" |
Example
ChequePayment request example
Start a Cheque payment on terminal, requires providing a Track and RLMC data to perform transaction
{
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Request",
"POIID": "POI_01",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "102"
},
"PaymentRequest": {
"PaymentData": {
"PaymentInstrumentData": [
{
"CheckData": [
{
"TrackData": [
{
"TrackValue": "D0015468D800000000909F000000000000B"
}
]
}
],
"PaymentInstrumentType": "Check"
}
]
},
"PaymentTransaction": {
"AmountsReq": {
"Currency": "EUR",
"RequestedAmount": 10.00
}
},
"SaleData": {
"OperatorID": "Cashier_01",
"SaleReferenceID": "8",
"SaleTransactionID": {
"TimeStamp": "2024-08-09T07:38:40Z",
"TransactionID": "123"
}
}
}
}
Review the full schema on the API specification page for required fields.
How to transform Track 2 Data
| Component | Raw Value | Transformed Value | Purpose |
|---|---|---|---|
| Start Sentinel | (Absent) | D |
The character 'D' (or sometimes ';') marks the beginning of the Track 2 data. |
| Primary Account Data | 0015468800000000909 |
0015468800000000909 |
This sequence is typically the PAN (Primary Account Number) or Check Card Number. |
| Field Separator (Delimiter) | (Absent) | D |
The character 'D' separates the card number from the expiration date and service code block. |
| Expiration/Service Code | (Partial) | 80000000 |
These digits usually encode the Expiry Date and the Service Code (which defines allowed usage). |
| Padding/End of Data | 0000000000000 |
F000000000000 |
The 'F' or '0's are used as padding or as the End Sentinel to fill the remaining length of the track. |
| End Sentinel | (Absent) | B |
The character 'B' (or sometimes '?') marks the end of the data string on the track. |
3. Cheques Response
The MessageHeader you receive in the response echoes the values you provided in the request. The only exception is the MessageType, which is Response.
Body
As part of the response, we receive standard information related to a payment and additional data related to cheque payment method used. Refer to the Standard POS integration flow to manage it.
For cheques, we receive response from server in field MarketpayPaymentExtensions.issuerOption. Raw data shared and is Base64 encoded.
ChequePayment Response example
{
"MessageHeader": {
"MessageCategory": "Payment",
"MessageClass": "Service",
"MessageType": "Response",
"POIID": "PayOnSite",
"ProtocolVersion": "3.1",
"SaleID": "POS_01",
"ServiceID": "20"
},
"PaymentResponse": {
"PaymentResult": {
"AmountsResp": {
"AuthorizedAmount": "10.00",
"Currency": "EUR"
},
"PaymentAcquirerData": {
"AcquirerPOIID": "cheque",
"MerchantID": "Test Cheque"
},
"PaymentInstrumentData": {
"CheckData": [
{
"TrackData": [
{
"TrackValue": "D0015455D800000000909F************B"
}
]
}
],
"PaymentInstrumentType": "Check"
}
},
"POIData": {
"POITransactionID": {
"TimeStamp": "2025-10-14T11:39:10.000",
"TransactionID": "0"
}
},
"Response": {
"AdditionalResponse": "Refused operation by server Currency not managed",
"Result": "Failure"
},
"SaleData": {
"SaleTransactionID": {
"TimeStamp": "2025-10-14T11:39:10.000",
"TransactionID": "0"
}
}
}
}
Review the full schema on the API specification page for required fields.
issuerOption decoding
Example of a Base64 encoded response
issuerOption example
Base64 encoded: IyMjIyA0LiBOZXB0aW5nIFN1Y2Nlc3MgUGF5bWVudCBSZXNwb25zZToKCmBgYApTSUdOQVRVUkVfUkVRVUlSRUQgPSAwCkNVUlJFTkNZX0ZSQUNUSU9OID0gMgpFWFRFTkRFRF9SRVNVTFRfVEVYVCA9ICIiCk1BU0tFRF9BQ0NPVU5UX0lERU5USUZJRVIgPSAiRDAwMTU0NTVEODAwMDAwMDAwOTA5RioqKioqKioqKioqKkIiCkxPQ0FMX1RJTUVTVEFNUCA9IDIwMjUtMTAtMTRUMTE6Mzk6MTAuMDAwCk1FU1NBR0VfSUQgPSAiMCIKTUVTU0FHRV9UWVBFID0gIkRlYml0IgpNRVNTQUdFX05BTUUgPSAiUG9zUmVzcG9uc2UiCkVYVEVOREVEX1JFU1VMVCA9ICIiCk1FUkNIQU5UX1RSU19JRCA9ICIxIgpBUFBMSUNBVElPTl9OQU1FID0gImNoZXF1ZSIKT0ZGTElORV9UUlNfQ09VTlQgPSAiMCIKR0xPQkFMX1NUQVRVUyA9ICIxIgpTVEFOID0gMQpDVVJSRU5DWV9DT0RFID0gOTc4ClRFU1RfSU5ESUNBVE9SID0gMApPRkZMSU5FX1RSU19CTE9DS0VEID0gMApDVVJSRU5DWV9BTFBIQSA9IEVVUgpNRVJDSEFOVF9MQUJFTCA9IFRlc3QgQ2hlcXVlCkVOVFJZX01PREUgPSAiMTYiClNDSEVNRSA9IENIRVFVRQpQT1NfRklOQUxfQU1PVU5UID0gMTAwMApDSFFfQ1BUMSA9ICIwMSIKQ0hRX0NQVDIgPSAiMDMiCkNIUV9DUFQzID0gIjA1IgpDSFFfQkFOSz0gImJhbmtOYW1lIgpDSFFfQ09MT1IgPSAiQkxBTkMi
Decoded:
#### 4. Nepting Success Payment Response: ``` SIGNATURE_REQUIRED = 0 CURRENCY_FRACTION = 2 EXTENDED_RESULT_TEXT = "" MASKED_ACCOUNT_IDENTIFIER = "D0015455D800000000909F************B" LOCAL_TIMESTAMP = 2025-10-14T11:39:10.000 MESSAGE_ID = "0" MESSAGE_TYPE = "Debit" MESSAGE_NAME = "PosResponse" EXTENDED_RESULT = "" MERCHANT_TRS_ID = "1" APPLICATION_NAME = "cheque" OFFLINE_TRS_COUNT = "0" GLOBAL_STATUS = "1" STAN = 1 CURRENCY_CODE = 978 TEST_INDICATOR = 0 OFFLINE_TRS_BLOCKED = 0 CURRENCY_ALPHA = EUR MERCHANT_LABEL = Test Cheque ENTRY_MODE = "16" SCHEME = CHEQUE POS_FINAL_AMOUNT = 1000 CHQ_CPT1 = "01" CHQ_CPT2 = "03" CHQ_CPT3 = "05" CHQ_BANK= "bankName" CHQ_COLOR = "BLANC"
In the response, you will find key information to accept or decline the cheque at POS.
| Component | Purpose |
|---|---|
| CHQ_CPT1 | Cheque Counter 1 |
| CHQ_CPT2 | Cheque Counter 2 |
| CHQ_CPT3 | Cheque Counter 3 |
| CHQ_BANK | Bank Name of the cheque returned by server |
| CHQ_COLOC | Color code |
| CHQ_CPT2 | This sequence is typically the PAN (Primary Account Number) or Check Card Number. |
How to interpret received response
Source: Verifiance
4. Reversal
A Cheques Reversal is processed as a standard payment reversal, to which we have to add extra "PaymentData" element in the Request Body
Header
The standard SaleToPOIRequest.MessageHeader object, with MessageClass set to Service and MessageCategory set to Reversal.
Body
To successfully initiate a PaymentRequest for Cheques, the body must contain the standard data expected for a PaymentRequest. In addition, you have to fulfill dedicated object: PaymentData.PaymentInstrumentData
Cheque 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",
"MarketpayPaymentExtensions": {
"CheckData": {
"CheckCardNumber": [
"09"
],
"TrackData": [
{
"TrackValue": "D0015468D800000000909F000000000000B"
}
]
},
"PaymentInstrumentType": "Check"
},
"OriginalPOITransaction": {
"POITransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
},
"ReversalReason": "MerchantCancel",
"ReversedAmount": "11.99",
"SaleData": {
"OperatorID": "Cashier_01",
"SaleTransactionID": {
"TimeStamp": "2025-11-28T14:12:59.6+01:00",
"TransactionID": "9991"
}
}
}
}
Review the full schema on the API specification page for required fields.