# Accessibility (WCAG) Quick Scanner (`zaden/my-actor-7`) Actor

Scans a page's static HTML for common WCAG accessibility issues -- missing alt text, unlabeled forms, heading problems, and more -- fast and without a browser. Need every check? See Full Site Health Suite for all 9 checks in one job.

- **URL**: https://apify.com/zaden/my-actor-7.md
- **Developed by:** [Zaden](https://apify.com/zaden) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.60 / 1,000 page scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Accessibility (WCAG) Quick Scanner

A fast, no-browser scan of a page's static HTML for the accessibility issues that trip up screen readers, keyboard users, and automated WCAG audits most often. Point it at one or more URLs and get back a **letter grade**, a 0-100 score, a severity tag, and a plain-English issue list.

### What it checks, per URL

- A **letter grade (A+ to F)** and 0-100 score summarizing accessibility health at a glance
- A one-line **executive summary** ("3 issue(s) found -- review recommended")
- A **severity** tag -- `critical` (missing alt text or unlabeled form fields -- the two issues that most directly block screen reader and assistive-tech users), `warning` (other issues), or `ok` -- for instant triage
- **Images missing `alt` text** -- screen readers can't describe them
- **Form fields with no accessible label** -- no `<label>`, `aria-label`, `aria-labelledby`, or `title`
- **Missing `lang` attribute** on `<html>` -- screen readers may mispronounce content
- **Missing viewport meta tag** -- can block pinch-zoom for low-vision users
- **Empty or ambiguous links** -- `<a>` tags with no text, aria-label, or image alt
- **Duplicate `id` attributes** -- break `label for=`, ARIA references, and in-page anchors
- **Heading hierarchy problems** -- pages that don't start with an `<h1>`, or skip a heading level
- **Missing page `<title>`**
- Pages are checked **in parallel** (configurable, up to 20 at once), so a batch of 50 URLs finishes in a fraction of the time a one-by-one check would take

### Why this instead of checking manually

| | Manual spot-checks | Accessibility (WCAG) Quick Scanner |
|---|---|---|
| Coverage | Whatever page you remember to test | Every URL you list, automatically |
| Speed | Minutes per page with dev tools open | Seconds, via parallel checking |
| Triage | You read the DOM yourself | Pre-classified severity + letter grade |
| Repeatability | Forgotten until an audit or complaint | One click, or schedule it |
| Output | Notes in a doc | Structured dataset, exportable to CSV/JSON/BI tools |

### Who this is for

- Developers running a quick pre-launch accessibility gut-check
- Agencies including an a11y pass in a client site audit
- Teams tracking ADA/WCAG compliance risk across key pages
- Anyone who wants a fast first pass before a full manual or automated audit

### How to use it

1. Add one or more **URLs to scan**.
2. Tune **concurrency** (default 5) to trade speed for gentleness on slow servers.
3. Run it once for a snapshot, or put it on an Apify **Schedule** to catch regressions after each deploy.

### What this does NOT check

This reads raw server-rendered HTML, the same way many bots and some screen readers do -- it does not run JavaScript, so client-side-rendered content and dynamically injected ARIA attributes won't be seen. It also cannot check color contrast, focus order, or keyboard-trap behavior, which require rendering. Treat this as a fast first pass, not a substitute for a full WCAG audit or manual testing with assistive technology.

### Example output (one item)

```json
{
  "url": "https://example.com/",
  "statusCode": 200,
  "score": 70,
  "grade": "C-",
  "severity": "warning",
  "summary": "3 issue(s) found -- review recommended.",
  "issueCount": 3,
  "issues": [
    "Missing \"lang\" attribute on the <html> element -- screen readers may mispronounce content.",
    "Missing <meta name=\"viewport\"> tag -- can prevent users from zooming on mobile.",
    "No heading elements (h1-h6) found on the page."
  ],
  "imagesTotal": 0,
  "imagesMissingAlt": 0,
  "formFieldsMissingLabel": 0,
  "hasLangAttribute": false,
  "hasViewportMeta": false,
  "emptyLinksCount": 0,
  "duplicateIdCount": 0,
  "headingHierarchySkips": 1,
  "hasPageTitle": true,
  "checkedAt": "2026-08-22T00:00:00.000Z"
}
```

### Pricing

This Actor uses pay-per-event pricing:

- **Page scanned** -- charged once per URL processed.

Parallel checking doesn't cost more -- it just finishes faster.

### FAQ

**Is this a full WCAG compliance audit?**
No. It's a fast static-HTML check covering common, high-impact issues. Full WCAG 2.1/2.2 conformance requires rendering, keyboard testing, and manual review that this tool doesn't attempt.

**Does it check color contrast?**
No -- contrast requires rendering CSS, which this Actor deliberately doesn't do to stay fast and cheap to run.

**What makes something "critical" vs. a "warning"?**
`critical` covers the two issues most likely to directly block a screen reader or assistive-tech user: images missing alt text, and form fields with no accessible label. `warning` covers everything else that lowers the score -- still worth fixing, but less immediately blocking.

**Will higher concurrency get me rate-limited?**
It can, on servers with aggressive rate limiting. Start at the default (5) and lower it if you see timeouts spike for a particular site.

**Does this send data anywhere besides your own Apify account?**
No. It only fetches the URLs you provide and returns what it finds.

# Actor input Schema

## `urls` (type: `array`):

One or more page URLs. Each page's static HTML is checked once for common accessibility issues.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each page to load before giving up.

## `concurrency` (type: `integer`):

How many pages to fetch and scan in parallel. Higher values finish faster at the same cost; lower values are gentler on slow servers.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/"
  ],
  "requestTimeoutSecs": 15,
  "concurrency": 5
}
```

# Actor output Schema

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

Accessibility issue findings for each scanned URL.

# 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 = {
    "urls": [
        "https://example.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaden/my-actor-7").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 = { "urls": ["https://example.com/"] }

# Run the Actor and wait for it to finish
run = client.actor("zaden/my-actor-7").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 '{
  "urls": [
    "https://example.com/"
  ]
}' |
apify call zaden/my-actor-7 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zaden/my-actor-7"
        }
    }
}

```

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/PDmgXp6uBAbJAQDaC/builds/FAg1ADD8FmWAD1H8R/openapi.json
