QRQR Code Agency
Concepts

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_typeWhat it does when scanned
url (default)Opens a URL in the default browser
textShows raw text
vcardOffers to save a contact
wifiOffers to join a Wi-Fi network
emailOpens the mail composer with prefilled fields
smsOpens the SMS composer
geoOpens the device map app at a coordinate
dynamicEncodes 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"
}
FieldRequiredNotes
nameFull display name
orgCompany name
titleJob title
phone or phonesSingle string or array
email or emailsSingle string or array
urlPersonal or company URL
addressOne-line postal
noteFree-form

warning: Old Android vCard parsers Android 6 and earlier sometimes choke on EMAIL: lines with multiple addresses. Use one email max in email, or pass an array via emails and 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
}
FieldRequiredAllowed values
ssidAny string (special chars escaped)
passwordIf auth != NOPASSAny string
authWPA (default), WEP, NOPASS
hiddentrue 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.

email

{
 "data_type": "email",
 "payload": {
 "address": "support@yourbusiness.com",
 "subject": "Customer feedback",
 "body": "Hi team,\n\n"
 },
 "size_inches": 3
}
FieldRequiredNotes
addressEmail address
subjectURL-encoded automatically
bodyURL-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"
 }
}
FieldRequiredNotes
phoneE.164 format recommended (+1...)
bodyPre-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 a vcard instead.

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
}
FieldRequiredNotes
nameInternal label, never visible to scanners
destination_urlThe 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

On this page