QR Code Format Reference: Exact Syntax for Every Type

Key Takeaway
The exact string every QR code type encodes: URL, WiFi, vCard, email, SMS, geo, calendar, and crypto, UPI, and PIX payments, with real examples and specs.
A QR code does not store a "type". It stores a plain string of text, and a short prefix at the front tells the scanner what to do with it. Point a camera at a WiFi QR code and the phone reads WIFI:T:WPA;S:Cafe;P:latte2026;;. That WIFI: prefix is the whole trick: it tells the scanner to offer a join-network button instead of showing raw text.
This page is the reference for those strings. For every common QR code type it gives the exact syntax the code encodes, a real working example, and the standard that defines it. If you are debugging a code that will not scan, building payloads by hand, or you just want to know what actually lives inside the squares, this is the map.
Keep one thing straight up front. The QR symbol itself, defined by ISO/IEC 18004, only knows how to pack characters into a grid. It has no concept of a phone number or a contact card. All the meaning comes from the text conventions below, and those are set by separate standards: RFCs for links, a Wi-Fi Alliance convention for networks, EMVCo and central banks for payments. The QR code is just the envelope.
Every QR code format at a glance
Here is the quick reference. Each row is the literal string a scanner reads for that type, with a real example. The detailed syntax, field rules, and source specs follow underneath.
| Type | What the QR encodes | Example |
|---|---|---|
| Website / URL | the URL, as typed | https://qrlynx.com |
| Plain text | the raw text, no prefix | Table 12, ask your server |
| Phone call | tel: then the number | tel:+14155550123 |
| SMS | sms:number?body=text | sms:+14155550123?body=Hello |
mailto:addr?subject={...}&body={...} | mailto:hi@acme.com?subject=Quote | |
a wa.me link | https://wa.me/14155550123?text=Hi | |
| Contact card (vCard) | a BEGIN:VCARD block | BEGIN:VCARD ... END:VCARD |
| Calendar event | an iCalendar VEVENT | BEGIN:VEVENT ... END:VEVENT |
| WiFi | WIFI:T:...;S:...;P:...;; | WIFI:T:WPA;S:Cafe;P:latte2026;; |
| Location | geo:latitude,longitude | geo:37.7749,-122.4194 |
| Bitcoin (BIP21) | bitcoin:address?amount={...} | bitcoin:bc1qar0srrr...?amount=0.01 |
| Ethereum (EIP-681) | ethereum:address@chain?value={...} | ethereum:0xAbC...@1?value=1e18 |
| UPI (India) | upi://pay?pa={...}&pn={...}&am={...}&cu=INR | upi://pay?pa=acme@okbank&am=499&cu=INR |
| PIX (Brazil) | an EMV BR Code (00020126...) | 00020126...5204000053039865802BR |
| SEPA (Europe) | an EPC QR / GiroCode | BCD 002 1 SCT ... |
Web and text
Website URL
A URL QR code holds nothing more than the address, encoded as plain text, with no wrapper beyond the scheme. https://qrlynx.com in, https://qrlynx.com out. Leave off the scheme and most generators, QRLynx included, prepend https:// so the link opens instead of triggering a search. The rules come from RFC 3986, the generic URI standard, so any registered scheme is valid. Reserved characters such as spaces must be percent-encoded (%20) or the link breaks.
Dynamic QR codes are still URL codes underneath. The symbol encodes a short redirect link like https://qropen.link/abc123 and the destination is swapped server-side, which is why the printed code never has to change. Build one on the URL QR code generator.
Plain text
The simplest payload is raw text with no scheme at all. The scanner reads the characters and shows them, nothing more. This is the one format that is not really a format: the standard defines how characters are packed into the grid, but there is no syntax to parse. Non-English text travels fine as long as the encoder marks it UTF-8, which is the norm now. See the text QR code generator.
Contact actions: call, text, email, WhatsApp
Phone call
A phone QR code is just tel: followed by the number. Use the full international form with a leading plus, tel:+14155550123, so it dials correctly wherever the phone happens to be. RFC 3966 also allows visual separators for readability (tel:+1-415-555-0123) and an ;ext= parameter for extensions. Make one on the phone QR code generator.
SMS
An SMS code opens the messaging app with the number, and optionally the message, prefilled. The format is sms: number, then an optional ?body= with the text percent-encoded: sms:+14155550123?body=Hello%20there. That matches RFC 5724. An older SMSTO: convention still works in some scanners, but sms: is the modern one. Build it on the SMS QR code generator.
Email codes use the same mailto: link a browser does. Address first, then optional headers: mailto:hi@acme.com?subject=Quote&body=Hi%20there. Subject and body are percent-encoded, and cc or bcc work the same way. The rules are set by RFC 6068. See the email QR code generator.
A WhatsApp QR code is not a special scheme, it is an ordinary https://wa.me/ link. Put the number in full international form with no plus and no spaces, then an optional prefilled message: https://wa.me/14155550123?text=Hi%2C%20a%20question. WhatsApp documents this click-to-chat link itself. Make one on the WhatsApp QR code generator.
Contact card (vCard)
A contact card QR code carries a full vCard, the same .vcf format your phone stores contacts in. It is a block of lines wrapped in BEGIN:VCARD and END:VCARD, one line per field:
BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;;
FN:Jane Doe
ORG:Acme Corp
TITLE:Marketing Director
TEL;TYPE=CELL:+14155550123
EMAIL:jane@acme.com
URL:https://acme.com
END:VCARD
FN is the display name and N is the structured name (family, given, middle, prefix, suffix) split by semicolons. Add TEL, EMAIL, ORG, TITLE, URL, and ADR lines as needed. The format is defined by RFC 6350 (vCard 4.0) and its predecessor RFC 2426 (3.0), which is what most generators emit for the widest scanner support. For a modern, editable card that also tracks scans, see the digital business card, or the classic vCard QR code generator.
Calendar event
An event QR code holds an iCalendar object, the same format a calendar invite uses, and the scanner offers to add it. The structure nests a VEVENT inside a VCALENDAR:
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Product Launch
DTSTART:20260715T180000
DTEND:20260715T200000
LOCATION:Acme HQ
END:VEVENT
END:VCALENDAR
Times use the compact YYYYMMDDTHHMMSS form, with a trailing Z for UTC. SUMMARY is the title, DTSTART and DTEND the times, and LOCATION and DESCRIPTION are optional. Strict calendar clients also expect a UID and DTSTAMP, per RFC 5545. Build one on the event QR code generator.
WiFi network
A WiFi QR code lets someone join a network without typing the password. It is a single line that starts with WIFI: and packs the settings into key-value pairs, each closed by a semicolon, with a double semicolon at the end:
WIFI:T:WPA;S:MyNetwork;P:s3cur3p@ss;H:false;;
T is the security type (WPA, WEP, or nopass for open networks), S is the network name, P is the password, and H flags a hidden network. If your name or password contains a semicolon, comma, colon, backslash, or quotation mark, escape it with a backslash. This is not a formal RFC; it is a de-facto convention popularized by the ZXing project and read natively by iOS and Android. Make one on the WiFi QR code generator.
Location
A location QR code uses the geo: URI: the word geo: then latitude and longitude, comma-separated. geo:37.7749,-122.4194 drops a pin at those coordinates. To label the pin, some apps read the extended form geo:37.7749,-122.4194?q=37.7749,-122.4194(Union%20Square). The standard is RFC 5870. To point at a named place instead, a Google Maps link also works. See the location and Google Maps generators.
Payment formats: crypto, UPI, PIX, and SEPA
Payments are where formats turn strict, because a wallet or bank app has to parse them exactly. Each network and region carries its own standard.
Bitcoin (BIP21)
Bitcoin uses the bitcoin: URI from BIP21. The address is the only required part; an amount and label are optional query parameters: bitcoin:bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq?amount=0.01&label=Order%20482. Amount is in BTC. Make one on the Bitcoin QR code generator.
Ethereum (EIP-681)
Ethereum follows EIP-681: ethereum: address, an optional @chainId to pick the network, and a ?value= in wei for a payment request. ethereum:0xAbC...@1?value=1e18 requests 1 ETH on mainnet. See the Ethereum QR code generator.
UPI (India)
India's UPI uses a upi://pay deep link defined by NPCI. Payee address and name are required, the rest optional: upi://pay?pa=acme@okbank&pn=Acme%20Store&am=499.00&cu=INR&tn=Order%201234. pa is the payee ID, pn the name, am the amount, cu the currency (always INR), and tn a note. Build one on the UPI QR code generator.
PIX (Brazil)
Brazil's PIX is the strictest of the set. The official format, the Banco Central do Brasil BR Code, is an EMV-MPM string rather than a simple URI. It is built from tag-length-value fields, starts with 000201, carries the PIX key inside a BR.GOV.BCB.PIX block, and ends with a four-character CRC16 checksum: 00020126580014BR.GOV.BCB.PIX0136...5204000053039865802BR...6304ABCD. Because a bank app validates that checksum and the EMV structure, a working PIX code has to follow this format exactly. See the PIX QR code page.
SEPA (Europe)
For euro bank transfers, the EPC QR code, often called a GiroCode, encodes the transfer as fixed lines: BCD, a version, a character set, SCT, then the BIC, beneficiary name, IBAN, and amount (EUR12.30). It is defined by the European Payments Council. QRLynx does not generate GiroCodes today; the format is here for reference.
What format does a QR code use to store a URL?
None beyond the URL itself. A website QR code encodes the address as plain text, for example https://qrlynx.com, following the RFC 3986 URI standard. There is no wrapper or prefix other than the scheme (https://). If the scheme is missing, most generators add https:// so the link opens rather than being treated as a search.
What is the WiFi QR code format?
A single line: WIFI:T:WPA;S:NetworkName;P:password;H:false;; . T is the security type (WPA, WEP, or nopass), S is the network name, P is the password, and H flags a hidden network. Special characters in the name or password are escaped with a backslash. It is a de-facto standard read natively by iOS and Android.
What does a vCard QR code look like inside?
It is a text block wrapped in BEGIN:VCARD and END:VCARD, with a VERSION line and one line per field such as FN (name), TEL, EMAIL, ORG, and TITLE. Most QR generators emit vCard 3.0 for the widest scanner support, defined by RFC 2426 and RFC 6350.
How do you format a phone number in a QR code?
Use tel: followed by the number in full international form with a leading plus, for example tel:+14155550123. That follows RFC 3966 and dials correctly regardless of the phone's country. The related sms: scheme works the same way for text messages.
Can a QR code hold a crypto payment?
Yes. Bitcoin uses the bitcoin: URI from BIP21 (bitcoin:address?amount=0.01), and Ethereum uses ethereum: from EIP-681 with an optional chain id and a value in wei. The wallet app reads the address and the requested amount straight from the code.
What is the UPI QR code format?
A upi://pay deep link defined by NPCI: upi://pay?pa=payee@bank&pn=Name&am=100.00&cu=INR&tn=Note . pa (payee address) and pn (name) are required; amount, currency, and note are optional. It is the standard for QR payments across Indian banking apps.
What is a PIX QR code?
Brazil's PIX uses the official BR Code, an EMV-MPM string set by the Banco Central do Brasil. It starts with 000201, carries the PIX key inside a BR.GOV.BCB.PIX block, and ends with a CRC16 checksum. Because bank apps validate that structure, PIX codes must follow the format precisely, unlike a simple URI.
Do QR codes have a character encoding?
Yes. The QR symbol defaults to ISO 8859-1, but modern encoders set an ECI marker to UTF-8 so non-English characters round-trip correctly. If accented or non-Latin text shows as garbled after scanning, an encoding mismatch between the generator and the scanner is the usual cause.
What is the maximum amount of data a QR code can hold?
A standard QR code tops out at 7,089 numeric digits, 4,296 alphanumeric characters, or 2,953 bytes, at the largest version and lowest error correction. Most real payloads use a tiny fraction of that. The full breakdown is in the QR code capacity reference.
How do I make a WhatsApp QR code?
A WhatsApp code is a normal https://wa.me/ link, not a special scheme. Use the number in full international form with no plus or spaces, and an optional prefilled message: https://wa.me/14155550123?text=Hi . Scanning it opens a chat with that number.
Are QR code payload formats standardized?
The symbol layer is, by ISO/IEC 18004. The payload conventions come from separate standards: RFCs for URL, tel, sms, mailto, geo, vCard, and iCalendar; NPCI for UPI; the Banco Central do Brasil for PIX; and the European Payments Council for SEPA. WiFi is the main exception, a widely-supported de-facto convention rather than a formal standard.
Why does my QR code show text instead of doing something?
Almost always a prefix or separator error. If a WiFi code is missing its closing double semicolon, or a URL is missing its scheme, or a field separator is wrong, the scanner cannot recognize the action and falls back to showing the raw string. Check the payload character by character against the formats above.
The QR code is the envelope, not the letter
Every format on this page is just text with a recognized prefix. That is the useful mental model: the QR symbol is a way to hand a string to a phone quickly, and the prefix is the instruction for what to do with it. Get the prefix and the field separators right and any scanner will act on it. Get them wrong, even by a stray character, and the code either shows raw text or does nothing.
When you build codes through a generator you never touch these strings directly, which is the point. But when something will not scan, or you are wiring QR codes into your own system, knowing the exact payload is the difference between guessing and fixing. Bookmark this as your lookup, and if you also need to know how much data each code can hold, see the QR code capacity reference.


