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:
tool:"axe"(axe-core results),"playwright"(what@axe-core/playwrightreturns) or"lighthouse"(a Lighthouse JSON report).results: that tool's JSON output, up to 2 MB.fail_on(optional):"critical"(default),"serious"(critical or serious) or"none".commit,branch,source(optional): recorded with the entry.
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);
});