🇧🇪 Bancontact - Belgium Acquiring
Bancontact is a Belgian debit card scheme, with no no-chargeback risk and the most popular payment method in Belgium. Used by 94% of Belgians, with over 18 million cards in circulation and connected to 17 banks, Bancontact processed 382 million online payments in 2024 (+19,7% compared to 2023, with 90% of mobile transactions), making it an essential option for merchants and PSPs targeting the Belgian market.
To pay with Bancontact, consumers can enter their card details, scan a QRcode, or be redirected to their home bank or the Payconiq by Bancontact app.
Payment Method Properties
Category | Card |
Markets | BE |
One-time payments | Yes |
Recurring payments | Yes |
Processing currencies | EUR |
Consumer currencies | EUR |
Settlement currencies | EUR |
Minimum payment amount | EUR 0.01 |
Maximum payment amount | EUR 1,500.00 (via Mobile Authentication Flows) No limit with 3DS Authentication |
Refund (non-native via SEPA) | - Full - Partial - Multiple Partial - Over Refund |
Refund validity | 365 days |
Captures | Auto |
Chargeback Risk | No |
Sandbox Availability | Yes, PPRO-hosted |
Session Timeout | 1 hour |
Make a Bancontact payment
Bancontact is available through our standardized REDIRECT
, SCAN_CODE
and APP_INTENT
flows. Enabling you to offer a seamless desktop or in-store QR code to mobile handoff, as well as a smooth app-to-app experience.
To create a Bancontact payment, you'll need to provide the following data at minimum when calling our /v1/payment-charges API:
Data Field | Description |
---|---|
paymentMethod | BANCONTACT |
amount.value | The amount to be paid in the smallest units of the currency used. |
amount.currency | EUR |
consumer.name | Full name of the consumer. |
consumer.country | The country where the consumer is shopping. |
paymentDescriptor | Description of the payment. |
authenticationSettings: REDIRECT settings.returnUrl | Add the URL where the consumer should be redirected after they complete the payment. Required for the REDIRECT flow. |
Request
POST /v1/payment-charges
{
"paymentMethod": "BANCONTACT",
"merchantPaymentChargeReference": "{{$guid}}",
"paymentDescriptor": "Bancontact Sandbox",
"webhooksUrl":"https://webhook_url",
"autoCapture": true,
"amount": {
"value": 123,
"currency": "EUR"
},
"authenticationSettings": [
{
"type": "REDIRECT",
"settings": {
"returnUrl": "https://www.ppro.com/"
}
}
],
"consumer": {
"name": "Ernestine Bartoletti",
"email": "[email protected]",
"country": "BE",
"client": {
"ip": "227.149.145.184"
},
"taxIdentification": "39112171883",
"billingAddress": {
"firstName": "Ernestine",
"lastName": "Bartoletti",
"street": "Rue de Fierlant 67",
"postalCode": "1190",
"city": "Bruxelles",
"region": "Bruxelles",
"country": "BE"
}
},
"order": {
"orderItems": [
{
"sku": "LS123456789",
"category": "bicycle",
"name": "White T-Shirt",
"quantity": 1,
"amount": 100
}
],
"shippingAddress": {
"firstName": "Naldo",
"lastName": "Ro",
"phoneNumber": "01522113356",
"street": "Rue de Fierlant 67",
"postalCode": "1190",
"city": "Bruxelles",
"region": "Bruxelles",
"country": "BE"
}
}
}
Response
You'll receive our standard payment charge response (see potential responses in the API Reference) with the available authentication methods.
{
"id": "charge_JpHQdyPNIghVel5TuVXVf",
"paymentMethod": "BANCONTACT",
"paymentMedium": "ECOMMERCE",
"scheduleType": "UNSCHEDULED",
"instrumentId": "instr_Zkn3z8DX9n6vD49nrLGBC",
"currency": "EUR",
"country": "BE",
"paymentDescriptor": "Bancontact Sandbox",
"status": "AUTHENTICATION_PENDING",
"consumer": {
"name": "Ernestine Bartoletti",
"email": "[email protected]",
"country": "BE",
"client": {
"ip": "227.149.145.184"
},
"taxIdentification": "39112171883",
"billingAddress": {
"firstName": "Ernestine",
"lastName": "Bartoletti",
"street": "Rue de Fierlant 67",
"postalCode": "1190",
"city": "Bruxelles",
"region": "Bruxelles",
"country": "BE"
}
},
"order": {
"orderItems": [
{
"sku": "LS123456789",
"category": "bicycle",
"name": "White T-Shirt",
"quantity": 1,
"amount": 100
}
],
"shippingAddress": {
"firstName": "Naldo",
"lastName": "Ro",
"phoneNumber": "01522113356",
"street": "Rue de Fierlant 67",
"postalCode": "1190",
"city": "Bruxelles",
"region": "Bruxelles",
"country": "BE"
},
"industryData": []
},
"authenticationMethods": [
{
"details": {
"mobileIntentUri": "bepgenapp://DoTx?TransId=1BANCONTACT.CARD-INTEGRATIONS.NON-PROD.PPRO.COM/BEP/LC/GM83TKXPUX55ZRKV8/1PTZIBX738PNUVUKT4EK1NSMP9P8UYGKM$AUWAQSHVF4X6QJAFRJ5NUMLS"
},
"type": "APP_INTENT"
},
{
"details": {
"codeType": "QR",
"codePayload": "BEP://1BANCONTACT.CARD-INTEGRATIONS.NON-PROD.PPRO.COM/BEP/LC/GM83TKXPUX55ZRKV8/1PTZIBX738PNUVUKT4EK1NSMP9P8UYGKM$AUWAQSHVF4X6QJAFRJ5NUMLS"
},
"type": "SCAN_CODE"
},
{
"details": {
"requestUrl": "https://authman.qa.lp-pl.ppro.com/v0/pages/?redirection_token=eyJhbGciOiJIUzUxMiJ9.eyJzZXNzaW9uIjp7InIiOiJjaGFyZ2VfSnBIUWR5UE5JZ2hWZWw1VHVWWFZmIn19.kooJ4gsHmRffZwiXKS75xTxhg2f2_0hQokojtG8A4mnidfsmQ-dPsPk5EDrw2X6YFlva69cGyzA1Yr-pwa5gPw",
"requestMethod": "GET"
},
"type": "REDIRECT"
}
],
"authorizations": [
{
"id": "authz_f7TKEgB8cse31haYCX4Pf",
"amount": 123,
"status": "AUTHENTICATION_PENDING",
"merchantPaymentChargeReference": "c855ca53-30d9-43f0-bbed-a0baac7e9601",
"createdAt": "2025-05-26T20:55:29.863Z",
"updatedAt": "2025-05-26T20:55:29.863Z"
}
],
"captures": [],
"refunds": [],
"voids": [],
"createdAt": "2025-05-26T20:55:29.595Z",
"updatedAt": "2025-05-26T20:55:29.863Z",
"_links": {
"authorizations": {
"href": "/v1/payment-charges/charge_JpHQdyPNIghVel5TuVXVf/authorizations"
},
"captures": {
"href": "/v1/payment-charges/charge_JpHQdyPNIghVel5TuVXVf/captures"
},
"refunds": {
"href": "/v1/payment-charges/charge_JpHQdyPNIghVel5TuVXVf/refunds"
},
"voids": {
"href": "/v1/payment-charges/charge_JpHQdyPNIghVel5TuVXVf/voids"
}
}
}
Auto Capture
Bancontact currently does not support two-step payments (Authorization + Capture) as separate events. As a result:
- All charges must be created with "autoCapture":true, meaning PPRO will automatically perform the capture of all charges
- Void endpoints are not yet supported, meaning transactions cannot be canceled before settlement.
Test Card Numbers
PAN | Expiry Date | Result |
---|---|---|
60600599999899023 | 01/2035 | Authentication success (frictionless) |
60600599999899049 | 01/2035 | Challenge required (OTP) |
60600599999899064 | 01/2035 | Challenge required (OOB) |
60600599999899080 | 01/2035 | Authentication denied |
Pick the desired authentication method
REDIRECT
- Redirect your consumer to the returned
$.authenticationMethods[?(@.type == "REDIRECT")].details.requestUrl
.
For example, with the value ofhttps://redirection-target.ppro.com/
using the returned$.authenticationMethods[?(@.type == "REDIRECT")].details.requestMethod
HTTP method. - The consumer will finalize the payment process on the redirected page.
The PPRO-hosted payment page supports four languages: English, Dutch, French, and German. If no preferred language is specified, the default is French.
If the consumer is accessing the page via a mobile or small-sized device, they can chose between clicking the "Pay with your Bancontact app" to be redirected to their preferred payment app, or entering their card details in the PAN input form.
If the consumer is accessing the page via a medium-sized or large desktop device, they can chose between scanning a QRcode using their preferred payment app, or entering their card details in the PAN input form.
The display of these options is determined by the detected screen size. For transactions above €1,500, mobile options are always hidden. The payment page adapts to four screen size categories:
- Mobile (up to 599px wide): vertical layout with the payment app link and PAN input form
- Small-sized devices (600px to 767px): horizontal layout with the payment app link and PAN input form
- Medium-sized devices (768px to 1199px): horizontal layout showing both mobile options (payment app link and QR code) and the PAN input form
- Large or desktop devices (1200px and above): horizontal layout with the QR code and PAN input form

Bancontact HPP for Desktop

Bancontact HPP for Mobile
SCAN_CODE
- Render the code using one of the techniques available.
- The consumer will scan the code to complete the payment.
APP_INTENT
- Use the intent system on Android or a similar mechanism on iOS to trigger the URI.
- The consumer will be taken to the native app to complete the payment.
Handling the payment result
REDIRECT
- Once the consumer has confirmed the payment, they are redirected to the
returnUrl
provided in the initial payment charge creation request. - After the consumer is redirected back to your site, check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the
Status
that you received to display the payment outcome to the consumer. - Webhooks are also sent to inform you of the payment outcome. If the shopper closes the browser and doesn't return to your website, you can rely on webhooks to receive the payment result.
SCAN_CODE
- You'll be notified of the payment outcome via Webhook.
- You can check the payment status at any time by making a GET /v1/payment-charges/{paymentChargeId}.
- Use the
Status
that you received to display the payment outcome to the consumer.
APP_INTENT
- Once the consumer has confirmed the payment, they are returned to your app using the
mobileIntentUri
provided in the initial payment charge creation request. - After the consumer is redirected back to your app, check the payment status by making a GET /v1/payment-charges/{paymentChargeId}. Use the
Status
that you received to display the payment outcome to the consumer. - Webhooks are also sent to inform you of the payment outcome.
Updated 2 days ago