Respawn Tech Dev

Marketing & QR Codes

Dynamic QR CodeQR codes with editable destinations, custom design and analytics for every scan.

Documents

HTML to PDFConvert HTML and CSS to PDF, PNG or JPG — one document or 500 at once.

Artificial intelligence

Knowledge baseSemantic search over your documents for AI chatbots, assistants and agents.
See all products→
  • Developers
  • Use cases
  • Docs↗
  • Blog
Pricing
Sign inSign up
Respawn Tech Dev

Products

Dynamic QR CodeHTML to PDFKnowledge baseSee all products →

Resources

PricingDevelopersUse casesDocsBlog
Sign upSign in
  1. Home
  2. /Blog
  3. /Security
  4. /Quishing: how to use dynamic QR codes to defend yourself instead of getting attacked
Security

Quishing: how to use dynamic QR codes to defend yourself instead of getting attacked

Quishing grew 146% in 2026. See how scammers abuse dynamic QR codes, how to protect the QR codes you print and how to check URLs via API before the scan.

R

Rychard

Respawn Tech Dev Team

Nov 07, 2026Updated Nov 07, 20268 min read

Share
⚿Security
In this article · 9 sections1 of 9
  1. 01 · What is quishing and why does it get past filters?
  2. 02 · How scammers use dynamic QR codes
  3. 03 · The risk for those who print QR codes
  4. 04 · Defense 1: check the URL before publishing
  5. 05 · Defense 2: change the destination without reprinting
  6. 06 · Defense 3: controls that limit the damage
  7. 07 · Checklist for teams that use QR codes
  8. 08 · Frequently asked questions
  9. Can a QR code have a virus?
  10. How can I tell if a QR code is safe?
  11. Is a dynamic QR code more dangerous than a static one?
  12. What should I do if one of my company's QR codes is tampered with?
  13. 09 · Start with the QR codes already out there

A QR code doesn't look like a link. Nobody hovers over it to see where it goes, and the email filter only sees a black-and-white image. Quishing, phishing through QR codes, grew through that gap by 146% in the first quarter of 2026: from 7.6 million attacks in January to 18.7 million in March, according to Microsoft's quarterly email threat report. It was the fastest-growing vector of the period.

The irony is that the scammers' favorite feature, the dynamic QR code, is also the best defense for anyone who prints QR codes on packaging, menus, invoices or posters. Below is how the attack works and what you can do about it, with code.

Quick summary

Quishing hides a malicious URL inside a QR code. To protect yourself: check every URL before it goes into a QR code, use dynamic QR codes to change the destination without reprinting, limit use with expiration, scan limits or a password, and never ask for a login or card right after a scan.

01What is quishing and why does it get past filters?

In regular phishing, the link is in the text. Email filters and browsers read that text, compare it against lists of dangerous domains and block it. In quishing, the URL is encoded in the modules of an image. Many security tools don't decode the image, so the message goes through clean.

The second effect is the device switch. Someone who gets the email on a laptop points their phone camera at the screen. The attack leaves a computer with antivirus, a corporate proxy and security extensions and lands in a mobile browser, with a shortened address bar and a rush to get things done.

Where the scam shows up

"Re-authenticate your account" emails, fake bills with a payment QR code, stickers placed over the legitimate QR code on parking meters and menus, and flyers offering a "gift" to whoever scans.

02How scammers use dynamic QR codes

A static QR code stores the final URL inside the image. A dynamic QR code stores a short link, and the server decides where to redirect on every scan. Scammers exploit that split: when the message is sent, the QR code points to a harmless page. If a smarter filter decodes the image and follows the link, it finds something clean and lets the message through. Hours later, the destination is switched to the fake page.

Unit 42, Palo Alto Networks' research team, documented this tactic: QR code shorteners turn a static image into a dynamic endpoint, and the attacker can change the redirect at will. In one case they analyzed, the code went through a CAPTCHA before landing on a fake Outlook page. Checking at delivery time isn't enough, because tomorrow's destination doesn't exist yet.

For end users, the practical rule is simple: if a parking meter, a shipping company or a bank asks you to act through a QR code, skip the code and open the official app you already have, or type the address yourself. For anyone publishing QR codes, the lesson is different: your customers will be increasingly suspicious, and the QR code has to give them a reason to trust it.

Dynamic QR code flow: the scan calls /r/{short_id}, the URL safety check returns is_safe; if true, it redirects with a 307 to the destination, if false, it blocks with reason=safety_risk.
What happens on every scan of a dynamic QR code.

03The risk for those who print QR codes

If your company puts QR codes on products or printed material, the problem isn't just a customer falling for a scam. It's a customer falling for a scam that looked like yours. Three scenarios come up often:

  • Sticker on top: someone places a fake QR code over yours on a table, kiosk or parking meter. Visually, nothing changes.
  • Rotten destination: the campaign domain expired, was bought by someone else, and the QR code printed on a thousand packages now leads somewhere else.
  • Static QR code with a mistake: the URL had an error or the page went down, and there's no way to fix it without reprinting.

All three share the same cause: a printed QR code is out of your control once it leaves the print shop. A dynamic QR code gives that control back.

04Defense 1: check the URL before publishing

The first step is cheap: before any URL becomes a QR code, ask whether it's safe. This applies to links your team types and, above all, to links that come from users, partners or integrations. The URL Safety Check API answers in a single call:

curl -sS 'https://api.respawntech.dev/v1/tools/safety/check?url=https://loja.example.com/promo' \
  -H "X-API-Token: $RESPAWN_API_TOKEN"

# { "is_safe": true }
async function isSafe(url) {
  const res = await fetch(
    `https://api.respawntech.dev/v1/tools/safety/check?url=${encodeURIComponent(url)}`,
    { headers: { "X-API-Token": process.env.RESPAWN_API_TOKEN } }
  );
  const { is_safe } = await res.json();
  return is_safe;
}

if (!(await isSafe(targetUrl))) {
  throw new Error("Destino bloqueado: URL marcada como insegura");
}

Fail-open, by design

If the safety check service is down, the route returns is_safe: true so it doesn't block your flow. In critical processes, log the check and repeat it later. The result is cached for 1 hour, so checking the same URL several times in a row doesn't add extra work.

In the Dynamic QR Code this check is built in: malicious URLs are rejected at creation with the dynamic_qr.malicious_url error, and a destination that later becomes unsafe sends the visitor to the QR unavailable page with reason=safety_risk instead of redirecting them.

05Defense 2: change the destination without reprinting

Found out the destination page was compromised, or that the campaign is over? With a dynamic QR code, the printed image stays the same and only the destination changes. It's a PATCH, and editing the destination costs no credits:

curl -sS -X PATCH "https://api.respawntech.dev/v1/tools/image/qr-code/dynamic/$QR_ID" \
  -H "X-API-Token: $RESPAWN_API_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{ "target_url": "https://loja.example.com/aviso-de-seguranca" }'
await fetch(`https://api.respawntech.dev/v1/tools/image/qr-code/dynamic/${qrId}`, {
  method: "PATCH",
  headers: {
    "X-API-Token": process.env.RESPAWN_API_TOKEN,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ target_url: "https://loja.example.com/aviso-de-seguranca" }),
});

During an incident, pointing to a warning page beats deactivating the QR code. Whoever scans understands what happened instead of thinking the code is broken.

06Defense 3: controls that limit the damage

Not every QR code needs to work forever, or for anyone. The smaller the usage window, the less it's worth to someone looking to abuse it. The fields below work both at creation and in a PATCH:

FieldWhat it doesWhen to use it
expires_atTurns the QR code off on a datePromotions, events, tickets
scan_limitTurns it off after N scansLimited-use coupons, giveaways
passwordRequires a password before the redirectInternal material, restricted documents
expired_url / limit_reached_urlSends people to your own page when the QR code expires or runs outAvoid a dead end after the campaign ends
custom_domain_idUses your domain in the short linkReinforce the brand and teach customers to recognize your address

The custom domain deserves attention. When every QR code from your company opens on qr.yourcompany.com, it's easy to guide customers: if the address is different, be suspicious. It's the same logic as teaching people to check the browser padlock, applied to the scan.

Check the cost first

Send the X-Dry-Run: true header on creation to validate the payload and see how much each option costs, without charging or creating anything.

07Checklist for teams that use QR codes

  1. 1Check every URL before it becomes a QR code, including those from partners and users.
  2. 2Prefer dynamic QR codes on any printed material that lasts more than a week.
  3. 3Use your own domain in the short link and tell your customers about it.
  4. 4Set an expiration or scan limit on campaigns with an end date.
  5. 5Watch the scans: a spike at odd hours or from an unexpected region may mean the QR code was copied.
  6. 6Never take a customer straight from a scan to a login or payment without context. If it's unavoidable, make the domain clear.
  7. 7Physically inspect QR codes in public places: a sticker on top is the cheapest scam there is.

08Frequently asked questions

Can a QR code have a virus?

The QR code itself is just encoded text, usually a URL. The danger is the destination: a page that imitates a login, asks for card details or downloads a malicious app.

How can I tell if a QR code is safe?

Before opening it, check the address the camera shows. Be wary of strange domains, generic link shorteners and pages that ask for a password or payment right away. In your systems, check the URL via API before displaying it or redirecting.

Is a dynamic QR code more dangerous than a static one?

It depends on who controls it. In a scammer's hands, the changeable destination helps fool filters. In the hands of the company that prints it, it's what lets you fix a compromised destination without recalling material.

What should I do if one of my company's QR codes is tampered with?

If it's dynamic, point the destination to a warning page right away and investigate. If it's static, remove the material and replace it with a dynamic QR code on your own domain.

09Start with the QR codes already out there

Quishing grows because it exploits the spot nobody looks at. For anyone printing QR codes, the defense is to treat each code as a link you must keep controlling after the print shop: check the destination, be able to change it and limit the usage window.

The Dynamic QR Code already rejects malicious destinations and lets you change the link without reprinting. The URL Safety Check brings the same check to the rest of your system. Details on every field are in the documentation.

  • #quishing
  • #qr-code
  • #dynamic-qr-code
  • #phishing
  • #security
  • #url-safety-check
Share
R

About the author

Rychard

Respawn Tech Dev Team

The people who build and run the Respawn Tech Dev APIs.

In this article

  1. 01 · What is quishing and why does it get past filters?
  2. 02 · How scammers use dynamic QR codes
  3. 03 · The risk for those who print QR codes
  4. 04 · Defense 1: check the URL before publishing
  5. 05 · Defense 2: change the destination without reprinting
  6. 06 · Defense 3: controls that limit the damage
  7. 07 · Checklist for teams that use QR codes
  8. 08 · Frequently asked questions
  9. Can a QR code have a virus?
  10. How can I tell if a QR code is safe?
  11. Is a dynamic QR code more dangerous than a static one?
  12. What should I do if one of my company's QR codes is tampered with?
  13. 09 · Start with the QR codes already out there
↑ Back to top

Tool in this post

Dynamic QR Code

Generate QR codes whose link can be swapped at any time, track every scan in real time and customize the look with your brand — all via API or the dashboard.

Learn more

Start integrating today

Create your account, generate a token and make your first call in a few minutes.

Sign upSee all products
Respawn Tech Dev

Production-ready APIs. Pay only for what you use.

Products

  • Dynamic QR Code
  • HTML to PDF
  • Knowledge base
  • See all products
  • Pricing

Resources

  • Developers
  • Use cases
  • Docs
  • Blog

Company

  • About
  • Contact
  • Dashboard

© 2026 Respawn Tech LTDA — All rights reserved.

Privacy PolicyTerms of Use

Privacy & cookies

We use analytics cookies (Google Analytics and Plausible) only with your consent, to understand how the site is used. We do not show ads.

View policy