Free QR code API โ€” scannable QR codes from a URL, PNG or SVG, no key

You need a QR code in an app, an email, a ticket PDF, a poster, a terminal script โ€” and you don't want to vendor a QR library into every codebase, run an image service, or paste strings into a generator website one at a time. The URL-parameter pattern solves this: put your data in a query string, get image bytes back, and let an <img> tag or a curl -o do the rest.

Mockbird serves QR codes exactly that way โ€” no key, no signup, no watermark, and the same URL returns the same bytes forever, so caches and CDNs love it:

The 10-second version

# a scannable 256x256 PNG โ€” this URL works right now
curl -o qr.png "https://mockbird.mockbird.workers.dev/m/demo/qr?data=https%3A%2F%2Fexample.com"

# bigger, with a size in the path
curl -o qr.png "https://mockbird.mockbird.workers.dev/m/demo/qr/500?data=hello+world"

# vector output for print (crisp at any scale)
curl -o qr.svg "https://mockbird.mockbird.workers.dev/m/demo/qr.svg?data=hello+world"

Or straight in HTML โ€” the classic use:

<img src="https://mockbird.mockbird.workers.dev/m/demo/qr?data=https%3A%2F%2Fexample.com"
     width="256" height="256" alt="QR code">

QR code, 120px QR code with custom colors QR code with high error correction

All the parameters

ParamWhat it doesDefault
dataThe payload โ€” URL, text, wifi string, anything. โ‰ค1000 chars, UTF-8. Aliases: text, url. URL-encode it.required
size / /qr/:sizeOutput size in px, square. 64โ€“2000.256
format=svg / .svgVector output instead of PNG โ€” crisp at any print size.PNG
eccError-correction level L/M/Q/H. Higher survives more damage (logos, smudges) but fits less data.M
marginQuiet zone in modules, 0โ€“16. The spec minimum for reliable scanning is 4.4
fg / bgColors, 3- or 6-digit hex without #. Keep dark-on-light โ€” many readers fail on inverted codes.black / white

Payloads people actually encode

# a URL (the 95% case)
โ€ฆ/qr?data=https%3A%2F%2Fexample.com%2Fmenu

# wifi credentials (scan โ†’ join network)
โ€ฆ/qr?data=WIFI%3AT%3AWPA%3BS%3Amynet%3BP%3Asecret123%3B%3B

# mailto / tel
โ€ฆ/qr?data=mailto%3Ahello%40example.com
โ€ฆ/qr?data=tel%3A%2B15551234567

# plain text (event check-in codes, ticket ids)
โ€ฆ/qr?data=TICKET-2026-000451

Encoding tip: always URL-encode the payload. &, ?, #, + and spaces inside an unencoded data= will be eaten by query parsing โ€” encodeURIComponent() in JS, urllib.parse.quote() in Python, --data-urlencode with curl.

Generate a batch from your shell

> for id in 001 002 003; do
    curl -s -o "ticket-$id.png" \
      "https://mockbird.mockbird.workers.dev/m/demo/qr/400?data=TICKET-$id&ecc=Q"
  done

Because output is deterministic, re-running the loop produces byte-identical files โ€” safe for build pipelines and reproducible artifacts.

Honest comparison

Mockbirdgoqr.me (api.qrserver.com)QuickChart /qra QR library
Key / signupnonenonenonen/a
PNGโœ”โœ” (+ GIF/JPEG/EPS)โœ”depends
SVGโœ”โœ”โœ”depends
Free volumegenerous per-project daily capinformal ~10k/day courtesy1,000 renders/month, 60/minunlimited (your CPU)
Center logo imageโœ˜โœ˜โœ”some
Decode/read APIโœ˜โœ”โœ˜some
Deterministic bytesโœ”not guaranteednot guaranteedโœ”
Also a full mock REST APIโœ”โœ˜โœ˜โœ˜

Being upfront: goqr.me has run a solid free QR endpoint for over a decade and also reads QR codes โ€” if you need decoding or EPS output, use it. QuickChart is open-source (you can self-host the AGPL server) and supports embedding a center logo image, which we don't. Mockbird's angle: the QR endpoint lives next to your mock REST API, placeholder images, avatars and OG cards under one project URL โ€” one host to remember for everything a frontend needs before the real backend exists. And offline/air-gapped builds should always vendor a library instead of calling anyone's API.

Pairs well with the rest of your mock backend

Seeded mock data + QR endpoint composes nicely: render a QR per record with nothing but string interpolation.

// e.g. a ticket list from the demo API, each with its own QR
const res = await fetch("https://mockbird.mockbird.workers.dev/m/demo/orders?limit=5");
const orders = await res.json();
document.body.innerHTML = orders.map(o =>
  `<img src="https://mockbird.mockbird.workers.dev/m/demo/qr/160?data=ORDER-${o.id}" width="160">`
).join("");

Limits

โšก These URLs run on the shared demo project and work forever. Want your own namespace (and a full mock REST API + placeholder/avatar/OG endpoints alongside it)? One click creates a project โ€” no signup.

Full reference in the docs. More image guides: placeholder image API ยท PNG placeholder API ยท OG image API ยท chart image API ยท avatar API ยท identicon API. Create your API โ†’