Discover sites
Get registered site IDs before starting a full-site run, reading a trend, or selecting a saved journey. Requires sites:read.
GET /api/v1/sitesUse a scoped organization API key to start single-page or full-site scans and read stable, structured results.
The Developer API uses scoped keys, not the browser login endpoint.
curl https://api.wcagc.com/api/v1/sites \
-H "Accept: application/json" \
-H "Authorization: Bearer $WCAGC_API_KEY"Keys begin with wcagc_ and are shown in full once. Store them as secrets, grant only the scopes you need, and revoke them immediately if exposed.
You will not see /api/auth/login in the public specification: it creates a cookie session for the web app and is intentionally not the authentication method for scripts.
Each key allows 120 requests per minute by default. A 429 response includes Retry-After so clients can back off safely.
Most REST routes require the Developer API plan feature. CI uses a separate ci:check scope and plan quota; assistant and browser-extension credentials have their own documentation.
sites:readscans:writescans:readci:checkThe reference is organized around stable jobs rather than the internal web-app endpoints. Every resource is tenant-scoped to the organization that owns the credential.
Get registered site IDs before starting a full-site run, reading a trend, or selecting a saved journey. Requires sites:read.
GET /api/v1/sitesQueue a page on a registered site, poll the scan, then read its stable finding records. Requires scans:write and scans:read.
POST /api/v1/scans
GET /api/v1/scans/{id}
GET /api/v1/scans/{id}/violationsQueue a full-site run, read progress, findings, and deterministic root-cause groups. Requires scans:write and scans:read.
POST /api/v1/scan-runs
GET /api/v1/scan-runs/{id}
GET /api/v1/scan-runs/{id}/violations
GET /api/v1/scan-runs/{id}/root-causesUse server-stored steps and credentials; API requests never carry login secrets. Site trends and targeted re-checks reuse the normal read/write scopes.
GET /api/v1/sites/{id}/journeys
POST /api/v1/journeys/{id}/runs
GET /api/v1/sites/{id}/trend
POST /api/v1/remediation-items/{id}/verificationsCheck up to the plan limit of URLs on one verified site, read the verdict, and retrieve baseline-aware findings. Requires ci:check.
POST /api/v1/ci/checks
GET /api/v1/ci/checks/{id}
GET /api/v1/ci/checks/{id}/violationsScan, run, CI, journey, and fix-verification creation is asynchronous. A successful POST returns 202 Accepted, a resource ID, and a Location header.
Poll the Location resource with bounded backoff until it reaches a terminal state. Read findings only after completion; do not treat a queued or running response as a result.
curl -X POST https://api.wcagc.com/api/v1/scans \
-H "Authorization: Bearer $WCAGC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/checkout"}'curl https://api.wcagc.com/api/v1/scans/{id} \
-H "Authorization: Bearer $WCAGC_API_KEY"
curl https://api.wcagc.com/api/v1/scans/{id}/violations \
-H "Authorization: Bearer $WCAGC_API_KEY"Errors use application/problem+json. Branch on code, keep traceId for support, and treat detail as human-readable context that may change.
401 API_KEY_INVALID403 API_KEY_SCOPE_MISSING / FEATURE_NOT_IN_PLAN404 *_NOT_FOUND409 *_ALREADY_RUNNING422 VALIDATION_FAILED / INVALID_URL429 RATE_LIMITED + Retry-After{
"type": "https://wcagc.com/problems/api-key-scope-missing",
"title": "API key scope missing",
"status": 403,
"detail": "The API key does not grant the required scope.",
"instance": "/api/v1/sites",
"code": "API_KEY_SCOPE_MISSING",
"traceId": "019c…",
"timestamp": "2026-08-19T20:57:19Z"
}Swagger lists every supported Developer API v1 operation, required scope, request schema, response status, and example. The raw OpenAPI 3.1 JSON can be imported into API clients and code generators.
Subscribe an HTTPS endpoint to terminal scan, regression, and remediation events. Every JSON delivery includes a timestamped HMAC-SHA256 signature, a stable delivery ID, and automatic retries.
Configure webhooksVerify X-Wcagc-Signature against timestamp + '.' + the unchanged raw request body. Reject old timestamps to reduce replay risk.
X-Wcagc-Event: scan_run.completed
X-Wcagc-Delivery: 019f…
X-Wcagc-Timestamp: 178406…
X-Wcagc-Signature: v1=<hmac-sha256>