Skip to main content
QR code styles

Style a QR code until it looks like yours — then prove it still scans

Module shapes, eye styles, colours, gradients, a logo, a caption frame. Every download format is free with no account, there is no watermark on anything, and no style reaches the picker until a decoder has read it back.

No sign-up, no card, no trial clock. Static codes are unlimited.

A plain black-and-white QR code with square modules that opens this page
Plain shape=square · eye=square
The same QR code styled with rounded modules, round eye centres and a deep blue ink
Styled shape=rounded · eye=dot · fg=#1A6AC2

Neither of these is a screenshot. Both are live responses from this site's free QR API, fetched when you loaded the page, with the exact parameters printed underneath. Point a phone at either — they both open this page.

What actually makes a code get scanned

A QR code is not a picture. It is a grid a camera measures. Four things decide whether a phone can read yours, and every one of them is a design decision that is easy to get wrong.

1

The quiet zone is part of the code

The pale margin around a code is not padding. A scanner uses it to find where the grid stops. Our API renders four modules of it by default and the generator gives you a slider, but the danger is downstream: trimming into that band is the single most common reason a printed code stops working.

2

Contrast beats cleverness

Dark modules on a light background. Inverted codes and low-contrast colour pairs are the second most common failure. It is also why every code on this page stays dark-on-white even when you switch the site to a dark scheme: a code that matched the page would be a picture of a code that does not scan.

3

Module size, in millimetres

One square of the grid has to survive both the printer and the camera. Common print guidance puts the floor around 0.4–0.5 mm. Our print templates measure the printed module size for the code you dropped in, warn you below 0.7 mm, and refuse the download below 0.5 mm rather than let you order a batch that will not scan.

4

Error correction is a budget

Levels L, M, Q and H trade data capacity for redundancy. Add a logo and the generator raises the level for you, because a logo is damage you are choosing to inflict on the middle of the grid. You can still set the level by hand.

We decode-test the styles, and we publish the failures

A styled QR code can look immaculate and be unreadable, and the place you usually find out is the print run. So we measure ours, twice, and both records are checked into the repository rather than summarised on a slide.

Both numbers are real and they disagree, which is the useful part: a shape that needs a camera's forgiveness is not the same as a shape that reads cleanly under a strict decoder. Being straight about what is wired up today — the generator's own picker offers five of these twelve module shapes plus one more, classy-rounded, that predates this sweep and is not among the 432; the free API exposes three module shapes and two eye styles. The twelve-shape renderer above is verified and ready but not yet the thing drawing your code on this site. Every code on this page came from the narrower shipped set.

A footnote on the finder patterns, since we are being honest: the solid timing row was added on the theory that it would rescue the sparse shapes, and the sweep came back byte-identical with and without it. The gaps were the real culprit. It stays because it is the correct thing to draw, not because it fixed anything.

The style options

The six tiles below are being rendered right now by the free API described further down this page, and the parameters under each one are the real ones. Every code encodes this page's address, so you can check any of them with your phone.

QR code with square modules and square eyes
shape=square
eye=square
QR code with rounded modules and square eyes
shape=rounded
eye=square
QR code with circular dot modules and square eyes
shape=dots
eye=square
Green QR code with square modules and round eye centres
shape=square
eye=dot · fg=#0F7B6C
Blue QR code with rounded modules and round eye centres
shape=rounded
eye=dot · fg=#1A6AC2
Purple QR code with dot modules and round eye centres
shape=dots
eye=dot · fg=#701A75

What the browser generator adds on top

Three more module shapes

Extra-rounded, classy and classy-rounded, on top of the square, rounded and dots the API exposes. Plus a third eye frame, extra-rounded.

Gradients as well as solid colour

Pick a start colour, an end colour and a background, or begin from one of the built-in palettes. The contrast rule from the section above still applies, and it is still on you to keep the dark end dark.

A logo, cropped where you want it

Upload an image logo with drag-to-reposition, zoom and size, or type a short text logo instead. Error correction is raised automatically so the code survives the hole you just made in it.

Eight caption frames

Banner top, banner bottom, pill, ticket, speech bubble, brackets, phone and ribbon, each carrying your own short call to action of up to 24 characters. The test suite checks that no frame's canvas encroaches on the code's quiet zone.

A photo blend mode

Composites a genuine QR code onto a real image rather than hoping a generated picture happens to be scannable. The blend slider is clamped to the range that survived binarised decoding, which is what a phone camera actually does before it reads.

Everything runs in your browser

A static code is built locally. Your link, your logo and your text do not need to reach our servers at all for you to design and download the file.

Every download format is free

Not free-as-in-trial. There is no file type, no resolution and no transparent background behind a paywall on this site, and there is no watermark on anything, ever. What the paid plans buy is editable dynamic codes and the things we run for them — never a file type.

Format What it is for Ceiling Price
PNG Screens, slides, social, anything happy with a background. Up to 4096 × 4096 px Free, no account
Transparent PNG Dropping a code onto a coloured panel or a photograph. Up to 4096 × 4096 px Free, no account
JPG For the system that will only accept a JPEG. Up to 4096 × 4096 px Free, no account
SVG Vector. Scales to a billboard with no pixels in sight. Any size Free, no account
PDF Vector, and the file a print shop will ask you for. Any size Free, no account
EPS Vector, for older press and design workflows that insist on it. Any size Free, no account

Twelve print templates, drawn in real millimetres

“1024 pixels” tells a printer nothing. These twelve layouts are drawn at their finished trim size, so what you approve on screen is the size that comes back from the press. Put your own words in, drop in any code, and take away a 300 dpi PNG, a vector SVG or a print PDF.

Each template measures the printed module size for the code you dropped in and shows you the number in millimetres. Below 0.5 mm it disables the download instead of letting you order a run that will not scan.

Open the print templates

A free QR API, with no key

One GET request. No account, no API key, no sign-up step in the middle of your afternoon. This is the endpoint that drew every code on this page.

curl "https://qrcodeharbor.com/api/qr?data=https://example.com&size=512" -o qr.png

That returns a PNG. Add format=svg for vector. Responses are CORS-open and cached hard at the edge, so an image tag pointing at it is simply a working QR code — which is exactly how the codes further up this page are drawn:

<img src="https://qrcodeharbor.com/api/qr?data=https://example.com&shape=rounded&eye=dot">

The honest limits: 60 requests a minute per IP address, static codes only, and a 2048 px ceiling — the browser tool and the paid API go to 4096. Nothing is stored and no account is read. It is a pure function of the query string.

Full API documentation
Parameter Accepts Default
dataThe text or URL to encode, up to 1200 charactersrequired
size64 to 2048 pixels512
formatpng, svgpng
eccL, M, Q, HM
fg / bgA hex colour, such as #1A6AC2#000000 / #ffffff
margin0 to 16 modules of quiet zone4
shapesquare, dots, roundedsquare
eyesquare, dotsquare

How this compares, without the invented statistics

There is no scan-lift percentage on this page, because we have never run a study that would produce one. What we have instead is a capture of a competitor's own pricing and product pages, taken on 9 September 2026, and this repository. Where the capture supports a claim it is quoted; where it does not, that is said out loud.

The question What the capture actually shows Here
How many codes on the free tier Bitly’s pricing page lists “2 QR Codes/month” and “5QR Codes/month” among its plan limits; its QR landing page shows tiers at $10, $29 and $199 a month. Captured 8 September 2026. Unlimited static codes. Plus two dynamic, editable codes — two that you keep, not two a month.
Which file types you get Bitly's feature pages list “PNG/JPEG/SVG downloads”. The capture does not say which tier that sits on, so we will not claim it is gated. PNG, JPG, SVG, PDF, EPS and transparent PNG, up to 4096 px, free and without an account.
Whether styling costs money Bitly’s pricing page lists “Advanced QR Code customizations” among its paid-plan features. Captured 8 September 2026. Every shape, eye style, gradient, logo and caption frame is on the free tool. There is no advanced tier of decoration.
Whether the free output is watermarked Not measured. We have no survey of the field and will not invent one. Never. Nothing in this codebase draws a watermark, on any plan, in any format.
What happens when you stop paying Not stated on the pricing page we captured. An ordinary scan is a plain redirect whatever plan the owner is on — the handler never consults a subscription. A code you already printed keeps resolving.
Whether the styles were ever tested We know of no published decode test in this field to compare against. Published above, with the strict-decode failures included and the raw record in the repository.

Two caveats we would rather say than have you find out. A dynamic code does stop if you paused it yourself, gave it an expiry date, put a password on it or deleted it — and it still needs our servers to answer. The only code that depends on nobody is a static one, which carries your link inside the pattern itself; that is what a QR code that never expires means here, and it is free.

Style one now

It costs nothing, and nothing on this page needs an account.