Data types
How to encode URLs, vCards, Wi-Fi join, email, SMS, geo coordinates, and dynamic short URLs in a QR.
Data types
QR codes encode much more than URLs. The data_type field tells the
API which encoding rule to apply. Phone scanners (iOS Camera, Android
default scanner, Google Lens) recognize each format and offer the
matching action: open URL, save contact, join Wi-Fi, dial number, etc.
data_type | What it does when scanned |
|---|---|
url (default) | Opens a URL in the default browser |
text | Shows raw text |
vcard | Offers to save a contact |
wifi | Offers to join a Wi-Fi network |
email | Opens the mail composer with prefilled fields |
sms | Opens the SMS composer |
geo | Opens the device map app at a coordinate |
dynamic | Encodes a short URL we host. Repointable any time. |
url
For plain links. Pass the URL as data.
{
"data": "https://yourbusiness.com/menu",
"size_inches": 4
}tip: Long URLs Long URLs produce QRs with more modules, which means each module is smaller at a given print size, which makes scans harder. If your URL has tracking parameters, consider:
- A URL shortener (
bit.ly, your own redirect) - A dynamic QR (encode a short URL, store the long one server-side)
text
Plain text. Phones show it as a string with no action.
{
"data_type": "text",
"data": "Table 14 - Bonjour de la part du chef!",
"size_inches": 3
}vcard
Saves the person to the scanner's address book. Output is standards compliant vCard 3.0; special characters are escaped per spec.
{
"data_type": "vcard",
"payload": {
"name": "Darius Tokam",
"org": "QR Code Agency",
"title": "Founder",
"phone": "+15145551234",
"email": "darius@qrstudio.agency",
"url": "https://qrstudio.agency",
"address": "123 Rue Saint-Laurent, Montreal QC",
"note": "Met at Web Summit 2026"
},
"size_inches": 3,
"format": "svg"
}| Field | Required | Notes |
|---|---|---|
name | Full display name | |
org | Company name | |
title | Job title | |
phone or phones | Single string or array | |
email or emails | Single string or array | |
url | Personal or company URL | |
address | One-line postal | |
note | Free-form |
warning: Old Android vCard parsers Android 6 and earlier sometimes choke on
EMAIL:lines with multiple addresses. Use one email max inemailsand accept that older devices may show only the first.
wifi
The scanner offers a single-tap "Join Network" button. Perfect for cafes, hotels, AirBnBs, conference venues.
{
"data_type": "wifi",
"payload": {
"ssid": "Cafe Plein Soleil",
"password": "BienvenueChezNous2026",
"auth": "WPA"
},
"size_inches": 6
}| Field | Required | Allowed values |
|---|---|---|
ssid | Any string (special chars escaped) | |
password | If auth != NOPASS | Any string |
auth | WPA (default), WEP, NOPASS | |
hidden | true for hidden SSID |
info: Wi-Fi QR support iOS supports Wi-Fi QR since iOS 11 (2017). Android since version 10 (2019). Earlier devices show the raw
WIFI:T:...;string and will not auto-join.
{
"data_type": "email",
"payload": {
"address": "support@yourbusiness.com",
"subject": "Customer feedback",
"body": "Hi team,\n\n"
},
"size_inches": 3
}| Field | Required | Notes |
|---|---|---|
address | Email address | |
subject | URL-encoded automatically | |
body | URL-encoded automatically |
The output is a standard mailto: URI:
mailto:support@...?subject=...&body=...
sms
{
"data_type": "sms",
"payload": {
"phone": "+15145551234",
"body": "Hi, I saw your QR ad - I am interested in"
}
}| Field | Required | Notes |
|---|---|---|
phone | E.164 format recommended (+1...) | |
body | Pre-filled message |
geo
Opens the device's default map app at a GPS coordinate.
{
"data_type": "geo",
"payload": {
"lat": 45.5017,
"lng": -73.5673
}
}tip: Use vCard for full addresses
geo:is purely lat/lng. For a business name and a postal address, use avcardinstead.
dynamic
Encodes a short URL we host. The destination is stored in our database and editable any time without reprint.
{
"data_type": "dynamic",
"payload": {
"name": "Spring 2026 menu",
"destination_url": "https://example.com/menus/spring-2026"
},
"size_inches": 4
}| Field | Required | Notes |
|---|---|---|
name | Internal label, never visible to scanners | |
destination_url | The URL we 302 redirect to. Editable later. |
The render response embeds the encoded short URL as
https://q.qrstudio.agency/q/<short_id>/. The image is otherwise
identical to a static URL render.
The same call also creates a DynamicQr row in our database. Manage it
with the /api/v1/dynamic/ endpoints.
See Static vs dynamic for the full trade-off discussion.
Choosing the right type
flowchart LR
A{What should<br/>the scanner do?} --> B[Open a website]
A --> C[Save my contact]
A --> D[Join my Wi-Fi]
A --> E[Send me an email]
A --> F[Text me]
A --> G[Show a location on map]
A --> H[Display some text]
A --> I[Open a URL I can change later]
B --> b1[url]
C --> c1[vcard]
D --> d1[wifi]
E --> e1[email]
F --> f1[sms]
G --> g1[geo]
H --> h1[text]
I --> i1[dynamic]Combining types
A QR encodes one thing at a time. There is no "Wi-Fi + vCard" payload.
For multi-action, point a url at a landing page that offers each
action as a button:
<a href="WIFI:T:WPA;S:Cafe;P:WelcomeGuest;;">Join our Wi-Fi</a>
<a href="tel:+15145551234">Call us</a>
<a href="mailto:hi@cafe.com">Email us</a>Or use a dynamic QR pointing at the landing page; you get analytics for free and can swap the page later.
What is next
- Styling and colors: make it match your brand
- Logos: add your brand mark to the center
- API reference: every parameter