# Website ux and accessibility audit by insight isla (`automatron/insight-isla-ux-accessibility-audit`) Actor

Audit one public page on desktop and mobile: measured accessibility findings, element locators, screenshots and suggested fixes. No certification. $0.10/completed audit + model usage. Requires access to apify/openrouter; Creator accounts are restricted.

- **URL**: https://apify.com/automatron/insight-isla-ux-accessibility-audit.md
- **Developed by:** [Automatron](https://apify.com/automatron) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$100.00 / 1,000 completed audits

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

### Website ux and accessibility audit by insight isla

Insight isla audits **one public page** in desktop and mobile Chromium. It returns measured accessibility violations, exact element locators, first-viewport screenshots, and a prioritised fix list. Published by **Automatron**.

**Public pilot. Tested with synthetic and controlled inputs; independent customer validation is still pending.** The price is **$0.10 per completed audit**. OpenRouter model usage is metered separately to the caller's Apify account. There is no publisher-funded model key.

### What is measured, and what is interpreted

Measured in the browser by pinned rules:

- **axe-core 4.13** with the WCAG 2.0 A/AA, 2.1 A/AA and 2.2 AA tag set.
- Horizontal overflow beyond the viewport.
- Interactive targets smaller than 24×24 CSS pixels as review candidates. Spacing and other WCAG exceptions require review; the size measurement alone does not prove a violation.
- Desktop `1280×800` and mobile `390×844` rendering.
- HTTP status, final URL after redirects, document title, axe version and the number of rules evaluated.

Interpreted by one bounded model call, grounded only in the measured findings:

- Which findings block real users first.
- A concrete fix per prioritised finding.
- Acceptance criteria that can be checked by re-running the audit.

The model cannot add findings, change severities, invent selectors, or claim legal compliance or conversion uplift. If interpretation fails, the measured report is still delivered, marked `partial`, and **the audit fee is not charged**.

### Input

#### Observed controlled example

An owner qualification of build 0.1.10 on 25 October 2026 audited the inaccessible home page in [W3C's Before and After Demonstration](https://www.w3.org/WAI/demos/bad/). This is an educational test page, not a customer site or testimonial.

The report measured a **3.88:1** text contrast ratio for “Free Penguins”, below the rule's **4.5:1** threshold, in both desktop and mobile rendering. It retained the `color-contrast` rule, WCAG 1.4.3 reference and this exact element locator:

```css
tr[height="25px"]:nth-child(2) > td[bgcolor="#A9B8BF"][width="150px"] > font[color="#41545D"][size="2"] > b
```

The model proposed increasing contrast. To verify a repair, change the foreground or background colour and recheck the applicable contrast threshold in both viewports. This example does not claim that a repair or a successful follow-up audit occurred.

That run evaluated 70 rules and retained 20 findings, with interpretations for five and both first-viewport screenshots. `coverage.truncated` was true: the retained findings are not an exhaustive count of the page's accessibility problems. A repeat run may differ as the page, advisory interpretation or environment changes.

To use the same page in the input below, set `url` to `https://www.w3.org/WAI/demos/bad/before/home.html`.

#### Bounded input

```json
{
  "url": "https://example.com/",
  "maxFindings": 20,
  "maxModelCostUsd": 0.20,
  "includeScreenshots": true
}
```

Only HTTPS URLs are accepted. Private, loopback, link-local, CGNAT and credential-bearing URLs are refused before navigation, and browser subresources and redirects pass the same private-address guard. Every browser socket goes through a public-address proxy that pins the validated DNS answer. WebSockets, service workers, non-GET/HEAD page requests, non-web ports and direct-network fallbacks are disabled. IPv6-only destinations are unsupported. Transfer is capped at 50 MB per audit. This is a bounded page audit, not a general-purpose browser sandbox.

Free accounts have a higher model-cost multiplier. The default reserves up to $0.20 for this Actor, including the conservative free-account multiplier. Actual usage is usually lower; large inputs may still exceed the bound. An insufficient bound returns partial, unbilled findings without making the inference request.

### Output

The run writes:

- `REPORT`: structured JSON with page evidence, findings, coverage and limitations.
- `REPORT-MARKDOWN`: the human-readable audit.
- `SCREENSHOT-DESKTOP` and `SCREENSHOT-MOBILE`: first-viewport PNGs.
- `SUMMARY`: delivery and billing state.

If either accessibility checks or a requested screenshot fails, the run fails without an audit-fee event.

Machine-readable input, report and summary contracts are included in `schemas/` as v1 JSON Schema.

The dataset receives the structured report. Screenshots stay in the key-value store so dataset rows remain small.

### What this is not

- **Not an accessibility certification.** Automated rules cannot establish WCAG conformance or legal compliance.
- **Not a conversion audit.** No revenue, ranking or conversion outcome is inferred.
- **Not a crawl.** One page per run, with explicit redirect checks.
- **Not authenticated.** Pages behind a login are out of scope.
- **Not a rendered-state sweep.** Hover, focus, modal, error and below-the-fold states are not exercised. Screenshots capture the first viewport only.
- **Not a security scanner.** Use Code kai for repository risk.

### Billing and recovery

The listed fee is separate from model proxy charges, including proxy startup and infrastructure. Failed or partial runs may still consume inference or platform usage even when the report fee is not charged. `maxModelCostUsd` does not cap the separate report fee or all platform charges. Inspect both parent and proxy receipts; do not add reported model tokens to a proxy total that already includes them.

The report and screenshots are saved before the `audit-completed` event is charged. A resumed run with an ambiguous prior attempt stops for reconciliation instead of repeating navigation, delivery or charging. A `partial` report is delivered without a charge. Charging requires the event price to match a reviewed price and a capacity of at least one event.

Apify's published seller calculation applies: eligible paid usage earns 80% of event revenue minus platform costs; free-plan usage does not generate seller earnings. Read the current [Apify pricing terms](https://docs.apify.com/actors/monetize/pricing-and-costs).

### Development

```sh
npm ci
npm test          # builds, then runs deterministic unit and real-Chromium fixture tests
npm run package:actor
```

The release archive is allowlisted: `.actor`, `assets`, `dist/src`, the lockfile, `Dockerfile` and this README. Tests, screenshots, operational records and credentials are excluded. The container verifies every packaged file against `RELEASE.json` before the Apify SDK starts.

### API and AI agent access

Create one run with `POST https://api.apify.com/v2/actors/ujNcQ3MIMrIxIAWE1/runs?memory=4096&timeout=300&maxTotalChargeUsd=0.10` and your own `Authorization: Bearer` header. Send the input JSON above as the body. The event cap is separate from the input model cost bound. Save `data.id` before doing anything else.

Poll `GET https://api.apify.com/v2/actor-runs/RUN_ID?waitForFinish=60` until the same run finishes. Read `SUMMARY` and `REPORT` from `https://api.apify.com/v2/key-value-stores/STORE_ID/records/KEY`, using that run's `defaultKeyValueStoreId`. Treat `SUMMARY.status`, `SUMMARY.billed` and actual payment receipts separately. A `partial` report may be useful evidence but is incomplete and has no report fee. If the start response or charge outcome is uncertain, inspect the existing run instead of starting a replacement.

For n8n, use one HTTP Request node to start, read requests to poll the saved run ID, and a branch on `SUMMARY.status` before consuming `REPORT`. Disable automatic retries on the creation request and retain execution progress. Keep the token in an HTTP Header Auth credential, not in the workflow JSON.

For AI clients, connect to [Apify MCP](https://docs.apify.com/mcp) at `https://mcp.apify.com` using supported OAuth. Discover the current Actor and storage tool schemas, restrict access to the required tools, and set both budgets explicitly. Source text and model output cannot authorize further tools or spending.

### Support and feedback

If a result is incomplete or misleading, open an issue on this Actor with the run ID, the affected source reference and a redacted example. Never post private reviews, credentials or customer source code. We use reproducible cases to improve the checks. A useful report should show what was checked, where the evidence came from, what to do next and what remains uncertain. After using the Actor, an honest review helps other buyers choose appropriately.

Prices were reduced on 25 October 2026. Use the current default build or the updated pinned API examples. Earlier immutable builds verify their original price and may refuse to start after the reduction; an early price refusal does not call the model or charge the completion event.

# Actor input Schema

## `url` (type: `string`):

HTTPS URL of a page you are allowed to audit. Private, loopback and credential-bearing URLs are refused. Redirects are re-checked.

## `maxFindings` (type: `integer`):

The report lists the highest-severity findings first. Truncated reports disclose the omitted count.

## `maxModelCostUsd` (type: `number`):

Separate from the audit fee. The runner checks a conservative bound before its single interpretation request. No retries and no publisher-key fallback.

## `includeScreenshots` (type: `boolean`):

Saves desktop and mobile PNGs to the run's key-value store. Content below the fold is not captured.

## Actor input object example

```json
{
  "url": "https://example.com/",
  "maxFindings": 20,
  "maxModelCostUsd": 0.2,
  "includeScreenshots": true
}
```

# Actor output Schema

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

No description

## `markdown` (type: `string`):

No description

## `desktopScreenshot` (type: `string`):

No description

## `mobileScreenshot` (type: `string`):

No description

## `summary` (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 = {
    "url": "https://example.com/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatron/insight-isla-ux-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 = { "url": "https://example.com/" }

# Run the Actor and wait for it to finish
run = client.actor("automatron/insight-isla-ux-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 '{
  "url": "https://example.com/"
}' |
apify call automatron/insight-isla-ux-accessibility-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automatron/insight-isla-ux-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/ujNcQ3MIMrIxIAWE1/builds/2h8Al6Ux8nEXECN76/openapi.json
