QR Codes & Payment Buttons
1. Why Choose Digiteal QR Codes Over Standard EPC QR Codes?
While standard European Payments Council (EPC) QR codes are a recognized format, they come with significant limitations. Here is why Digiteal's dynamic QR codes are the better choice for your integration:
- Universal Bank Support: EPC QR codes don't work with every banking app. Digiteal QR codes are universally supported across all EU banks, ensuring a frictionless experience for all customers.
- Automated Webhook Notifications: Because a standard EPC QR code does not create a dedicated payment session in our system, you cannot receive automated webhooks when a payment is completed. This forces you to track payments manually via your bank statements. Digiteal QR codes are fully integrated into our platform and trigger instant webhook notifications, enabling you to automate order fulfillment effortlessly.
- Dynamic Payment Status: EPC QR codes are completely static. Digiteal's QR codes are dynamic—if a payment has already been processed, the checkout page will intelligently update its appearance to reflect the fulfilled status, preventing users from accidentally paying twice.
2. QR Codes & Visual Formats
Depending on your architecture, you have two ways to present a QR code to your users:
Method A: Use our payments links API and generate your own QR code
For a full explanation on payment links, check our guide here
If you already have a preferred QR code generation library in your frontend or backend, you do not have to use our image generation endpoints.
You can simply generate a standard payment link using our Payment Links API (using the POST /api/v1/payment-request endpoint). Once you receive the payment-web-url in the response, just pass that string into your own QR generator to create the image yourself.
Method B: Digiteal's QR code API
Endpoint: GET api/v1/image-request/slip-image-anonymous
Key Query Parameters
You append these directly to the endpoint URL:
| Parameter | Type | Required | Description |
|---|---|---|---|
requesterVAT | string | Yes | Belgian VAT number. |
billerName | string | Yes | The name of the credtor. |
amount | integer | No | The fixed amount to pay in cents. Leave empty/omitted to let the user specify the amount. |
multiple | boolean | No | Set to true to allow the link to be used for multiple payments. Default is false (single-use). |
paymentInternalId | string | No | The internal identifier of the payment as known by you for webhook reconciliation. |
iban | string | No | The IBAN of the creditor (defaults to the requester's default IBAN if omitted). |
remittanceInfo | string | Conditional | An unstructured string used as communication in the payment. Cannot be used alongside creditorReference. Leave both empty to enable User-Defined Communication . |
creditorReference | string | Condtional | A structured communication/reference for the payment (e.g., Belgian Structured Communication +++123/4567/89012+++). Cannot be used alongside remittanceInfo. Leave both empty to enable User-Defined Communication. |
And then finally use the format query parameter to select the appropriate visual representation:
| Format | Description |
|---|---|
QR_URL | The standard, universally supported Digiteal QR code. Users scan this with their smartphone camera to be directed to the payment page. |
QR_TEXT | Returns a raw text-based representation of the payment data. This is extremely handy for SMS integration or other character-limited text channels where an image cannot be displayed. |
BANNER6 | Returns a specific, styled visual banner containing the QR code. Ideal for appending to the bottom of digital PDF invoices. |
Example Request:
https://test.digiteal.eu/api/v1/image-request/slip-image-anonymous?billerName=AcmeInc&billerVAT=BE0863311183&iban=BE76173688393895&amount=2&format=QR_URL&size=400&directPayment=false&multiple=false3. Generate a Payment Button
There is no easier way to integrate payments into emails, invoices, or simple web pages than through a payment button. A user can start a transaction by simply clicking it. Implementing this solution only requires basic HTML.
Endpoints:
- Image Source:
GET /api/v1/payment-request/pay-button - Click Action:
GET /api/v1/payment-request/pay-button/execute
Key Query Parameters
You append these directly to the endpoint URL:
| Parameter | Type | Required | Description |
|---|---|---|---|
requesterVAT | string | Conditional | Belgian VAT number. Required if requesterIdentificationNumber is not provided. . |
requesterIdentificationNumber . | string | Conditional | Identification number of the creditor. Required if requesterVAT is not provided. For the format of this parameter, see here |
amountInCents | integer | No | The fixed amount to pay in cents. Leave empty/omitted to let the user specify the amount. |
minAmountInCents | integer | No | The minimum amount to pay. Cannot be used if amountInCents is provided. |
maxAmountInCents | integer | No | The maximum amount to pay. Cannot be used if amountInCents is provided. |
suggestedAmountInCents | integer | No | The suggested amount to pay. Cannot be used if amountInCents is provided. |
paymentMethod | string | No | Restricts checkout to a single method (e.g., BANCONTACT). |
allowedPaymentMethods | string | No | A comma-separated list of allowed methods (e.g., VISA,MASTERCARD,BANCONTACT). |
qrCode | boolean | No | Set to true (along with BANCONTACT) to show a QR code directly for in-person collections. |
multiple | boolean | No | Set to true to allow the link to be used for multiple payments. Default is false (single-use). |
emailOptin | boolean | No | Set to true to display a GDPR-compliant prompt asking for the user's email address after payment completion (Requires the CUSTOMER_OPTIN webhook). |
paymentInternalId | string | No | The internal identifier of the payment as known by you for webhook reconciliation. |
iban | string | No | The IBAN of the creditor (defaults to the requester's default IBAN if omitted). |
remittanceInfo | string | No | An unstructured string used as communication in the payment. Cannot be used alongside creditorReference. Leave both empty to enable User-Defined Communication . |
creditorReference | string | No | A structured communication/reference for the payment (e.g., Belgian Structured Communication +++123/4567/89012+++). Cannot be used alongside remittanceInfo. Leave both empty to enable User-Defined Communication. |
confirmationURL | string | Yes | Redirect URL for successful payments. |
errorURL | string | Yes | Redirect URL for failed payments. |
How the Dynamic Status Works
The real magic of the Digiteal payment button lies in the <img> tag. The src URL of the image points directly to our API. When the user opens their email or loads your web page, our server checks the real-time status of that specific transaction.
- Pending: We serve an image that says "PAY".
- Fulfilled: We serve an image that says "PAID" (or the localized equivalent).
This intelligently updates its appearance, preventing users from accidentally paying twice.
HTML Example for a Website
To embed a button on a website, use the execute endpoint for the link (href), and the standard pay-button endpoint for the image (src).
<a href="https://app.digiteal.eu/api/v1/payment-request/pay-button/execute?requesterVAT=BE0406729809&amountInCents=4000&iban=BE72000000001616&language=en&remittanceInfo=Urgency%20Fund" style="outline: none;">
<img src="https://app.digiteal.eu/api/v1/payment-request/pay-button?requesterVAT=BE0406729809&amountInCents=4000&iban=BE72000000001616&language=en&remittanceInfo=Urgency%20Fund">
</a>
HTML Example for an Email
Emails require slightly more care. Many email clients (like Outlook or Gmail) disable external images by default for security reasons. It is critical to provide fallback CSS styling to ensure the button still looks clickable even if the image hasn't loaded.
<style>
.payButtonLink {
outline: none;
line-height: 42px;
}
.payButtonImage {
font-size: 17px;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
background-color: #0cb4bf;
color: #ffffff;
height: 38px;
min-width: 120px;
text-align: center;
border-radius: 5px
}
</style>
<a class="payButtonLink" target="_blank" href="https://app.digiteal.eu/api/v1/payment-request/pay-button/execute?...">
<img class="payButtonImage" alt="PAY" src="https://app.digiteal.eu/api/v1/payment-request/pay-button?..."/>
</a>
How the fallback works
.payButtonLink: Vertically aligns the alternative text.
.payButtonImage: Applies a background color, rounded borders, and font styling so the rawalttext visually resembles a button.
Always include an appropriate, localized alt text (e.g., PAY, BETAAL, PAYER). One minor drawback of images being blocked by the email client is that the dynamic "PAID" status image cannot load until the user "allows images." However, clicking the link will always take them to the live payment page where the current status is explicitly shown.
Updated 5 days ago
