Requires that users can turn off, adjust or extend any time limit set by the content, with a warning before time runs out.
Many people need more time: to read, to type, to find a control, to understand a form. A session that expires after a few minutes, a quiz with a fixed countdown or a checkout that releases your basket too soon can lock them out and make them lose their work.
This criterion requires that for each time limit set by the content, users can turn it off, adjust it to at least ten times the default, or extend it. To extend it, they are warned before time runs out, given at least 20 seconds to respond with a simple action such as pressing Space, and can do this at least ten times.
People who read or type slowly, including people with cognitive or learning differences. Screen reader users, who need more time to navigate. People with motor disabilities who use switches or voice control. People who are interrupted. Anyone who needs longer than the designer expected.
The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. Enough time to use content is part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.2.1 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.2.1 | Web pages | Web content must satisfy WCAG success criterion 2.2.1. |
| 10.2.2.1 | Non-web documents (PDF, Office files) | Documents with time limits must meet the same rule where the standard applies the criterion to them. |
| 11.2.2.1 | Non-web software (native mobile apps) | Software with time limits must let users turn them off, adjust them or extend them. |
Whether and how the criterion applies to non-web documents is stated in clause 10 of the standard. Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality. Check the exact numbers in the standard when you cite them.
Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 2.2.1 is the same in WCAG 2.1 and 2.2.
A note on EAA scope: Article 2(4) of the Directive excludes certain content from the requirements, for example office file formats published before 28 June 2025 and archives that are not updated after that date. Content you publish or change after that date is not covered by these exclusions.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
Before the session expires, show a dialog that gives at least 20 seconds to respond and lets the user continue with one action.
setTimeout(() => { window.location = "/logout"; }, 5 * 60 * 1000);<dialog id="timeout" role="alertdialog" aria-labelledby="tt" aria-describedby="td">
<h2 id="tt">Your session is about to expire</h2>
<p id="td">You will be signed out in <span id="left">60</span> seconds.</p>
<button type="button" id="extend">Stay signed in</button>
</dialog>
<script>
// Warn 60 seconds before expiry; the user can extend repeatedly
extend.addEventListener("click", () => { refreshSession(); timeout.close(); });
</script>A meta refresh that moves the user on after a few seconds does not give them time to read.
<meta http-equiv="refresh" content="5; url=/next"><p>Your order was received.</p>
<a href="/next">Continue to your account</a>Offer a setting that extends the time or removes the limit before the quiz begins.
<p>You have 10 minutes. The timer cannot be changed.</p><label for="extra">Extra time</label>
<select id="extra">
<option value="1">Standard time (10 minutes)</option>
<option value="1.5">1.5x time</option>
<option value="2">2x time</option>
<option value="0">No time limit</option>
</select>Preserve entered data so that users can continue after being signed out.
// On timeout: session destroyed, form data lost// Save a draft locally (or on the server) and restore it after sign-in
form.addEventListener("input", () => {
sessionStorage.setItem("draft", JSON.stringify(Object.fromEntries(new FormData(form))));
});A short reservation time is a time limit. Give users a way to extend it.
<p>Your tickets are held for 3 minutes.</p><p>Your tickets are held for 15 minutes.
<button type="button" id="more">Add 15 more minutes</button></p>A warning is only useful if screen reader users hear it.
<div class="warn">Session ends soon</div><div role="alert">Your session ends in 60 seconds.
<button type="button">Stay signed in</button></div>Native apps have time limits too, for example sessions, one-time codes and countdowns. Warn users, let them extend, and keep their data.
import SwiftUI
struct SessionWarning: View {
@Binding var secondsLeft: Int
var extend: () -> Void
var body: some View {
VStack(spacing: 12) {
Text("Your session ends in \(secondsLeft) seconds.")
.accessibilityAddTraits(.isHeader)
// One simple action to extend; allow it repeatedly
Button("Stay signed in") { extend() }
}
.padding()
.onAppear {
// Announce so VoiceOver users hear the warning
UIAccessibility.post(notification: .announcement,
argument: "Your session ends soon")
}
}
}import androidx.compose.material3.*
import androidx.compose.runtime.Composable
@Composable
fun SessionWarning(secondsLeft: Int, onExtend: () -> Unit, onDismiss: () -> Unit) {
// Warn before expiry and offer one simple action to extend; allow it repeatedly
AlertDialog(
onDismissRequest = onDismiss,
title = { Text("Your session is about to expire") },
text = { Text("You will be signed out in $secondsLeft seconds.") },
confirmButton = {
TextButton(onClick = onExtend) { Text("Stay signed in") }
}
)
}meta refresh but not script-based timers. A person must test.role="alert" or role="alertdialog".