# POST /v1/page/accessibility

Axe accessibility scan of a single page — violations, keyboard-navigation checks, honest scan status.

**Credits:** 2 credits per call.

**Timeout:** 120s

## Parameters

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `url` | string | yes | — | Absolute http(s) page URL to scan. Required, max 2048 chars. |

## Request

```http
POST /v1/page/accessibility HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json

{
  "url": "https://seojuice.io/"
}
```

## Response

Wrapped in the standard envelope (id, object, created_at, elapsed_ms, cache, credits) -- documented once on The Contract. The body below is a real envelope with this endpoint's `data` shape; values vary per request, and a `…` marks an array cut short for display.

```json
{
  "id": "acce_luyybyea2nbqmxtb5pzatcqt",
  "request_id": "req_r2ai4l6t4zcirfwqqzad3cazb4",
  "object": "accessibility",
  "created_at": "2026-08-09T08:27:29Z",
  "elapsed_ms": 180,
  "cache": "miss",
  "credits": {
    "charged": 2,
    "balance": 9857
  },
  "data": {
    "url": "https://seojuice.io/",
    "status": "complete",
    "violations": [
      {
        "id": "color-contrast",
        "impact": "serious",
        "help": "Elements must meet minimum color contrast ratio thresholds",
        "help_url": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
        "nodes_count": 77
      }
    ],
    "passes_count": 23,
    "incomplete_count": 1,
    "keyboard": {
      "interactive_total": 100,
      "reached": 95,
      "focus_trap": false,
      "has_skip_link": false
    },
    "engine": {
      "axe_version": "4.10.3"
    }
  }
}
```

## Response fields

What each field in `data` (above) means.

| Field | Description |
| --- | --- |
| `data.url` | The URL you requested. |
| `data.status` | Scan outcome: "complete" (axe + keyboard walk both ran), "partial" (axe ran, the keyboard walk was skipped or truncated), or "blocked" (no work product -- refunded automatically). |
| `data.violations` | Axe rule violations found on the page, one entry per rule. |
| `data.violations[].id` | Axe rule id, e.g. "color-contrast". |
| `data.violations[].impact` | Axe severity for this rule: minor, moderate, serious, or critical. |
| `data.violations[].help` | One-line description of what the rule requires. |
| `data.violations[].help_url` | Deque University reference page for the rule. |
| `data.violations[].nodes_count` | How many elements on the page violate this rule. |
| `data.passes_count` | Number of axe rules the page passed. |
| `data.incomplete_count` | Number of rules axe could not conclusively evaluate. |
| `data.keyboard` | Keyboard-navigation walk results. |
| `data.keyboard.interactive_total` | Interactive elements found on the page. |
| `data.keyboard.reached` | How many of them keyboard focus could reach. |
| `data.keyboard.focus_trap` | true if focus got stuck somewhere it couldn't leave. |
| `data.keyboard.has_skip_link` | true if the page offers a skip-to-content link. |
| `data.engine` | Scanner version info. |
| `data.engine.axe_version` | The axe-core version that produced this scan. |
