QR code payload cheatsheet, every URI scheme in one reference
A QR code is a pattern that encodes bytes. The bytes that get those scans to do something useful (open a mail draft, join Wi-Fi, drop a contact into Contacts, trigger a UPI payment) all follow URI schemes defined in real standards, mostly RFCs. This page collects every scheme imgkilo's QR generators emit, the fields each one expects, the gotchas that break them in practice, and the controlling spec for each. Bookmark it; use the QR code generator when you need a static code, or jump to the per-scheme tools listed at the bottom.
Reference table: every scheme at a glance
| Payload type | Scheme / format | Controlling spec | imgkilo tool |
|---|---|---|---|
| Web URL | http(s):// | RFC 3986 (generic URI) | QR code generator |
| Plain text | (raw bytes) | ISO/IEC 18004 byte mode | QR code generator |
| mailto: | RFC 6068 | Email QR | |
| Phone | tel: | RFC 3966 | Phone QR |
| SMS (URI) | sms: | RFC 5724 | SMS QR |
| SMS (legacy) | SMSTO: | Pre-RFC convention, widely supported | SMS QR |
| Wi-Fi | WIFI: | ZXing Wi-Fi spec | Wi-Fi QR |
| Location | geo: | RFC 5870 | Location QR |
| UPI payment | upi://pay | NPCI UPI Linking spec | UPI QR |
| Contact (modern) | BEGIN:VCARD VERSION:4.0 | RFC 6350 | vCard QR |
| Contact (legacy) | BEGIN:VCARD VERSION:3.0 | RFC 2426 | vCard QR |
| Calendar event | BEGIN:VEVENT | RFC 5545 | QR code generator (raw) |
| Android app | market://details?id= | Google Play vendor URI | App store QR |
| Android intent | intent:// | Android Intent URI scheme | QR code generator (raw) |
| iOS App Store | https://apps.apple.com/... | Plain HTTPS, no custom scheme | App store QR |
Web URLs: http and https
The base case. The scanner sees a string starting with http:// or https:// and hands it to the OS to open in a browser. Defined by RFC 3986, the generic URI syntax.
- Always use https; modern scanners warn or block plain http on phones with corporate profiles.
- Percent-encode any character outside the unreserved set defined in RFC 3986 (e.g. spaces become %20).
- Watch payload length. Long URLs push the QR symbol to a higher version, which raises the minimum print size. Strip unnecessary query parameters before encoding.
- Trailing slashes and case affect server matching but not QR decoding. Match your canonical form.
mailto: email
Defined by RFC 6068. Lets a scanner open a pre-filled email draft.
| Field | Example | Notes |
|---|---|---|
| Recipient | mailto:hello@example.com | Required. Multiple addresses comma-separated. |
| Subject | ?subject=Hi%20there | Optional. Percent-encode spaces and reserved chars. |
| Body | &body=Some%20message | Optional. Long bodies bloat the QR; keep under 200 chars. |
| CC / BCC | &cc=copy@example.com&bcc=hidden@example.com | Optional, comma-separated lists allowed. |
Full example: `mailto:hello@example.com?subject=Reservation&body=Table%20for%20two%20on%20Friday`. Most mobile clients honour subject and body; some desktop clients ignore body. Use the email QR generator to assemble the URI without hand-encoding.
tel: phone
Defined by RFC 3966. The scanner opens the dialler with the number pre-loaded.
- Use the E.164 international form with a leading +: tel:+919876543210.
- Spaces, hyphens and parens in the number are stripped by the OS; including them is fine for readability.
- Extensions can be added with ;ext=, e.g. tel:+12025550100;ext=42.
- The phone QR does not place the call; it only loads the dialler. The user still taps to dial.
Build one with the phone QR generator.
SMS: two schemes, one outcome
Two conventions are in use. The RFC form is RFC 5724 (sms:); the older form pre-dates the RFC and lives on as SMSTO:.
| Form | Syntax | Notes |
|---|---|---|
| RFC 5724 | sms:+919876543210?body=Hello | Universally supported on modern phones. |
| SMSTO legacy | SMSTO:+919876543210:Hello | Pre-RFC; still widely supported. Colon-separated, no URL encoding. |
Stick with the RFC form for new QRs. The body field is optional in both. Use the SMS QR generator, which emits the RFC form by default.
WIFI: join a network on scan
Wi-Fi QR codes use a vendor format documented by the ZXing project. iOS (since 11) and Android (since 10) both honour it.
| Field | Key | Example | Notes |
|---|---|---|---|
| Authentication type | T | WPA | WPA (covers WPA/WPA2/WPA3), WEP, or nopass for open networks. |
| SSID | S | Cafe-Guest | The network name. Escape `;`, `,`, `:`, `\`, and `"` with a backslash. |
| Password | P | letmein123 | Omit for nopass. Escape the same characters as SSID. |
| Hidden network | H | true | Optional; omit unless the SSID is genuinely hidden. |
Full example: `WIFI:T:WPA;S:Cafe-Guest;P:letmein123;;`. The trailing `;;` matters; some scanners refuse the payload without it. Generate one safely with the Wi-Fi QR generator.
geo: pin a location
Defined by RFC 5870. Opens the OS map app to a coordinate.
| Field | Example | Notes |
|---|---|---|
| Coordinates | geo:28.6139,77.2090 | Latitude,longitude in decimal degrees. WGS-84 by default. |
| Altitude | geo:28.6139,77.2090,15 | Optional third value in metres. |
| Uncertainty | ;u=10 | Optional accuracy radius in metres. |
| Query string | ?q=Cafe+name | Some platforms accept a non-standard search query after `?q=`. |
On Android, geo: opens Google Maps reliably. On iOS, behaviour varies: many scanners convert geo: into a Maps URL automatically, while others ignore it. For cross-platform safety, encode an https://maps.apple.com or https://maps.google.com URL instead, or use the location QR generator which emits a fallback.
upi: India UPI payments
UPI QR codes follow the National Payments Corporation of India's UPI Linking spec, published under the NPCI UPI product documentation. The scheme is upi://pay with query parameters.
| Field | Key | Example | Required |
|---|---|---|---|
| Payee VPA | pa | merchant@bank | Yes |
| Payee name | pn | Sample%20Store | Yes |
| Transaction ID | tid | TXN12345 | No |
| Reference ID | tr | ORDER12345 | Yes for merchant payments |
| Amount | am | 199.00 | No (omit to let the payer choose) |
| Currency | cu | INR | Yes |
| Note | tn | Order%20%23ORDER12345 | No |
| Min amount | minam | 100.00 | No |
Example: `upi://pay?pa=merchant@bank&pn=Sample%20Store&am=199.00&cu=INR&tn=Order`. Use the UPI QR generator for static merchant QRs. The NPCI spec is authoritative; payment apps reject any payload that omits a required field.
vCard: contact cards
vCard is the standard contact format. Two versions matter for QR codes: 3.0 (RFC 2426) and 4.0 (RFC 6350). iOS and Android both support 3.0 reliably. 4.0 has better field types but inconsistent QR-scanner support in 2026.
| Property | Example | Notes |
|---|---|---|
| BEGIN / END | BEGIN:VCARD ... END:VCARD | Required wrapper. CRLF line breaks recommended. |
| VERSION | VERSION:3.0 | Pick 3.0 for QR compatibility unless you control the scanner. |
| N | N:Doe;Jane;;; | Structured name: Family;Given;Additional;Prefix;Suffix. |
| FN | FN:Jane Doe | Display name. Required in 3.0. |
| ORG | ORG:Acme Pvt Ltd | Company name. |
| TITLE | TITLE:Engineer | Job title. |
| TEL;TYPE=CELL | TEL;TYPE=CELL:+919876543210 | Mobile number. TYPE=WORK and HOME also accepted. |
| EMAIL;TYPE=WORK | EMAIL;TYPE=WORK:jane@example.com | Work email. |
| URL | URL:https://example.com | Website. |
| ADR;TYPE=WORK | ADR;TYPE=WORK:;;221B Baker St;London;;NW1;UK | Address. Seven semicolon-separated parts. |
Keep the vCard short, vCard payloads bloat fast. A full address plus two phones, two emails and a photo will push the QR symbol to a high version and force a large print size. Strip optional fields. Build one with the vCard QR generator.
MeCard, the compact alternative
MeCard (`MECARD:N:Doe,Jane;TEL:+919876543210;EMAIL:jane@example.com;;`) is a denser legacy format that Android originally promoted. Modern scanners still understand it. vCard 3.0 has wider iOS support; default to it unless print size is critical.
Calendar: ICS events
Calendar events use the iCalendar format defined in RFC 5545. For a QR payload, encode a single VEVENT inside a VCALENDAR wrapper.
| Property | Example | Notes |
|---|---|---|
| BEGIN / END | BEGIN:VCALENDAR / END:VCALENDAR | Required wrapper with a nested VEVENT block. |
| VERSION | VERSION:2.0 | ICS protocol version, required. |
| UID | UID:event-123@example.com | Globally unique ID. Required by RFC 5545. |
| DTSTAMP | DTSTAMP:20260627T120000Z | When the event record was created, UTC. |
| DTSTART | DTSTART:20260701T180000Z | Event start. Use Z suffix for UTC, or TZID= for local. |
| DTEND | DTEND:20260701T200000Z | Event end. |
| SUMMARY | SUMMARY:Product launch | Event title. |
| LOCATION | LOCATION:HQ Auditorium | Optional. |
| DESCRIPTION | DESCRIPTION:Doors open at 17:30. | Optional. Long values inflate the QR fast. |
Scanner support for raw ICS varies. iOS and most Android scanners do recognise it; some only accept ICS hosted at an https URL and treat the QR as a URL instead. For best cross-platform behaviour, host the ICS file at a public URL and encode that URL in the QR.
App store links: Android and iOS
App store links are the messiest part of the QR cheat sheet, because Android and iOS use different conventions.
iOS: a normal HTTPS URL
Use the canonical https://apps.apple.com/<country>/app/<slug>/id<numeric-id> URL. Encode it as a plain URL QR. No custom scheme is involved; Safari and the App Store handle the rest.
Android: market:// and intent://
Two conventions exist. `market://details?id=com.example.app` opens the Play Store app directly if it is installed; it fails on devices without Play Services. `intent://...#Intent;scheme=https;package=com.example.app;end` is the Android Intent URI scheme and lets you fall back to a web URL when the app is missing.
For QR codes meant to install or open an app, the safe pattern is to encode the canonical https://play.google.com/store/apps/details?id=... URL and let the OS dispatch it to the Play Store app. Same for iOS with apps.apple.com URLs. Use the app store QR generator, which emits cross-platform-safe URLs.
Scheme-specific gotchas, in one list
- Anything inside a QR is plain text. Wi-Fi passwords, mailto bodies and vCard fields can all be read by decoding the symbol. Treat printed codes as public.
- Long payloads push the symbol up several QR versions, raising the minimum print size. Strip optional fields ruthlessly.
- Capital-letter schemes (WIFI:, SMSTO:, MATMSG:) are case-sensitive vendor conventions. Lowercase RFC schemes (mailto:, tel:, sms:, geo:, upi:) are case-insensitive per RFC 3986 but should be written lowercase for safety.
- Some scanners default to opening only http(s) automatically and require an extra tap for everything else. This is a security feature, not a QR error.
- iOS and Android disagree on geo: behaviour. Encode a maps URL fallback for cross-platform reliability.
- vCard 4.0 (RFC 6350) is technically the modern version, but 3.0 (RFC 2426) has wider scanner support in 2026. Default to 3.0 unless you control the readers.
- intent:// URLs work only on Android Chrome and its derivatives; on iOS they are ignored. Use plain https URLs for cross-platform app deep links.
Frequently asked questions
Related guides
- QR error correction levels
Pick L, M, Q or H for a QR code based on damage tolerance and logo cushion, with the redundancy math for each.
- Minimum QR size for print
The print width a QR code needs at a given scan distance, plus module size, DPI and quiet-zone math you can check against any layout.
- Static vs dynamic QR codes
How dynamic QR codes work, what they cost in privacy and dependency, and the cases where a free static code is the better answer.
Related tools
- QR code generator
Plain URL, text or any custom URI payload.
- Wi-Fi QR code generator
Emit a safe WIFI: payload with escaping handled.
- UPI QR code generator
NPCI-compliant upi://pay URI builder.
- vCard QR code generator
vCard 3.0 contact card encoded in the symbol.
- Email QR code generator
mailto: with subject and body pre-filled.
- Static vs dynamic QR codes
When to encode the payload directly vs use a redirect.