The developer-first dynamic QR API

Print once. Edit forever.

The dynamic QR API for developers and print shops. Generate at 600 DPI, edit destinations after print, track scans by country and device. Bulk endpoints, signed webhooks, REST API on every plan.

No credit card. Free trial - 5 generations/mo, 1 dynamic QR with 1 destination edit, 50 scans/mo.

$7/mo

Production API from

600 DPI

Print resolution

5,000/req

Bulk endpoint

99.9%

API uptime SLA

Print once. Edit forever. The dynamic QR API for developers and print shops.

See it in motion

Your campaign, watched live

One screen, one printed QR, every scan accounted for. Edit destinations on the fly without reprinting a single sticker.

qrstudio.agency/app/dynamic/sps26
Dynamic QR

Spring sale 2026

q.qrstudio.agency/q/sps26Live
Scans · last 30 dayspeak 365 / day
Top destinationsThis month
  • /spring-sale12,487
  • /summer-sale7,842
  • /black-friday4,310
  • /holiday2,701
Recent scans
  • 🇨🇦MontréaliOS Safari12s ago
  • 🇫🇷ParisAndroid Chrome34s ago
  • 🇯🇵ShibuyaiOS Safari1m ago
  • 🇺🇸BrooklynAndroid Chrome2m ago
Scans this month
29,384
+18.2% vs. previous period
Top country
🇨🇦 Canada
42.1% of scans
Active dynamic QRs
24
all editable
Edit destination
Destination URL
https://yourbrand.com/spring-sale

All printed QRs reroute in under 2 seconds. No reprint.

Same stack your customers already trust

Stripe
Cloudflare
Vercel
Railway
Resend

Stripe billing · Cloudflare DNS + custom-domain TLS · Resend transactional email · Sentry error monitoring.

How dynamic QR codes actually work

The same QR. Three lives.

What a dynamic QR lets you do that a static one can't.

Print

Print 10,000 flyers carrying a QR pointing at /spring-sale. The QR encodes a short URL on your domain - once etched, never re-rendered.

Track

Watch every scan come in: country, city, device, browser, hour-of-week heatmap. Filter by referer or A/B variant. No tracking pixels needed.

Edit

Sale ends? Switch the destination to /summer-sale in 2 clicks. The QR on every printed flyer instantly redirects to the new page. Zero reprint cost.

The QR encoded on your physical asset never changes. Only what's on the other end of it does. That's the whole pitch.

One endpoint. Pick your stack.

Native SDKs for Python and TypeScript. Or just hit the API with any HTTP client - no wrapper required.

curl -X POST https://api.qrstudio.agency/api/v1/generate/ \
  -H "X-Api-Key: smk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": "https://yourbrand.com",
    "size_inches": 4,
    "format": "png"
  }' \
  --output qr.png

Full quickstart · pip install qrstudio · npm install @qrstudio/sdk

One field away from dynamic

Static to dynamic, in one diff

Change data into data_type: "dynamic" and the same QR becomes editable forever, with scan analytics and webhooks attached.

examples/spring-sale-qr.sh
01 curl -X POST https://api.qrstudio.agency/api/v1/generate/ \
02 -H "X-Api-Key: smk_..." \
03 -H "Content-Type: application/json" \
04 -d '{
05- "data": "https://yourbrand.com/spring-sale",
05+ "data_type": "dynamic",
06+ "payload": {
07+ "name": "Spring sale 2026",
08+ "destination_url": "https://yourbrand.com/spring-sale"
09+ },
06 "size_inches": 4,
07 "format": "svg"
08 }' \
09 --output qr.svg
10
15+# Response now carries X-QR-Dynamic-Id - PATCH it later to redirect
16+# anywhere without re-printing. Every scan logs to /api/v1/dynamic/<id>/analytics/.

Or skip the boilerplate

Raw fetch → typed SDK, side by side

Drop in @qrstudio/sdk and the same script ships dynamic QRs, scan analytics, and a typed client - in five lines.

campaigns/spring-sale.ts
01 import { writeFile } from "node:fs/promises";
02+import { QRStudio } from "@qrstudio/sdk";
02
03-const res = await fetch(
04- "https://api.qrstudio.agency/api/v1/generate/",
05- {
06- method: "POST",
07- headers: {
08- "X-Api-Key": process.env.QR_KEY!,
09- "Content-Type": "application/json",
10- },
11- body: JSON.stringify({
12- data: "https://yourbrand.com/spring",
13- size_inches: 4,
14- }),
15- },
16-);
17-const buf = Buffer.from(await res.arrayBuffer());
18-await writeFile("qr.png", buf);
04+const qr = new QRStudio({ apiKey: process.env.QR_KEY! });
05+
06+// Dynamic QR - destination editable forever, scan analytics built-in
07+const code = await qr.dynamic.create({
08+ name: "Spring sale",
09+ destination_url: "https://yourbrand.com/spring",
10+ size_inches: 4,
11+});
12+await writeFile("qr.png", code.bytes);

Everything competitors gate behind enterprise.

In Starter for $7. Or Pro for $19.

Pixel-perfect rendering

Rounded modules, square finder patterns, custom colors, transparent backgrounds, neon-alpha logo backings. ERROR_CORRECT_H baked in.

Print-ready up to 15″

Up to 4500×4500 PNG (15″ at 300 DPI) or scalable SVG. Stickers, posters, billboards: scannable from across the room.

Dynamic QRs with editable destinations

Encode a short URL once, change the destination forever. Don't reprint. Scan analytics on every redirect.

Bulk endpoint with manifest

Up to 5,000 QRs per POST. Returns a ZIP plus manifest.json. Render cache makes re-runs free.

Deep scan analytics

By country, city, device, browser, hour-of-week heatmap, geo pins, A/B variant split. Pro+ unlocks the full picture.

Custom domain white-label

Agency tier: route every dynamic QR through qr.yourbrand.com. Auto-TLS via Cloudflare for SaaS.

HMAC-signed webhooks

Get pinged on every scan, dynamic create/update, quota threshold. Stripe-style signature verification. Retries with exponential backoff.

Production-grade auth

SHA-256 hashed API keys, scoped permissions (read / generate / dynamic-write), 7-day rotation grace, audit log on every call.

7 data types out of the box

URL, vCard, Wi-Fi, mailto, SMS, geo, plain text. The API formats correctly so every scanner triggers the right action.

Built for three buyers.

Pick your fit. Same API, same dashboard. The use case is the workflow on top.

Why teams pick QR Code Agency

Defensible by default.

Concrete things competitors charge $99+/mo for.

ERROR_CORRECT_H on every render

30% of modules can be obstructed before scannability drops. Logos, smudges, print bleed: scans keep working.

Up to 4500×4500 px / 600 DPI

15″ at 300 DPI or scalable SVG. Stickers, posters, billboards: scannable from across the room.

Bilingual + privacy-first

EN + FR pages, GDPR + CCPA + Quebec Law 25 compliant out of the box. Cookieless analytics, no tracking pixels.

Real API, not a wrapper

Open-source SDKs (pip + npm). HMAC-signed webhooks. Plan-aware rate limits. Audit log on every call.

Beta - May 2026

Be the first customer story.

We ship a new feature every couple of days. Early customers shape what comes next. The testimonial slot on this page is yours.

  • Direct line to the founder - Slack/email, no support gate
  • First-month-free coupon on Pro or Agency
  • Logo + quote in this section once you say yes
Email hello@qrstudio.agency

Pricing that scales with your usage, not your funding round.

Every plan, including free, ships dynamic QRs, scan analytics, and the full REST API. No enterprise gates. À-la-carte credits when you don't need a subscription.

Free

$0
  • 5 QRs / mo
  • 3 dynamic · 1 edit · 50 scans / mo
  • PNG + SVG
Start free

Starter

$7/mo USD
  • 200 QRs/mo · custom logos
  • 10 dynamic · scan analytics
  • Bulk + REST API
Choose Starter
Most popular

Pro

$19/mo USD
  • 2,000 QRs/mo · 600 DPI
  • 200 dynamic · A/B testing
  • Webhooks · Deep analytics
Choose Pro

Agency

$99/mo USD
  • 10,000 QRs/mo · 1,000 dynamic
  • 5 team seats · Custom domain
  • Webhooks · HMAC-signed events
Choose Agency

Need volume / SLA / on-prem? Compare all plans or email sales@qrstudio.agency.

Common questions.

A static QR encodes the destination URL directly. Once printed, the URL is locked. A dynamic QR encodes a short URL (q.qrstudio.agency/q/abc12345) that 302-redirects to whatever you set as the destination - and you can change the destination anytime without reprinting. Same QR, new target.

Generate your first QR in 60 seconds.

Free trial - 5 generations/mo, 1 dynamic QR, full REST API. No credit card. Upgrade in one click when you outgrow it.