Build a QR code payload string for URL, WiFi, vCard, SMS or email
Fill in a WiFi name like Studio;Guest and a password like tea:coffee, and get the text a scanner understands, with the semicolon and colon protected so they stay part of the name. Works for websites, WiFi, vCard contacts, SMS and email. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
What a QR code actually stores
A QR code is only a picture of a piece of text. When a phone camera reads it, the shape of that text tells the phone what to offer: open a website, join a WiFi network, save a contact, start a text message or draft an email. Each of those actions expects its own layout. A website is just a full web address. A WiFi code carries the network name, the security mode, the password when the network needs one and, if you want, a mark saying the network is hidden. A contact card holds names, company, job title, phone, email and website, and is assembled as a version 3.0 vCard.
Why punctuation breaks home-made QR codes
These formats use punctuation as structure. In a WiFi code a semicolon ends one item and a colon separates a label from its value, so a network called Studio;Guest or a password like tea:coffee would be cut in the wrong place if written as is. The builder puts a backslash in front of those characters so they stay part of the name or password. Contact cards get the same care for commas, semicolons and line breaks, and an email keeps the spaces, ampersands, line breaks and accented letters of its subject and body. Only the details the chosen format needs are asked for, so a WiFi code never asks for an email address.
Understand how reserved characters are handled
QR content formats use punctuation as structure, which means user-entered punctuation sometimes needs protection. The builder escapes backslashes and reserved punctuation inside the network name or password so those characters remain data rather than being mistaken for a new property. vCard text receives its own escaping for backslashes, commas, semicolons, and embedded line breaks, and the card is assembled with version 3.0 fields and CRLF line endings. Email is represented as a mailto URI.
Its subject and body are encoded as query values, preserving spaces, ampersands, line breaks, and non-ASCII characters without allowing them to alter the query structure. SMS uses the compact SMSTO form supported by many QR scanners.
FAQ
Which WiFi security modes are supported?
WPA, WEP, and nopass are supported. WPA and WEP require a password; nopass does not.
Which vCard version is generated?
The builder generates vCard 3.0 with a structured name, display name, and any supplied optional contact fields.
Can email subject and body contain spaces or line breaks?
Yes. They are encoded as mailto query values so reserved characters and line breaks remain part of the intended text.
Will it verify a URL, phone number, network, or mailbox?
No. It validates the required shape locally but does not contact external services or confirm that a destination exists.
Does this tool create the QR code image?
No. It builds the text that goes inside the code, with the separators and special-character protection the chosen format expects. Paste that text into any QR generator or printing tool and the scanner will offer the matching action, such as joining the network.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/web/qr-payload-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"wifi"}'const res = await fetch("https://api.kit.forhosting.com/web/qr-payload-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"type": "wifi"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/qr-payload-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"type": "wifi"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/qr-payload-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"type":"wifi"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"type":"wifi"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/qr-payload-build", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"type": "wifi"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.qr_payload_build",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
timeout_sec | 30 |
max_crawl_pages | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
A QR image is only the visual encoding of a text payload, and each useful content type expects that text in a particular shape. This QR payload builder turns ordinary fields into a ready-to-encode string for a website, WiFi network, vCard contact, SMS message, or email draft. It applies the delimiters, escaping, line endings, and URI encoding required by the selected format, then returns deterministic text you can pass directly to a QR library, image service, print workflow, or automated test.
Choose the payload type before supplying its fields
Start with the content type that matches the action you want a scanner to offer. A vCard represents a reusable contact record. SMS provides a destination number and optional prewritten message, while email provides one recipient with optional subject and body fields. The builder reports a clear invalid-input error when the selected type lacks a necessary value. A URL payload is simply a valid absolute HTTP or HTTPS address, which most camera applications open in a browser. A WiFi payload includes the network name, security mode, password when security requires one, and an optional hidden-network flag. Only the selected format decides which fields are required, so an email address is not demanded when you are building a WiFi payload. This conditional contract makes one endpoint practical for forms and automation without quietly creating incomplete QR content. The result contains the normalized type and a payload string; it does not render pixels, contact a recipient, or test whether the destination exists.
Understand how reserved characters are handled
WiFi payloads separate properties with semicolons and use colons between property names and values. These rules are deliberately format-specific: applying generic URL encoding to every payload would corrupt WiFi and vCard syntax, while failing to encode an email query could change what the scanner reads.
Use the returned string in an encoder or test suite
If a scan behaves unexpectedly, inspect the text first, then the encoder settings and scanner support. The builder is deterministic and performs no network requests, randomization, or time-based changes, so identical input produces identical output. Pass the returned payload unchanged to the text input of your QR encoder. The encoder should treat it as data and choose its own error-correction level, image size, margin, and output format; those visual decisions are separate from payload construction. Keeping the stages separate is useful in production systems because the same canonical payload can feed SVG, PNG, PDF, label-printer, or mobile rendering code without duplicating business rules. It also makes testing straightforward. Store representative inputs and compare the exact payload, including vCard line endings and escaped WiFi delimiters, before any image generation happens. Browser use is convenient for one-off payloads, while the API costs $0.002 per request and is suited to batch preparation, templates, deployment pipelines, and server-side applications.
Integration use cases
Prepare WiFi cards
Build an escaped network payload before rendering guest-access QR codes for signs, rooms, or welcome packs.
Generate contact labels
Turn contact fields into a vCard 3.0 payload that can be encoded on badges, cards, and product inserts.
Test a QR pipeline
Assert exact URL, SMS, and email payload strings independently from image rendering and scanner tests.
Technical questions
Does this create a QR code image?
No. It creates the payload string that you pass to a separate QR encoder.
What does it cost?
It runs free in your browser on this page, or costs $0.002 per API request.