2.4.4 Link Purpose (In Context)
- Level A
- Operable
- Since WCAG 2.0
Summary
Screen reader users routinely navigate by pulling up a list of every link on the page and reading it out of visual context. Ten links that all announce as "Read more" tell that user nothing: which article, which product, which policy? The same list defeats speech input users trying to say a link's name, and people with cognitive disabilities scanning for a destination. This criterion, at Level A, requires that the purpose of each link is determinable from the link text alone, or from the link text combined with its programmatically determined context.
That second clause is what makes this criterion gradeable rather than a style preference. Generic text like "Read more" can be rescued at Level A if the machine-readable context supplies the rest: text in the same sentence, the same list item, the same table cell (or an associated header cell), or an explicit ARIA relationship such as aria-labelledby or aria-describedby. Context that is merely nearby on screen, with no programmatic relationship, does not count. The only exception is a link whose purpose is ambiguous to all users, sighted or not, by design (a deliberately unlabelled mystery link, for example). The AAA sibling, SC 2.4.9 Link Purpose (Link Only), removes the context lifeline entirely; do not apply that stricter bar in a Level A or AA audit.
Official wording
The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context, except where the purpose of the link would be ambiguous to users in general.
EN 301 549 mapping
- Web pages
- Clause 9.2.4.4
- Software and native apps
- Clause 11.2.4.4
Clauses 9.2.4.4 (web) and 11.2.4.4 (software) apply this criterion unchanged, so the same requirement binds web pages and native app user interfaces.
Clause references are to EN 301 549 V3.2.1 (2021-03), the harmonised European standard. Descriptions are our own summary, not the text of the standard.
In practice
Web
Pull the full link list first. With VoiceOver running in Safari, open the rotor and switch to Links, then arrow through every entry. Alternatively, inspect the accessibility tree in browser developer tools and read each link's accessible name. For each link, ask: does the name alone identify the purpose? If not, is there rescuing context in a programmatic relationship?
Check the rescue candidates in order. Is the generic link inside a sentence that names the destination ("Read the full text of the [regulation]")? Is it inside the same list item as the article title and excerpt (the classic card pattern, when the card is a genuine li)? Is it in a table cell whose row or column header identifies the target ("Download" links in a documents table)? Does aria-labelledby or aria-describedby stitch the title into the announced name or description? W3C also accepts the immediately preceding heading as sufficient context. If none of these apply and the visible clue sits in a sibling div with no relationship, the link fails: proximity on screen is not programmatic context.
Two further web patterns to watch. Raw URLs as link text: a short, human-readable address can convey purpose to the page's audience, but a long machine-generated URL full of parameters conveys nothing and fails. Icon-only links (social icons, a magnifier, a cart) inherit the same duty: their accessible name must convey the destination, so alt="icon" or aria-label="link" fails here, while a missing name altogether is a different criterion (see below).
iOS
The criterion applies unchanged to native software under the European standard, so grade iOS apps to the same bar. With VoiceOver running, set the rotor to Links and swipe through; also traverse the screen element by element, since many navigational controls in native apps carry the button trait rather than the link trait and will not appear in the links rotor. Judge whatever VoiceOver announces for each navigational element as its name, then look for programmatic context in the same announcement or the element's hint.
Merged semantics are the platform's version of rescuing context. When a whole card or table row is exposed as a single accessible element, VoiceOver reads the row's title, subtitle, and trailing "See all" or "Learn more" text as one announcement, and the merged content supplies the purpose. The failure spots are the opposite pattern: a link-styled "See all" button in a section header exposed as its own element, announcing only "See all, button", with the section title in a separate element; or a standalone "Learn more" under a promotional card. Use Accessibility Inspector in Xcode to read the accessible label of the suspect element and confirm what is, and is not, part of it.
Android
The same bar applies to Android under the European standard. With TalkBack running, traverse the screen, and use the reading controls (or the TalkBack menu's links option for links embedded in text) to review navigational elements. Links implemented as ClickableSpan inside a paragraph are announced within their sentence, so same-sentence context is available exactly as on the web. Standalone "See all" or "Learn more" text buttons are the risk: if the element announces only the generic text and the section title lives in a separate node, the purpose is not determinable.
As on iOS, merged semantics can supply the context. A list row or Compose card that merges its descendants into one accessible node announces title, supporting text, and the generic call to action together, which passes. Verify with Layout Inspector in Android Studio (check contentDescription and the merged semantics tree in Compose) or simply by listening to the TalkBack announcement: everything spoken for that single element counts as its context, and anything requiring a separate swipe does not.
Pass and fail examples
Passes:
- A blog index where each card is a list item containing the post title, an excerpt, and a "Read more" link: the same list item supplies the purpose at Level A.
- A "Read more" link whose
aria-labelledbyreferences both its own text and the article heading, announcing as "Read more, Understanding the audit lifecycle". - A documents table with a "Download" link in each row, where the row header cell names the document.
- The link "annual report 2025" in running prose: the link text alone conveys the purpose.
- A native app list row exposed as one accessible element that announces "Invoices, 3 unpaid, See all" as a single name: merged semantics supply the context.
Fails:
- Ten "Read more" links in a card grid built from sibling
divelements, with each card's title in a separate element and no list structure or ARIA relationship connecting them. - A social footer with three icon links named "icon", "icon", and "icon": names exist, but none conveys a destination.
- A link whose visible text is a machine-generated URL of 120 characters of path segments and tracking parameters.
- A "click here" link where the destination is described in a callout elsewhere on the page with no programmatic relationship to the link.
- A "See all" text button in an app's section header, exposed as its own element announcing only "See all, button", with the section title in a separate node.
Not a fail under this criterion:
- An icon link with no accessible name at all: that is a missing name, graded under SC 4.1.2 for icon-font, SVG, or CSS controls (or SC 1.1.1 where the visual is an image element), not an unclear purpose here.
- A link whose accessible name omits its visible text (visible "View pricing", name "Plans"): grade the mismatch under SC 2.5.3 Label in Name.
- A "Read more" link that passes via its list item context but would fail the link-text-alone bar: that stricter bar is SC 2.4.9 at Level AAA and is out of scope in an A or AA audit.
- A section heading that is vague or unhelpful: heading quality belongs to SC 2.4.6, even when the weak heading sits above a set of links.
Commonly confused with
- Name, Role, Value, SC 4.1.2. Control naming generally lives there: a link or icon control with no accessible name at all is a 4.1.2 finding (filed by element type, per the house position). This criterion applies once a name exists and asks whether it conveys the link's purpose. One finding, one criterion; never double-count the same missing name.
- Label in Name, SC 2.5.3. That criterion compares the visible text with the accessible name for speech input users. A link can pass 2.5.3 perfectly (name matches the visible "Read more") and still fail here because "Read more" conveys no purpose; the two grade different questions.
- Headings and Labels, SC 2.4.6. The quality of headings and labels is graded there. A weak heading above a group of links is a 2.4.6 finding; a link whose own purpose cannot be determined is a 2.4.4 finding, even though the fix (better wording) often looks similar.
- SC 2.4.9 Link Purpose (Link Only). The Level AAA sibling requires the link text alone to convey the purpose, with no context rescue. Auditors who fail every "Read more" link regardless of its list item or sentence are applying 2.4.9 to a Level A criterion.
How AUDITSU tests this
AUDITSU's audit walkthrough covers link purpose on every screen you review, with the screen reader running. The walkthrough prompts you to pull the full set of links and navigational controls (rotor links list on web and iOS, TalkBack traversal on Android), read each announced name out of visual context, and then check the programmatic context (sentence, list item, table cell, ARIA relationship, or merged native semantics) before grading. Each question records a pass, fail, or not applicable result per screen, with the announced name and its context captured as evidence, so a "ten identical Read more links" finding lands tied to the exact screen and elements.
Because the criterion applies unchanged to web content and native software under the European standard, the walkthrough asks the same questions across all three platforms and grades them to the same Level A bar.
For the full guided workflow, see the audit platform.