The QR REST API connects a cash register or other business system to Comgate over the Internet and lets you initiate a QR / account payment on a payment terminal and subsequently determine its result. We only support the JSON data format. The process of processing one transaction usually consists of the following steps:
Authentication (mandatory first step)
Call the POST /pos/auth-api/authenticate method with HTTP Basic credentials (header Authorization: Basic [base64_encode(user:password)]). The API returns a JWT token and its expiry. Use this token in the Authorization: Bearer [token] header for all QR API calls until it expires; after that, authenticate again.
Creating a payment (mandatory step)
Call the POST /pos/qr-api/payment method and pass the mandatory data: merchantId, terminalId, amount (in minor units), currency and method; optionally refId and created. If the request is correct, the API returns a unique transaction identifier transId and paymentData for rendering the QR code. Save the transId, it is key for all further operations with this payment.
Determining the payment status (optional step)
Repeatedly call the GET /pos/qr-api/payment/{transId} method until the status changes from 'PENDING' to a final value. Possible final states are:
POST /pos/qr-api/payment/{transId}/cancel method. The response contains the resulting status ('CANCELLED').Authorization: Bearer [token] with a valid JWT token obtained from the Auth API. The token has a limited validity (expiry); after it expires, obtain a new one via POST /pos/auth-api/authenticate.
Verifies HTTP Basic credentials and returns a JWT Bearer token used to authorize the QR API. Pass credentials in the Authorization: Basic [base64_encode(user:password)] header. A merchant identifier mid is REQUIRED in the JSON body (400 without it) — it is baked into the token and all subsequent QR API operations are restricted to that merchant (requests for another merchant or payments of another merchant return 403).
| mid required | string Merchant identifier baked into the token (MID scoping). |
| token | string JWT Bearer token. |
| expiry | string Token expiration (ISO 8601). |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "mid": "MERCH001"
}{- "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNT05FVCJ9.dummy-signature",
- "expiry": "2026-06-18T10:15:00+00:00"
}Returns the QR payment methods available for the given terminal and currency (bank-specific QR methods and the generic QR transfer), including bank names and logos. For EUR the offer follows the merchant's establishment country (SK → the SK QR method, otherwise the EU QR method); with bothEurQr both SK and EU QR methods are returned. Methods are also filtered by supported amount and instant-payment limits based on the mandatory amount.
| merchantId required | string Merchant identifier. |
| terminalId required | string Terminal identifier. |
| currency required | string ISO 4217 currency code (CZK or EUR). |
| amount required | integer >= 1 Amount in minor units (e.g. hellers/cents) — filters methods by supported amount and instant-payment limits. |
| bothEurQr | boolean Optional; for EUR returns both SK and EU QR methods regardless of the establishment country. |
| lang | string Optional language of method names (cs/sk/en, default cs). |
Array of objects | |||||||||
Array
| |||||||||
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "merchantId": "MERCH001",
- "terminalId": "TERM001",
- "currency": "CZK",
- "amount": 12500,
- "bothEurQr": false,
- "lang": "cs"
}{- "methods": [
- {
- "id": "BANK_CZ_T_OTHER",
- "name": "České banky",
}
]
}Creates a new QR payment. On success it returns the transaction identifier transId and the payment data needed to render the QR code.
| merchantId required | string Merchant identifier. |
| terminalId required | string Terminal identifier. |
| refId | string Optional merchant payment reference. It appears on the merchant's settlement statement (the |
| amount required | integer >= 1 Amount in minor units (e.g. hellers/cents). |
| currency required | string ISO 4217 currency code. |
| method required | string Payment method, e.g. |
| created | string Optional payment creation timestamp (ISO 8601). |
| variableSymbol | string <= 128 characters Optional variable symbol entered by the operator - the merchant's own reference stored with the payment. Any text up to 128 bytes; longer values or NUL return 400. When it is filled it is the value that appears on the merchant's settlement statement (the |
| transId | string Transaction identifier. |
| refId | string Merchant payment reference (echo of the request). |
| status | string Payment status; right after creation it is PENDING. |
| paymentData | string Payment QR code data; the format follows the method: SPAYD for CZ methods, PAY by square for BANK_SK_T_OTHER, EPC QR (SEPA) for BANK_EUR_T_OTHER. Not present for a CANCELLED payment. |
| paymentRejectedReason | string Reason for rejection; present only for a CANCELLED payment. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "merchantId": "MERCH001",
- "terminalId": "TERM001",
- "refId": "ORDER-2026-001",
- "amount": 12500,
- "currency": "CZK",
- "method": "BANK_CZ_T_OTHER",
- "created": "2026-05-27T10:00:00Z",
- "variableSymbol": "FAKTURA-2026/01"
}{- "transId": "AAAA-BBBB-CCCC",
- "refId": "ORDER-2026-001",
- "status": "PENDING",
- "paymentData": "SPD*1.0*ACC:CZ6508000000192000145399*AM:125.00*CC:CZK*MSG:Platba ORDER-2026-001",
- "paymentRejectedReason": "string"
}Returns the current state of the payment. Poll until status reaches a final value (PAID / CANCELLED).
| transId required | string Example: AAAA-BBBB-CCCC Transaction identifier. |
| transId | string Transaction identifier. |
| refId | string Merchant payment reference. |
| status | string Payment status: PENDING, PAID or CANCELLED. |
| paymentRejectedReason | string Reason the payment was cancelled; present only for a CANCELLED payment. The values are stable and can be used as keys: |
Array of objects Refunds of this payment in chronological order; an empty array if there are none. Use it to recover |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
# You can also use wget curl -X GET https://payments.comgate.cz/pos/qr-api/payment/{transId} \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNT05FVCJ9.dummy-signature'
{- "transId": "AAAA-BBBB-CCCC",
- "refId": "ORDER-2026-001",
- "status": "PAID",
- "paymentRejectedReason": "Customer timeout",
- "refunds": [
- {
- "transRefundId": "123456",
- "refId": "REFUND-001",
- "amount": 2000
}
]
}<span class='cg-lang cg-lang-en'>Rewrites the payment method on an EXISTING pending payment and restarts its expiry, so that going back to the bank list does not create a second payment for one purchase. The response has the same shape as creating a payment, plus the new expiry. Nothing is written until every check passes, so a rejected request leaves the payment usable with its ORIGINAL method - pick another bank and call again. The number of changes is not limited and the expiry is never shortened. Amount limits are not re-checked here: the amount does not change, so the list from /methods still applies.<span class='cg-lang cg-lang-cs'>Přepíše metodu na EXISTUJÍCÍ rozdělané platbě a spustí její expiraci znovu, aby návrat k seznamu bank nevyrobil na jednu útratu druhou platbu. Odpověď má stejný tvar jako založení platby plus novou expiraci. Dokud neprojdou všechny kontroly, nezapisuje se nic, takže po odmítnutí platba dál platí s PŮVODNÍ metodou - stačí vybrat jinou banku a zavolat znovu. Počet změn omezený není a expirace se nikdy nezkrátí. Limity částky se tu znovu nekontrolují: částka se nemění, takže platí seznam ze /methods.<span class='cg-lang cg-lang-sk'>Prepíše metódu na EXISTUJÚCEJ rozrobenej platbe a spustí jej expiráciu znova. Po odmietnutí platba ďalej platí s PÔVODNOU metódou.
| transId required | string Example: AA25-FD8D-9GF5 |
| method required | string <span class='cg-lang cg-lang-en'>Method identifier from /methods.<span class='cg-lang cg-lang-cs'>Identifikátor metody ze /methods.<span class='cg-lang cg-lang-sk'>Identifikátor metódy zo /methods. |
| transId | string |
| refId | string or null |
| status | string |
| paymentData | string <span class='cg-lang cg-lang-en'>QR payload to redraw. Today it does not depend on the chosen bank, but it is returned so that a future change does not need both sides to be updated.<span class='cg-lang cg-lang-cs'>Data QR kódu k překreslení. Dnes na zvolené bance nezávisí, vrací se proto, aby budoucí změna neznamenala úpravu na obou stranách.<span class='cg-lang cg-lang-sk'>Dáta QR kódu na prekreslenie. |
| expiration | string <date-time> |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "method": "BANK_CZ_T_KB"
}{- "transId": "AA25-FD8D-9GF5",
- "refId": "string",
- "status": "PENDING",
- "paymentData": "string",
- "expiration": "2026-09-22T15:10:00+02:00"
}Extends the expiration of an unconfirmed payment to 7 days, for the case where the merchant released the goods even though we have not confirmed the payment. The payment stays pending and matchable, so once the money arrives it flips to paid the usual way. The length is a server-side policy and cannot be chosen by the caller. The call is idempotent and never shortens the expiration. A paid payment returns 200 unchanged (the money arrived in the meantime); a cancelled one returns 400 — it is not resurrected, and late money goes through the standard refund process.
| transId required | string Example: AAAA-BBBB-CCCC Transaction identifier. |
| note | string <= 1000 characters Optional merchant note kept with the payment, e.g. a customer contact for later follow-up. |
| transId | string Transaction identifier. |
| refId | string Merchant payment reference. |
| status | string Payment status. |
| expiration | string New payment expiration (ISO 8601). |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "note": "Zákazník: 777123456"
}{- "transId": "AAAA-BBBB-CCCC",
- "refId": "ORDER-2026-001",
- "status": "PENDING",
- "expiration": "2026-09-08T10:00:00+02:00"
}Cancels the payment. The response contains the resulting state (CANCELLED).
| transId required | string Example: AAAA-BBBB-CCCC Transaction identifier. |
| transId | string Transaction identifier. |
| status | string Payment status. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
# You can also use wget curl -X POST https://payments.comgate.cz/pos/qr-api/payment/{transId}/cancel \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNT05FVCJ9.dummy-signature' \ -H 'Content-Type: application/json'
{- "transId": "AAAA-BBBB-CCCC",
- "status": "CANCELLED"
}Creates a refund request for the payment. Only a paid (PAID) payment can be refunded. Both partial and full refunds are possible; the total of all refunds must not exceed the payment amount. The request is processed asynchronously — track the result via GET /pos/qr-api/payment/{transId}/refund/{transRefundId}.
| transId required | string Example: AAAA-BBBB-CCCC Transaction identifier. |
| amount required | integer >= 1 Refund amount in minor units. |
| created required | string Refund creation timestamp (ISO 8601). |
| refId | string Optional merchant refund reference — the refund is tied to the payment by transId in the URL. |
| transRefundId | string Refund identifier. |
| status | string Refund status; right after creation it is PENDING. |
| transId | string Transaction identifier. |
| refId | string Merchant refund reference (echo of the request). |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
{- "amount": 12500,
- "created": "2026-05-27T10:05:00Z",
- "refId": "REFUND-2026-001"
}{- "transRefundId": "123456",
- "status": "PENDING",
- "transId": "AAAA-BBBB-CCCC",
- "refId": "REFUND-2026-001"
}Returns the refund status. Possible states: PENDING (in processing), REFUNDED (money sent back), CANCELLED (refund rejected/cancelled).
| transId required | string Example: AAAA-BBBB-CCCC Transaction identifier. |
| transRefundId required | string Example: 123456 Refund identifier. |
| transRefundId | string Refund identifier. |
| status | string Refund status: PENDING / REFUNDED / CANCELLED. |
| transId | string Transaction identifier. |
| refId | string Merchant refund reference. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
| errorMessage | string Error message. |
# You can also use wget curl -X GET https://payments.comgate.cz/pos/qr-api/payment/{transId}/refund/{transRefundId} \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNT05FVCJ9.dummy-signature'
{- "transRefundId": "123456",
- "status": "PENDING",
- "transId": "AAAA-BBBB-CCCC",
- "refId": "REFUND-2026-001"
}