QR Code Validator

Upload a code and get measured answers rather than a tick: how many modules of quiet zone it has, what the contrast actually is, which error-correction level it carries, how much a logo covers. Test it here before you commit it to five thousand flyers.

Quick answer: drop in a QR code image and this measures the things that decide whether it survives print — clear space in modules, the real contrast ratio between the ink and background it finds, the error-correction level read back out of the code, the module count, and how much of the code a logo covers. Every figure comes with the threshold it is being judged against, because what you need to know is how much margin you have, not whether something passed.
Test a code

Drop your QR code here

or click to choose one — PNG, JPG, WebP, GIF or BMP.
The artwork you are about to print, a screenshot, an export from anywhere.

Why a tick is not an answer

Most code checkers tell you whether the code scanned on their machine. That is the least interesting thing about it, because a code that scans from a clean file on a desktop can still fail on a menu in a dim restaurant, on a window in sun, or once a printer has spread the ink a little. What decides that is how much margin the code has, and margin is a number.

So every check here reports the measurement and the threshold it is being held to. Four modules of quiet zone is the standard; yours might be 1.8. Contrast stops working below 4:1; yours might be 4.3, which passes and leaves nothing spare. A logo covering 7% of the area is a different proposition from one covering 19%. You can act on those. You cannot act on a green tick.

What each check is measuring, and where the number comes from

CheckHow it is measuredThe threshold, and why
DecodesThe same two-pass ZXing configuration the generator uses to check its own outputPass or fail. Everything else depends on it
Quiet zoneClear rows and columns outside the code, divided by the module size — so the answer is in modules, the unit the standard usesFour. With none, the same code stops scanning as soon as it sits on a dark background
ContrastThe mean colour of the dark modules against the mean colour of the light ones, as a WCAG ratio4:1 floor, 7:1 comfortable. Measured: 4.06:1 decoded, 4.00:1 did not
LogoThe area inside the code that is neither ink nor background, and whether it sits in the middleNo fixed limit — the honest answer is whether it still decoded
DestinationProperties of the URL text: scheme, shortener, an @ before the host, a punycode nameFlags, not a verdict on trust

The module count is worked out rather than guessed. A finder-pattern centre sits three and a half modules in from its corner, so the two centres along one edge are n − 7 modules apart; with W the code's width in pixels and D that distance, n = 7W / (W − D). On real renders that recovers 21, 25, 29, 69 and 101 modules to the second decimal, which is what makes the quiet zone measurable in modules instead of pixels — and pixels are the wrong unit, because the same four modules is a different pixel count at every size.

What it will not tell you

Three things, and they matter as much as the checks.

What crosses the network

Nothing of yours. This page holds no fetch, no XMLHttpRequest, no sendBeacon and no form, so the image has no route off your machine; it is read with FileReader, drawn onto a canvas in your tab, and measured there. The only things fetched are the decoder library from jsDelivr — a static file, identical for every visitor — and this site's own header, fonts, analytics and ad script. That matters more here than usual, because the codes people most want to check before printing are the ones carrying a payment address or an internal link.

Frequently Asked Questions

Upload the image here. It decodes the code and then measures the things that decide whether it survives print: how many modules of clear space it has, the real contrast ratio between the ink and the background, which error-correction level it carries, how many modules across it is, and how much of it a logo covers. Each answer is a number rather than a tick, because the number is what tells you how much margin you have.
Four modules on every side — that is what the standard asks for, and it is measured in modules rather than millimetres or pixels because it scales with the code. We tested the same code with and without it: both scan on a white page, and the one with no margin stops scanning the moment it sits on a dark background. The validator reports the tightest side in modules, and says when the figure is what the image gives rather than what the page will.
More than you would guess from looking. Stepping a grey foreground against white and decoding at each step, everything at a contrast ratio of 4.06:1 and above read back and everything at 4.00:1 and below did not. So 4:1 is the floor, not a target — aim for 7:1 or more for anything printed, because ink spreads on paper and a phone camera in a dim room has less to work with than a clean file does. The validator measures the real ink and background colours it finds, not an assumed black on white.
There is no safe percentage, which is why this measures yours rather than quoting a rule. "Level H recovers 30%" is about codewords spread across the whole symbol, not a solid block you may paint over. Sweeping a centre block across payload lengths and levels, the largest that still read at H covered 15.2% of the area on a long payload and only 4% on a short link. The validator reports the area yours covers and whether it still decoded, which is the only test that settles it.
Yes. The level is encoded in the code itself, so it is read back rather than guessed: L recovers about 7% of the codewords, M about 15%, Q about 25% and H about 30%. It also reports the version and module count — a version 2 code is 25 modules across — which is what decides how fine it prints at a given size.
Upload it here and the checks are ordered by how often each one is the cause. Most failures are the quiet zone, the contrast, or a logo covering more than the error correction can rebuild. If it will not decode here at all, the picture itself is usually the problem — too small, too soft, cropped into the pattern, or photographed at an angle. What this cannot tell you is whether a code that measures well will survive a particular printer and a particular phone; for that, print one and scan it.
No. The page contains no way to send anything — no fetch, no XMLHttpRequest, no form — so the image is read by your browser and measured by JavaScript in the same tab. That matters here more than usual, because the codes people most want to check before printing are the ones carrying a payment address or an internal link.

Related tools