Skip to content
Spellkit

How Much Data Can a QR Code Actually Hold?

A QR code's capacity depends on its version (grid size), its error correction level, and what kind of data you're encoding — and the three trade off directly against each other.

A QR code that scans instantly for a short URL can turn into a dense, hard-to-scan grid for a longer payload — same format, wildly different reliability. The reason comes down to three interacting variables: version, error correction, and encoding mode.

Version: the grid size

QR codes come in 40 standardized sizes, called versions, from Version 1 (21×21 modules) to Version 40 (177×177 modules). More modules means more data capacity, but also a denser, harder-to-scan image at small print sizes — a Version 40 code shrunk to fit a business card becomes unreadable to most phone cameras, since the individual modules become smaller than the camera can resolve. Generators pick the smallest version that fits the data, which is why a short URL produces a much simpler-looking code than a long one.

Error correction: trading capacity for damage tolerance

QR codes use Reed-Solomon error correction, which means part of the encoded data is redundant — specifically so the code can still scan correctly even if it's partially obscured, smudged, or has a logo placed over the middle. Four levels are standardized:

  • L (Low) — ~7% of the code can be damaged and still scan. Maximum data capacity.
  • M (Medium) — ~15% damage tolerance. The common default.
  • Q (Quartile) — ~25% damage tolerance.
  • H (High) — ~30% damage tolerance. Lowest data capacity, but the only level that reliably survives a logo overlay.

Higher error correction doesn't add resilience for free — it works by encoding more redundant data in the same grid, which leaves less room for the actual payload. This is why a code with a logo in the center (common in restaurant menu QR codes) needs High error correction specifically, and correspondingly can hold less raw data than the same-size code at Low.

Encoding mode: not all characters cost the same

QR codes support several encoding modes, each packing bits differently:

  • Numeric — digits only, packed 3 digits per ~10 bits. The most efficient mode.
  • Alphanumeric — digits, uppercase letters, and a small set of symbols, packed 2 characters per 11 bits.
  • Byte — arbitrary bytes (any UTF-8 text, lowercase letters, most URLs), packed 1 byte per 8 bits — noticeably less efficient than the other two.

A URL with lowercase letters (https://example.com) is encoded in Byte mode, not Alphanumeric, even though it's technically "just text" — which is why URLs consume capacity faster than an equivalent-length string of pure digits.

Rough capacity numbers

At the largest version (40) with the lowest error correction (L), a QR code can hold roughly 7,089 numeric digits, 4,296 alphanumeric characters, or about 2,953 bytes of arbitrary text/binary data. At the highest error correction (H), that byte capacity drops to roughly 1,273 — less than half — because so much of the grid is now redundant error-correction data instead of payload.

The practical takeaway

For anything meant to be scanned reliably in the real world — printed, potentially creased, possibly with a logo — shorter input and higher error correction both matter more than squeezing in extra data. A shortened URL scans faster and more reliably than a long one at the same physical size, for exactly this reason.

Spellkit's QR Code Generator lets you set the error correction level directly and generates the code entirely client-side.