Public Test Corpus

Our scanner-compatibility claims are only as good as the evidence they're built on. This page is the corpus, the inputs we regression-test our encoder families against, plus the phone-camera behaviour you can audit yourself without taking our word for any of it.

Why this exists: most QR tools publish a compatibility matrix. Ours publishes the corpus behind the matrix. If you're responsible for a scanner fleet, retail, warehouse, pharma, airline, DMV, you can run this corpus through your own readers and verify every claim we make.

Download corpus.zip Bundled fixtures JSON + CSV + methodology + README. ~4 KB.

Loading version…

How to use the corpus

Download the fixtures.

Every test vector lives in /test-vectors/fixtures.json. One JSON object per type with the input fields and the expected decoded substring(s). Fetched live from this site, no stale copies.

Regenerate the QRs.

Take any fixture's fields map, drop the values into the generator for that type, and hit Generate. The resulting QR is bit-for-bit identical to what our CI round-trips against.

Scan with your own fleet.

Point an iPhone Camera, Android Camera, Google Lens, industrial scanner (Zebra, Honeywell, Datalogic), or app-specific reader (a banking app, an authenticator) at the generated QR. Confirm the decoded text contains every expect substring for that fixture.

Report discrepancies.

If a scanner in your fleet returns a decode that doesn't match the fixture, file an issue. We'll reproduce, add your scanner to the public compatibility matrix, and (if it's an encoder bug) ship a fix.

Expected scan results

Rendered from the same dataset as the compatibility matrix and every type page's "Scans on" line, so the three cannot disagree. The full fixture file at /test-vectors/ has 33 entries, one per encoder family we regression-test; it is not one row per product type, and we do not claim it is.

TypeFixture inputiPhone CameraAndroid CameraPro scanner
URLhttps://example.com/testOpens linkA1Opens linkA5DecodesA8
WiFiWIFI:S:MyNet;T:WPA;P:...;;Joins networkA1Joins networkA5Decodes payloadA8
WiFi Enterprise (EAP)WPA2-EAP PEAP identity=alice@corpiOS 17+, reportedUDecodes; join depends on the OEMUDecodes payloadQ
vCardFN=Alice ORG=Acme ...Add to ContactsA1Add to ContactsA5Decodes payloadA8
TOTPotpauth://totp/...?secret=JBSW...Authenticator app reads itA9, A10Authenticator app reads itA9, A10Decodes URIA8
eSIMLPA:1$rsp.example.com$K2-LM...iOS 17.4+ provisionsA4Android 13+ provisionsUDecodes URIQ
Bitcoin (BIP-21)bitcoin:1A1zP1eP...Wallet app opensQWallet app opensQDecodes URIQ
SEPA (EPC)BCD header + name + IBAN + amountRaw string onlyQRaw string onlyQDecodes raw stringQ
Swiss QR-billSPC header + IBAN + address + amountRaw string onlyQRaw string onlyQDecodes raw stringQ
Micro QRCompact payloadNo decodeV, UNo decodeGIndustrial readersZ
rMQRRectangular payloadNo decodeUNo decodeGNewer Zebra, Scandit and Cognex firmwareZ
GS1 Digital Linkhttps://id.gs1.org/01/09506000134352Opens URLQOpens URLQPOS firmware parses the AIsQ
AztecArbitrary payloadNo decodeA2Google Lens, some variantsA7NativeA8
Data MatrixArbitrary payloadNo decodeA2Google LensA6NativeA8
PDF417AAMVA or arbitraryNo decodeA2Google Lens, unevenA7NativeA8
AAMVA driver license@\n\x1e\rANSI 636014100002DL...iOS 17+ license-aware flowA3License-aware apps onlyUNativeA8
EAN-13 / UPC-A0012345678905No decodeApGoogle LensGEvery retail POSA8
Code 128ABC-123No decodeApGoogle LensGNativeA8

How to read the marks

Evidence

What "expected scan result" means

Methodology notes

Scanner-fleet attestation log

Every manual device run, dated. Rows are added when we acquire hardware or a user reports a discrepancy; a result never changes silently, it gets a new row.

#DeviceOS / appCorpus sliceResultDateNotes
A1iPhone 15 ProiOS 18.3, native CameraAll QR fixturespass2026-04-10
A2iPhone 15 ProiOS 18.3, native CameraAztec, PDF417, Data Matrixfail2026-04-10None decode natively (expected, see /standards/non-qr-2d/)
A3iPhone 15 ProiOS 18.3, native CameraAAMVA PDF417partial2026-04-10iOS 17+ license-aware flow offers Add to Wallet; raw PDF417 not returned
A4iPhone 15 ProiOS 18.3, WalleteSIM LPApass2026-04-12Add-eSIM flow triggers correctly
A5Pixel 8Android 14, native CameraAll QR fixturespass2026-04-10
A6Pixel 8Android 14, Google LensData Matrixpass2026-04-10
A7Pixel 8Android 14, Google LensAztec, PDF417partial2026-04-10Some variants decode; support is uneven
A8Zebra DS8100firmware CAAACS00-002-R06All 2D + 1D fixturespass2026-04-11Industrial imager, canonical reference
A9Google Authenticatorv7.0+ (iOS/Android)TOTP, HOTPpass2026-04-12SHA-1 only, 6-digit (ignores algorithm/digits params per Google's de facto profile)
A101Passwordv8 (iOS/Android/macOS)TOTP, HOTPpass2026-04-12Full RFC support incl SHA-256, SHA-512, 8-digit

What's coming

See also

Corpus last regression-tested 2026-04-18. Scanner devices verified: iPhone 15 Pro / iOS 18.3, Pixel 8 / Android 14, Zebra DS8100.