Bharat QR and EMVCo QR code decoder
Parse an EMVCo merchant QR into readable tag-length-value objects, and check the CRC.
Runs in your browser — nothing you paste is sent to a server
Drop a QR image here, or . Decoded in your browser — no upload.
How an EMVCo payload is structured
Every object is four characters of header followed by its value: two digits of tag, two digits of length, then exactly that many characters. There are no delimiters and no terminator, so the length is the only thing keeping the payload aligned.
00 02 01 payload format indicator, length 2, value "01" 01 02 11 point of initiation, static 59 14 Bharat Grocers 63 04 A13A CRC over everything above, including this "6304"
Some tags are templates whose value is itself a run of tag-length-value objects. Tags 02 to 51 each hold one payment network's details, with sub-tag 00 carrying the identifier that says which network it is. Tag 62 holds references such as bill number and terminal label, and tag 64 holds the merchant name in a second language.
Scope and limits
- Decodes merchant-presented mode, which is what a printed or displayed merchant QR uses. Consumer-presented mode is a different structure and is not handled.
- Network-specific data inside the merchant account templates is shown as-is. Its meaning is defined by each payment network rather than by EMVCo, so this tool names the network where it can identify the GUID and leaves the rest uninterpreted rather than guessing.
- The CRC tells you the payload is internally consistent. It is not a signature — anyone can recompute it after editing — so it proves accidental corruption did not occur, not that the QR is genuine.
Worked example
A static Bharat QR for a grocery merchant, carrying two payment networks — a card scheme in tag 26 and UPI in tag 28. Paste it into the decoder above, then change one character of the merchant name to watch the CRC fail.
00020101021126350010A0000005240117BHARATGROCERS000128350003upi0124bharatgrocers@okhdfcbank5204541153033565802IN5914Bharat Grocers6005Kochi610668200162360107INV48210309Counter 10708TERM004263047CAC
How the CRC is computed
- Input — everything up to and including 6304
- …200162360107INV48210309Counter 10708TERM00426304
- Algorithm:
- CRC-16/CCITT-FALSE — poly 0x1021, init 0xFFFF, no reflection, no final XOR
- Result:
- 7CAC
- Carried in tag 63:
- 7CAC
Decoded objects
00Payload format indicator01
Version 01, the only value defined
01Point of initiation method11
Static — the same printed code is reused for every payment, so the payer enters the amount
26Merchant account information00Globally unique identifier (GUID) — A00000052401Network-specific data (01) — BHARATGROCERS0001
28Merchant account information00Globally unique identifier (GUID) — upi01Network-specific data (01) — bharatgrocers@okhdfcbank
52Merchant category code5411
53Transaction currency356
INR (ISO 4217 356)
58Country codeIN
India
59Merchant nameBharat Grocers
60Merchant cityKochi
61Postal code682001
62Additional data field template01Bill number — INV482103Store label — Counter 107Terminal label — TERM0042
63CRC7CAC
Frequently asked questions
- Why does my CRC never match?
- Two causes account for nearly all of it. First, the wrong CRC variant: tag 63 uses CRC-16/CCITT-FALSE, meaning polynomial 0x1021, initial value 0xFFFF, no input or output reflection and no final XOR. At least four different algorithms are called CCITT, and the others give completely different answers. Second, the wrong range: the CRC covers the entire payload including the four characters 6304 that introduce the CRC object itself, and excludes only its four hex digits. Stopping before 6304 is the classic error.
- Is a Bharat QR the same as a UPI QR?
- No. A Bharat QR is an EMVCo merchant-presented payload — a tag-length-value structure that can carry several payment networks at once, typically a card scheme plus UPI, and ends with a CRC. A UPI QR encodes a upi://pay URI, which is plain readable text. If what you scanned begins with upi:// it belongs in the UPI tool; if it begins with 0002 it belongs here.
- What is the difference between a static and a dynamic QR here?
- Tag 01, the point of initiation method. Value 11 means static: one printed code reused for every sale, with the payer entering the amount. Value 12 means dynamic: generated per transaction, normally carrying the amount in tag 54. A static code that also fixes an amount, or a dynamic one that omits it, is almost always a generator bug — this decoder flags both.
- Why did my payload stop decoding halfway through?
- The format has no delimiters. Each object is two digits of tag, two digits of length, then exactly that many characters, so one wrong length reinterprets everything after it as garbage. This decoder stops at the point it loses alignment and tells you the offset, which is where the fault is. A common cause is copying a payload out of a viewer that collapsed or trimmed spaces — spaces inside a merchant name are real data and removing one shifts every subsequent field.