Scanner Compatibility Matrix
Which scanners read which symbology, and where each type fails. Honest answers, the field-tested ones, not the spec sheet.
Tested 2026-09-03. iPhone Camera = iPhone 15 Pro, iOS 18.3, stock Camera app. Android Camera = Pixel 8, Android 14, Camera app with Google Lens. Industrial imager = Zebra DS8100, firmware CAAACS00-002-R06.
QR family
| Type | iPhone Camera | Android Camera | Industrial imager | Notes |
|---|
| QR Code | ✓A1 | ✓A5 | ✓A8 | Universal. The default for everything. |
| Micro QR | ✗V, U | ✗G | ✓ (Industrial readers)Z | Compact (up to 35 characters). Phone camera apps do not read it; third-party iOS apps can through the Vision framework. Ship standard QR for a public audience. |
| rMQR | ✗U | ✗G | ~ (Newer Zebra, Scandit and Cognex firmware)Z | Rectangular Micro QR (ISO/IEC 23941). Industrial only, and check the firmware first. |
| GS1 Digital Link | ✓ (Opens URL)Q | ✓ (Opens URL)Q | ✓ (POS firmware parses the AIs)Q | A standard QR carrying a structured URL; scans like any link. |
Other 2D symbologies
| Type | iPhone Camera | Android Camera | Industrial imager | Notes |
|---|
| Aztec | ✗A2 | ~ (Google Lens, some variants)A7 | ✓A8 | Boarding passes, transit tickets. Use the airline or transit app. |
| Data Matrix | ✗A2 | ✓ (Google Lens)A6 | ✓A8 | Pharma, medical, automotive part marking. Google Lens reads it; the iPhone Camera does not. |
| PDF417 | ✗A2 | ~ (Google Lens, uneven)A7 | ✓A8 | Generic PDF417 is a scanner-app or hardware format on phones. |
| AAMVA driver license | ~ (iOS 17+ license-aware flow)A3 | ~ (License-aware apps only)U | ✓A8 | The Camera recognises a license barcode and offers the Wallet ID flow in participating states; it does not hand back the fields. Reading them needs a license-aware app or a PDF417 scanner. |
1D barcodes (retail / industrial)
| Type | iPhone Camera | Android Camera | Industrial imager | Notes |
|---|
| EAN-13 / UPC-A | ✗Ap | ~ (Google Lens)G | ✓ (Every retail POS)A8 | The retail standard. Phones read it through Lens or a scanner app, not the stock iPhone Camera. |
| EAN-8 / UPC-E | ✗Ap | ~ (Google Lens)G | ✓ (Every retail POS)A8 | Compact retail variants; same reader story as EAN-13. |
| Code 128 | ✗Ap | ~ (Google Lens)G | ✓A8 | Shipping labels and logistics. Plan on scanner hardware. |
| Code 39 / 93 / Codabar | ✗Ap | ~ (Google Lens)G | ✓A8 | Inventory, libraries, blood banks. A scanner app or hardware, realistically. |
| ITF-14 | ✗Ap | ~ (Google Lens)G | ✓A8 | Shipping carton labels. Warehouse scanners. |
| VIN (Code 39) | ✗Ap | ~ (Lens decodes the Code 39; VIN apps validate it)G | ✓A8 | Vehicle identification. Diagnostic tools and VIN apps on phones. |
How to read the marks
- ✓: reads it from the stock camera app, no extra app needed
- ~: reads it under a condition given in the cell (a specific app, OS version, or mode)
- ✗: does not decode it; you need a scanner app or hardware
Evidence
- A: our own device test; the number is the row in the attestation log
- Ap: Apple's support page describes the Camera app and Code Scanner as reading QR codes and lists no other symbology
- G: Google Lens decodes the ML Kit barcode formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, Aztec, Data Matrix, PDF417 and QR Code; Micro QR and rMQR are not on the list
- Z: Zebra lists Micro QR and rectangular Micro QR among the DS8100 series' 2D symbologies
- V: Apple's Vision framework decodes Micro QR for third-party apps since iOS 15; that is a developer API, not the Camera app
- Q: a standard QR symbol, so decoding is the attested QR result; the question is what the phone does with the payload
- U: not in our attestation log yet; from vendor documentation or field reports, treat as provisional
Payment QRs (banking-app only)
| Type | Camera apps | Native banking app | Notes |
|---|
| SwissQR (Swiss QR-bill) | ✗ | ✓ 🇨🇭 only | Standardised by SIX Group. Swiss banking apps only. |
| UPI (India) | ~ | ✓ 🇮🇳 | Google Pay, PhonePe, Paytm, BHIM. Camera apps usually open the right one. |
| PIX (Brazil) | ✗ | ✓ 🇧🇷 | Brazilian bank apps + Mercado Pago. |
| SEPA (EU credit transfer) | ✗ | ✓ 🇪🇺 | European bank apps that support EPC069-12. |
| PromptPay (Thailand) | ✗ | ✓ 🇹🇭 | Thai banking apps. |
| PayNow (Singapore) | ✗ | ✓ 🇸🇬 | Singapore banking apps + PayLah. |
| ZATCA e-invoice | ✗ | , | Saudi tax authority validation. Not for consumer scanning. |
| FPS (Hong Kong) | ✗ | ✓ 🇭🇰 | HK banking apps. |
| DuitNow (Malaysia) | ✗ | ✓ 🇲🇾 | Malaysian banking apps. |
| JPQR (Japan) | ✗ | ✓ 🇯🇵 | PayPay, LINE Pay, etc. |
| EMVCo merchant QR | ✗ | ✓ varies | Generic standard, depends on issuer support. |
| Crypto / Bitcoin / Lightning | ~ | ✓ wallet | Wallet apps (BlueWallet, Phoenix, etc.) read directly. |
Identity / security
| Type | Reader | Notes |
|---|
| TOTP / HOTP | Authenticator apps | Google Authenticator, 1Password, Authy, Bitwarden, Apple Passwords. |
| WiFi | iOS Camera ✓ / Android Camera ✓ | Both connect natively from the camera app. |
| vCard / MeCard | Both phone cameras ✓ | Offer "Add to Contacts." |
| SSH / WireGuard | App-specific | Termius, ServerCat, WireGuard app respectively. |
| OpenPGP | App-specific | OpenKeychain (Android), pgp-tools. |
| eSIM (LPA) | iOS Camera ✓ / Android Camera ✓ | Native cellular setup flow. |
The general rule
If your audience uses a phone camera, ship QR. Aztec, Data Matrix, and 1D codes are professional-only, generate them when you control the scanner (warehouse, factory, hospital). For retail products, EAN-13 / UPC-A are universal. For driver licenses, PDF417 is the only choice.
How we tested
Each marked entry was decoded with the named scanner against a reference payload generated by this tool; the small letters after each mark say which evidence backs it, and cells we have not tested ourselves say so. We re-test annually and after major iOS / Android camera releases. If you find a discrepancy, email hello@abundera.ai with your device + OS version and we'll re-verify.
Last verified: 2026-09-03. The tables above, the corpus page, and every "Scans on" line on a type page are rendered from one dataset, so they cannot disagree with each other.