Skip to content
CardTools

TSI Decoder

Paste a TSI (tag 9B) and see which processing steps the terminal says it performed.

Runs entirely in your browser. Nothing you paste is uploaded, logged or stored.

Transaction Status Information (tag 9B)

Which processing functions actually executed. Read it alongside the TVR: the TVR says what went wrong, the TSI says whether the step even ran. For cardholder verification, issuer authentication and script processing, a clear TVR bit means little unless the TSI shows the step was performed.

2 bytes · 4 hex characters
Try:

Transaction Status Information bit table (tag 9B)

2 bytes, 4 hex characters. Byte 1 is the leftmost, and b8 is the most significant bit of each byte.

Byte 1

Bit Hex Meaning when set
b8 80 Offline data authentication was performed
b7 40 Cardholder verification was performed
b6 20 Card risk management was performed
b5 10 Issuer authentication was performed
b4 08 Terminal risk management was performed
b3 04 Script processing was performed
b2 02 Reserved for future use
b1 01 Reserved for future use

Byte 2

Bit Hex Meaning when set
b8 80 Reserved for future use
b7 40 Reserved for future use
b6 20 Reserved for future use
b5 10 Reserved for future use
b4 08 Reserved for future use
b3 04 Reserved for future use
b2 02 Reserved for future use
b1 01 Reserved for future use

Other fields: TVR decoder , AIP decoder , 9F33 decoder , 9F34 decoder , TTQ decoder , and the rest (AUC, CID, 9F40, 9F35, CTQ) in the bit field decoder .

What the TSI records

Transaction Status Information is tag 9B, two bytes, and only six bits of the first byte are assigned. Each one says that a processing step was performed. It says nothing about how the step turned out: "cardholder verification was performed" is set whether the PIN was right or wrong.

Byte 2 is entirely reserved. A TSI with anything in its second byte is usually a value that has been misaligned by a byte, not a new feature.

Why the TVR needs it

The TVR sets a bit when something goes wrong, so a clear bit can mean the check passed or that it never happened. The TSI is what separates the two. If TVR byte 5 b7, "issuer authentication failed", is clear and TSI byte 1 b5 is set, the ARPC was checked and verified. If both are clear, no ARPC was ever checked, and the clear TVR bit tells you nothing.

Values you will see often

E800 is b8, b7, b6 and b4: offline data authentication, cardholder verification, card risk management and terminal risk management all ran. That is a complete contact transaction up to the first GENERATE AC. F800 adds b5, issuer authentication, which appears once the response has come back and the card has checked the ARPC. FC00 adds b3 as well, because an issuer script was processed.

6800 is the same as E800 without b8: no offline data authentication. Expect the TVR alongside it to have byte 1 b8 set, and if it does not, one of the two values was captured at a different point in the transaction.

When it was captured matters

The terminal sets these bits as it goes, so the TSI in an authorisation request is a snapshot taken before the issuer has replied. Issuer authentication and script processing cannot be set in it yet. The final value is the one in the terminal's own record after the second GENERATE AC, and the two are often quoted as if they were the same.

The TSI belongs to the contact flow. Several contactless kernels do not define it, so a tap that carries no 9B is not necessarily broken.

More EMV chip tools

All EMV chip tools