API for your own software
Java, PHP, Node.js, Python or any site with its own backend (also behind nginx). One call: POST /api/v1/qr with the article and the price.
Show a SEPA QR code for an article and a price. Your customer scans it with their banking app and pays by bank transfer, straight into the seller's GloryPay account.
Pick what fits your shop. Every option creates the same SEPA QR code, and the money goes straight into the seller's GloryPay account.
The GloryPay QR code follows the European EPC standard (SEPA credit transfer). This is where the banking apps stand today. (as of 19/10/2026)
Camera: scans the QR code from another screen or paper. Same phone: reads the QR code from a PDF or image on the phone itself.
| Bank | Camera | Same phone |
|---|---|---|
| Belgium | ||
| KBC / KBC Brussels share the PDF to KBC Mobile (SmartPaste) | Yes | Yes |
| BNP Paribas Fortis (Easy Banking App) | Yes | Not stated |
| Belfius | Yes | Not stated |
| ING België | Unknown | Unknown |
| Argenta | Unknown | Unknown |
| Germany · called "GiroCode" there | ||
| Sparkasse Fotoüberweisung > Importieren (PDF, PNG, JPEG) | Yes | Yes |
| DKB import of PDF or photo (user reports) | Yes | Likely |
| Deutsche Bank existing photos | Yes | Yes |
| ING Deutschland | Yes | Not stated |
| Commerzbank | Yes | Not stated |
| Volksbank / Raiffeisenbank (VR Banking) | Yes | Not stated |
| N26 | Yes | Not stated |
| Netherlands | ||
| ING | Yes | Not stated |
| bunq | Yes | Not stated |
| Knab | Yes | Not stated |
| ASN Bank, SNS, RegioBank | Yes | Not stated |
| Rabobank | No | No |
| ABN AMRO | No | No |
| Triodos | No | No |
| France | ||
| BNP Paribas, Société Générale, Crédit Agricole and BPCE are still introducing the QR code. Not reliable yet. | ||
| Revolut tested by GloryPay (French account): photo of the screen and uploading the PDF both work | Yes | Yes |
Source: the banks' help pages, not tested by us per app.
Every seller with a GloryPay account receives a seller code from GloryPay. Ask for it via support. The seller's name and IBAN are linked to the code by GloryPay and can never be changed through the API.
Keep the code on your server. Never put it in a web page, an app or JavaScript that customers can read.
Test code. Next to the seller code there is a test code (it starts with gps_test_). The seller creates it in the members area (Webshop & developers), or you create it in the developer panel. With a test code the API answers exactly the same, with "test": true, but the QR code contains no payment order, the payment page shows "TEST · do not pay" and the request expires after at most 1 hour. Use it to build and test your integration, then switch to the seller code.
POST https://glorypay.com/api/v1/qr
Authorization: Bearer <seller code>
Content-Type: application/json
{
"article": "Photo set Summer",
"price": 24.99,
"order": "WC-10452",
"return_url": "https://shop.example/thanks",
"valid_minutes": 1440
}| Field | Required | Description |
|---|---|---|
article | yes | What the customer buys, max. 140 characters. |
price | yes | Amount in EUR, from 0.01 to 100000. |
order | no | Your order number, max. 60 characters. Shown on the payment page. |
return_url | no | https link back to your shop, shown on the payment page. |
valid_minutes | no | From 5 to 10080 (7 days). Default 1440 (24 hours). |
Response 201:
{
"id": "Hk7pQ2xZra",
"test": false,
"status": "open",
"article": "Photo set Summer",
"order": "WC-10452",
"amount": "24.99",
"currency": "EUR",
"merchant": "Seller name",
"iban": "BE68539007547034",
"reference": "+++123/4567/89002+++",
"epc": "BCD\n002\n1\nSCT\n...",
"qr_svg": "<svg ...>",
"qr_svg_url": "https://glorypay.com/api/v1/qr/Hk7pQ2xZra/svg",
"payment_url": "https://glorypay.com/p/Hk7pQ2xZra",
"expires_at": "2026-10-19T14:40:00.000Z"
}<img src="{qr_svg_url}" width="280" alt="SEPA QR code"> (optional ?size=120 to 1000), or insert qr_svg directly. The customer scans it with the banking app on their phone.payment_url. That page shows copy buttons for IBAN, amount and reference, a button to download the payment order as a PDF, and the QR code.The QR code follows the European EPC standard (SEPA credit transfer). Banking apps fill in the beneficiary, IBAN, amount and the structured reference automatically.
The money arrives directly in the seller's GloryPay account. The seller finds the payment in the GloryPay app by its structured reference (reference). Automatic payment confirmation is not available yet.
GET https://glorypay.com/api/v1/qr/{id} returns the request with its status: open, expired or cancelled. After expiry the image returns 410.
| Status | error |
|---|---|
| 401 | missing_seller_code, invalid_seller_code |
| 400 | missing_article, invalid_price, invalid_return_url, invalid_valid_minutes |
| 500 | db_error, try_again |
| 503 | not_configured |
curl -X POST https://glorypay.com/api/v1/qr \
-H "Authorization: Bearer $GLORYPAY_SELLER_CODE" \
-H "Content-Type: application/json" \
-d '{"article":"Photo set Summer","price":24.99,"order":"WC-10452"}'$r = wp_remote_post('https://glorypay.com/api/v1/qr', [
'headers' => [
'Authorization' => 'Bearer ' . GLORYPAY_SELLER_CODE,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'article' => $product_name,
'price' => $order_total,
'order' => $order_id,
'return_url' => $thank_you_url,
]),
]);
$qr = json_decode(wp_remote_retrieve_body($r), true);
echo '<img src="' . esc_url($qr['qr_svg_url']) . '" width="280" alt="SEPA QR code">';
echo '<a href="' . esc_url($qr['payment_url']) . '">Pay with your banking app</a>';const res = await fetch("https://glorypay.com/api/v1/qr", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GLORYPAY_SELLER_CODE}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ article: "Photo set Summer", price: 24.99, order: "WC-10452" }),
});
const qr = await res.json(); // qr.qr_svg_url, qr.payment_url, qr.referencevar body = """
{"article":"Photo set Summer","price":24.99,"order":"WC-10452"}""";
var req = HttpRequest.newBuilder(URI.create("https://glorypay.com/api/v1/qr"))
.header("Authorization", "Bearer " + System.getenv("GLORYPAY_SELLER_CODE"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
var res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
// res.statusCode() == 201, res.body() contains qr_svg_url, payment_url and referenceimport os, requests
r = requests.post(
"https://glorypay.com/api/v1/qr",
headers={"Authorization": f"Bearer {os.environ['GLORYPAY_SELLER_CODE']}"},
json={"article": "Photo set Summer", "price": 24.99, "order": "WC-10452"},
timeout=20,
)
qr = r.json() # qr["qr_svg_url"], qr["payment_url"], qr["reference"]