TigerTag Python SDK

Open-source SDK · TigerTag protocol v2.2

TigerTag Python SDK

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.

pip install tigertag
from tigertag import TigerTag

tag = TigerTag.from_pages(uid, payload)        # from your NFC SDK
print(tag.pretty())                            # human-readable summary
print(tag.verify())                            # VALID / NOT SIGNED / INVALID
print(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. 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. 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. 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]              # everything
pip 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": "…"}
More in the README

What the SDK reads

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.

Memory layout of a TigerTag NTAG chip, pages 0x04 to 0x27, field by field The TigerTag specification

What the SDK does

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 output
tigertag dump.bin --json       # output as JSON
tigertag dump.bin --raw        # raw protocol fields, no DB lookup
tigertag update [--force]      # check for new reference data now (--catalog, --data-dir)
tigertag dump.bin --offline    # no network access at all
tigertag --version             # show SDK version

python -m tigertag dump.bin    # same, via module runner
More in the README

One file, no package

parse_tigertag.py is a complete standalone copy of the SDK for projects that cannot add a dependency: drop the file in and import TigerTag from it.

parse_tigertag.py

Playground

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.

python3 tools/server.py 7432
More in the README

Questions

What is the TigerTag Python SDK?

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).

tigertag on PyPI