# White-Label WCAG Audit Report Generator (`cardinal_lecturer/a11ybatch`) Actor

Crawl client websites, detect WCAG 2.2 accessibility issues, and generate branded HTML and PDF reports with selectors, evidence, risk scores, and developer-ready remediation guidance.

- **URL**: https://apify.com/cardinal\_lecturer/a11ybatch.md
- **Developed by:** [Arya Singh](https://apify.com/cardinal_lecturer) (community)
- **Categories:** Developer tools, Automation, Other
- **Stats:** 2 total users, 0 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 audited pages

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## White-Label WCAG Audit Report Generator

Crawl client websites, detect WCAG 2.2 accessibility issues, and generate branded HTML and PDF reports with selectors, evidence, risk scores, and developer-ready remediation guidance.

### Live Demo Report

See the deliverable first:
[HTML report](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/DEMO_REPORT_HTML) -
[PDF report](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/DEMO_REPORT_PDF) -
[JSON export](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/DEMO_REPORT_JSON) -
[CSV export](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/DEMO_REPORT_CSV)

This demo run audited W3C's intentionally inaccessible Before and After Demo pages. It scanned 3 public pages, found 6 critical and 11 serious WCAG issues, produced an average automated risk score of 91, and exported branded HTML, PDF, JSON, and CSV reports.

![HTML report overview](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/HTML_OVERVIEW_PNG)

![HTML violation details with selectors and evidence](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/HTML_VIOLATIONS_PNG)

![PDF report cover](https://api.apify.com/v2/key-value-stores/vDD6mQmIo4ihib4QF/records/PDF_COVER_PNG)

### Common Buyer Workflows

- Generate a white-label WCAG audit PDF for an agency client.
- Run a Shopify accessibility audit for WCAG 2.2 storefront issues.
- Run a WordPress accessibility audit across public marketing pages.
- Audit ecommerce pages for EAA accessibility risk signals.
- Find missing alt text across a website.
- Find unlabelled forms, buttons, links, and missing accessible names.
- Create an accessibility fix backlog for developers.
- Export WCAG violations to JSON and CSV for QA or ticketing systems.

### Example Client Report

**Northstar Retail WCAG 2.2 Audit**

Prepared for Acme Digital - Branded HTML and PDF report

| Overall automated risk | Pages audited | Critical | Serious | Moderate |
| ---------------------- | ------------: | -------: | ------: | -------: |
| 68 / 100               |            24 |        3 |      14 |       31 |

**Executive summary:** The audit found recurring image alternative text, form label, button name, and color contrast issues across product listing and checkout-adjacent public pages. The developer backlog below prioritizes critical and serious findings first, with exact selectors, escaped HTML evidence, and remediation guidance for each affected page.

| Priority | WCAG rule        | Affected page           | Selector                  | Developer action                                             |
| -------- | ---------------- | ----------------------- | ------------------------- | ------------------------------------------------------------ |
| Critical | `image-alt`      | `/collections/sale`     | `img.product-card__image` | Add useful alternate text or mark decorative images empty.   |
| Serious  | `label`          | `/pages/contact`        | `input[name="email"]`     | Associate the input with a visible label or accessible name. |
| Serious  | `button-name`    | `/products/classic-bag` | `button.icon-only`        | Add an accessible button name that describes the action.     |
| Moderate | `color-contrast` | `/`                     | `.promo-banner__text`     | Increase text/background contrast for WCAG AA.               |

Each run stores polished `REPORT_HTML` and `REPORT_PDF` files for clients, plus `REPORT_JSON`, `REPORT_CSV`, and one structured Dataset item per successfully audited page.

A11yBatch scans public client websites with Playwright and axe-core, then returns developer-ready accessibility findings as Apify Dataset items plus branded JSON, CSV, HTML, and PDF reports. It is built for agencies, QA teams, product teams, and developers who need repeatable automated accessibility checks inside Apify workflows. Apify supplies accounts, billing, scheduling, API access, storage, integrations, and marketplace delivery.

> This automated report identifies issues detectable by the configured axe-core rules. Automated testing cannot evaluate every accessibility requirement and does not establish legal or WCAG conformance. Manual testing by qualified people, including assistive-technology testing, may still be required.

### What You Get

- One billable Dataset item per successfully audited page
- Run-level `OUTPUT` summary with totals, average automated risk score, and report URLs
- `ERRORS` record for failed, unreachable, robots-blocked, invalid, or unsafe pages
- Stable `REPORT_JSON`, `REPORT_CSV`, `REPORT_HTML`, and `REPORT_PDF` key-value records
- Developer-ready rule IDs, impacts, WCAG tags, selectors, escaped evidence, and axe help links

### What It Checks

- WCAG 2.0, WCAG 2.1, and WCAG 2.2 axe-core rules
- WCAG A or AA rule tags
- Public HTTP and HTTPS pages only
- Same-origin crawl by default, with optional subdomain inclusion
- Sitemap discovery plus same-site link discovery
- Violations, incomplete checks, affected selectors, offending HTML snippets, and remediation links

### Inputs

- `startUrls` - required public HTTP/HTTPS URLs, up to 100
- `maxPagesPerSite` - 1 to 100 pages per site, default 10
- `useSitemap` - read `/sitemap.xml` and sitemap indexes first, default true
- `includeSubdomains` - include subdomains of the starting host, default false
- `wcagLevel` - `A` or `AA`, default `AA`
- `standards` - `WCAG_2_0`, `WCAG_2_1`, `WCAG_2_2`, default all
- `includePasses` - include passed axe checks in output, default false
- `generateHtmlReport` - store responsive HTML report, default true
- `generatePdfReport` - store PDF report, default true
- `brandName`, `brandColor`, `logoUrl` - optional report branding
- `waitAfterLoadMs` - extra wait after DOMContentLoaded, default 1000
- `pageTimeoutSecs` - navigation timeout, default 30
- `respectRobotsTxt` - obey robots.txt, default true

### Output

Each successfully audited page creates exactly one default Dataset item:

```json
{
  "url": "https://example.com",
  "finalUrl": "https://example.com/",
  "pageTitle": "Example Domain",
  "scannedAt": "2026-06-24T06:00:00.000Z",
  "httpStatus": 200,
  "automatedRiskScore": 24,
  "summary": {
    "critical": 0,
    "serious": 1,
    "moderate": 2,
    "minor": 0,
    "affectedNodeCount": 5,
    "violationCount": 3,
    "incompleteCount": 1,
    "passCount": 0
  },
  "violations": [
    {
      "id": "image-alt",
      "impact": "critical",
      "help": "Images must have alternate text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/...",
      "tags": ["cat.text-alternatives", "wcag2a"],
      "wcagTags": ["wcag2a"],
      "recommendedFix": "Images must have alternate text. Review the affected selector(s), update the page implementation, and rerun the scan.",
      "affectedNodeCount": 1,
      "nodes": [
        {
          "target": ["img.hero"],
          "html": "<img class=\"hero\" src=\"hero.jpg\">",
          "htmlSnippet": "&lt;img class=&quot;hero&quot; src=&quot;hero.jpg&quot;&gt;",
          "failureSummary": "Fix any of the following..."
        }
      ]
    }
  ],
  "incomplete": [],
  "reportUrls": {
    "json": "https://api.apify.com/v2/key-value-stores/.../records/REPORT_JSON",
    "csv": "https://api.apify.com/v2/key-value-stores/.../records/REPORT_CSV",
    "html": "https://api.apify.com/v2/key-value-stores/.../records/REPORT_HTML",
    "pdf": "https://api.apify.com/v2/key-value-stores/.../records/REPORT_PDF"
  },
  "error": null
}
````

Failed pages are not pushed as Dataset items. They are stored in the default key-value store under `ERRORS`.

The run-level summary is stored under `OUTPUT` and includes requested sites, attempted pages, successful audits, failures, totals by impact, total affected nodes, top violation rules, average automated risk score, timestamps, status message, and report URLs.

### Automated Risk Score

`automatedRiskScore` is not a compliance score. It is a deterministic prioritization score from 0 to 100.

Formula:

```text
weightedIssues = sum(impactWeight * affectedNodeCount)
impactWeight: critical=10, serious=6, moderate=3, minor=1
automatedRiskScore = round(100 * weightedIssues / (weightedIssues + 40))
```

The score rises faster for critical and serious findings, and for rules that affect many nodes.

### Reports

A11yBatch stores stable report records in the default key-value store:

- `REPORT_JSON`
- `REPORT_CSV`
- `REPORT_HTML`
- `REPORT_PDF`

The HTML and PDF reports include optional branding, an executive summary, page-level scores, severity totals, filterable violation rows, exact selectors, safely escaped HTML snippets, remediation guidance, official axe help links, metadata, and limitations.

Before: manual browser extension checks one page at a time. After: batch scan public pages, export structured findings, and share a client-ready report.

### API Usage

```bash
curl "https://api.apify.com/v2/acts/YOUR_USERNAME~a11ybatch/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{ "url": "https://example.com" }],
    "maxPagesPerSite": 10,
    "wcagLevel": "AA",
    "standards": ["WCAG_2_0", "WCAG_2_1", "WCAG_2_2"],
    "generateHtmlReport": true,
    "generatePdfReport": true
  }'
```

### Scheduling Example

Create an Apify Task with the input above, then schedule it weekly or monthly in Apify Console. Use integrations or webhooks to send the `OUTPUT` record or Dataset export to Slack, email, Google Drive, or your QA workflow.

### Pricing

Use Apify Store pay-per-event monetization with one chargeable event:

| Event                      |     Price |
| -------------------------- | --------: |
| Actor start                | No charge |
| Successfully audited page  | **$0.03** |
| HTML and PDF report        |  Included |
| Failed or unreachable page |        $0 |

Configure `apify-default-dataset-item` as the primary event with title `Audited page`. Remove the synthetic `apify-actor-start` event from monetization so Actor starts are not charged. Failed and unreachable pages are stored in `ERRORS`, not the default Dataset, so they do not create paid events.

### Responsible Use

- Scan only public pages you are allowed to test.
- Do not submit credentials or authenticated account URLs.
- Leave `respectRobotsTxt` enabled unless you have permission to scan blocked paths.
- Keep `maxPagesPerSite` modest for routine monitoring.
- Treat automated findings as triage input, not legal proof of conformance.

### When Not to Use This

- Authenticated applications, account dashboards, checkout steps, or pages requiring cookies
- Legal certification, formal WCAG conformance claims, or final EAA compliance sign-off
- Manual screen-reader, keyboard-only, cognitive, usability, or assistive-technology testing
- Any page you do not have permission to scan

### Limitations

- Automated axe-core checks do not cover every WCAG success criterion.
- Dynamic states behind logins, forms, modals, and authenticated flows are out of scope.
- Some sites block automation, throttle requests, or serve different content to browsers.
- PDF rendering depends on Chromium support in the Apify Playwright image.
- Sitemap discovery is bounded by `maxPagesPerSite`.

### FAQ

**Does this prove WCAG compliance?**\
No. It identifies automated findings only. Manual expert testing is still required.

**Can I scan logged-in pages?**\
No. A11yBatch is intentionally limited to public pages and does not collect credentials.

**Why are failed pages not in the Dataset?**\
Only successfully audited pages are billable results. Failed pages are stored in `ERRORS`.

**Can I include subdomains?**\
Yes. Set `includeSubdomains` to true.

**Can I turn off PDF generation?**\
Yes. Set `generatePdfReport` to false for faster runs.

### Troubleshooting

- If no pages are audited, check `ERRORS` for robots.txt, DNS, redirect, timeout, or SSRF safety failures.
- If a site is slow, increase `pageTimeoutSecs` or reduce `maxPagesPerSite`.
- If reports are missing, confirm `generateHtmlReport` and `generatePdfReport` settings.
- If local Playwright cannot launch, run inside the Apify Docker image or install Chromium locally for tests.

### Development

```bash
npm install
npm run typecheck
npm run lint
npm run test
npm run build
npm run start
```

Deploy with:

```bash
npx apify-cli@latest login
npx apify-cli@latest push
```

# Actor input Schema

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

Public HTTP or HTTPS website URLs to scan. Up to 100 starting URLs are accepted.

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

Maximum number of same-site pages to audit for each starting URL.

## `useSitemap` (type: `boolean`):

Try sitemap.xml and sitemap indexes before falling back to same-site link discovery.

## `includeSubdomains` (type: `boolean`):

Allow pages on subdomains of the starting host.

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

Highest WCAG conformance level to include in automated axe rules.

## `standards` (type: `array`):

WCAG standards to include in the axe runOnly tags.

## `includePasses` (type: `boolean`):

Include axe passes in each page dataset item. This can make output larger.

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

Create a polished responsive HTML report in the default key-value store.

## `generatePdfReport` (type: `boolean`):

Create a PDF copy of the HTML report in the default key-value store.

## `brandName` (type: `string`):

Optional customer or agency name shown in reports.

## `brandColor` (type: `string`):

Hex color used for report accents.

## `logoUrl` (type: `string`):

Optional public HTTPS image URL displayed in the HTML and PDF reports, for example https://example.com/logo.png.

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

Additional delay after DOMContentLoaded before running axe.

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

Navigation timeout per page.

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

Skip URLs disallowed for A11yBatchBot by robots.txt.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "maxPagesPerSite": 10,
  "useSitemap": true,
  "includeSubdomains": false,
  "wcagLevel": "AA",
  "standards": [
    "WCAG_2_0",
    "WCAG_2_1",
    "WCAG_2_2"
  ],
  "includePasses": false,
  "generateHtmlReport": true,
  "generatePdfReport": true,
  "brandColor": "#111827",
  "waitAfterLoadMs": 1000,
  "pageTimeoutSecs": 30,
  "respectRobotsTxt": true
}
```

# Actor output Schema

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

Successful page audits in the default Dataset, using the Overview dataset view.

## `violations` (type: `string`):

Successful page audits expanded by violation rule, using the Violations dataset view.

## `developerExport` (type: `string`):

Full nested successful page audit records from the default Dataset.

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

Run-level OUTPUT record with totals, top rules, average risk score, timestamps, and report URLs.

## `errors` (type: `string`):

Failed or unreachable page records stored in the default key-value store.

## `jsonReport` (type: `string`):

Stable run-level JSON report stored in the default key-value store.

## `csvReport` (type: `string`):

Stable run-level CSV report stored in the default key-value store.

## `htmlReport` (type: `string`):

Stable run-level HTML report stored in the default key-value store.

## `pdfReport` (type: `string`):

Stable run-level PDF report stored in the default key-value store.

# 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"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cardinal_lecturer/a11ybatch").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" }] }

# Run the Actor and wait for it to finish
run = client.actor("cardinal_lecturer/a11ybatch").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
    }
  ]
}' |
apify call cardinal_lecturer/a11ybatch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=cardinal_lecturer/a11ybatch",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "White-Label WCAG Audit Report Generator",
        "description": "Crawl client websites, detect WCAG 2.2 accessibility issues, and generate branded HTML and PDF reports with selectors, evidence, risk scores, and developer-ready remediation guidance.",
        "version": "0.1",
        "x-build-id": "o0rDeCx1KzactNcPN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/cardinal_lecturer~a11ybatch/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-cardinal_lecturer-a11ybatch",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/cardinal_lecturer~a11ybatch/runs": {
            "post": {
                "operationId": "runs-sync-cardinal_lecturer-a11ybatch",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/cardinal_lecturer~a11ybatch/run-sync": {
            "post": {
                "operationId": "run-sync-cardinal_lecturer-a11ybatch",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "maxItems": 100,
                        "type": "array",
                        "description": "Public HTTP or HTTPS website URLs to scan. Up to 100 starting URLs are accepted.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of same-site pages to audit for each starting URL.",
                        "default": 10
                    },
                    "useSitemap": {
                        "title": "Use sitemap",
                        "type": "boolean",
                        "description": "Try sitemap.xml and sitemap indexes before falling back to same-site link discovery.",
                        "default": true
                    },
                    "includeSubdomains": {
                        "title": "Include subdomains",
                        "type": "boolean",
                        "description": "Allow pages on subdomains of the starting host.",
                        "default": false
                    },
                    "wcagLevel": {
                        "title": "WCAG level",
                        "enum": [
                            "A",
                            "AA"
                        ],
                        "type": "string",
                        "description": "Highest WCAG conformance level to include in automated axe rules.",
                        "default": "AA"
                    },
                    "standards": {
                        "title": "Standards",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "WCAG standards to include in the axe runOnly tags.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "WCAG_2_0",
                                "WCAG_2_1",
                                "WCAG_2_2"
                            ],
                            "enumTitles": [
                                "WCAG 2.0",
                                "WCAG 2.1",
                                "WCAG 2.2"
                            ]
                        },
                        "default": [
                            "WCAG_2_0",
                            "WCAG_2_1",
                            "WCAG_2_2"
                        ]
                    },
                    "includePasses": {
                        "title": "Include passed checks",
                        "type": "boolean",
                        "description": "Include axe passes in each page dataset item. This can make output larger.",
                        "default": false
                    },
                    "generateHtmlReport": {
                        "title": "Generate HTML report",
                        "type": "boolean",
                        "description": "Create a polished responsive HTML report in the default key-value store.",
                        "default": true
                    },
                    "generatePdfReport": {
                        "title": "Generate PDF report",
                        "type": "boolean",
                        "description": "Create a PDF copy of the HTML report in the default key-value store.",
                        "default": true
                    },
                    "brandName": {
                        "title": "Brand name",
                        "maxLength": 100,
                        "type": "string",
                        "description": "Optional customer or agency name shown in reports."
                    },
                    "brandColor": {
                        "title": "Brand color",
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "type": "string",
                        "description": "Hex color used for report accents.",
                        "default": "#111827"
                    },
                    "logoUrl": {
                        "title": "Logo URL",
                        "pattern": "^https://",
                        "type": "string",
                        "description": "Optional public HTTPS image URL displayed in the HTML and PDF reports, for example https://example.com/logo.png."
                    },
                    "waitAfterLoadMs": {
                        "title": "Wait after load",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Additional delay after DOMContentLoaded before running axe.",
                        "default": 1000
                    },
                    "pageTimeoutSecs": {
                        "title": "Page timeout",
                        "minimum": 10,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Navigation timeout per page.",
                        "default": 30
                    },
                    "respectRobotsTxt": {
                        "title": "Respect robots.txt",
                        "type": "boolean",
                        "description": "Skip URLs disallowed for A11yBatchBot by robots.txt.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
