{
  "$schema": "https://appvau.lt/api/v1/openapi.json",
  "dataset": "qr",
  "title": "QR payload formats and symbol capacity",
  "description": "The exact strings a QR code has to contain for a phone camera to offer a Wi-Fi join, a contact save or a dial, plus the real data capacity of every symbol version at every error-correction level, computed from ISO/IEC 18004 rather than quoted.",
  "updated": "2026-09-11",
  "source": "https://appvau.lt",
  "documentation": "https://appvau.lt/tools/qr-code-generator/",
  "publisher": "Vast Flow, LLP",
  "licence": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "App-Vault (https://appvau.lt)",
    "terms": "Free to reuse, republish and build on, including commercially, with attribution and a link to the source page."
  },
  "caveats": [
    "A Wi-Fi QR code stores the password in clear text inside the symbol. It is not encrypted, and a photograph of the printed code recovers it.",
    "Capacity is a property of the symbol, not of what will scan. A version-40 symbol is 177 modules across and needs a large, clean print; in practice keep a code under a few hundred characters.",
    "Error correction is redundancy against damage after printing. Spending it in advance on a logo in the middle means the code starts with no margin.",
    "These are static codes. Nothing here describes a redirect service, a scan counter or an editable destination — a downloaded code has no relationship with this site at all."
  ],
  "standard": {
    "name": "ISO/IEC 18004 — QR Code bar code symbology specification",
    "model": "Model 2",
    "versions": "1 to 40, sizes 21 to 177 modules square",
    "quiet_zone_modules": 4,
    "quiet_zone_note": "The four-module blank border is part of the symbol, not a design margin. Cropping it off is the commonest reason a code will not scan."
  },
  "payload_types": [
    {
      "id": "url",
      "label": "Website",
      "what": "One complete http or https address. The camera offers to open it.",
      "encodes_as": "RFC 3986 URI",
      "fields": [
        {
          "id": "url",
          "label": "Full website address",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    },
    {
      "id": "text",
      "label": "Plain text",
      "what": "Any text, stored verbatim. Nothing is rendered or executed by a scanner.",
      "encodes_as": "no scheme — raw text",
      "fields": [
        {
          "id": "text",
          "label": "Text",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    },
    {
      "id": "wifi",
      "label": "Wi-Fi network",
      "what": "Network name, security type and password, so a phone can join without typing.",
      "encodes_as": "WIFI: record, as read by iOS 11+ and Android 10+ cameras",
      "fields": [
        {
          "id": "ssid",
          "label": "Network name (SSID)",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "security",
          "label": "Security",
          "required": true,
          "options": [
            "WPA",
            "WEP",
            "nopass"
          ],
          "boolean": false,
          "secret": false
        },
        {
          "id": "password",
          "label": "Password",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": true
        },
        {
          "id": "hidden",
          "label": "Hidden network",
          "required": false,
          "options": null,
          "boolean": true,
          "secret": false
        }
      ]
    },
    {
      "id": "email",
      "label": "Email",
      "what": "Opens a new message with the recipient, subject and body already filled in.",
      "encodes_as": "RFC 6068 mailto:",
      "fields": [
        {
          "id": "to",
          "label": "Recipient",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "subject",
          "label": "Subject",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "body",
          "label": "Message",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    },
    {
      "id": "tel",
      "label": "Phone number",
      "what": "Offers to dial the number.",
      "encodes_as": "RFC 3966 tel:",
      "fields": [
        {
          "id": "number",
          "label": "Phone number",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "ext",
          "label": "Extension",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    },
    {
      "id": "sms",
      "label": "SMS",
      "what": "Opens a text message to the number with the body pre-filled.",
      "encodes_as": "SMSTO: record",
      "fields": [
        {
          "id": "number",
          "label": "Phone number",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "message",
          "label": "Message",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    },
    {
      "id": "vcard",
      "label": "Contact card",
      "what": "Offers to save a contact instead of opening anything.",
      "encodes_as": "vCard 4.0 (RFC 6350)",
      "fields": [
        {
          "id": "name",
          "label": "Full name",
          "required": true,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "org",
          "label": "Organisation",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "title",
          "label": "Job title",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "phone",
          "label": "Phone",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "email",
          "label": "Email",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        },
        {
          "id": "url",
          "label": "Website",
          "required": false,
          "options": null,
          "boolean": false,
          "secret": false
        }
      ]
    }
  ],
  "examples": [
    {
      "type": "wifi",
      "inputs": {
        "ssid": "Studio Guest",
        "security": "WPA",
        "password": "weeknight-parcel-7"
      },
      "payload": "WIFI:T:WPA;S:Studio Guest;P:weeknight-parcel-7;;",
      "warnings": [
        "The password sits in clear text inside the symbol. Anyone who can see or photograph the code can read it — put guests on a guest network before printing one."
      ]
    },
    {
      "type": "wifi",
      "inputs": {
        "ssid": "Lobby Open",
        "security": "nopass"
      },
      "payload": "WIFI:T:nopass;S:Lobby Open;;",
      "warnings": []
    },
    {
      "type": "url",
      "inputs": {
        "url": "https://appvau.lt/tools/qr-code-generator/"
      },
      "payload": "https://appvau.lt/tools/qr-code-generator/",
      "warnings": []
    },
    {
      "type": "tel",
      "inputs": {
        "number": "+14155550134",
        "ext": "204"
      },
      "payload": "tel:+14155550134;ext=204",
      "warnings": []
    },
    {
      "type": "sms",
      "inputs": {
        "number": "+14155550134",
        "message": "Table for two at seven"
      },
      "payload": "SMSTO:+14155550134:Table for two at seven",
      "warnings": []
    },
    {
      "type": "email",
      "inputs": {
        "to": "hello@example.org",
        "subject": "Order 4471",
        "body": "Received, thank you."
      },
      "payload": "mailto:hello@example.org?subject=Order%204471&body=Received%2C%20thank%20you.",
      "warnings": []
    },
    {
      "type": "vcard",
      "inputs": {
        "name": "Ada Lovelace",
        "org": "Analytical Engine",
        "title": "Programmer",
        "phone": "+442079460000",
        "email": "ada@example.org"
      },
      "payload": "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Lovelace;Ada;;;\r\nFN:Ada Lovelace\r\nORG:Analytical Engine\r\nTITLE:Programmer\r\nTEL;TYPE=cell;VALUE=text:+442079460000\r\nEMAIL:ada@example.org\r\nEND:VCARD",
      "warnings": []
    }
  ],
  "escaping": {
    "wifi": "Backslash-escape any of ; , : \" appearing in an SSID or a password. A record ends with two semicolons.",
    "vcard": "RFC 6350: backslash-escape backslash, comma and semicolon; encode a newline as \\n. Lines are separated by CRLF.",
    "note": "Getting this wrong produces a symbol that decodes to a truncated network name, which then fails to join with no explanation."
  },
  "error_correction_levels": [
    {
      "id": "L",
      "label": "L — low",
      "recovers": "~7%",
      "format_bits": 1,
      "what": "The most content in the smallest symbol. Fine on a screen."
    },
    {
      "id": "M",
      "label": "M — medium",
      "recovers": "~15%",
      "format_bits": 0,
      "what": "The usual default, and what most printed codes use."
    },
    {
      "id": "Q",
      "label": "Q — quartile",
      "recovers": "~25%",
      "format_bits": 3,
      "what": "For a code that will be printed small, or on a surface that scuffs."
    },
    {
      "id": "H",
      "label": "H — high",
      "recovers": "~30%",
      "format_bits": 2,
      "what": "The densest symbol for the same content. Redundancy is not a licence to cover modules with a logo."
    }
  ],
  "capacity": [
    {
      "version": 1,
      "modules": 21,
      "levels": [
        {
          "level": "L",
          "data_codewords": 19,
          "max_numeric_digits": 41,
          "max_alphanumeric_chars": 25,
          "max_bytes_utf8": 17
        },
        {
          "level": "M",
          "data_codewords": 16,
          "max_numeric_digits": 34,
          "max_alphanumeric_chars": 20,
          "max_bytes_utf8": 14
        },
        {
          "level": "Q",
          "data_codewords": 13,
          "max_numeric_digits": 27,
          "max_alphanumeric_chars": 16,
          "max_bytes_utf8": 11
        },
        {
          "level": "H",
          "data_codewords": 9,
          "max_numeric_digits": 17,
          "max_alphanumeric_chars": 10,
          "max_bytes_utf8": 7
        }
      ]
    },
    {
      "version": 2,
      "modules": 25,
      "levels": [
        {
          "level": "L",
          "data_codewords": 34,
          "max_numeric_digits": 77,
          "max_alphanumeric_chars": 47,
          "max_bytes_utf8": 32
        },
        {
          "level": "M",
          "data_codewords": 28,
          "max_numeric_digits": 63,
          "max_alphanumeric_chars": 38,
          "max_bytes_utf8": 26
        },
        {
          "level": "Q",
          "data_codewords": 22,
          "max_numeric_digits": 48,
          "max_alphanumeric_chars": 29,
          "max_bytes_utf8": 20
        },
        {
          "level": "H",
          "data_codewords": 16,
          "max_numeric_digits": 34,
          "max_alphanumeric_chars": 20,
          "max_bytes_utf8": 14
        }
      ]
    },
    {
      "version": 3,
      "modules": 29,
      "levels": [
        {
          "level": "L",
          "data_codewords": 55,
          "max_numeric_digits": 127,
          "max_alphanumeric_chars": 77,
          "max_bytes_utf8": 53
        },
        {
          "level": "M",
          "data_codewords": 44,
          "max_numeric_digits": 101,
          "max_alphanumeric_chars": 61,
          "max_bytes_utf8": 42
        },
        {
          "level": "Q",
          "data_codewords": 34,
          "max_numeric_digits": 77,
          "max_alphanumeric_chars": 47,
          "max_bytes_utf8": 32
        },
        {
          "level": "H",
          "data_codewords": 26,
          "max_numeric_digits": 58,
          "max_alphanumeric_chars": 35,
          "max_bytes_utf8": 24
        }
      ]
    },
    {
      "version": 5,
      "modules": 37,
      "levels": [
        {
          "level": "L",
          "data_codewords": 108,
          "max_numeric_digits": 255,
          "max_alphanumeric_chars": 154,
          "max_bytes_utf8": 106
        },
        {
          "level": "M",
          "data_codewords": 86,
          "max_numeric_digits": 202,
          "max_alphanumeric_chars": 122,
          "max_bytes_utf8": 84
        },
        {
          "level": "Q",
          "data_codewords": 62,
          "max_numeric_digits": 144,
          "max_alphanumeric_chars": 87,
          "max_bytes_utf8": 60
        },
        {
          "level": "H",
          "data_codewords": 46,
          "max_numeric_digits": 106,
          "max_alphanumeric_chars": 64,
          "max_bytes_utf8": 44
        }
      ]
    },
    {
      "version": 10,
      "modules": 57,
      "levels": [
        {
          "level": "L",
          "data_codewords": 274,
          "max_numeric_digits": 652,
          "max_alphanumeric_chars": 395,
          "max_bytes_utf8": 271
        },
        {
          "level": "M",
          "data_codewords": 216,
          "max_numeric_digits": 513,
          "max_alphanumeric_chars": 311,
          "max_bytes_utf8": 213
        },
        {
          "level": "Q",
          "data_codewords": 154,
          "max_numeric_digits": 364,
          "max_alphanumeric_chars": 221,
          "max_bytes_utf8": 151
        },
        {
          "level": "H",
          "data_codewords": 122,
          "max_numeric_digits": 288,
          "max_alphanumeric_chars": 174,
          "max_bytes_utf8": 119
        }
      ]
    },
    {
      "version": 15,
      "modules": 77,
      "levels": [
        {
          "level": "L",
          "data_codewords": 523,
          "max_numeric_digits": 1250,
          "max_alphanumeric_chars": 758,
          "max_bytes_utf8": 520
        },
        {
          "level": "M",
          "data_codewords": 415,
          "max_numeric_digits": 991,
          "max_alphanumeric_chars": 600,
          "max_bytes_utf8": 412
        },
        {
          "level": "Q",
          "data_codewords": 295,
          "max_numeric_digits": 703,
          "max_alphanumeric_chars": 426,
          "max_bytes_utf8": 292
        },
        {
          "level": "H",
          "data_codewords": 223,
          "max_numeric_digits": 530,
          "max_alphanumeric_chars": 321,
          "max_bytes_utf8": 220
        }
      ]
    },
    {
      "version": 20,
      "modules": 97,
      "levels": [
        {
          "level": "L",
          "data_codewords": 861,
          "max_numeric_digits": 2061,
          "max_alphanumeric_chars": 1249,
          "max_bytes_utf8": 858
        },
        {
          "level": "M",
          "data_codewords": 669,
          "max_numeric_digits": 1600,
          "max_alphanumeric_chars": 970,
          "max_bytes_utf8": 666
        },
        {
          "level": "Q",
          "data_codewords": 485,
          "max_numeric_digits": 1159,
          "max_alphanumeric_chars": 702,
          "max_bytes_utf8": 482
        },
        {
          "level": "H",
          "data_codewords": 385,
          "max_numeric_digits": 919,
          "max_alphanumeric_chars": 557,
          "max_bytes_utf8": 382
        }
      ]
    },
    {
      "version": 25,
      "modules": 117,
      "levels": [
        {
          "level": "L",
          "data_codewords": 1276,
          "max_numeric_digits": 3057,
          "max_alphanumeric_chars": 1853,
          "max_bytes_utf8": 1273
        },
        {
          "level": "M",
          "data_codewords": 1000,
          "max_numeric_digits": 2395,
          "max_alphanumeric_chars": 1451,
          "max_bytes_utf8": 997
        },
        {
          "level": "Q",
          "data_codewords": 718,
          "max_numeric_digits": 1718,
          "max_alphanumeric_chars": 1041,
          "max_bytes_utf8": 715
        },
        {
          "level": "H",
          "data_codewords": 538,
          "max_numeric_digits": 1286,
          "max_alphanumeric_chars": 779,
          "max_bytes_utf8": 535
        }
      ]
    },
    {
      "version": 30,
      "modules": 137,
      "levels": [
        {
          "level": "L",
          "data_codewords": 1735,
          "max_numeric_digits": 4158,
          "max_alphanumeric_chars": 2520,
          "max_bytes_utf8": 1732
        },
        {
          "level": "M",
          "data_codewords": 1373,
          "max_numeric_digits": 3289,
          "max_alphanumeric_chars": 1994,
          "max_bytes_utf8": 1370
        },
        {
          "level": "Q",
          "data_codewords": 985,
          "max_numeric_digits": 2358,
          "max_alphanumeric_chars": 1429,
          "max_bytes_utf8": 982
        },
        {
          "level": "H",
          "data_codewords": 745,
          "max_numeric_digits": 1782,
          "max_alphanumeric_chars": 1080,
          "max_bytes_utf8": 742
        }
      ]
    },
    {
      "version": 40,
      "modules": 177,
      "levels": [
        {
          "level": "L",
          "data_codewords": 2956,
          "max_numeric_digits": 7089,
          "max_alphanumeric_chars": 4296,
          "max_bytes_utf8": 2953
        },
        {
          "level": "M",
          "data_codewords": 2334,
          "max_numeric_digits": 5596,
          "max_alphanumeric_chars": 3391,
          "max_bytes_utf8": 2331
        },
        {
          "level": "Q",
          "data_codewords": 1666,
          "max_numeric_digits": 3993,
          "max_alphanumeric_chars": 2420,
          "max_bytes_utf8": 1663
        },
        {
          "level": "H",
          "data_codewords": 1276,
          "max_numeric_digits": 3057,
          "max_alphanumeric_chars": 1852,
          "max_bytes_utf8": 1273
        }
      ]
    }
  ],
  "encoding_modes": [
    {
      "id": "numeric",
      "charset": "0-9",
      "bits_per_unit": "10 bits per 3 digits",
      "when": "The whole payload is digits."
    },
    {
      "id": "alphanumeric",
      "charset": "0-9 A-Z space $ % * + - . / :",
      "bits_per_unit": "11 bits per 2 characters",
      "when": "The whole payload fits the restricted set. An all-capitals URL qualifies and is meaningfully smaller."
    },
    {
      "id": "byte",
      "charset": "any",
      "bits_per_unit": "8 bits per byte",
      "when": "Everything else. UTF-8."
    }
  ],
  "eci": {
    "assignment": 26,
    "means": "UTF-8",
    "when_written": "Only when the payload contains non-ASCII bytes. It is the correct declaration and also the thing old readers are most likely to mishandle, so it is not added when it buys nothing."
  },
  "tool": "https://appvau.lt/tools/qr-code-generator/",
  "verification": "The tool decodes both the PNG and the SVG it produces, from their own rendered pixels, and recomputes the Reed-Solomon codewords before either download unlocks. That proves the file decodes and that its redundancy is intact; it does not prove any particular camera will read any particular print."
}
