Build a QR code payload string for URL, WiFi, vCard, SMS or email
A QR image is only the visual encoding of a text payload, and each useful content type expects that text in a particular shape.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
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 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. 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. Only the selected format decides which fields are required, so an email address is not demanded when you are building a WiFi payload. The builder reports a clear invalid-input error when the selected type lacks a necessary value. 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
QR content formats use punctuation as structure, which means user-entered punctuation sometimes needs protection. WiFi payloads separate properties with semicolons and use colons between property names and values. 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. 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
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. 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. 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.
What you can do with it
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.
FAQ
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.
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.
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. |