Docs

Send your own test results, and add a CI check

On paid plans, results from your own accessibility tests can go into your site's Jralo evidence log, with the same dated, tamper-evident record as Jralo's daily checks. The same call answers whether the run passes, so your pipeline can fail when it finds critical problems.

1. Create a token

In your dashboard, open the site, choose Send your own test results and add a CI check, then Create a token. Copy it once and save it as a secret named JRALO_TOKEN in your CI. Jralo stores only a hash of it.

2. Send results

POST https://jralo.com/api/v1/results with Authorization: Bearer JRALO_TOKEN and a JSON body:

Lighthouse reports carry no impact rating, so Jralo rates each failed Lighthouse audit with the impact axe-core gives the same rule. "Critical" means the same whichever tool you send.

The answer includes pass, the counts by impact and the evidence log entry number. Up to 60 calls an hour per token.

GitHub Actions with Lighthouse

name: Accessibility
on: [push, pull_request]
jobs:
  jralo:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v4
        with: { node-version: 22 }
      - name: Lighthouse accessibility audit
        run: |
          npx --yes lighthouse@12 "$SITE_URL" --only-categories=accessibility \
            --output=json --output-path=report.json --chrome-flags="--headless=new --no-sandbox" --quiet
        env:
          SITE_URL: https://your-site.com/
      - name: Send to Jralo and fail on critical problems
        run: |
          jq -n --slurpfile r report.json \
            '{tool: "lighthouse", results: $r[0], fail_on: "critical", commit: env.GITHUB_SHA, branch: env.GITHUB_REF_NAME, source: "github-actions"}' \
          | curl -sS --fail-with-body -X POST https://jralo.com/api/v1/results \
              -H "Authorization: Bearer $JRALO_TOKEN" -H "content-type: application/json" --data @- \
          | tee jralo.json
          jq -e '.pass' jralo.json > /dev/null
        env:
          JRALO_TOKEN: ${{ secrets.JRALO_TOKEN }}

Playwright with axe-core

import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

test('home page', async ({ page }) => {
  await page.goto('https://your-site.com/');
  const results = await new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa', 'wcag22aa']).analyze();
  const res = await fetch('https://jralo.com/api/v1/results', {
    method: 'POST',
    headers: { authorization: `Bearer ${process.env.JRALO_TOKEN}`, 'content-type': 'application/json' },
    body: JSON.stringify({ tool: 'playwright', results, fail_on: 'critical', commit: process.env.GITHUB_SHA }),
  });
  const answer = await res.json();
  expect(answer.pass, `${answer.byImpact?.critical ?? '?'} critical problems`).toBe(true);
});

Automated testing finds many, not all, accessibility problems. A passing check is not a statement that a site meets any law or standard.