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.

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
}

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": "Alex Tremblay",
    "org": "Acme Co",
    "title": "Founder",
    "phone": "+15145551234",
    "email": "alex@yourcompany.com",
    "url": "https://yourcompany.com",
    "address": "123 Rue Saint-Laurent, Montreal QC",
    "note": "Met at Web Summit 2026"
  },
  "size_inches": 3,
  "format": "svg"
}
FieldRequiredNotes
nameyesFull 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

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
ssidyesAny string (special chars escaped)
passwordIf auth != NOPASSAny string
authWPA (default), WEP, NOPASS
hiddentrue for hidden SSID

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
addressyesEmail 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
phoneyesE.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
  }
}

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
nameyesInternal label, never visible to scanners
destination_urlyesThe 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