Accessible QR Codes: What to Add So Everyone Can Reach the Same Content
Published · Reviewed
An accessible QR code is never the only way to reach the content: provide an accessible text link or equivalent route, make the code easy to see, explain what scanning will do, and check that the destination page is accessible too. When the QR image adds unique purpose or function, its alt text should convey that purpose; when a nearby accessible link already provides the same information and action, alt="" may be appropriate. [S1][S3][S16] This checklist turns those points into items you can apply to a web page, a document or a printed piece, and shows which of them connect to a specific WCAG 2.2 success criterion and which are only good practice.
It is a set of recommendations, not a compliance certificate. Following it does not make a page conform to WCAG, and the checks have not been validated with real assistive-technology users.
What WCAG says, and what it does not
WCAG 2.2 is a standard for web content. Its Understanding pages do not mention QR codes (the 1.4.11 page, which people most often cite for QR contrast, says nothing about them), so every mapping from "QR code" to a criterion is a reading, not a W3C ruling. [S6] Third-party guidance makes similar readings and sometimes assigns different criteria to the same advice. For example, the DAISY Consortium's EPUB guidance ties identifying the code, giving instructions and offering an alternative link to 1.1.1, and ties minimum size to 2.5.8. [S15] This article uses three labels so you can tell which kind of statement you are reading:
- WCAG means the criterion's own wording covers the item for web content.
- Interpretation means we are applying a criterion to a QR code, and the W3C page does not say so.
- Recommendation means no WCAG success criterion requires it. It comes from the sources cited or from our own judgement.
| Checklist item | WCAG 2.2 criterion (level) | What the criterion actually says | Label |
|---|---|---|---|
| The QR image has a context-appropriate text alternative | 1.1.1 Non-text Content (A) | Convey the image's purpose when it provides unique information or function; alt="" can be appropriate when an adjacent accessible link makes the image redundant [S4][S16] | WCAG for web pages. For the choice between descriptive and empty alt, see Rule 2 |
| A link beside the code whose text says where it goes | 2.4.4 Link Purpose, In Context (A) | The purpose of a link can be worked out from its text, or its text with its context [S5] | WCAG for the link text. Having a link at all is a recommendation |
| A typed or printed address, and a route that needs no camera | None names QR codes | No WCAG success criterion mentions QR codes. Section508.gov says that, to comply with Section 508, a text alternative or link should sit next to a QR code in digital formats and a URL in print [S1]; that is a Section 508 reading, not a WCAG rule | Recommendation [S1][S3] |
| Squares of the code have at least 3:1 against their background | 1.4.11 Non-text Contrast (AA) | Parts of graphics required to understand the content need 3:1; the page does not mention QR codes, and the criterion says nothing about whether a scanner can read the code [S6] | Interpretation [S2] |
| Text next to the code has at least 4.5:1 | 1.4.3 Contrast (Minimum) (AA) | Text and images of text need 4.5:1; large text needs 3:1; logotypes and decoration are exempt [S7] | WCAG |
| No text baked into the code image | 1.4.5 Images of Text (AA) | Use real text rather than an image of text where the technology can do it, with exceptions for customisable text and essential presentation [S10] | WCAG for captions drawn into an image. For the code itself it is an interpretation |
| Instructions do not rely on position or shape ("scan the square on the right") | 1.3.3 Sensory Characteristics (A) | Instructions do not rely solely on sensory characteristics such as shape, colour, size or visual location [S8] | WCAG |
| Instructions do not rely on colour ("scan the green code") | 1.4.1 Use of Color (A) | Colour is not the only visual means of conveying information [S9] | WCAG |
| A minimum size and scanning distance | None for scanning. 2.5.8 Target Size (Minimum) (AA) only if the code image or its link is clickable | Pointer targets are at least 24 by 24 CSS pixels, unless an exception applies [S11] | Recommendation for print and for scanning. 2.5.8 is WCAG for clickable web targets only |
| A short sentence saying what scanning will do | None | 3.3.2 Labels or Instructions (A) is about form input, not about scanning [S13] | Recommendation [S2][S3] |
| No code that starts a text, call or download by itself | Related: 3.2.5 Change on Request (AAA) | Changes of context happen only on user request, or can be turned off; this is Level AAA [S14] | Interpretation, and only loosely. Recommendation [S1] |
| The destination page works on a phone and with magnification | For example 1.4.10 Reflow (AA); 3.3.2 for form fields | Content presents at 320 CSS pixels wide without two-dimensional scrolling [S12]; form controls have labels or instructions [S13] | WCAG for the destination page, not for the QR code |
| Test with a screen reader | None | Not a success criterion | Recommendation [S1] |
Printed pieces are outside WCAG's reach as web content, and Section508.gov notes that Section 508 standards do not apply to print, so every print item below is a recommendation. [S1]
Who a QR code leaves out
A QR code asks someone to point a camera at a small picture, wait for a scan, and trust a destination they cannot read first. That excludes more people than it first appears:
- People who cannot see the code or aim a camera at it. TetraLogical's 2022 analysis cites a survey in which 60% of the 38 blind or visually impaired respondents found it difficult to use QR codes independently, which is a small sample and so a signal, not a population figure [S2].
- People without a suitable smartphone, or who cannot reach the code. BOIA notes that people without smartphones or with older devices should not be left to figure it out [S3], and TetraLogical notes that people using wheelchairs or of restricted growth may not be able to reach a code placed high or low [S2]. Glare on a glossy surface can also stop a scan; that point is our own and not from these sources.
- People who do not want to open a link they cannot read. The destination is hidden until after the scan, and TetraLogical notes that some people may not use QR codes because of concerns about where they will be redirected. [S2]
BOIA's advice is similar and short: offer an alternative, give instructions, and make sure the code leads to accessible content. [S3] Everything below is a way of doing those three things concretely.
Rule 1: always offer a route that does not need the camera
Label: Recommendation, with WCAG 2.4.4 for the link text. Put the destination where a person can read it and type it, or click it.
- In print: the full address, or a short address that is easy to type, printed next to the code. Section508.gov says print materials should include the URL [S1].
- On screen: a clickable link next to the code, with link text that tells people where it goes. Link text such as "click here" tells people nothing on its own, and WCAG 2.4.4 asks that the purpose of a link can be determined from its text or from its text together with its context, where "link context" means context that software can work out, such as the sentence the link sits in. Write the purpose into the link text itself and you do not have to rely on that. [S5]
- For people who cannot browse: a phone number or office hours, when the code is the only way to register or pay.
Keep the address short enough to type. A long tracking address is not a real alternative.
Rule 2: write a useful text alternative
Label: WCAG 1.1.1 (Level A) for web pages; the example wording is our recommendation. For a QR image that conveys an otherwise unavailable destination or function, write alt text that communicates that purpose rather than its appearance. WCAG 1.1.1 asks for a text alternative serving the equivalent purpose. [S4] Section508.gov gives an example such as "QR code linking to the product accessibility page". [S1] Exception: if an adjacent, accessible text link fully communicates the same destination and action, the QR image may be redundant and alt="" can be appropriate. An empty alt attribute is different from an omitted alt attribute; do not omit the attribute itself. This choice depends on context, not a blanket rule for every QR image. [S16] For Word, PDF and slide decks, follow the relevant software's accessible-image guidance.
| Poor alt text | Why it fails | Better alt text |
|---|---|---|
QR code | Says nothing about where it leads | QR code that opens the spring fair sign-up form |
qr-code-final-v2.png | A filename | QR code to the 2026 bus timetable PDF |
alt="" when the QR image is the only accessible indication of its purpose | Silences information that is not provided elsewhere | QR code to the museum audio guide (when no equivalent accessible text link exists) |
https://example.org/a/very/long/path?x=1 | Reads out a long address that is already visible | QR code to the clinic booking page |
Black and white square pattern | Describes the look, not the purpose | QR code to download the volunteer handbook |
Scan me! | A command, not a description | QR code to the library event calendar |
These are examples we wrote for this article. Adjust them to match the language and context of the page, and keep each one short, because a screen reader reads every word.
Automated checkers cannot judge any of this on their own.
In a local run, 17 small HTML pages went through axe-core 4.11.0: 4 correct ones and 13 that were each broken in one deliberate way, and its default rules flagged 6 of the 13 (a missing language, an invalid language code, a missing alt attribute, an unnamed image link, an unnamed SVG, and low contrast). [T1] They did not flag the other 7, which included an image with the alt text "QR code", an alt text that was a filename, an empty alt, a "click here" link, and a page showing a code with no visible address. [T1] An empty alt is not always an error; it depends on whether another accessible route already provides the same purpose. [S16] The pages were ones we wrote, they are HTML only, and one run in one browser does not describe real sites, but the pattern is the point: a green automated report is not evidence that a QR code is accessible.
Rule 3: contrast, size and placement
Contrast. Label: Interpretation of WCAG 1.4.11 for the squares; WCAG 1.4.3 for nearby text. WCAG 1.4.11 asks for at least 3:1 contrast for graphical objects that are needed to understand content, at level AA. [S6] The W3C page does not mention QR codes, so applying it to a code is an interpretation. TetraLogical makes that reading and recommends that the colours used for the squares have a contrast ratio of at least 3:1. [S2] Section508.gov points to the WCAG 2.1 ratio of 4.5:1 for normal text and images, but it does not say which part of a QR code that ratio is meant for. [S1]
Treat 3:1 as a floor for people seeing the code. It is a visibility threshold for people, not a scanning guarantee: nothing in WCAG says whether a camera will decode a code at that ratio, so test every printed or on-screen variant with real phones. Text next to the code is ordinary text and needs 4.5:1 under WCAG 1.4.3 (3:1 if it is large-scale text). [S7]
Size and distance. Label: Recommendation. Standards do not give a single number here, and WCAG 2.5.8 sets a 24 by 24 CSS pixel minimum only for clickable targets on screen, which is a different question from whether a camera can read the code. [S11] TetraLogical suggests a minimum of 2 cm by 2 cm and a scanning distance of roughly ten times the code's width, and credits both figures to QR code vendors (QR Code Generator and Sprout QR for the 2 cm minimum, Scanova and Sprout QR for the ratio). [S2] Use them as starting points: a 10 cm code is meant to scan from about a metre. Then test on the real surface at the real distance.
Placement. Label: Recommendation. Put codes at a consistent, reachable height and position, and not where glare lands. TetraLogical notes people using wheelchairs or of restricted growth may not reach codes placed high or low. [S2]
Rule 4: tell people what will happen
- Label: Recommendation. Put a short instruction beside the code, such as "Point your phone camera at the code to open the sign-up form". Do not assume everyone knows how to scan. [S2]
- Label: WCAG 1.3.3 and 1.4.1. Do not rely only on position, shape or colour in the instruction. "Scan the square on the right" or "scan the green code" fails people who cannot see the layout or the colour, so name what the code does. WCAG 1.3.3 asks that instructions not rely solely on sensory characteristics such as shape, colour, size or visual location, and 1.4.1 asks that colour is not the only visual means of conveying information. [S8][S9]
- Label: Recommendation, loosely related to 3.2.5 (AAA). Avoid codes that act on their own, such as sending a text or starting a download. Link to a web page with a clear call to action so the person decides whether to continue. [S1][S14]
- Label: WCAG 1.4.5 for text in an image. Do not put text inside the code image. Put it in real text. WCAG 1.4.5 prefers real text over images of text, with an exception for essential presentation such as logotypes. [S10][S2]
Rule 5: check the destination, not only the code
Label: WCAG applies here, to the page you send people to. A perfect code that opens an inaccessible page is still a barrier. [S3] This is the one place where WCAG can actually be assessed, because the destination is web content.
- The destination should work on a phone: readable without zooming sideways, which WCAG 1.4.10 describes as presenting content at 320 CSS pixels wide without two-dimensional scrolling, with labelled form fields and buttons (3.3.2). [S12][S13]
- Do not force a file download as the only result. Give a page that explains and offers the file.
- Test the page with a screen reader and magnification. Section508.gov names VoiceOver on iOS and TalkBack on Android for this. [S1]
- If the code is on a short or redirecting address, check the final page too, because the code only holds the first address.
When not to use a QR code
Ask these questions before you add one:
| Question | If yes |
|---|---|
| Is the code the only way to register, pay, or get safety information? | Provide a second route as well, or skip the code |
| Will most of the audience be at a desk or on a laptop? | Use a clickable link |
| Does the destination require a long, complicated address? | Put a short page address in the text and use the code as a convenience |
| Is it on a moving vehicle, high on a wall, or behind glass? | Place it where it can be scanned, or use a typed address |
| Will the content change, or be removed, after printing? | Plan how you will update it. Printed materials cannot be updated, which Section508.gov flags as a risk [S1] |
Copy-ready checklist
Web page
- If the QR image provides unique purpose or function, its alt text conveys it; if an adjacent accessible text link makes the image fully redundant,
alt=""may be appropriate (WCAG 1.1.1). [S4][S16] - A text link to the same destination is next to the code, and its text says where it goes (WCAG 2.4.4). [S5]
- The visible web address is printed as text, not only inside the image (recommendation).
- Caption and link text have at least 4.5:1 contrast (WCAG 1.4.3). [S7]
- The code's squares have at least 3:1 against their background (interpretation of WCAG 1.4.11). [S6] [S2]
- Instructions do not depend on colour, shape or position (WCAG 1.4.1, 1.3.3). [S8][S9]
- The destination page works with a screen reader and magnification.
Word, PDF or presentation
- Provide a suitable text alternative for a QR image that conveys unique information or function; if the image is fully redundant to an accessible equivalent, consult the software's guidance for marking it decorative. We have not verified menu paths for any specific version.
- The address is visible text in the document and, where the format supports it, a live link.
- Run your authoring tool's own accessibility checker, and then a person's review.
Print (all recommendations)
- The address is printed next to the code, big enough to read. [S1]
- The code is at least about 2 cm across for close-up scanning, and bigger when it will be scanned from further away. [S2]
- A short instruction sits beside the code.
- You scanned a proof on at least two phones at the real distance and in the real light.
- Someone checked the destination page on a phone.
Example markup
This is an English adaptation of the block that passed axe-core in our fixtures (the original is in Traditional Chinese): a code, a purpose sentence and a typed fallback, all in one block. [T2] The adaptation below was not itself run through axe-core.
<figure class="qr-block">
<img src="spring-fair-signup-qr.svg" width="200" height="200"
alt="QR code that opens the spring fair sign-up form">
<figcaption>
<p>Scan with your phone camera to open the sign-up form.</p>
<p>Can't scan? Go to
<a href="https://example.com/spring-fair">Spring fair sign-up: example.com/spring-fair</a>
</p>
</figcaption>
</figure>
Making the code itself
If you need a plain code to start from, OwnQR's free QR code generator makes a static code. It uses error-correction level H, which the user cannot change. Its SVG export keeps the code itself as vector, but caption text is written as live text, not outlined shapes, so its font may be substituted on a machine without it, and an uploaded logo stays a raster image, so check how a caption looks after export. Whatever you use, apply the checklist above to the placement and the text around the code.
Sources
- [S1] Accessibility Bytes No. 8: Accessible QR Code Implementation (Section508.gov)
https://www.section508.gov/blog/accessibility-bytes/qr-codes/ · accessed - [S2] Accessibility and QR codes (TetraLogical, 2022)
https://tetralogical.com/blog/2022/08/08/accessibility-and-qr-codes/ · accessed - [S3] Are QR Codes Accessible for People with Disabilities? (BOIA, 2023)
https://www.boia.org/blog/are-qr-codes-accessible-for-people-with-disabilities · accessed - [S4] Understanding Success Criterion 1.1.1 Non-text Content (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html · accessed - [S5] Understanding Success Criterion 2.4.4 Link Purpose (In Context) (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html · accessed - [S6] Understanding Success Criterion 1.4.11 Non-text Contrast (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html · accessed - [S7] Understanding Success Criterion 1.4.3 Contrast (Minimum) (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html · accessed - [S8] Understanding Success Criterion 1.3.3 Sensory Characteristics (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html · accessed - [S9] Understanding Success Criterion 1.4.1 Use of Color (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html · accessed - [S10] Understanding Success Criterion 1.4.5 Images of Text (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html · accessed - [S11] Understanding Success Criterion 2.5.8 Target Size (Minimum) (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html · accessed - [S12] Understanding Success Criterion 1.4.10 Reflow (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/reflow.html · accessed - [S13] Understanding Success Criterion 3.3.2 Labels or Instructions (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html · accessed - [S14] Understanding Success Criterion 3.2.5 Change on Request (W3C WCAG 2.2)
https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html · accessed - [S15] DAISY Knowledge Base - QR codes (EPUB publishing guidance; no date shown on the page)
https://kb.daisy.org/publishing/docs/html/images-qr.html · accessed - [S16] W3C WAI — An alt Decision Tree (including redundant images)
https://www.w3.org/WAI/tutorials/images/decision-tree/ · accessed
Our own checks
- [T1] We checked 17 small HTML test pages (4 passing, 13 deliberately broken, all written by us) with the axe-core 4.11.0 accessibility checker in a browser. That tests HTML only, not screen readers. The script and its output are not public yet, and the result has not been independently verified.
- [T2] The example HTML block in this article is adapted from a block we wrote and checked with the same tool. It has not been tested with VoiceOver or TalkBack. The script and its output are not public yet, and the result has not been independently verified.