GeneratorsFreeNo signup

QR Code Generator

A QR code carries its own repair kit. Denso Wave, which invented the symbology and wrote what became ISO/IEC 18004, publishes four error correction levels: approximately 7% of the codewords recoverable at L, 15% at M, 25% at Q, 30% at H. That redundancy is not free, it is stored in the code, and raising the level on a fixed canvas makes every black square smaller. The controls above set both: level M by default, and a four-module margin on every code. The figures below are measured from this page's own output.

Last updated 2 October 2026

Download PNG
Generated QR code

Enter text and generate.

Read this before you print anything. This page does not build the code on your device. It puts your text into the query string of a request to api.qrserver.com, a third-party service, and shows you the image that comes back. It does that once automatically when the page loads, with whatever is already in the box. The code it returns is error correction level M with a four-module quiet zone, both asked for by this page. That service's own defaults are level L and no quiet zone, which is what this page shipped until 4 October 2026.

The four levels, and what each one is actually promising

Denso Wave invented QR Code and still publishes the reference material behind it. Its page on the error correction feature states the design plainly: QR Code has error correction capability to restore data if the code is dirty or damaged. Four error correction levels are available for users to choose according to the operating environment. Raising this level improves error correction capability but also increases the amount of data QR Code size.

The published capability table reads:

LevelError correction capability
LApprox 7%
MApprox 15%
QApprox 25%
HApprox 30%

The footnote under that table is the part almost every other page drops, and it changes what the number means: the figures are the Data restoration rate for total codewords (codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits.) So level H does not mean you can tear 30% off the picture. It means 30% of the codewords, the eight-bit units the symbol is built from, can be unreadable and the data still comes back. Damage concentrated on a finder pattern, the three big squares in the corners, can stop a scan long before you reach any percentage, because the reader needs those to locate and orient the symbol in the first place.

The mechanism is Reed-Solomon coding, which Denso Wave describes as a mathematical error correction method used for music CDs etc., originally developed as a measure against communication noise for artificial satellites and planetary probes. Its worked example is a good sanity check on the arithmetic: if 100 codewords are to be encoded and 50 of them need correcting, 100 codewords of Reed-Solomon are required, giving 200 total of which 50 are correctable, Thus, the error correction rate for the total codewords is 25%. This corresponds to QR Code error correction Level Q.

Denso Wave's own guidance on choosing: Level Q or H may be selected for factory environment where QR Code get dirty, whereas Level L may be selected for clean environment with the large amount of data. Typically, Level M (15%) is most frequently selected.

What the level costs, measured on this page's own output

Redundancy occupies space in the symbol, so the same payload at a higher level needs a bigger symbol. QR symbols come in 40 fixed sizes, called versions, from Version 1 at 21 by 21 modules to Version 40 at 177 by 177, and Each higher version number comprises 4 additional modules per side. A module is one black or white square.

Below is the URL https://example.com/spring-sale?utm_source=flyer&utm_medium=qr, which is 62 bytes, generated four times through this page's own API call at the default 256-pixel size. The version was read back by measuring the finder pattern in each returned PNG, and then checked against Denso Wave's published capacity table.

LevelVersionModulesModule size at 256 pxBytes that version holds
L433 x 337.6 px78
M433 x 337.6 px62
Q641 x 416.1 px74
H745 x 455.6 px64

Read the last column against the 62 bytes going in and the table explains itself. Version 4 holds 78 bytes at L and 62 at M, so both fit. At Q, Version 4 holds only 46 and Version 5 only 60, so the symbol jumps to Version 6. At H, Version 6 holds 58, so it jumps again to Version 7. Going from L to H on this URL costs 12 modules per side and shrinks every square a camera has to resolve by about a quarter, on an image that never changed size.

The boundaries are sharp rather than gradual, which is the part that surprises people. At level M, Version 4 holds exactly 62 bytes. That URL is exactly 62 bytes. Adding one character to it moves the symbol to Version 5, from 33 modules per side to 37, verified by generating both: 62 bytes drew modules at 6.9 px and 63 bytes at 6.9 px on a 37-module grid. There is no partial step. You are either inside a version's capacity or you have bought the next one whole.

Why a long URL is a worse code, in pixels

The size field on this page sets the size of the image, not the size of a module. Put more data in and the version climbs, the module count climbs with it, and each module gets smaller because the canvas did not move. Measured at the default 256 pixels, level L:

PayloadModule size at 256 px
20 bytes (https://quikutil.com)10.1 px
62 bytes (the tracking URL above)7.6 px
903 bytes2.4 px
1,203 bytes2.1 px
2,003 bytes1.6 px

Those were measured at level L with no quiet zone, which is what this page sent before 4 October 2026; with the four-module quiet zone it now requests, the 62-byte row measures 6.3 pixels rather than 7.6, because the margin comes out of the same canvas. Those are module sizes read directly out of the returned files. The exact version for the three long rows is not quoted here because measuring a 2-pixel module from a rendered PNG cannot separate one version from its neighbour reliably, and a figure that cannot be measured to that precision should not be stated to it. The module size can be, and it is the number that decides whether a camera can read the thing.

The practical consequence is the opposite of the instinct. Faced with a code that will not scan, people make the image bigger. The cheaper fix is usually to shorten what is in it, because a redirect behind a short domain turns a 200-byte payload into a 20-byte one and buys back module size that no amount of enlargement gives you on a crowded page.

The margin is part of the code, and this page adds it

A QR symbol is defined with an empty border around it. Denso Wave: The margin is a clear area around a symbol where nothing is printed. QR Code requires a four-module wide margin at all sides of a symbol. It is called the quiet zone, and it is what lets a reader tell where the symbol stops.

The service this page calls documents its quiet zone parameter as defaulting to 0 (=no "quiet zone"), and adds the recommendation itself: An at least 1 module wide quiet zone is required for optimal scanning results. The QR code standard recommendes a "quiet zone" of 4. This page sends that parameter, set to 4. Until 4 October 2026 it sent nothing, and a separate pixel margin parameter defaults to 1, so what came back had a one-pixel white border.

Counting the uniform border rows in a generated file, measured 4 October 2026 on the 62-byte URL above: 25 pixels at a 256-pixel canvas, 98 pixels at 1000. Before the fix it was exactly one pixel. The quiet zone is carved out of the canvas you asked for rather than added around it, so the squares get smaller as the margin appears: the same URL measured 7.6 pixels per module at 256 pixels with no quiet zone and 6.3 with one. If the code has to survive a camera at a distance, raise the pixel size rather than dropping the margin.

The preview above hides this, and that is worth knowing because it defeats the obvious test. The image element on this page carries 12 pixels of white CSS padding, so on screen the code sits in a white frame and scans off a monitor without complaint. That padding is a property of this web page. It is not in the PNG. The file now carries its own four modules, so pasting it onto a dark poster no longer removes the thing the standard called for. Keep that border intact: cropping to the black squares puts you back where this page started.

Printing it: the arithmetic the inventor publishes

Denso Wave sets out the calculation for physical size, and it is short enough to do in your head once you have seen it. Its worked example encodes 50 alphanumeric characters at level M. From the capacity table that needs Version 3, because Version 2 with Level M holds only 38 characters, and Version 3 is 29 modules per side.

Choose a printer resolution and a number of printer dots per module. At 400 dpi with 4 dots per module: (Equation: 25.4 mm/inch ÷ 400 dpi × 4 dots/module = 0.254 mm/module). Then Version 3 = 29 modules, therefore, the size of QR Code is 29 modules × 0.254 mm/module = 7.366 mm, and adding the quiet zone, Secure a four-module wide margin. 7.366mm + 0.254mm/module × 8 modules = 9.398mm. Eight modules, not four, because the margin lands on both sides.

So a 50-character code at a perfectly ordinary print resolution occupies under a centimetre square, and nearly a quarter of that square is margin. When the result does not fit the space you have, Denso Wave lists three levers and no others: Decrease the symbol version. Make the module size smaller. Split the QR Code symbol. Decreasing the version means shortening the data or dropping the correction level. Making the module smaller means betting on the scanner.

Accents, Kanji and emoji

Non-ASCII text works here, and it is charged in bytes. The page percent-encodes your text as UTF-8 and the service documents UTF-8 as its default source and target charset. The string café ☕ 日本語 naïve is 16 characters but 26 UTF-8 bytes, because the accented letters take two bytes each and the emoji and the CJK characters take three. Generated through this page it produced a Version 2 symbol, which holds 32 bytes at level L. Six bytes of headroom on something that looked like a short phrase.

One caveat comes from the service's own documentation rather than from us: Unfortunately, the QR code specification does not provide a place to store the used charset within a QR code. This means that QR code readers have to take a guess, or always assume a certain charset. Some older software even just ignores non ASCII characters. We have not verified that claim against ISO/IEC 18004 itself, which is not published free of charge, so treat it as the vendor's position rather than as settled. What we did verify is that the bytes go out as UTF-8 and the symbol sizes come back consistent with the published capacity tables.

What this page does not know

It does not know where the code will end up. Every number above about scanning assumes a camera, a distance and a light level that nobody here can see, and the error correction level, the quiet zone and the module size are the only three things under anyone's control.

It does not know whether your link will still work. A QR code is a fixed string of bytes; it has no redirect of its own. Encode a URL that moves and the printed code is dead, and no error correction level helps with that.

It cannot tell you whether the code scans, because it never reads one back. Generating a symbol and decoding a symbol are different jobs and this page only does the first.

It does not keep your text private. The text is in the query string of a request to a third party before any image exists.

It does now set the two parameters that matter most. Level defaults to M and is yours to change, and every code is requested with a four-module quiet zone, rather than the service's defaults of the weakest level and no margin at all.

Sources

Every quotation above was read from the page named on 2 October 2026 and checked against the downloaded bytes of that page rather than against a search summary. The module sizes, symbol versions and image dimensions were measured by generating codes through this page's own API call and reading the returned PNG files directly; where a measurement could not resolve a version it is reported as a module size only. Part of the QuikUtil tools collection.

Frequently asked questions

Which error correction level does this page use?

Level M unless you change it, and the menu above offers all four. The page sends your choice as the service's ecc parameter. Denso Wave puts M at approximately 15% of codewords recoverable and calls it the level most frequently selected. Until 4 October 2026 this page sent no ecc parameter at all, so every code came back at L, approximately 7%, which the service documents as the value used if no or invalid value is set. Raise the level if the code will be printed, handled, or stuck to anything that gets scuffed.

How much capacity does a higher level cost?

On a 62-byte URL, measured on this page's own output: level L and level M both fit Version 4 (33 by 33 modules), level Q needs Version 6 (41 by 41) and level H needs Version 7 (45 by 45). Denso Wave's capacity table explains it exactly, because Version 4 holds 78 bytes at L, 62 at M, 46 at Q and 34 at H. Same URL, same page, four different symbol sizes.

Why does a longer URL scan worse?

Because the canvas does not grow with it. At the default 256 pixels, a 20-byte URL draws modules about 10.1 pixels across. A 903-byte one draws them at 2.4 pixels, and a 2,003-byte one at 1.6 pixels. The picture is the same size; the squares a camera has to resolve are six times smaller. Shorten the URL before you enlarge the image.

What margin does the downloaded PNG have?

Four modules, which is what Denso Wave requires: QR Code requires a four-module wide margin at all sides of a symbol. Measured on 4 October 2026 by decoding the returned file, the 62-byte URL used elsewhere on this page comes back with a 25-pixel uniform border at 256 pixels and a 98-pixel one at 1000. Until that date the page sent no quiet zone parameter and the border was one pixel, which the preview hid, because the image element carries 12 pixels of white CSS padding that is not in the file.

Is the text I type kept in my browser?

No. This page builds https://api.qrserver.com/v1/create-qr-code/ with your text in the query string and loads the image from that third-party server, so the text reaches them and can appear in their request logs. It also runs once on page load with whatever is already in the box. Nothing is encoded on your device.

Can I ask for a 1024-pixel code?

No, and the field now stops at 1000. The service documents a maximum of 1000 by 1000 for PNG and falls back silently above it: measured 4 October 2026, requesting 1000 returns a 1000-pixel file and requesting 1001 returns a 250-pixel one, HTTP 200 and no error either time. Until that date this field accepted 1024, the image element was still set to the size you asked for, and the browser scaled a 250-pixel file up to fill it, which looks like a blurry code rather than a wrong one. Type a larger number now and the page reduces it to 1000 and says so.

Does it handle accents, Kanji and emoji?

Yes, as UTF-8, but count bytes rather than characters. café ☕ 日本語 naïve is 16 characters and 26 UTF-8 bytes, against the 32 bytes a Version 2 symbol holds at level L. The API's own note is worth reading before you rely on it: the QR code specification does not provide a place to store the used charset within a QR code. This means that QR code readers have to take a guess, or always assume a certain charset.

Why does the Download PNG button not always download?

It does now. The HTML standard only treats the download attribute's filename as trusted when response origin is the same origin as interface origin, and the image comes from api.qrserver.com rather than from quikutil.com, so until 4 October 2026 some browsers navigated to the image instead of saving it and ignored the qrcode.png name. The button now fetches the bytes and saves them from your own browser, which the service permits because it answers Access-Control-Allow-Origin: *. If that fetch fails for any reason the button falls back to opening the image, which is the old behaviour rather than nothing.

Related tools