Read, verify and write TigerTag NFC chips from Python.
The tigertag package turns the 144 bytes of a TigerTag chip into material, colours, temperatures and quantity, checks its ECDSA-P256 signature and builds new tags. The reference data ships inside the package, so it works offline right after pip install.
from tigertag import TigerTag
tag = TigerTag.from_pages(uid, payload) # from your NFC SDKprint(tag.pretty()) # human-readable summaryprint(tag.verify()) # VALID / NOT SIGNED / INVALIDprint(tag.to_dict()) # JSON-ready dict
The quick start, as the README gives it: uid and payload come from your NFC reader.
1.4.0Latest release ·
3.8+Python 3.8 and later
0Runtime dependencies for the core: standard library only
144Bytes read per chip: pages 0x04 to 0x27, data and signature
Get started in three steps
The tigertag package is on PyPI. Install it, pass it what your NFC reader returns, and check the signature.
1
Install
One command. The core uses only the standard library and the reference data is bundled: no configuration, and no network needed on first run.
pip install tigertag
2
Read a chip
Pass the 7-byte UID and the 144-byte payload your NFC SDK returns. pretty(), to_dict() and validate() then give a summary, a JSON-ready dict and warnings.
from tigertag import TigerTag
tag = TigerTag.from_pages(uid, payload)
3
Verify the signature
The verify extra adds the cryptography package, so tag.verify() can check the ECDSA-P256 signature offline with the public key bundled in the SDK.
pip install tigertag[verify]
Optional extras
sync adds requests (updates already work with the standard library), verify adds cryptography for signature checks, full installs both, and nfc adds pyscard for PC/SC readers in the playground.
pip install tigertag # core only — stdlib, works fully offline (data bundled)pip install tigertag[sync] # + requests (optional — updates use the standard library)pip install tigertag[verify] # + cryptography (ECDSA signature check)pip install tigertag[full] # everythingpip install "tigertag[nfc]"# + pyscard (playground: ACR122U / PC/SC readers)
Signatures and chip layout
A signed TigerTag carries an ECDSA-P256 signature that binds the chip UID to the product data. The SDK checks it with no server call.
tag.verify()
It returns a SignatureResult: ok is True only for a valid signature, and status says why otherwise (no signature, cryptography not installed, no public key, no UID).
result = tag.verify() # fully autonomous — finds the public key from the bundled DB
result.ok # True only for VALID
result.status # "valid" | "invalid" | "unsigned" | "no_crypto" | "no_key" | "no_uid"
str(result) # "VALID" | "INVALID" | "NOT SIGNED" | "NO CRYPTO — …" | "NO PUBLIC KEY — …" | "NO UID — …"
result.to_dict()# {"status": "valid", "ok": True, "detail": "…"}
from_pages() takes 144 bytes (pages 0x04 to 0x27, data and signature) or 80 bytes (data only). from_dump() also accepts a 180-byte full dump and takes the UID from it.
Everything the README documents, in one package that works offline.
Offline first
The reference tables and the TigerTag+ catalogue (about 1 MB) ship inside the package. offline=True or TIGERTAG_OFFLINE=1 turns off every network call.
Signature verification
ECDSA-P256, fully offline, with the public key from the bundled id_version.json. Install tigertag[verify] to add the cryptography package.
Create, patch, erase
TigerTag.create() builds a tag from scratch, patch() returns a new tag with fields changed, erase() returns the 80 zero bytes that wipe a chip. Changing the UID or the signature raises ValueError.
TigerTag+ catalogue
TigerTag.from_catalog() turns a TigerTag+ product ID into a complete tag ready to write, from the official catalogue. catalog_entry() gives its title, brand, SKU and photo.
Reference data updates
The first TigerTagDB of a process checks for new data at most once a day and never raises: on any failure the local data is used. tigertag update checks right away.
Any NFC SDK
from_pages(uid, payload) takes what Android, iOS, Flutter and nfcpy return. The README has a complete example for an ACR122U reader with nfcpy.
Command line and single file
The tigertag command parses a chip dump, prints it as text, JSON or raw fields, and updates the reference data.
tigertag dump.bin # parse + human-readable outputtigertag dump.bin --json # output as JSONtigertag dump.bin --raw # raw protocol fields, no DB lookuptigertag update [--force] # check for new reference data now (--catalog, --data-dir)tigertag dump.bin --offline # no network access at alltigertag --version # show SDK versionpython -m tigertag dump.bin # same, via module runner
A local web page that builds, parses and verifies tags with this SDK, without hardware. With an ACS ACR122U or another PC/SC reader, it also reads and writes real chips.
A Python package, tigertag on PyPI, that reads, verifies, creates and patches TigerTag NFC chips for 3D-printing filament and resin. It is open source under the Apache License 2.0 and implements TigerTag protocol v2.2.
How do I install it?
Run pip install tigertag on Python 3.8 or later. Add tigertag[verify] for signature checks, tigertag[full] for every optional dependency, or tigertag[nfc] for PC/SC readers in the playground.
Does it need an internet connection?
No. The reference data ships inside the package, so reading and verifying work offline. Since version 1.3.0 the SDK checks for new reference data at most once a day; offline=True, TIGERTAG_OFFLINE=1 or auto_update=False turns that off.
Which chips does it read?
NTAG213, NTAG215, NTAG216 and ISO 14443-3 compatible chips, with the three tag types: TigerTag (Maker), TigerTag Init and TigerTag+. The SDK reads all three the same way.
How does it check that a chip is genuine?
tag.verify() checks the chip's ECDSA-P256 signature, which binds the chip UID to the product data, with the public key bundled in the package and no server call. It needs the UID, so read the chip with from_pages(uid, payload).
Can I use it without installing a package?
Yes. parse_tigertag.py at the root of the repository is a complete standalone copy: copy the file into your project and import TigerTag from it.
Is there a command-line tool?
Yes. tigertag dump.bin prints a readable summary, --json prints JSON and --raw the raw protocol fields; tigertag update refreshes the reference data, and python -m tigertag works the same way.
Read your first TigerTag in Python
pip install tigertag, then TigerTag.from_pages(uid, payload).