Public Test Corpus
Our scanner-compatibility claims are only as good as the evidence they're built on. This page is the corpus — the canonical inputs we regression-test every encoder against, plus the phone-camera behaviour you can audit yourself without taking our word for any of it.
Download corpus.zip Bundled fixtures JSON + CSV + methodology + README. ~4 KB.
Loading version…
How to use the corpus
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.
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.
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.
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 — curated subset
This is a compact view of the full fixture JSON, grouped by scanner behaviour. For the exhaustive list across every type Abundera supports, go to /test-vectors/.
| Type | Fixture input | iOS Camera | Android Camera | Pro scanner |
|---|---|---|---|---|
| URL | https://example.com/test | Decodes | Decodes | Decodes |
| WiFi | SSID=MyNet PSK=... WPA | Joins network | Joins network | Decodes payload |
| WiFi Enterprise (EAP) | WPA2-EAP PEAP identity=alice@corp | iOS 17+ | Decodes | Decodes |
| vCard | FN=Alice ORG=Acme ... | Add to Contacts | Add to Contacts | Decodes payload |
| TOTP | otpauth://totp/...?secret=JBSW... | Authenticator app reads it | Authenticator app reads it | Decodes URI |
| eSIM | LPA:1$rsp.example.com$K2-LM... | iOS 17.4+ provisions | Android 13+ provisions | Decodes URI |
| Bitcoin (BIP-21) | bitcoin:1A1zP1eP... | Wallet app opens | Wallet app opens | Decodes URI |
| SEPA (EPC) | BCD header + name + IBAN + amount | Raw string only | Raw string only | Banking-app support |
| Swiss QR-bill | SPC header + IBAN + address + amount | Raw string only | Raw string only | Swiss banking apps native |
| GS1 Digital Link | https://id.gs1.org/01/09506000134352 | Opens URL | Opens URL | POS firmware parses AIs |
| Data Matrix | Arbitrary payload | No decode | Google Lens only | Native |
| Aztec | Arbitrary payload | No decode | Some Android readers | Native |
| PDF417 | AAMVA or arbitrary | No decode | Google Lens partial | Native |
| AAMVA driver license | @\n\x1e\rANSI 636014080002DL... | iOS 17+ license-aware | Android license-aware apps | Native |
| EAN-13 | 0012345678905 | Decodes digits | Decodes digits | Every retail POS |
| Code 128 | ABC-123 | Decodes | Decodes | Native |
| Micro QR | Compact payload | No decode | No decode | Industrial readers only |
| rMQR | Rectangular payload | No decode | No decode | Some Scandit/Cognex firmware |
What "expected scan result" means
- Decodes — native phone-camera reader returns the payload without needing a separate app.
- Partial — decode depends on a specific app (authenticator, wallet, banking) or a specific OS version.
- No decode — native camera returns nothing. Requires a specialist scanner or reader.
Methodology notes
- Every fixture round-trips. Our CI generates each code in headless Chromium, decodes it back via the browser's
BarcodeDetectorAPI, and asserts the substring match. A green CI means the corpus is internally consistent. - Scanner results in this table are from manual testing on real devices. Not synthesized. iPhone 15 Pro on iOS 18.3, Pixel 8 on Android 14, Zebra DS8100 imager on firmware CAAACS00-002-R06.
- We publish negative results. If iPhone Camera refuses to decode a symbology (Data Matrix, Aztec, PDF417), that's a "No decode" in the table — not a rebrand of "native reader".
- The corpus is versioned. When we add a type or fix an encoder bug, the corresponding fixture entry ships in the same commit. Check the fixture history for the audit trail.
What's coming
- Pre-rendered artifacts. The current ZIP bundles fixtures + methodology + CSV. A future revision will add pre-rendered SVG + PNG of each fixture so you can drop them straight into a scanner-fleet harness. Pending build-time headless-browser step.
- Scanner-fleet attestation. Dated log at docs/SCANNER_ATTESTATION.md — grows each time we verify against a new device.
- Third-party verification. An independent security lab runs the corpus through a scanner fleet and publishes a signed attestation. Pending (commissioned; see /accessibility/audit/ placeholder).
See also
- /test-vectors/ — full fixture JSON and searchable table.
- /compatibility/ — live scanner compatibility matrix.
- /standards/ — per-standard reference pages.
- /print-size/ — physical-print guidance that sits alongside the corpus.