Version: 1.0.0
Status: Draft / Public Proposal
Authors: Wolfgang Wiese, University of Erlangen–Nuremberg
The Accessibility Metadata Format defines a machine-readable JSON structure for describing the accessibility evaluation status of a web project, product, theme, template, or standalone web application.
This format is intended to:
- document accessibility compliance (e.g., WCAG, EN 301 549) in a standardized way
- allow automated generation of accessibility statements (legal requirement in many regions)
- allow CMS plugins, CI pipelines, or scanners to read structured accessibility info
- provide verifiable metadata for third-party components (themes, templates, libraries)
The formal definition is included as a JSON Schema:
schema/v1/accessibility.schema.json
A typical accessibility report using this format SHOULD be stored as:
accessibility.json
The file SHOULD be placed in the project root and MAY additionally be exposed via:
/.well-known/<projectname-prefix>-accessibility.json
This allows both local tooling (reading from the project directory) and remote tooling (crawlers, automated checkers) to access the file in a predictable way.
Please note: The filename /.well-known/accessibility.json should not be used by plugins, themes, or other components. Due to its generic format, this filename should always be reserved for a report for the entire website. Therefore, the project prefix should always be used for components.
A valid accessibility metadata file contains the following top-level structure:
{
"specVersion": "1.0.0",
"generatedAt": "2025-11-27T10:35:00Z",
"language": "en",
"project": { },
"evaluation": { }
}| Field | Type | Required | Description |
|---|---|---|---|
specVersion |
string | yes | Version of this metadata format (e.g. 1.0.0). |
language |
string | yes | Language of all human-readable text in the file (BCP47, e.g. en, de-DE). |
project |
object | yes | Describes the evaluated project/product. |
evaluation |
object | yes | Contains the accessibility evaluation data. |
| Field | Type | Description |
|---|---|---|
generatedAt |
string (date-time) | ISO 8601 timestamp of report generation (e.g. 2025-11-27T10:35:00Z). |
The project object describes the software, theme, template, or web application being evaluated.
Example:
"project": {
"id": "rrze-example-theme",
"name": "Example Theme",
"type": "theme",
"description": "Responsive web theme designed for higher education websites.",
"platform": "WordPress",
"platformVersion": "6.7.1",
"homepage": "https://example.org/example-theme",
"repository": "https://git.example.org/rrze/example-theme",
"license": "GPL-2.0-or-later",
"version": "1.3.7",
"lastChange": "2025-11-26",
"contact": { ... },
"scope": { ... },
"roadmap": { ... }
}| Field | Type | Description |
|---|---|---|
name |
string | Human-readable project/product name. |
version |
string | Project version (SemVer or equivalent). |
contact.email |
string | Contact email address for accessibility-related issues. |
scope.coverage |
string | Evaluated scope (e.g. site, templates, components). |
scope.legalBasis[] |
array | List of normative/legal bases used (e.g. WCAG 2.2). |
id— Internal or machine-readable identifier (slug, package name, etc.).type— Type of project (e.g.theme,plugin,designSystem,application,website).description— Short human-readable description of the project.
platform— Underlying platform, e.g.WordPress,TYPO3,React,Custom,None.platformVersion— Version of that platform.
homepage— Public project/product website URL.repository— Source repository URL (e.g. GitHub, GitLab).license— License identifier, ideally SPDX (e.g.GPL-2.0-or-later,MIT).lastChange— Date of last relevant project change (YYYY-MM-DD).
The contact object describes how users can reach someone regarding accessibility issues.
"contact": {
"organization": "Regional Computing Center",
"department": "Webteam",
"person": "Accessibility Team",
"email": "accessibility@example.org",
"phone": "+49 9131 85-12345",
"url": "https://example.org/contact"
}| Field | Type | Description |
|---|---|---|
email |
string | Contact email address (must be a valid email address). |
organization— Name of the organization.department— Department or unit.person— Contact person or role (e.g. “Accessibility Team”).phone— Phone number.url— URL of a contact or support page.
The scope object describes what is covered by the accessibility evaluation.
"scope": {
"coverage": "templates",
"includesContent": false,
"languages": ["en", "de"],
"jurisdiction": "EU",
"legalBasis": ["WCAG 2.2", "EN 301 549", "EAA"]
}| Field | Type | Description |
|---|---|---|
coverage |
string | High-level coverage of the evaluation (e.g. site, templates, components, application). |
legalBasis |
array | List of legal/normative bases used (e.g. WCAG 2.2, EN 301 549). At least one entry required. |
includesContent— Boolean.trueif actual content was evaluated;falseif only templates/structure/components.languages[]— Languages in which the project is typically offered (BCP47 tags).jurisdiction— Legal jurisdiction for which this evaluation is relevant (e.g.EU-DE,EU,US).
The roadmap object defines planned improvements and future audits.
"roadmap": {
"plannedImprovements": [
{
"description": "Improve link contrast in the footer and sidebar.",
"relatedCriteria": ["1.4.3"],
"targetDate": "2026-03-31",
"issueURL": "https://git.example.org/rrze/example-theme/issues/42"
}
],
"nextAuditPlanned": "2026-01-31"
}| Field | Type | Required | Description |
|---|---|---|---|
plannedImprovements[] |
array | no | List of planned remediation actions. |
plannedImprovements[].description |
string | yes (per entry) | Description of the planned improvement. |
plannedImprovements[].relatedCriteria[] |
array | no | Related criteria (e.g. WCAG numbers). |
plannedImprovements[].targetDate |
string (date) | no | Planned completion date. |
plannedImprovements[].issueURL |
string (uri) | no | Link to an issue tracker entry. |
nextAuditPlanned |
string (date) | no | Date of the next planned accessibility evaluation. |
The evaluation object describes the actual accessibility evaluation in terms of standards such as WCAG.
Example:
"evaluation": {
"standard": "WCAG",
"version": "2.2",
"firstAudit": "2025-10-01",
"lastAudit": "2025-11-25",
"method": "thirdParty",
"auditor": "RRZE Webteam",
"conformance": "partially_conformant",
"reportURL": "https://example.org/wcag-report",
"tests": { ... },
"issues": [ ... ],
"limitations": [ ... ]
}| Field | Type | Description |
|---|---|---|
standard |
string | Name of the standard (e.g. WCAG, EN 301 549). |
version |
string | Version of the standard (e.g. 2.2). |
conformance |
string | Overall conformance status. |
issues[] |
array | List of identified issues (at least one issue). |
Recommended conformance values:
fully_conformantpartially_conformantnot_conformant
firstAudit— Date of first audit under this standard.lastAudit— Date of most recent audit.method— e.g.selfAssessment,thirdParty,automated.auditor— Name of auditor, team or organization.reportURL— URL to a more detailed report.tests— See next section.limitations— See section 10.
The optional tests object describes environment and test runs.
"tests": {
"environment": {
"os": "Windows 11",
"browser": "Firefox 130",
"assistiveTech": ["NVDA 2023.3"]
},
"runs": [
{
"type": "automated",
"tool": "axe-core",
"version": "4.8.0",
"date": "2025-11-25",
"sampleDescription": "Homepage, standard page template, news overview, contact form."
}
]
}All fields inside tests are optional in the format (you may omit the entire tests block), but if present, they must follow the schema.
| Field | Type | Description |
|---|---|---|
os |
string | Operating system used (e.g. Windows 11). |
browser |
string | Browser used (e.g. Firefox 130). |
assistiveTech[] |
array | Assistive technologies used (e.g. NVDA 2023.3). |
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | yes | Test type (e.g. automated, manual). |
tool |
string | yes | Name of the tool or method (e.g. axe-core, expertReview). |
version |
string | no | Tool version, if relevant. |
date |
string (date) | yes | Date of the test run. |
sampleDescription |
string | no | Description of the tested sample (pages, flows, etc.). |
The issues array contains all identified accessibility issues.
Example:
"issues": [
{
"criterion": "1.4.3",
"level": "AA",
"reason": "The contrast ratio of some footer text links is below 4.5:1.",
"alternatives": [
{
"description": "A high-contrast PDF version of the central information is available.",
"url": "https://example.org/high-contrast-info.pdf"
}
]
}
]| Field | Type | Description |
|---|---|---|
criterion |
string | Reference to the relevant criterion, typically a WCAG-style number (e.g. 1.4.3). |
reason |
string | Explanation why the criterion is not met. |
level— Level of the criterion (e.g.A,AA,AAA).alternatives[]— Alternative access methods or aids for this issue:
"alternatives": [
{
"description": "A high-contrast PDF version of the central information is available.",
"url": "https://example.org/high-contrast-info.pdf"
}
]Fields in each alternative:
| Field | Type | Required | Description |
|---|---|---|---|
description |
string | yes | Description of the alternative solution. |
url |
string (uri) | no | URL to an alternative resource or help. |
The limitations array describes known non-compliant areas or exceptions.
Example:
"limitations": [
{
"area": "Document archive prior to 2018",
"reason": "archivedContent",
"description": "Legacy PDF documents may not be fully accessible.",
"plannedFixDate": null
}
]| Field | Type | Description |
|---|---|---|
area |
string | Name or description of the affected area (e.g. “archive”, “legacy forms”). |
description |
string | Description of the limitation. |
reason— e.g.archivedContent,disproportionateBurden,thirdPartyContent.plannedFixDate— Date when the limitation is expected to be resolved, ornullif not planned.
The canonical JSON Schema for this format is stored in:
schema/v1/accessibility.schema.json
You can validate example files using tools such as ajv:
ajv validate -s schema/v1/accessibility.schema.json -d examples/full-accessibility.jsonOr in Python using jsonschema:
from jsonschema import validate
import json
with open("schema/v1/accessibility.schema.json") as f:
schema = json.load(f)
with open("examples/full-accessibility.json") as f:
data = json.load(f)
validate(instance=data, schema=schema)- This document defines format version 1.0.0.
- Backward-incompatible changes MUST result in a new major version (e.g.
2.0.0). - Backward-compatible, additive changes MAY result in a minor or patch version (e.g.
1.1.0,1.0.1).
Recommended directory structure:
schema/v1/accessibility.schema.json
schema/v2/accessibility.schema.json
...
Each major version MUST have its own schema and specification.
The specification and schema MAY be published under: CC BY 4.0
End of Accessibility Metadata Format – Specification v1.0