Use QR code payments with MONEI Pay
Accept in-store contactless payments and support all the most popular payment methods with QR codes using MONEI Pay.
Getting started with MONEI Pay App
MONEI Pay provides the easiest way to accept payments in-store using a dedicated app.
Login into pay.monei.com or download the MONEI Pay app using your MONEI Dashboard credentials to start creating QR payment codes.
Creating QR Payments Programmatically
This section covers how to generate QR payment codes using the MONEI API for custom integrations.


Before You Begin
- You'll need a MONEI account and your API keys (test or live). Find them in your MONEI Dashboard.
- Use your test mode keys for integration testing.
- Ensure relevant payment methods are enabled in your account settings.
- You can monitor test payments in your MONEI Dashboard → Payments (ensure Test Mode is active).
Integration Steps
1. Create Payment (Server-side)
Create a Payment on your server with an amount and currency.
- cURL
- Node.js
- PHP
- Python
curl --request POST 'https://api.monei.com/v1/payments' \
--header 'Authorization: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 110,
"currency": "EUR",
"orderId": "14379133960355",
"callbackUrl": "https://example.com/checkout/callback"
}'
(Replace YOUR_API_KEY
with your actual MONEI API key)
import {Monei} from '@monei-js/node-sdk';
// Replace YOUR_API_KEY with your actual MONEI API key
const monei = new Monei('YOUR_API_KEY');
const payment = await monei.payments.create({
amount: 110,
currency: 'EUR',
orderId: '14379133960355',
callbackUrl: 'https://example.com/checkout/callback'
});
// You will need the paymentId from the response to generate the QR code URL
const paymentId = payment.id;
// Construct the QR code URL
const qrCodeUrl = `https://secure.monei.com/payments/${paymentId}/qr`;
<?php
require_once 'vendor/autoload.php';
use Monei\Model\CreatePaymentRequest;
use Monei\MoneiClient;
// Replace YOUR_API_KEY with your actual MONEI API key
$monei = new MoneiClient('YOUR_API_KEY');
$payment = $monei->payments->create(
new CreatePaymentRequest([
'amount' => 110,
'currency' => 'EUR',
'order_id' => '14379133960355',
'callback_url' => 'https://example.com/checkout/callback'
])
);
// You will need the paymentId from the response to generate the QR code URL
$paymentId = $payment->getId();
// Construct the QR code URL
$qrCodeUrl = "https://secure.monei.com/payments/{$paymentId}/qr";
?>
import Monei
from Monei import CreatePaymentRequest
# Replace YOUR_API_KEY with your actual MONEI API key
monei = Monei.MoneiClient(api_key="YOUR_API_KEY")
payment = monei.payments.create(
CreatePaymentRequest(
amount=110,
currency="EUR",
order_id="14379133960355",
callback_url="https://example.com/checkout/callback"
)
)
# You will need the paymentId from the response to generate the QR code URL
payment_id = payment.id
# Construct the QR code URL
qr_code_url = f"https://secure.monei.com/payments/{payment_id}/qr"
Key Parameters:
- amount
positive integer
: Amount in the smallest currency unit (e.g., 110 for €1.10). - currency
string
: Three-letter ISO currency code (e.g.,EUR
). - orderId
string
: Your unique order identifier. - callbackUrl
string
: Your server endpoint URL for asynchronous webhook notifications.
Check all available request parameters.
The API response includes the payment.id
, which you'll use in the next step.
2. Display QR Code & Handle Interaction (Client-side/Physical)
Use the payment.id
from Step 1 to present the QR code to your customer.
Option 1: Embed QR Image Directly
Construct the QR code image URL: https://secure.monei.com/payments/{payment_id}/qr
You can render it directly on a webpage or display:
<img
src="https://secure.monei.com/payments/{{payment_id}}/qr?format=svg&size=300"
alt="Scan to Pay"
width="300"
height="300"
/>
- Replace
{{payment_id}}
with the actual ID. - Use
?format=svg
for SVG (default ispng
). - Use
?size=400
to specify size (min: 100, max: 1000, default: 300).
Option 2: Redirect to Hosted Page with QR
The Payment object returned in Step 1 also contains payment.nextAction.redirectUrl
. Append ?qr=1
to this URL to get a link to a MONEI-hosted page displaying the QR code.
Example: https://secure.monei.com/payments/{payment_id}?qr=1
Customer Interaction:
The customer scans the QR code with their phone and completes the payment on the MONEI payment page using their chosen method.
The QR code payment link is valid for 5 minutes. After that, you must create a new payment request.
3. Process Webhook Notification (Server-side)
MONEI sends the final, authoritative payment status via an asynchronous HTTP POST request to the callbackUrl
you provided in Step 1. The request body contains the full Payment object in JSON format.
This webhook ensures you get the definitive status even if the customer closes their browser or loses connection after scanning.
Crucially, you must:
- Verify the
MONEI-Signature
header included in the request. This confirms the webhook genuinely came from MONEI. See the Verify Signatures guide for implementation details. - Return a
200 OK
HTTP status code immediately upon receiving the webhook to acknowledge receipt. Any other status code tells MONEI the notification failed.
If MONEI doesn't receive a 200 OK
, it will retry sending the webhook.
Once the signature is verified, inspect the status
field in the Payment object to confirm payment success (SUCCEEDED
) and fulfill the order, or handle failures.
Customization
You can customize the appearance of the QR code (color, icon) and the hosted payment page in your MONEI Dashboard → Settings → Branding.