Developers

API & CI/CD integration

Scan any public URL with a single request and fail your CI pipeline when the accessibility score drops below your threshold.

Authentication

Send your API key as a Bearer token (Authorization: Bearer nh_live_...) or as an x-api-key header. Requests without a valid key return 401.

API access is an Agency-plan feature. Generate your key from your account page.

Endpoint

POST https://normharbor.com/api/v1/scan or GET https://normharbor.com/api/v1/scan?url=...

Send a URL, get back a JSON scan result — score, grade, totals by severity, and the list of detected issues.

Example request (curl)

curl -s -X POST "https://normharbor.com/api/v1/scan" \
  -H "Authorization: Bearer nh_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

Example response

{
  "url": "https://example.com",
  "score": 87,
  "grade": "B",
  "totals": { "critical": 0, "serious": 1, "moderate": 2, "minor": 3, "elements": 6 },
  "issues": [
    { "id": "img-alt", "wcag": "1.1.1", "level": "A", "impact": "critical", "count": 2 }
  ],
  "scannedAt": "2026-09-23T10:00:00.000Z"
}

Errors

CodeMeaning
401Missing or invalid API key
403Key valid but account is not on the Agency plan
400Missing or empty url
422The target URL could not be scanned (unreachable, blocked, too large, etc.)
429Rate limit exceeded (60 requests/minute per key)
503Service temporarily busy — retry shortly

Rate limit: 60 requests per minute per API key.

GitHub Action (CI accessibility gate)

Add an accessibility gate to your pipeline: it scans a URL and fails the build if the score is below min-score.

- uses: normharbor/scan-action@v1
  with:
    api-key: ${{ secrets.NORMHARBOR_API_KEY }}
    url: https://example.com
    min-score: "90"

See the github-action/ folder in the NormHarbor repo for the full action.yml and setup instructions.

← Back to account