Developers

GloryPay QR API

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.

Ways to accept GloryPay QR

Pick what fits your shop. Every option creates the same SEPA QR code, and the money goes straight into the seller's GloryPay account.

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.

Read the API docs

WooCommerce plugin

For WordPress shops. Adds the GloryPay QR payment option to the checkout and shows the QR code on the thank-you page.

Download glorypay-qr.zip

PrestaShop module in test

For PrestaShop 1.7.7, 8 and 9. The order gets the status "Awaiting GloryPay QR payment" and the confirmation page shows the QR code.

Download glorypayqr.zip

Demo shop

See the checkout from the customer's side: choose a product, pay by QR, and see what your customer sees.

Open the demo shop

Access: seller code

GloryPay creates a seller code after checking the seller's name and IBAN. Use it only on your server, never in a web page or app.

Ask for a seller code

Developer panel

Invited by a seller? Log in to see their seller code and test code, the log of your API requests, the plugins and which banking apps read the QR code.

Open the developer panel

Which banking apps read the QR code?

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.

BankCameraSame phone
Belgium
KBC / KBC Brussels
share the PDF to KBC Mobile (SmartPaste)
YesYes
BNP Paribas Fortis (Easy Banking App)YesNot stated
BelfiusYesNot stated
ING BelgiëUnknownUnknown
ArgentaUnknownUnknown
Germany · called "GiroCode" there
Sparkasse
Fotoüberweisung > Importieren (PDF, PNG, JPEG)
YesYes
DKB
import of PDF or photo (user reports)
YesLikely
Deutsche Bank
existing photos
YesYes
ING DeutschlandYesNot stated
CommerzbankYesNot stated
Volksbank / Raiffeisenbank (VR Banking)YesNot stated
N26YesNot stated
Netherlands
INGYesNot stated
bunqYesNot stated
KnabYesNot stated
ASN Bank, SNS, RegioBankYesNot stated
RabobankNoNo
ABN AMRONoNo
TriodosNoNo
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
YesYes

Source: the banks' help pages, not tested by us per app.

Advice for your customer on a phone

  1. The copy buttons (IBAN, amount, reference) work with every bank.
  2. "Download payment order (PDF)" works with KBC, Revolut, Sparkasse, Deutsche Bank and probably DKB.
  3. The QR code is for paying with a second device or on a computer.

1. Get a seller code

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.

2. Create a QR 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
}
FieldRequiredDescription
articleyesWhat the customer buys, max. 140 characters.
priceyesAmount in EUR, from 0.01 to 100000.
ordernoYour order number, max. 60 characters. Shown on the payment page.
return_urlnohttps link back to your shop, shown on the payment page.
valid_minutesnoFrom 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"
}

3. Show it to your customer

The QR code follows the European EPC standard (SEPA credit transfer). Banking apps fill in the beneficiary, IBAN, amount and the structured reference automatically.

4. Check the payment

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.

Errors

Statuserror
401missing_seller_code, invalid_seller_code
400missing_article, invalid_price, invalid_return_url, invalid_valid_minutes
500db_error, try_again
503not_configured

Examples

curl

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"}'

PHP (WordPress / WooCommerce)

$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>';

Node.js

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.reference

Java (11+)

var 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 reference

Python

import 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"]