Developers & agents
Generate a QR code in Next.js
Point next/image at the keyless API (add useqr.app to images.remotePatterns), or proxy it through a route handler so codes are cached at your own edge. For build-time codes, fetch during static generation; for OG images, compose the PNG into ImageResponse. No key or SDK required.
next/image against the API
The keyless API is just an image URL, so
next/image can optimise it like any remote image. Allow the host first:
// next.config.js
module.exports = {
images: {
remotePatterns: [{ protocol: "https", hostname: "useqr.app" }],
},
};
import Image from "next/image";
<Image
src={`https://useqr.app/api/v1/qr?data=${encodeURIComponent(url)}&size=512`}
width={256}
height={256}
alt={`QR code linking to ${url}`}
/>
Honestly, next/image buys little here — the API already serves an optimised PNG with
Cache-Control: immutable — so a plain <img> (see the
React page) is equally good and skips the
config.
Route-handler proxy
To serve codes from your own domain — same-origin CSPs, your own CDN keys, no third-party hostname in the markup — proxy through a route handler:
// app/qr/route.ts
export async function GET(request: Request) {
const data = new URL(request.url).searchParams.get("data") ?? "";
const upstream = await fetch(
`https://useqr.app/api/v1/qr?data=${encodeURIComponent(data)}&size=512`,
{ cache: "force-cache" }
);
return new Response(upstream.body, {
headers: {
"Content-Type": "image/png",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
}
<img src="/qr?data=..."> now works anywhere in your app. cache: "force-cache" lets
Next's data cache absorb repeat upstream fetches, and the immutable response header lets
your CDN edge hold the bytes — after the first request per payload, useqr.app is never
contacted again. Broader caching patterns are in
caching and CDN strategy for QR images.
Build-time generation
For a static site with many codes — one per product page, say — fetch during static generation so zero requests happen at runtime:
// in a server component with generateStaticParams
const res = await fetch(
`https://useqr.app/api/v1/qr?data=${encodeURIComponent(url)}&format=base64`
);
const b64 = await res.text();
// <img src={`data:image/png;base64,${b64}`} ... />
format=base64 returns the PNG as base64 text, which drops straight into a data URI in the
prerendered HTML. For thousands of pages, batch it: POST /api/v1/qr/batch takes up to
100 items per call. Fully offline builds can use the qrcode npm package instead — see the
Node page.
QR codes in OG images
ImageResponse (from next/og) composes JSX to a PNG for social cards. It renders plain
<img> elements, so a QR code is just another element in the card:
new ImageResponse(
<div style={{ display: "flex", width: "100%", height: "100%" }}>
<img src={`https://useqr.app/api/v1/qr?data=${encodeURIComponent(url)}`}
width={220} height={220} />
</div>,
{ width: 1200, height: 630 }
);
Keep the code at least 200 px in a 1200 px card and leave the quiet zone clear of background art — OG images get scanned off other people's screens more often than you would think.
Verify before deploy
A build step that generates codes should decode them too: GET /api/v1/verify with the
same parameters returns scannable and a list of issues. Wire it into CI as described in
why verify that your QR code decodes.
FAQ
How do I show a QR code in a Next.js app?
Point an img or next/image at the keyless API with the payload URL-encoded. For next/image, add useqr.app to images.remotePatterns first.
How do I serve QR codes from my own domain?
A small route handler that fetches the API and streams the PNG back with an immutable cache header. Your CDN then holds each code after the first request.
Can I generate QR codes at build time?
Yes — fetch with format=base64 during static generation and inline the result as a data URI, or use the qrcode npm package for a fully offline build.
Can I put a QR code in an Open Graph image?
Yes. ImageResponse renders img elements, so include the API URL as an element in the card. Keep it at least 200 px wide with a clear margin.
Try it — free, no signup
Related
- A free QR code API with no key — UseQR's REST API needs no signup, no API key and no SDK. GET /api/v1/qr?data=hello returns a PNG. The shortest form is /q/hello.png, which drops straight…
- Generate a QR code in React — React QR component patterns: an <img> against the keyless API, qrcode.react for client-side rendering, SSR notes and accessible alt text.
- Generate a QR code in Node.js — Server-side QR generation with the qrcode npm package — files, data URLs, SVG strings, streaming into HTTP responses — and when to proxy the keyless API.
- Caching and CDN strategy for QR images — QR codes are pure functions of their parameters, so cache them forever: immutable Cache-Control, hash-keyed storage, CDN edge caching, and why cache-busting is wrong.