# EU Accessibility Act (EAA) & WCAG 2.2 Auditor - Bulk Checker (`kryptoryn/eu-accessibility-act-wcag-auditor`) Actor

Audit many websites against WCAG 2.2 AA with axe-core and check EU Accessibility Act readiness: score, risk level, failures mapped to WCAG criteria with affected elements and fixes, plus accessibility statement check.

- **URL**: https://apify.com/kryptoryn/eu-accessibility-act-wcag-auditor.md
- **Developed by:** [Manuel P.](https://apify.com/kryptoryn) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 page auditeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EU Accessibility Act (EAA) & WCAG 2.2 Auditor: bulk website checker

The **European Accessibility Act** has applied since **28 June 2025**. E-commerce, banking, transport, e-books and many other digital services sold in the EU must now be accessible, and enforcement has started: courts and regulators are ordering fixes with daily penalties.

This Actor audits **many websites in one run** against **WCAG 2.2 level A/AA** (the level targeted by the EAA harmonised standard EN 301 549) using **axe-core**, the most widely used open-source accessibility engine. For every page you get an accessibility score, an EAA risk level, each failure mapped to its WCAG success criterion, the affected elements and how to fix them.

### What you get for each page

- **Score 0–100** and **EAA risk level** (high / medium / low)
- **Failures by impact**: critical, serious, moderate, minor
- **WCAG criterion** for every failure (e.g. 1.4.3 Contrast, 1.1.1 Non-text content, 2.5.8 Target size)
- **Affected elements**: CSS selector, HTML snippet and a fix summary (up to 3 examples per rule) plus a link to the full fix guide
- **Accessibility statement check**: whether the page links to an accessibility statement (EAA requires providers to publish how their service meets the requirements)
- **Page language** (`lang` attribute) and number of checks that **need manual review**

### Who is it for?

- **Web agencies and freelancers**: audit every client site at once and quote remediation work.
- **E-commerce and SaaS teams**: monitor your key pages (home, product, cart, checkout, login) on a schedule and catch regressions.
- **Compliance and legal teams**: get a quick, evidence-based snapshot across a portfolio of websites.
- **Lead generation**: find businesses with high EAA risk and offer accessibility services.

### Input

| Field | Description |
|---|---|
| Websites or pages | One URL or domain per line |
| Pages per site | 1 = only the URL entered. Higher values also audit internal pages, prioritising contact, product, cart, checkout, login and search |
| WCAG conformance level | A, AA (default, EAA target) or AAA |
| Report language | English, Español, Français, Deutsch, Italiano, Português, Nederlands, Polski (rule texts translated where axe-core has a translation) |
| Include best-practice rules | Adds axe-core best practices that are not strict WCAG requirements |
| Max concurrency | Pages audited in parallel (default 3) |

### Example output

```json
{
  "site": "www.example-shop.es",
  "url": "https://www.example-shop.es",
  "score": 64,
  "riskLevel": "high",
  "wcagLevel": "WCAG 2.2 AA",
  "violationCounts": {"critical": 1, "serious": 3, "moderate": 1, "minor": 0},
  "elementsAffected": 58,
  "accessibilityStatement": {"found": false, "url": null},
  "violations": [
    {
      "id": "image-alt", "impact": "critical", "wcag": ["1.1.1"],
      "help": "Images must have alternative text", "elements": 12,
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt",
      "examples": [{"selector": ".hero > img", "html": "<img src=\"banner.jpg\">", "fix": "Element does not have an alt attribute"}]
    }
  ]
}
```

The dataset has two views: **Pages** (one row per page) and **Failures and fixes** (one row per failed rule), exportable to CSV, Excel or JSON.

### How the score works

Each failed rule subtracts points by impact: critical 10, serious 6, moderate 3, minor 1 (doubled when more than 10 elements are affected). Risk is **high** with any critical failure or a score below 50, **medium** with any serious failure or a score below 80, otherwise **low**.

### Pricing

Pay per page audited. Pages that fail to load, return an error or are blocked by bot protection (some large retailers block automated browsers) are **not charged** and are listed with the reason in the key-value store record `FAILED_URLS`.

### Español

Audita en bloque webs según la **Ley Europea de Accesibilidad (EAA)** y **WCAG 2.2 AA**: puntuación, nivel de riesgo, cada fallo con su criterio WCAG, los elementos afectados y cómo corregirlos, y si la web enlaza una declaración de accesibilidad. Elige **Español** en *Report language*.

### Important limitations

Automated testing finds a significant share of WCAG failures, but not all of them: some criteria (keyboard flow, meaningful alt text, captions quality) always need a human review. A high score is **not** a legal certificate of conformance. Some large sites block automated browsers running in the cloud; those pages are reported in FAILED_URLS and not charged. Use these results to prioritise fixes and track progress, and combine them with a manual audit when you need a formal conformance statement. Only audit websites you own, manage or have a legitimate reason to review.

# Actor input Schema

## `startUrls` (type: `array`):

URLs or domains to audit, one per line, e.g. https://shop.example.com or example.es.

## `maxPagesPerSite` (type: `integer`):

1 audits only the URL you enter. Higher values also audit internal pages found on it, prioritising contact, product, cart, checkout, login and search pages.

## `wcagLevel` (type: `string`):

WCAG 2.2 level to test. The EAA harmonised standard EN 301 549 targets level AA.

## `language` (type: `string`):

Language of the rule descriptions and fixes, where an axe-core translation is available.

## `includeBestPractices` (type: `boolean`):

Also report axe-core best-practice rules that are not strict WCAG requirements.

## `maxConcurrency` (type: `integer`):

How many pages are audited in parallel.

## `maxSites` (type: `integer`):

Safety cap on the number of sites per run.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.boe.es",
    "https://example.com"
  ],
  "maxPagesPerSite": 1,
  "wcagLevel": "AA",
  "language": "en",
  "includeBestPractices": false,
  "maxConcurrency": 3,
  "maxSites": 500
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.boe.es",
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kryptoryn/eu-accessibility-act-wcag-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [
        "https://www.boe.es",
        "https://example.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kryptoryn/eu-accessibility-act-wcag-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.boe.es",
    "https://example.com"
  ]
}' |
apify call kryptoryn/eu-accessibility-act-wcag-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kryptoryn/eu-accessibility-act-wcag-auditor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/k2TvqynFu2PGjvffd/builds/gMOwqwj86VM40FI8i/openapi.json
