Snapper - metrodroid/metrodroid GitHub Wiki
Snapper is the ticketing system used in Wellington, and a number of other towns in New Zealand.
There are two types of cards:
- 
Snapper classic: These are MIFARE Plus SL3 cards, and not readable by Metrodroid. These were issued before ~2015, and as of 2022-06-27, they're being phased out.
 - 
Snapper plus: SmartMX cards with a variant of the T-Money application. These have a
+symbol in the top right corner of the card, and are issued since ~2015. 
This discusses the Snapper plus exclusively.
Metrodroid detects this as a T-Money card, and shows the balance (in cents) as KRW rather than NZD. Better support for this card is being implemented in PR 362.
Applications
| AID | Name | 
|---|---|
a000000003000000 | 
GlobalPlatform | 
d4100000030001 | 
Snapper / T-Money application | 
Note: Unlike T-Money, there is no Config DF.
- 
All date and times are BCD-encoded:
YYYYMMDDfor datesYYYYMMDDHHMMSSfor timestamps (date + time)
 - 
Multi-byte integers are big endian unless otherwise specified.
 - 
All currency values are in cents of the New Zealand Dollar
 
a000000003000000
The card responds to an empty SELECT "by name" with AID a000000003000000. This can also be explicitly selected by name.
This is a GlobalPlatform application.
The card responds to EMV GET PROCESSING OPTIONS request (80a8000002830000) with 6985 (conditions not satisfied).
d4100000030001
This is a variant of the T-Money (KS X 6924) application:
- All costs are in cents of the New Zealand Dollar.
 - T-Money 
GET BALANCE(90 4c 0000 04) has the card balance in cents of the New Zealand Dollar (as opposed to KRW). - The Snapper app attempts to use a command that looks like a proprietary 
GET RECORDcommand (90 78 rr00 10) on records0-f; but this appears to contain no data? - Selecting the T-Money application to read file IDs doesn't work -- only SFI works.
 - There is no Config DF.
 
The files are a different bit layout to T-Money, with SFI files:
0x03: trip data0x04: transaction data0x06: on an unused card this is all00, on a used card this has data.
The trip data (SFI 3 records) and balance data (SFI 4 records) should be treated as a pair.
SFI file 3 (trip data)
Each record is 51 (0x34) bytes long.
| Start byte | End byte | Length | Meaning | 
|---|---|---|---|
| 0 | 0 | 1 | Unknown, always 0x01 | 
| 1 | 1 | 1 | Byte length of the transaction (always 0x32) | 
| 4 | 4 | 1 | Trip ID in journey (for transfers) | 
| 5 | 5 | 1 | Journey ID | 
| 13 | 19 | 7 | Timestamp | 
SFI file 4 (balance data)
Records are 46 (0x2e) bytes long.
| Start byte | End byte | Length | Meaning | 
|---|---|---|---|
| 0 | 0 | 1 | Transaction type (1 = trip, 2 = topup) | 
| 1 | 1 | 1 | Byte length of the transaction (always 0x2c) | 
| 2 | 5 | 4 | Balance after transaction (int32) | 
| 6 | 9 | 4 | Transaction counter | 
| 10 | 13 | 4 | Cost (int32) | 
| 14 | 18.5 | 4.5 | Agency ID (binary-coded decimal) | 
| 26 | 46 | 20 | FF | 
Other notes / trivia
- 
Snapper also contributed to Leap's mobile app (Ireland) -- but these are very different card systems.
 - 
The
Snapper Feeder(used by the MySnapper PC app) is an ACS ACR122T USB dongle.This works with the jvmcli version of Metrodroid (and supports many different cards – not just Snapper) provided you've installed appropriate drivers for your system's PC/SC implementation.
 - 
The MySnapper and Snapper Mobile apps appear to proxy card communication to a remote server (over HTTP/SOAP), and then that remote server indicates some data. There is some limited information available offline, and the Snapper Mobile app partially caches data.
For Metrodroid, probing the remote web server isn't a valid strategy for reading a Snapper card.
 - 
Snapper Mobile has a complete list of Stop IDs available in
cd.zip. - 
d 410 000003 0001is from the ISO7816 National AID range for South Korea (d 410).