# Website Accessibility Audit

A URL → grounded WCAG-flavoured findings, honestly scoped.

Deterministic accessibility checks over the rendered page — missing alt text, unlabelled forms, blocked zoom, nameless buttons and more — each tied to the WCAG criterion it concerns. Built for the European Accessibility Act era: honest diagnosis, never a compliance badge.

The European Accessibility Act is now enforced — court orders and daily fines have started — and most SME sites have never been checked. This endpoint runs deterministic, WCAG-referenced checks over the rendered page (missing alt text, unlabelled forms, blocked zoom, nameless buttons and more) and returns countable, explainable findings. The honesty is deliberate: automated checks catch a minority of issues, every response says so, and we never sell a compliance badge — the approach regulators have fined others for faking.

- Price: 2 credits (4 on the free plan)
- Page: https://meetkatalis.com/apis/accessibility-audit
- OpenAPI: https://meetkatalis.com/openapi.yaml

## Endpoints

- `GET /api/v1/accessibility-audit?url=example.co.uk` — Audit one page

## Call it

```bash
curl -H "x-api-key: $KATALIS_API_KEY" \
  "https://meetkatalis.com/api/v1/accessibility-audit?url=https://www.greggs.com"
```

```javascript
const res = await fetch("https://meetkatalis.com/api/v1/accessibility-audit?url=https://www.greggs.com", {
  headers: { "x-api-key": process.env.KATALIS_API_KEY },
});
if (!res.ok) throw new Error(`Katalis ${res.status}: ${await res.text()}`);
console.log(await res.json());
```

```python
import os, requests

r = requests.get(
    "https://meetkatalis.com/api/v1/accessibility-audit?url=https://www.greggs.com",
    headers={"x-api-key": os.environ["KATALIS_API_KEY"]},
    timeout=60,
)
r.raise_for_status()
print(r.json())
```

## Example response (a real reply)

```json
{
  "url": "https://example.co.uk",
  "audit": {
    "score": 62,
    "band": "fair",
    "checked": 12,
    "findings": [
      { "id": "img-alt", "wcag": "1.1.1 Non-text Content (A)",
        "severity": "high", "count": 14,
        "note": "14 of 30 images have no alt attribute — screen-reader users get nothing for them." },
      { "id": "zoom-disabled", "wcag": "1.4.4 Resize Text (AA)",
        "severity": "high", "count": 1,
        "note": "The viewport meta tag blocks pinch-zoom — low-vision users can't enlarge your text." }
    ],
    "passed": ["html-lang", "doc-title", "h1-present"]
  }
}
```

## What you'd build with it

- **Agency client audits.** Run every client site monthly; each finding is a ready-made conversation (and the EAA makes it a timely one).
- **CI guardrails.** Fail a deploy preview when the marketing site ships alt-less images or a zoom-blocking viewport tag.
- **Vendor pre-checks.** Procurement screens supplier sites for accessibility posture before contracts — honestly scoped, never a fake badge.

## Why this one

- **Honest by design.** Automated checks catch a minority of WCAG issues, and we say so on every response. We diagnose real problems; we never sell a compliance badge — the approach regulators have fined others for faking.
- **Deterministic, explainable findings.** No AI in the fact path: every finding is countable in the fetched HTML, tied to its WCAG criterion, with a plain-English why. Same input, same output.
- **Renders JavaScript sites.** Audits the rendered page, not just raw HTML — so single-page apps and modern site builders get checked fairly.
- **Screen a whole client list.** Agencies and consultancies run it across every client site to find who needs accessibility work — each finding is a ready-made conversation.

## Conventions

- Auth: `x-api-key: kat_live_…` on every request (free key at https://meetkatalis.com/developers: a verified email and mobile, 100 credits a month, no card).
- One credit balance across every API; each endpoint's price is on its page and in `x-credits` in https://meetkatalis.com/openapi.yaml.
- Keys are camelCase everywhere. A registered company is `company: { name, number, status, statusDetail?, filingsOverdue? }` on the register endpoints; the enrichment family (enrich, score, assess, brand-kit, ai-visibility, tender-match) keeps `business` / `profile` with `companyNumber`.
- Every error has `code` and `requestId`; every reply an `x-request-id` header; a charged reply `x-credits-remaining`; a reply that gave credits back `x-credits-refunded`. Missing = 404 with `query`.
- Burst ceiling 60 requests a minute per key (429, `Retry-After`, no credits used). A failure on our side (5xx) gives the call's credits back.
- Company data contains public sector information licensed under the Open Government Licence v3.0.

Provided "as is"; results come from public sources and, in places, AI, and may be inaccurate or out of date; not legal, professional or credit advice. Terms: https://meetkatalis.com/apis/terms