# WCAG Accessibility Audit (`mambalabs/wcag-accessibility-audit`) Actor

Audit any website for WCAG 2.1 and 2.2 AA accessibility issues with axe-core in a real browser. One row per domain: issues by severity, top failing rules, sample elements, a score, and European Accessibility Act exposure signals. Optional statement, Impressum, and privacy checks.

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

## Pricing

from $8.50 / 1,000 domain auditeds

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?

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

### 🔎 What can WCAG Accessibility Audit do?

Give it a domain. It opens the homepage in a real Chromium browser, runs [axe-core](https://github.com/dequelabs/axe-core) 4.14 against the standard you pick, and returns one flat row: the accessibility issues automated checks find, by severity, the worst failing rules, sample elements, a score, and European Accessibility Act (EAA) exposure signals.

Optional compliance checks add an accessibility statement link, an accessibility overlay widget, a privacy policy link, a German Impressum and its required field types, and the US privacy choice link and Global Privacy Control file.

- **Pick the standard.** WCAG 2.0 A or AA, WCAG 2.1 AA, WCAG 2.2 AA, Section 508, ADA (the WCAG 2.1 AA set the ADA Title II rule names), or EN 301 549, the European standard the EAA points to.
- **One row per domain.** Load a list of domains and get a table you can sort, filter, and join on `domain`.
- **A real browser, a hard budget.** Each page gets 45 seconds. A page that runs past it, blocks the browser, or cannot be reached comes back as a free row that says what happened.
- **EAA exposure signals.** EU language, EU hreflang, an EU country code domain, EUR prices, an EU country in the footer, and a cart or checkout. Signals, never a legal finding.
- **Desktop or mobile.** Mobile renders at 390 by 844 with touch, where reflow and target size issues show.

### 👥 Who this is for

Accessibility and web agencies that want a first pass on a prospect list, EU e-commerce and SaaS teams preparing for the EAA, US teams checking WCAG 2.1 AA exposure under ADA Title II and Section 508, and outbound teams that sell remediation and need a reason to reach out.

### ⚠️ What automated checks can and cannot tell you

Automated checks find a share of WCAG failures, not all of them. A row with zero failing rules is not a conformance claim, and this actor never says a site is compliant. Rules that axe cannot decide are counted in `incomplete` and need a human check. The score ranks sites against each other; it is not a grade under any law.

### ⌨️ Input

| Field | What it does |
| --- | --- |
| `domain` | One website domain, for example `mambabuilt.com`. The homepage is audited. |
| `domains` | Optional list, one row per domain. Used instead of `domain` when filled. |
| `standard` | `wcag21aa` (default), `wcag22aa`, `wcag2aa`, `wcag2a`, `section508`, `ada`, or `en301549`. |
| `pages` | 1 to 5. Pages after the homepage come from the sitemap, or from the homepage navigation. |
| `viewport` | `desktop` (default) or `mobile`. |
| `compliance_checks` | Any of `accessibility_statement`, `overlay`, `privacy_policy`, `impressum`, `us_privacy_links`. |
| `skipCache` | `false` reuses an identical audit from the last 24 hours. `true` audits fresh. |
| `max_charge_usd` | Optional cost cap for the run. The run stops before a domain that could cross it. |

Example input:

```json
{
  "domains": ["mambabuilt.com", "example.de"],
  "standard": "wcag22aa",
  "pages": 2,
  "compliance_checks": ["accessibility_statement", "impressum", "overlay"]
}
```

### 📤 Output

One row per domain with 40 fields. Every row carries every field; a value that does not apply is `null`, never missing.

| Field | Meaning |
| --- | --- |
| `domain` | The domain audited, without protocol or www. |
| `url_audited` | The homepage URL after redirects. |
| `standard` | The standard whose axe rule tags were run: wcag2a, wcag2aa, wcag21aa, wcag22aa, section508, ada, or en301549. |
| `viewport` | desktop (1280 by 800) or mobile (390 by 844). |
| `pages_requested` | How many pages the input asked for, 1 to 5. |
| `pages_audited` | How many pages were rendered and audited. 0 when the homepage could not be audited. |
| `urls_audited` | Every URL that was audited, homepage first. |
| `violations_total` | Distinct axe rules with at least one issue found by automated checks, across all audited pages. |
| `violations_critical` | Failing rules with impact critical. |
| `violations_serious` | Failing rules with impact serious. |
| `violations_moderate` | Failing rules with impact moderate. |
| `violations_minor` | Failing rules with impact minor. |
| `violation_nodes_total` | Page elements affected, summed over every failing rule and page. |
| `passes` | Distinct rules that passed on every audited page. |
| `incomplete` | Distinct rules axe could not decide automatically, which need a human check. |
| `top_rules_json` | JSON array of up to 10 failing rules, worst first: rule_id, impact, nodes, wcag_tags, help_url. |
| `sample_selectors_json` | JSON array of up to 10 CSS selectors of affected elements, as rule_id and selector pairs. |
| `score` | 0 to 100. 100 minus an impact weighted penalty per failing rule. The weights are arbitrary and published in the README. Not a conformance claim. |
| `eaa_exposure` | True when at least one EU market signal is present. A signal for the European Accessibility Act, never a legal finding. |
| `eaa_signals` | Which signals fired: eu_language, eu_hreflang, eu_tld, eur_prices, eu_country_in_footer, checkout. |
| `compliance_checks_requested` | The compliance modes that ran for this row, or null when none were selected. |
| `accessibility_statement_found` | Mode accessibility_statement: true when the homepage links to an accessibility statement or accessibility page, in any of 13 EU languages. |
| `accessibility_statement_url` | Mode accessibility_statement: the linked URL. |
| `overlay_detected` | Mode overlay: true when the homepage loads a known accessibility overlay widget. |
| `overlay_vendor` | Mode overlay: accessibe, userway, audioeye, equalweb, recite_me, max_access, eye_able, user1st, or purple_lens. |
| `privacy_policy_found` | Mode privacy_policy: true when the homepage links to a privacy policy. |
| `privacy_policy_url` | Mode privacy_policy: the linked URL. |
| `impressum_found` | Mode impressum, German language or .de sites only: true when the homepage links to an Impressum. Null when the mode does not apply. |
| `impressum_url` | Mode impressum: the linked URL. |
| `impressum_fields_present` | Mode impressum: which required field types appear on the page: address, email, phone, register_number, vat_id, representative. Presence only, never the values. |
| `us_privacy_choice_link_found` | Mode us_privacy_links: true when the homepage carries a Do Not Sell or Share or Your Privacy Choices link. |
| `gpc_well_known_found` | Mode us_privacy_links: true when /.well-known/gpc.json answers with a gpc field. |
| `render_status` | rendered, blocked (challenge, refusal, or robots.txt), timeout (past the 45 s page budget), unreachable, or error. Only rendered rows are charged. |
| `render_ms` | Wall time spent rendering and auditing the pages of this row. |
| `axe_version` | The axe-core engine version that ran. |
| `from_cache` | True when the row came from the 24 hour cache. |
| `row_status` | ok, partial (audited, but an extra page or a compliance read failed), or error (nothing audited). |
| `error_reason` | Why a row is partial or error, in plain words. Null on ok rows. |
| `billable_events_json` | JSON array of the events charged for this row, for example \[{"event":"domain-audited","count":1}]. \[] when free. |
| `checked_at` | When the row was produced, ISO 8601 UTC. |

Example row, shortened:

```json
{
  "domain": "example.de",
  "standard": "wcag21aa",
  "pages_audited": 1,
  "violations_total": 9,
  "violations_critical": 1,
  "violations_serious": 4,
  "violation_nodes_total": 61,
  "score": 58,
  "eaa_exposure": true,
  "eaa_signals": ["eu_language", "eu_tld", "eur_prices", "checkout"],
  "impressum_found": true,
  "impressum_fields_present": ["address", "email", "register_number", "vat_id"],
  "render_status": "rendered",
  "row_status": "ok",
  "billable_events_json": "[{\"event\":\"domain-audited\",\"count\":1},{\"event\":\"compliance-checked\",\"count\":1}]"
}
```

#### How the score works

100 minus a penalty per failing rule. Each failing rule costs its impact weight (critical 15, serious 8, moderate 4, minor 1), plus up to the same again as the number of affected elements grows toward 10. The floor is 0. **The weights are arbitrary and stated here so you can rebuild the number or ignore it** and use the counts directly.

### 💵 How much does it cost?

Pay per event. You pay for audits that ran, never for a blocked, timed out, or unreachable domain.

| Event | Free plan | Bronze | Silver | Gold |
| --- | --- | --- | --- | --- |
| `domain-audited`, one per domain with a rendered audit | $0.01000 | $0.00950 | $0.00900 | $0.00850 |
| `page-audited`, each page after the homepage | $0.00200 | $0.00190 | $0.00180 | $0.00170 |
| `compliance-checked`, once per domain when any compliance check is selected | $0.00300 | $0.00285 | $0.00270 | $0.00255 |
| `apify-actor-start`, once per run | $0.00250 | $0.00250 | $0.00250 | $0.00250 |

That is $10.00 per 1,000 audited homepages on the free plan, $8.50 on Gold, plus $0.0025 per run for the start event, which covers starting the browser container. Batch domains into one run to pay it once.

**Free plan cap:** free Apify plan users get 150 audited domains a month, which is $1.50 of evaluation. Paid plans have no cap.

**Stopping at your limit:** the run reads Apify's maximum cost per run and the `max_charge_usd` input, and stops before starting a domain it could not pay for.

### 💡 Usage examples

**Apify API**

```bash
curl -X POST "https://api.apify.com/v2/acts/mambalabs~wcag-accessibility-audit/runs?token=$APIFY_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"domains":["mambabuilt.com","example.de"],"standard":"wcag22aa"}'
```

**Clay.** Add an Apify column, pick this actor, and map your domain column to `domain`. Every input is read as a string, so Clay's string values work as is. One row comes back per domain.

**MCP.** The MCP server `@mambalabsdev/mcp-wcag-accessibility-audit` exposes the tool `audit_wcag_accessibility` to Claude, Cursor, and any MCP client.

### 🧯 Error handling

| What happened | `render_status` | `row_status` | Charged |
| --- | --- | --- | --- |
| Audit ran on every requested page | `rendered` | `ok` | yes |
| Audit ran, but an extra page or a compliance read failed | `rendered` | `partial` | yes, for what ran |
| Bot challenge, HTTP 403 or 429, or robots.txt disallows the homepage | `blocked` | `error` | no |
| Page did not finish in 45 seconds | `timeout` | `error` | no |
| DNS, TLS, or connection failure | `unreachable` | `error` | no |
| Input could not be read as a domain | `null` | `error` | no |

`error_reason` says what happened in plain words on every `partial` and `error` row.

### ⚠️ Limitations

- Automated checks find a subset of WCAG failures. Keyboard flow, screen reader meaning, captions, and most content rules need a human.
- Only the rendered state after load is audited. Menus, modals, and forms behind a click are not opened.
- Content inside iframes, such as embedded video players and third party widgets, is not audited.
- Media and fonts are not loaded, to stay inside 1,024 MB. Color contrast over background images can land in `incomplete`.
- EAA scope, and the microenterprise exemption, cannot be read from a page. `eaa_exposure` is a signal.
- The Impressum check reports which field types appear, never the values, and runs only on German language or .de sites.
- Sites behind bot protection return `blocked`. No proxy is used.
- The legal references in this README were confirmed on 2026-10-17 from ada.gov, section508.gov, gesetze-im-internet.de, cppa.ca.gov, and the W3C GPC specification. The EUR-Lex pages refused automated reads that day.

### ❓ FAQ

**Does this call an AI model?** No. Every field comes from axe-core rules or a presence check on the page.

**Why is a site I know is accessible showing failing rules?** axe flags real code issues, and most large sites have some. Read `top_rules_json` and the `help_url` for each rule.

**Do you respect robots.txt?** Yes. A homepage disallowed for all agents is not fetched, and extra pages that are disallowed are skipped.

**Is a cached row charged?** Yes, at the same price, and `from_cache` is true on it. Set `skipCache` to `true` to audit fresh.

### 🧩 Want other GTM data?

Mamba Labs builds a fleet of GTM enrichment actors that share one flat,
Clay-ready output convention, so their rows join on `company_domain` with no
cleaning step:

| | |
|---|---|
| 🔭 [Account Hiring Watch](https://apify.com/mambalabs/account-hiring-watch?fpr=mamba) | 🤖 [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) |
| 🤖 [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) | 📡 [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) |
| 🚀 [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) | 📝 [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) |
| 🦋 [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) | 🔀 [Career Change Signal Engine](https://apify.com/mambalabs/career-change-signal-engine?fpr=mamba) |
| ⏩ [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | 🔄 [Company Change Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) |
| 📇 [Company Contact Details Extractor](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | 🧭 [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) |
| 🏢 [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | 🪪 [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) |
| 🌐 [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | 🏷️ [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) |
| 📈 [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | 🔎 [Influencer Finder](https://apify.com/mambalabs/creator-finder?fpr=mamba) |
| 🧾 [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | 👤 [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) |
| 📬 [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | 🔗 [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) |
| 🛒 [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | ✉️ [Work Email Waterfall](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) |
| 🎪 [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | ⚖️ [Expert Witness Directory](https://apify.com/mambalabs/expert-witness-directory?fpr=mamba) |
| 💵 [Company Funding Record](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) | 💰 [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) |
| 🐙 [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) | 🧑‍💼 [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) |
| 📋 [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) | 🧱 [Tech Stack Signal Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) |
| 🎯 [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) | 🔑 [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) |
| 🔁 [Job Change Tracker](https://apify.com/mambalabs/job-change-tracker?fpr=mamba) | 🏛️ [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) |
| 📰 [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | 💼 [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) |
| 💬 [LinkedIn Post Tracker](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | 📢 [Meta Ad Library Monitor](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) |
| 📸 [Instagram Facebook Brand Presence Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | 🆕 [New Hire Finder](https://apify.com/mambalabs/new-hire-finder?fpr=mamba) |
| 📮 [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) | 📄 [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) |
| 🧑 [People Finder & Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) | 📌 [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) |
| 🏆 [Government Contract Award Monitor](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) | 📅 [Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) |
| 👽 [Reddit Brand Presence Mapper](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) | ⭐ [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) |
| 🤝 [Influencer Talent Agency Lookup](https://apify.com/mambalabs/talent-agency-lookup?fpr=mamba) | 👥 [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) |
| 🎵 [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | 📊 [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) |
| 🏅 [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | ✖️ [X Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) |
| ▶️ [YouTube Channel Stats Extractor](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) |  |

> Every actor in the suite takes a domain or a company and returns one flat row,
> so they stack in the same Clay table without reshaping anything.

> 🛠️ **Need something custom built for you or your team?** Tell us what you are
> trying to find and we will build it. [Talk to Mamba Labs](https://mambabuilt.com/contact).

### 🆘 Support

Something wrong, or a site the actor reads incorrectly? Open an issue on the **Issues** tab with the domain and the row, and we will look at it.

> ℹ️ **Sourcing and legal.** Every field is a property of a website: rule results, link presence, and file presence. The Impressum check reports field types, never names, emails, or numbers. Every fetch honors `robots.txt`. axe-core is used unmodified under the Mozilla Public License 2.0. You are responsible for how you use the output.

Built by [Mamba Labs](https://apify.com/mambalabs?fpr=mamba).

# Actor input Schema

## `domain` (type: `string`):

One website domain, for example mambabuilt.com. Protocol and path are stripped and the homepage is audited. Required unless the Domains list is filled.

## `domains` (type: `array`):

Optional. A list of domains, one per line. One row per domain. When this list is filled it is used instead of the single Domain field.

## `standard` (type: `string`):

Which rule set axe-core runs. ADA runs the WCAG 2.1 AA set, the level the ADA Title II rule names. EN 301 549 runs the rules axe maps to the European standard the EAA points to.

## `pages` (type: `string`):

1 audits the homepage only. 2 to 5 adds pages from the sitemap, or from the homepage navigation when there is no sitemap. Each page after the first is charged as page-audited. Sent as a string so Clay columns work as is.

## `viewport` (type: `string`):

Desktop renders at 1280 by 800. Mobile renders at 390 by 844 with touch, which is where reflow and target size issues show.

## `compliance_checks` (type: `array`):

Optional page checks, charged once per domain as compliance-checked when any is selected. Presence only, never a legal verdict.

## `skipCache` (type: `string`):

Leave as false to reuse an identical audit from the last 24 hours. Set to true to audit fresh, for example right after a fix ships.

## `max_charge_usd` (type: `string`):

Optional, in USD, for example 1.50. The run stops before starting a domain that could take its charges past this amount, so no row is cut in half. Leave empty to rely only on the maximum cost per run you set in Apify. The run also stops cleanly when that Apify maximum is reached.

## `source_tag` (type: `string`):

Internal attribution tag set by Mamba Labs on published task examples. Not required, and nothing depends on it. Leave it empty.

## Actor input object example

```json
{
  "domain": "mambabuilt.com",
  "domains": [
    "mambabuilt.com",
    "example.de"
  ],
  "standard": "wcag21aa",
  "pages": "1",
  "viewport": "desktop",
  "compliance_checks": [],
  "skipCache": "false"
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "domain": "mambabuilt.com",
    "standard": "wcag21aa",
    "pages": "1",
    "viewport": "desktop",
    "compliance_checks": [],
    "skipCache": "false"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/wcag-accessibility-audit").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 = {
    "domain": "mambabuilt.com",
    "standard": "wcag21aa",
    "pages": "1",
    "viewport": "desktop",
    "compliance_checks": [],
    "skipCache": "false",
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/wcag-accessibility-audit").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 '{
  "domain": "mambabuilt.com",
  "standard": "wcag21aa",
  "pages": "1",
  "viewport": "desktop",
  "compliance_checks": [],
  "skipCache": "false"
}' |
apify call mambalabs/wcag-accessibility-audit --silent --output-dataset

```

## MCP server setup

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

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/P3jBj3FRghKEhX52z/builds/8t00mTAJcEtyrdodV/openapi.json
