Requires that automatically detected input errors identify the field in error and describe the error to the user in text.
A form that reloads with no sign of what went wrong leaves people guessing. People who cannot see a red border, who use a screen reader, or who have cognitive disabilities need to be told in words that there is an error and where it is.
This criterion requires that if an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.
People who are blind, who have low vision or colour vision deficiency, and cannot rely on a red outline. People with cognitive, language and learning disabilities who need to understand why a submission failed. Screen reader users who must be told that and where an error occurred. People who use magnification and see only part of the form.
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. Errors identified in text are part of "understandable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 3.3.1 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.3.3.1 | Web pages | Web content must satisfy WCAG success criterion 3.3.1. |
| 10.3.3.1 | Non-web documents (PDF, Office files) | Documents must identify and describe input errors in text where the standard applies the criterion to them. |
| 11.3.3.1 | Non-web software (native mobile apps) | Software must identify input errors and describe them in text. |
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 3.3.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
A red border alone is not a text description.
<input id="email" style="border:2px solid red"><label for="email">Email</label>
<input id="email" type="email" aria-invalid="true" aria-describedby="email-err">
<p id="email-err" class="error">Enter an email address, for example [email protected].</p>aria-invalid flags the field and aria-describedby connects the message to it.
<input id="phone">
<span class="error">!</span><input id="phone" aria-invalid="true" aria-describedby="phone-err">
<span id="phone-err">The phone number must have 10 digits.</span>Say which required field was left empty. Keep the other entries when the form is shown again.
<p class="error">Please correct the form.</p><p class="error">The "Last name" field is required.</p>A live region or role="alert" makes screen readers read the message when it appears (ARIA19).
<div class="error" style="display:none">…</div> <!-- revealed silently --><div id="errors" role="alert"></div>
<script>
errors.textContent = "The \"Last name\" field is required.";
</script>List the errors at the top, each linked to its field, and move focus to the summary.
<!-- Form reloads with no summary and no messages --><div role="alert" tabindex="-1" id="summary">
<h2>2 errors</h2>
<ul>
<li><a href="#email">Email: enter a valid address</a></li>
<li><a href="#phone">Phone: 10 digits required</a></li>
</ul>
</div>If the page changes a value the user entered, say so.
qty.value = Math.min(qty.value, 10); // changed with no messageif (qty.value > 10) {
qty.value = 10;
msg.textContent = "The maximum is 10, so the quantity was set to 10.";
}Show the error in text next to the field, and make sure screen readers are told. Colour alone is not enough on a native screen either.
import SwiftUI
struct EmailField: View {
@State private var email = ""
@State private var error: String?
var body: some View {
VStack(alignment: .leading) {
TextField("Email", text: $email)
.onSubmit { validate() }
if let error {
// The error is text, not only a red border
Text(error).foregroundStyle(.red)
}
}
}
private func validate() {
if email.contains("@") { error = nil; return }
error = "Enter an email address, for example [email protected]."
// Tell VoiceOver users the error appeared
AccessibilityNotification.Announcement(error ?? "").post()
}
}import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.error
import androidx.compose.ui.semantics.semantics
@Composable
fun EmailField() {
var email by remember { mutableStateOf("") }
val message = if (email.isNotEmpty() && !email.contains("@"))
"Enter an email address, for example [email protected]." else null
OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
isError = message != null,
// The error is text, not only a red outline
supportingText = { message?.let { Text(it) } },
modifier = Modifier.semantics { message?.let { error(it) } }
)
}aria-invalid and unlinked messages, but cannot judge whether the text describes the error. A person must read it.alert() for everything: The message disappears when the dialog is closed and does not stay by the field.