ART-783 · OpenChainGraph · QR Scheme Conformance
v1.0.0

EMV MPM QR Payload Validator

Paste an EMV merchant-presented-mode QR payload string and pick a scheme profile: generic EMV MPM, Fiji FJQR, or Brazil Pix BR Code. The engine parses the two-digit tag-length-value structure, recomputes the CRC-16/CCITT-FALSE checksum over the payload including the literal 6304 (and flags the common generator bug that leaves it out), checks static versus dynamic initiation semantics, merchant account templates and their globally unique identifiers, MCC, ISO 4217 currency, amount and tip or convenience consistency, merchant name and city presence and length, and additional-data subfields. For Pix dynamic payloads it also checks the location URL shape and the JWS protected-header skeleton. Merchant-bearing field values are reported as tag, length, and verdict only, never echoed. Use synthetic payloads: this page is for scheme engineers and testers, and every example it ships is invented.

Policy Mandate Export Cross-Border Payments compliance_control Proof deferred
🔒 All inputs are processed locally in your browser. No data is transmitted. Do not enter real personal data — use synthetic or anonymised inputs only. Paste synthetic merchant payloads only: real merchant names, cities, and account identifiers are never echoed back, and nothing you paste leaves this page.
The preloaded payload is synthetic and valid under the generic profile. Replace it with your own string.
A new country scheme is a profile entry, not a new engine. See the add-a-scheme-profile note below.
Signed dynamic-payload envelope skeleton (pix_brcode dynamic only)
Result
What this checks, and what it never does

Checks: payload format indicator 00 equals 01 and comes first; tag 01 static 11 or dynamic 12 consistent with amount presence per profile; at least one merchant account template in tags 26 to 51 carrying a profile-recognised globally unique identifier; MCC tag 52 four digits; currency tag 53 a three-digit ISO 4217 code pinned per profile (FJD 242 for fjqr, BRL 986 for pix_brcode); amount tag 54 format; tip and convenience tags 55 to 57 consistency; country tag 58; merchant name tag 59 and city tag 60 present and within length; tag 62 subfield structure; duplicate tags and trailing bytes after the CRC; and CRC tag 63 as CRC-16/CCITT-FALSE computed over the payload including the literal 6304, last in the payload. For pix_brcode dynamic payloads the location URL carried in tag 26 subfield 25 is shape-checked (no protocol prefix, host with a dot, path, at most 77 characters) and the JWS envelope skeleton is checked against the pinned algorithm set.

Never does: a dynamic payload URL is never fetched (zero network by construction); no signature is verified and no key material is accepted; merchant name, city, postal code, additional-data subfield values, alternate-language merchant fields, and account identifiers inside tags 26 to 51 are never echoed into the result. Structural tags 00, 01, 52, 53, 54, 58, 63 and template GUIDs are echoed because they cannot identify a merchant. Refusals, not verdicts, are returned for malformed input classes: non-string or empty payload, payload over the 2048-character input bound, an unknown profile, an invalid expected-mode value, or a non-object envelope.

  • EMV MPM rules: EMV QR Code Specification for Payment Systems, Merchant-Presented Mode, v1.1 (November 2020), as licensed by EMVCo. Facts and field semantics implemented; no spec text reproduced.
  • FJQR rules: Reserve Bank of Fiji, Guidelines on Participation in the Fiji Quick Response Code Scheme, May 2026, which builds the scheme on EMV MPM v1.1. The scheme-specific account identifier registry sits in the separate FJQR technical specification, so the fjqr profile reports an advisory rather than a verdict on account GUIDs.
  • Pix rules: Banco Central do Brasil BR Code manual v2.0.0 and the Pix initiation standards, plus the SFN security manual volume II for the JWS protected-header rules.

This is an independent conformance utility. It names no scheme operator official and implies no endorsement by EMVCo, any central bank, or the World Bank.

Add a scheme profile

One engine, profiles as data. The three shipped profiles live as a JSON data file beside the kernel (chaingraph/kernels/fixtures/783-emv-mpm-qr-validator.profiles.json) and are mirrored inside the kernel itself, with a property test holding the two equal. PromptPay, DuitNow, QRIS, PayNow or SGQR, KHQR, QR Ph, VietQR, and UPI's EMV form are all EMV MPM derivatives: a new country is a profile entry that pins its currency, country code, recognised account-template GUIDs, transaction-identifier requirement, and static or dynamic mode rules, and it lands as a data change with fixtures, not an engine rewrite.

Pinned primary texts
  • EMVCo QRCPS Merchant-Presented Mode v1.1, November 2020. Pinned with sha256 under research/clause-snapshots/emv-mpm-qr/ on the project board.
  • Reserve Bank of Fiji, Guidelines on Participation in the Fiji Quick Response Code Scheme, 19 May 2026.
  • Banco Central do Brasil, BR Code Manual v2.0.0 (English, May 2020) and Manual de Padrões para Iniciação do Pix (current edition).
  • Banco Central do Brasil, Manual de Segurança do SFN, Volume II, v6.00 (JWS protected-header rules for Pix).

Rule-by-rule source mapping lives in the pin note on the project board. Fixtures on this node are synthetic merchants only; no published specimen payload is reproduced.