# BFSG Barrierefreiheit & WCAG Accessibility Checker (`datenfuchs/bfsg-wcag-accessibility-checker`) Actor

Automatisierter Barrierefreiheits-Check nach BFSG / WCAG 2.1 AA (axe-core) für viele Websites pro Lauf: Score und Verstöße je Seite & Domain, Bericht auf Deutsch oder Englisch. Bulk accessibility audit for the European Accessibility Act (EAA). Keine Personendaten.

- **URL**: https://apify.com/datenfuchs/bfsg-wcag-accessibility-checker.md
- **Developed by:** [Datenfuchs Labs](https://apify.com/datenfuchs) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 page checkeds

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

## BFSG-Check: Barrierefreiheit & WCAG 2.1 AA für viele Websites prüfen (Bulk)

By **Datenfuchs Labs** · Deutsch | [English below](#english)

Automatisierter **Barrierefreiheits-Check nach BFSG** (Barrierefreiheitsstärkungsgesetz) und **WCAG 2.0/2.1 Stufe A + AA** – für eine oder hunderte Websites in einem Lauf. Ergebnis: Score, Verstöße je Seite und je Domain, plus **fertiger Bericht auf Deutsch** (Markdown + HTML) zum Weitergeben an Kunden oder Entwickler.

### Für wen?

- **Webagenturen & Freelancer:** Bestandskunden-Websites gesammelt vorprüfen, Angebote für BFSG-Nachbesserung vorbereiten
- **Shop-Betreiber (B2C-E-Commerce):** Startseite, Kategorie, Produkt, Warenkorb schnell checken
- **SEO-/Website-Audits:** Barrierefreiheit als zusätzlichen Audit-Punkt in bestehende Workflows (API, Zeitplan, Integrationen)

### Warum dieser Actor?

- **BFSG-Fokus & deutscher Report:** Regeltexte von axe-core auf Deutsch, Berichtsstruktur für den deutschen Markt
- **Bulk & günstig:** pro geprüfter Seite abgerechnet statt teurer Pauschale pro Domain
- **Ehrlich:** klare Hinweise, was automatisierte Tests leisten – und was nicht
- **Datensparsam:** kein HTML, keine Texte, keine Screenshots, keine personenbezogenen Daten

### So funktioniert es

1. Pro Start-URL (meist die Startseite) werden bis zu *N* Seiten derselben Domain gesammelt (Standard 5, Navigations-Links zuerst).
2. Jede Seite wird in Chromium geladen und mit **axe-core** nach WCAG 2.0/2.1 A + AA geprüft (Grundlage der EN 301 549, auf die das BFSG verweist).
3. Ergebnisse landen im Dataset, der Bericht als `REPORT.md` / `REPORT.html` im Key-Value-Store.

### Beispiel-Input

```json
{
  "startUrls": [
    { "url": "https://www.beispiel-shop.de" },
    { "url": "https://www.kunde-zwei.de" }
  ],
  "maxPagesPerDomain": 10,
  "language": "de",
  "generateReport": true
}
```

### Ergebnis (Dataset)

- je Seite (`type: "page"`): URL, Score 0–100, Anzahl betroffener Elemente je Schwere (kritisch/schwer/mittel/gering), Top-Verstöße (Regel-ID, Beschreibung, WCAG-Kriterien, Anzahl Elemente, Beispiel-CSS-Selektoren)
- je Domain (`type: "domainSummary"`): Durchschnitts-Score, schlechteste Seite, Summen, häufigste Verstöße
- optional Bericht `REPORT.md` und `REPORT.html` (Deutsch oder Englisch) – direkt im Tab „Output“ verlinkt

**Score:** 100 minus gewichtete Abzüge (kritisch 10, schwer 5, mittel 2, gering 1 pro Element, max. 10 Elemente je Regel). Eine grobe Orientierung zum Vergleichen und Priorisieren, kein Normwert.

### Input-Felder

| Feld | Standard | |
|---|---|---|
| `startUrls` | – | eine URL pro Website |
| `maxPagesPerDomain` | 5 | 1–100 |
| `language` | `de` | Bericht + axe-Regeltexte (`de`/`en`) |
| `generateReport` | true | REPORT.md / REPORT.html |
| `topViolations` | 10 | je Seite/Domain |
| `maxSelectorsPerViolation` | 3 | Beispiel-Selektoren |
| `proxyConfiguration` | aus | optional, falls Seiten Rechenzentrums-IPs blockieren |

### Preise

Pay-per-event ab **27. Oktober 2026**:

- `page-checked`: **$0.005** pro mit axe-core geprüfter Seite
- `domain-report`: **$0.02** pro Domain im Bericht
- zzgl. Apifys kleiner Startgebühr pro Lauf

Beispiel: 20 Websites × 5 Seiten = 100 Seiten → $0.50 + 20 × $0.02 = **$0.90**.

### Wichtige Hinweise (ehrlich)

- Automatisierte Tests finden nur einen **Teil** der WCAG-Probleme (grob 30–50 %). Tastaturbedienung, sinnvolle Alternativtexte, Verständlichkeit usw. brauchen eine manuelle Prüfung. „0 Verstöße“ heißt **nicht** barrierefrei.
- **Keine Rechtsberatung.** Das BFSG gilt seit 28.06.2025 vor allem für **B2C-E-Commerce** und bestimmte digitale Dienstleistungen für Verbraucher. **Kleinstunternehmen**, die Dienstleistungen erbringen (< 10 Beschäftigte und ≤ 2 Mio. € Jahresumsatz oder Bilanzsumme), sind ausgenommen.
- **DSGVO:** Es werden keine Seitentexte, kein HTML, keine Screenshots und keine personenbezogenen Daten gespeichert, nur URLs, Regel-IDs, Zähler und CSS-Selektoren.
- Manche Websites blockieren Rechenzentrums-IPs; dann optional Proxy aktivieren. Blockierte Domains werden nach 3 Fehlversuchen übersprungen.

### FAQ

**Reicht das für eine BFSG-Konformitätserklärung?** Nein. Der Check ist ein schneller, günstiger Vorab-Scan zum Priorisieren; eine vollständige Prüfung braucht zusätzlich manuelle Tests.

**Kann ich das regelmäßig laufen lassen?** Ja – als Apify-Zeitplan (z. B. monatlich) oder per API, um Verbesserungen über die Zeit zu verfolgen.

**Welche WCAG-Version?** axe-core-Regeln mit den Tags `wcag2a`, `wcag2aa`, `wcag21a`, `wcag21aa`.

### English

Bulk-checks websites for **WCAG 2.0/2.1 A + AA** violations with axe-core (basis of EN 301 549 / European Accessibility Act, German BFSG). Crawls up to *N* same-host pages per domain (default 5, navigation links first). Outputs per-page records, per-domain summaries and an optional Markdown/HTML report in **German or English**. Priced per page checked, so auditing many sites stays cheap.

Example input: `{"startUrls":[{"url":"https://www.example-shop.com"}],"maxPagesPerDomain":10,"language":"en"}`

Honest limits: automated testing catches only part of WCAG issues (roughly 30–50%); no findings ≠ accessible. Not legal advice. The German BFSG applies mainly to B2C e-commerce and consumer digital services; micro-enterprises providing services are exempt. No page text, HTML, screenshots or personal data are stored — only URLs, rule IDs, counts and CSS selectors.

### Run locally

```
npm install && npx playwright install chromium
## put input in storage/key_value_stores/default/INPUT.json
npm start
```

# Changelog

This Actor's version history is a separate document: https://apify.com/datenfuchs/bfsg-wcag-accessibility-checker/changelog.md

# Actor input Schema

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

One URL per website (homepage). Each domain is crawled separately.

## `maxPagesPerDomain` (type: `integer`):

Pages per domain incl. start URL (same-host links only).

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

Report language.

## `generateReport` (type: `boolean`):

Store a Markdown + HTML report per run in the key-value store (REPORT.md / REPORT.html).

## `topViolations` (type: `integer`):

Top violations per page.

## `maxSelectorsPerViolation` (type: `integer`):

CSS selectors only, no element HTML or text is stored.

## `proxyConfiguration` (type: `object`):

Optional. Some sites block datacenter IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "maxPagesPerDomain": 5,
  "language": "de",
  "generateReport": true,
  "topViolations": 10,
  "maxSelectorsPerViolation": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Page records (type=page) and domain summaries (type=domainSummary).

## `reportHtml` (type: `string`):

No description

## `reportMd` (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": [
        {
            "url": "https://example.com"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datenfuchs/bfsg-wcag-accessibility-checker").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": [{ "url": "https://example.com" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("datenfuchs/bfsg-wcag-accessibility-checker").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": [
    {
      "url": "https://example.com"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call datenfuchs/bfsg-wcag-accessibility-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datenfuchs/bfsg-wcag-accessibility-checker"
        }
    }
}
```

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/shT1qUmDfWTclFJHV/builds/Or3g9DZ9anMBJTKH6/openapi.json
