# WCAG 2.2 & EAA Accessibility Checker · SiteVerdict (`siteverdict/siteverdict-accessibility-auditor`) Actor

Audit websites for WCAG 2.2 AA and European Accessibility Act (EN 301 549) issues on desktop and mobile. axe-core plus keyboard focus, focus traps, target size, 320px reflow and reduced-motion checks. Scores, top 10 fixes and a shareable HTML report.

- **URL**: https://apify.com/siteverdict/siteverdict-accessibility-auditor.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$35.00 / 1,000 page audited (desktop + mobile)s

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

## SiteVerdict — Website Accessibility Auditor (WCAG 2.2 & EAA)

**Quick start:** replace the prefilled URL with your own page and press **Start**. One page audited on desktop and mobile costs $0.035.

**Automated checks find many accessibility issues, but not all.** This report is technical information, not a compliance certificate or legal advice. We recommend a manual expert audit for conformance claims.

**Works well with:** [Consent Mode v2 Auditor](https://apify.com/siteverdict/siteverdict-tracking-consent-auditor) · [Cookie & Privacy Policy Checker](https://apify.com/siteverdict/siteverdict-privacy-policy-checker) · [Core Web Vitals Scanner](https://apify.com/siteverdict/siteverdict-speed-revenue-scanner).

**Check any website for WCAG 2.2 AA accessibility issues on desktop and mobile, mapped to the European Accessibility Act (EN 301 549). Get a 0–100 score, the top 10 fixes in plain English, and a shareable, printable HTML report. Around $0.035 per page, with both devices included.**

SiteVerdict runs the industry-standard **axe-core** engine and adds checks that axe-core cannot do on its own:

- a **real keyboard Tab-through** that checks visible focus, focus hidden behind sticky bars, keyboard traps and skip links
- **WCAG 2.2 target size**
- **reflow at 320 px**, which is the same as 400% zoom
- a **reduced-motion** test
- vague link text, placeholder-only labels and suspicious alt text

***

### Why accessibility, why now

- The **European Accessibility Act (EAA)** has applied since **28 June 2025** to e-commerce, banking, transport, e-books and many other services sold to EU consumers, including those sold from the UK and US. The harmonised standard is **EN 301 549**, whose web requirements are WCAG 2.1 Level A and AA. WCAG 2.2 is expected in the next revision.
- In the UK, the **Equality Act 2010** and the Public Sector Bodies Accessibility Regulations require reasonable adjustments and WCAG AA for public bodies. In the US, **ADA** website lawsuits run into the thousands each year.
- About 1 in 4 adults has a disability. Accessible sites also convert better, rank better and work better on mobile.

### What it does

| | |
|---|---|
| 🧪 **axe-core 4.14** | WCAG 2.0 / 2.1 / 2.2 Level A + AA (optional AAA) plus best-practice rules |
| ⌨️ **Keyboard test** | Presses Tab up to 25 times (configurable) like a real keyboard user. It flags elements with **no visible focus indicator** (2.4.7), focus that lands **off-screen**, focus **hidden behind sticky headers or cookie banners** (2.4.11, new in WCAG 2.2), **keyboard traps** (2.1.2), **focus that changes the page** (3.2.1), and a missing or broken **skip link** (2.4.1) |
| 👆 **Target size** | WCAG 2.2 **2.5.8**: targets smaller than 24×24 px, including the official spacing exception and inline-link exception |
| 🔍 **Reflow / zoom** | Renders at **320 CSS px** (400% zoom) and finds what causes **horizontal scrolling** or cut-off text (1.4.10) |
| 🎞️ **Motion** | Finds long or infinite animations (2.2.2) and tests whether they stop when the user turns on **"reduce motion"** (2.3.3) |
| 🔗 **Content heuristics** | "Click here"/"read more" links (2.4.4), placeholder-only form labels (3.3.2), file-name or placeholder alt text (1.1.1), generic page titles (2.4.2), pages with no headings (1.3.1) |
| 🎨 **Colour contrast summary** | Number of failing elements, worst ratio, and the most common failing colour pairs |
| 🏛️ **Structure summary** | lang, title, h1 count, heading outline, landmarks, images without alt, unlabelled fields |
| 📱 **Desktop + mobile** | 1366 px desktop and a 390 px mobile touch viewport with a mobile user agent. Both are included in the per-page price. |
| 🇪🇺 **EAA mapping** | Every issue is mapped to its WCAG success criteria and level, plus its **EN 301 549 clause** (e.g. 9.1.4.3) and EAA relevance: *required*, *upcoming (WCAG 2.2)*, *AAA optional* or *best practice* |
| 🛠️ **Plain-English fixes** | A specific fix for every rule, the affected element's CSS selector and an HTML snippet |
| 📊 **Scores** | A 0–100 score and A–F grade per page and per device, severity counts, top 10 fixes, and a site summary |
| 📄 **HTML report** | A shareable, printable, accessible report saved to the key-value store (`REPORT`), plus a JSON `SUMMARY` |
| 🕷️ **Optional crawl** | Audits N internal pages per site. It stays on the same domain, respects robots.txt, skips login/cart/checkout pages, and supports include/exclude patterns. |

### How to use

1. Enter one or more **website URLs** (for example your home page, a product page and the contact page).
2. Optionally switch on **Crawl internal pages** and set **Max pages per website**.
3. Click **Start**. A typical page takes 5–20 seconds for both devices.
4. Open the **Output** tab:
   - **HTML report**: send it to your developer or client, or print it to PDF.
   - **Overview / Top fixes / All issues / Keyboard, reflow, motion & contrast**: table views you can export to CSV, Excel or JSON.
   - **Site summary**: JSON for dashboards.

#### Input example

```json
{
  "startUrls": [{ "url": "https://www.example-shop.co.uk/" }],
  "crawl": true,
  "maxPagesPerSite": 25,
  "devices": ["desktop", "mobile"],
  "wcagLevel": "AA"
}
```

All options: crawl depth, include/exclude regex, robots.txt, WCAG level (A/AA/AAA), best-practice rules, needs-review items, number of Tab presses, reflow and motion checks, examples per issue, concurrency, timeouts, extra wait for slow pages, and Apify Proxy.

### Input examples

One page, desktop and mobile:

```json
{ "startUrls": [{ "url": "https://www.example.com/" }] }
```

Crawl up to 20 pages of one site:

```json
{ "startUrls": [{ "url": "https://www.example.com/" }], "crawl": true, "maxPagesPerSite": 20 }
```

Desktop only:

```json
{ "startUrls": [{ "url": "https://www.example.com/" }], "devices": ["desktop"] }
```

### Output

One dataset item per page. Fields (abridged):

| Field | Meaning |
|---|---|
| `url`, `finalUrl`, `pageTitle`, `status` | `audited`, `failed`, `blocked` or `skipped` (only `audited` pages are charged). URLs in results, the report and the log are shown without query strings, fragments or credentials (`?[redacted]` marks a removed query); `urlHash` (first 16 hex of SHA-256 over the full URL) lets you join rows to your own list. |
| `score`, `grade`, `scoreByDevice` | 0–100 score, A–F, and per-device scores |
| `severity` | Failing rules by impact: critical / serious / moderate / minor |
| `violations`, `occurrences`, `needsReview` | Failing rules, affected elements, items to check manually |
| `eaaRequiredIssues`, `en301549ClausesFailed` | Failing rules in EAA / EN 301 549 scope, and which clauses |
| `topFixes[]` | The 10 highest-impact fixes: rule, WCAG, EAA, element count, fix, example selector |
| `issues[]` | Full list: `ruleId`, `source` (axe/custom), `type` (violation/needs-review), `impact`, `wcag[]` (SC, name, level, Understanding link), `eaa`, `fix`, `device`, `occurrences`, `nodes[]` (selector, HTML snippet, detail) |
| `keyboard` | Tab stops tested, invisible/obscured focus count, possible trap, skip link, first 30 steps of the focus order |
| `reflow`, `motion`, `contrast`, `structure` | Summaries of those checks |

Key-value store: `REPORT` (HTML), `SUMMARY` (JSON site summaries). When a run covers more than one site, there is also one `REPORT-<site>` per site.

#### Sample results (real run, 11 Oct 2026)

Local run: 4 start URLs, crawl on (max 5 pages per site, depth 1), desktop + mobile, WCAG 2.2 AA, concurrency 3. **15 pages audited in 61 s; peak memory about 1.8 GB.**

| Site | Pages | Avg score | Lowest | Notes |
|---|---|---|---|---|
| gov.uk | 5 | 92 | 82 | Very clean. Skip link present, no invisible focus, no reflow problems. |
| projects.accesscomputing.uw.edu (UW "Accessible University" demo) | 5 | 75 | **19** | The deliberately inaccessible "before" page scores 19. Its fixed "after" page scores 90. |
| bbc.co.uk | 4 | 83 | 52 | The home page has no automated failures (6 needs-review items). Content pages show target-size and label-in-name issues. |
| example.com | 1 | 78 | 78 | No main landmark, no headings, vague "Learn more" link |

The deliberately inaccessible demo page (`/au/before.html`) received these top fixes (abridged):

```json
{
  "url": "https://projects.accesscomputing.uw.edu/au/before.html",
  "score": 19, "grade": "F",
  "scoreByDevice": { "desktop": 21, "mobile": 22 },
  "severity": { "critical": 2, "serious": 6, "moderate": 4, "minor": 0 },
  "en301549ClausesFailed": ["9.1.1.1", "9.1.3.1", "9.1.4.1", "9.1.4.3", "9.1.4.10", "9.2.4.3", "9.2.4.6", "9.2.4.7", "9.3.1.1", "9.4.1.2"],
  "topFixes": [
    { "rank": 1, "title": "Form elements must have labels", "impact": "critical", "wcag": "4.1.2 Name, Role, Value (A)", "eaa": "required", "occurrences": 10,
      "fix": "Associate a visible <label for=\"id\"> with every form field (or wrap the field in <label>). Placeholders are not a substitute for labels.",
      "example": "input[name=\"name\"]" },
    { "rank": 2, "title": "Images must have alternative text", "impact": "critical", "wcag": "1.1.1 Non-text Content (A)", "occurrences": 2 },
    { "rank": 3, "title": "All touch targets must be 24px large, or leave sufficient space", "wcag": "2.5.8 Target Size (Minimum) (AA)", "eaa": "upcoming" },
    { "rank": 4, "title": "Elements must meet minimum color contrast ratio thresholds", "wcag": "1.4.3 Contrast (Minimum) (AA)" },
    { "rank": 5, "title": "Focused element is off-screen or invisible", "wcag": "2.4.7 Focus Visible (AA); 2.4.3 Focus Order (A)" },
    { "rank": 9, "title": "Horizontal scrolling at 320 px width (400% zoom)", "wcag": "1.4.10 Reflow (AA)",
      "fix": "Use responsive layouts: avoid fixed widths in px, use max-width:100% on images/media, allow long words/URLs to wrap ..." }
  ],
  "keyboard": { "tabStopsTested": 25, "invisibleFocusCount": 0, "possibleTrap": false, "skipLink": "missing" },
  "reflow": { "viewportWidth": 320, "scrollWidth": 729, "horizontalScroll": true },
  "contrast": { "failingElements": 4, "worstRatio": 2.52, "pairs": [{ "fg": "#8a94a8", "bg": "#e9e9ed", "ratio": 2.52, "required": 4.5, "count": 4 }] }
}
```

### Pricing

$0.035 per successfully audited page, with desktop and mobile both included ($35 per 1,000 pages). 20 pages cost $0.70. Failed, blocked, skipped and off-site pages are not charged. See **Performance, memory and cost** below for details.

### How the score works

- Each **failing rule** adds a penalty of `weight × (1 + log10(affected elements))`. The weights are critical 10, serious 6, moderate 3 and minor 1.
- `score = round(100 × e^(−total penalty / 60))`. The grades are A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, and F below 40.
- **Needs-review items never lower the score.** The score is a way to prioritise and track progress. It is **not** a conformance level. A score of 100 means no automatically detectable failures were found. It does not mean the page is accessible.

### Performance, memory and cost

- **Runtime:** typically 5–20 s per page for both devices (measured on gov.uk, bbc.co.uk, example.com and the UW demo). Each page has a hard timeout of 100 s, which you can configure, and pages are retried once. Target: 60 s or less per page.
- **Memory:** 4 GB is the default and recommended setting (it runs about 3–4 pages in parallel). 2 GB works for 1–2 pages at a time. Give 8 GB or more for large crawls with `maxConcurrency` 8 or higher.
- **Price:** pay per event, with one `page-audited` event per successfully audited page (desktop and mobile included). Failed, blocked, skipped and off-site pages are **not charged**. The run stops automatically when your *Max total charge* budget is reached.

### Limitations (please read)

> **Automated testing finds only part of accessibility problems.** Industry estimates put it at roughly 30–50% of issues, and many WCAG success criteria cannot be tested automatically at all (e.g. meaningful alt text, captions accuracy, logical reading order, error messages, cognitive load). **A clean result does not mean a website is accessible or compliant** with WCAG 2.2, EN 301 549, the European Accessibility Act, the UK Equality Act, the ADA or any other law. Items marked *needs review* require human judgement. **This tool and its reports are technical information, not legal advice.** For conformance claims, an accessibility statement or legal risk assessment, commission a **manual expert audit** that includes screen reader, keyboard-only, zoom and voice-control testing, ideally with disabled users.

Technical limitations:

- Content inside cross-origin iframes (embedded videos, maps, payment widgets) is not analysed.
- Pages behind logins are not supported. Cookie banners are audited as they appear to a first-time visitor and are not dismissed.
- The motion check detects CSS and Web Animations. JavaScript timer-driven carousels may not be detected.
- The keyboard test samples the first N Tab stops (default 25). It reports a *possible* trap that you should confirm manually.
- Sites protected by CAPTCHAs or bot-protection services are reported as `blocked` and not charged. The Actor never tries to bypass protection.

### FAQ

**Is this an accessibility overlay?** No. SiteVerdict only measures and reports. It never injects anything into your live site. Overlays do not make a site compliant.

**Which standard should I choose?** Choose WCAG 2.2 **AA** (the default). The EAA, EN 301 549, UK public-sector rules and most ADA settlements reference AA.

**Can I monitor my site weekly?** Yes. Create a Schedule in Apify Console with this Actor and your input, and compare scores over time with the Overview view.

**Can I white-label the report?** The report is self-contained HTML, so you can save it and add your own branding. Built-in white-labelling is on the roadmap.

### Data sources, compliance and retention

- **What it reads:** the public web pages you list (and, with crawling on, same-site links), loaded in a headless Chromium browser, plus each site's robots.txt (respected by default). It does not log in, submit forms or bypass bot protection; blocked pages are reported as `blocked` and not charged.
- **Private-network protection:** private, local and internal addresses (for example `localhost`, `10.x`, `192.168.x`, `169.254.169.254`) are refused, including after redirects (since 1.0.4).
- **No personal data** is collected on purpose. Results describe page markup (rules, CSS selectors, short HTML snippets). If a page itself shows personal data, a snippet of it can appear in an issue's evidence.
- **Where results are stored:** the default dataset (one row per page) and key-value store (`REPORT`, `SUMMARY`, per-site reports) of the run, inside your own Apify account. These default storages are unnamed. How long Apify keeps them is set by Apify and your plan, not by SiteVerdict ([Apify data retention](https://docs.apify.com/platform/storage/usage#data-retention)); you can delete them sooner in Apify Console.
- **What SiteVerdict keeps:** nothing. The Actor runs in your Apify account and sends no data to SiteVerdict.
- **Rules used:** axe-core 4.14 (Deque, MPL-2.0) mapped to WCAG 2.0/2.1/2.2 success criteria, plus our own checks described above.
- **Not a certificate and not legal advice.** Automated testing finds only part of the accessibility barriers on a page. A clean result does not mean the site conforms to WCAG, EN 301 549 or the European Accessibility Act; manual testing with assistive technology is still needed.

### Open-source licences

This Actor uses **axe-core®** by Deque Systems, licensed under the **Mozilla Public License 2.0** (MPL-2.0). We use the unmodified, published `axe-core` npm package. Its source code is available at <https://github.com/dequelabs/axe-core>, and the full licence text ships in the Actor image at `node_modules/axe-core/LICENSE`. axe-core is © Deque Systems, Inc. "axe" is a trademark of Deque Systems. This product is not affiliated with or endorsed by Deque. Other dependencies (Apify SDK, Crawlee, Playwright) are Apache-2.0. See [LICENSES.md](./LICENSES.md).

### Support

Found a false positive or need a feature? Open an issue on the Actor's **Issues** tab with the URL and the rule ID. Fixes are usually released within a few days.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-accessibility-auditor/changelog.md

# Actor input Schema

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

Pages to audit (e.g. your home page, a product page, checkout entry, contact form). Each URL is audited once per selected device. With crawling on, these are also the starting points for discovering internal pages.

## `crawl` (type: `boolean`):

Follow links on the start page(s) to audit more pages of the same website (same hostname; www. ignored). Respects robots.txt. Login, cart, checkout and admin URLs are skipped.

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

Maximum number of pages audited per website, including the start URL(s). Only used when crawling is on.

## `maxCrawlDepth` (type: `integer`):

How many clicks away from the start URL to follow links (1 = only pages linked from the start page).

## `maxPagesTotal` (type: `integer`):

Hard cap on pages audited in this run across all websites (each audited page is one billable event). The run also never exceeds your 'Max total charge' budget.

## `includeUrlPatterns` (type: `array`):

Optional. Only crawl discovered URLs matching at least one of these regular expressions, e.g. /products/ or /en-gb/.

## `excludeUrlPatterns` (type: `array`):

Optional. Skip discovered URLs matching any of these regular expressions, e.g. /blog/page/ or ?sort=.

## `respectRobotsTxt` (type: `boolean`):

Do not crawl discovered links disallowed by robots.txt. Start URLs you enter are always audited.

## `devices` (type: `array`):

Desktop = 1366x900 viewport. Mobile = 390x844 touch viewport with a mobile user agent (page is reloaded). Both are included in the per-page price.

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

AA is what the European Accessibility Act (via EN 301 549), the UK public sector regulations and most laws reference. AAA adds enhanced contrast and other optional rules.

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

Also report issues that are not strict WCAG failures but hurt real users (landmarks, heading order, one h1...). Marked as 'Best practice'.

## `includeNeedsReview` (type: `boolean`):

Report items that automated tools cannot decide (e.g. contrast over images, vague link text). They never lower the score.

## `keyboardTabStops` (type: `integer`):

How many Tab key presses to simulate to check visible focus, focus hidden behind sticky content, focus traps and skip links. 0 disables the keyboard test.

## `checkReflow` (type: `boolean`):

Detect horizontal scrolling and cut-off content at 320 CSS px width (WCAG 1.4.10).

## `checkMotion` (type: `boolean`):

Detect long or infinite animations and whether they stop when the user enables 'reduce motion' (WCAG 2.2.2 / 2.3.3).

## `maxNodesPerRule` (type: `integer`):

How many affected elements (selector + HTML snippet) to store per issue per page. The total count is always reported.

## `generateHtmlReport` (type: `boolean`):

Save a shareable, printable HTML report (key-value store record REPORT) plus a JSON site summary (record SUMMARY).

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

Optional. Usually not needed for accessibility audits. Use Apify Proxy if a site blocks data-centre traffic. The Actor never tries to bypass CAPTCHAs or bot protection; blocked pages are reported and not charged.

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

Upper limit of pages audited in parallel. Actual concurrency also scales with the memory you give the run (about 1 GB per parallel page).

## `navigationTimeoutSecs` (type: `integer`):

Maximum time to wait for a page to load.

## `pageTimeoutSecs` (type: `integer`):

Maximum time for the full audit of one URL (all devices). Pages that time out are retried once, then reported as failed and not charged.

## `waitAfterLoadMs` (type: `integer`):

Additional settle time after the page load event (for slow client-side rendering).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.gov.uk/"
    }
  ],
  "crawl": false,
  "maxPagesPerSite": 10,
  "maxCrawlDepth": 2,
  "maxPagesTotal": 100,
  "respectRobotsTxt": true,
  "devices": [
    "desktop",
    "mobile"
  ],
  "wcagLevel": "AA",
  "includeBestPractices": true,
  "includeNeedsReview": true,
  "keyboardTabStops": 25,
  "checkReflow": true,
  "checkMotion": true,
  "maxNodesPerRule": 20,
  "generateHtmlReport": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 4,
  "navigationTimeoutSecs": 30,
  "pageTimeoutSecs": 100,
  "waitAfterLoadMs": 1000
}
```

# Actor output Schema

## `report` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `pages` (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://www.gov.uk/"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-accessibility-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": [{ "url": "https://www.gov.uk/" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-accessibility-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": [
    {
      "url": "https://www.gov.uk/"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call siteverdict/siteverdict-accessibility-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siteverdict/siteverdict-accessibility-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/nr8kDX00V5QdXGIoQ/builds/Htb5p0nVX5LFxymu0/openapi.json
