API Documentation
Integrate RemediADA's accessibility scanning and remediation into your workflow.
Base URL
All API requests are made relative to the following base URL:
https://api-production-f2e2.up.railway.appIf you are self-hosting, set the NEXT_PUBLIC_API_URL environment variable to your custom base URL.
Authentication
Authenticate requests using an API token passed in the Authorization header. API tokens use the format clientId.secret, where clientId is your client identifier and secret is your API secret key.
Authorization: Bearer <clientId>.<secret>Generate API tokens from the Settings page in your dashboard. Treat your API secret like a password and never expose it in client-side code.
Endpoints
/api/scansCreate a new accessibility scan for a given URL.
curl -X POST https://api-production-f2e2.up.railway.app/api/scans \
-H "Authorization: Bearer <clientId>.<secret>" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "depth": 5}'const res = await fetch("https://api-production-f2e2.up.railway.app/api/scans", {
method: "POST",
headers: {
"Authorization": "Bearer <clientId>.<secret>",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com", depth: 5 }),
});
const scan = await res.json();{
"id": "scan_abc123",
"url": "https://example.com",
"status": "queued",
"depth": 5,
"createdAt": "2026-03-30T12:00:00Z"
}/api/scans/:idRetrieve the current status and details of a scan.
curl https://api-production-f2e2.up.railway.app/api/scans/scan_abc123 \
-H "Authorization: Bearer <clientId>.<secret>"const res = await fetch("https://api-production-f2e2.up.railway.app/api/scans/scan_abc123", {
headers: {
"Authorization": "Bearer <clientId>.<secret>",
},
});
const scan = await res.json();{
"id": "scan_abc123",
"url": "https://example.com",
"status": "completed",
"pagesScanned": 12,
"violationsFound": 47,
"completedAt": "2026-03-30T12:05:32Z"
}/api/reports/:scanIdGet the full accessibility report for a completed scan.
curl https://api-production-f2e2.up.railway.app/api/reports/scan_abc123 \
-H "Authorization: Bearer <clientId>.<secret>"const res = await fetch("https://api-production-f2e2.up.railway.app/api/reports/scan_abc123", {
headers: {
"Authorization": "Bearer <clientId>.<secret>",
},
});
const report = await res.json();{
"scanId": "scan_abc123",
"url": "https://example.com",
"summary": {
"totalViolations": 47,
"critical": 3,
"serious": 12,
"moderate": 20,
"minor": 12
},
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"description": "Elements must have sufficient color contrast",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.4/color-contrast",
"nodes": 8
}
]
}/api/clients/:id/scansList all scans for your client account. Supports pagination.
curl "https://api-production-f2e2.up.railway.app/api/clients/cl_xyz/scans?page=1&limit=20" \
-H "Authorization: Bearer <clientId>.<secret>"const res = await fetch(
"https://api-production-f2e2.up.railway.app/api/clients/cl_xyz/scans?page=1&limit=20",
{
headers: {
"Authorization": "Bearer <clientId>.<secret>",
},
}
);
const data = await res.json();{
"scans": [
{
"id": "scan_abc123",
"url": "https://example.com",
"status": "completed",
"violationsFound": 47,
"createdAt": "2026-03-30T12:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1
}
}/api/remediation/requestRequest automated remediation for violations found in a scan.
curl -X POST https://api-production-f2e2.up.railway.app/api/remediation/request \
-H "Authorization: Bearer <clientId>.<secret>" \
-H "Content-Type: application/json" \
-d '{"scanId": "scan_abc123", "violationIds": ["color-contrast", "image-alt"]}'const res = await fetch("https://api-production-f2e2.up.railway.app/api/remediation/request", {
method: "POST",
headers: {
"Authorization": "Bearer <clientId>.<secret>",
"Content-Type": "application/json",
},
body: JSON.stringify({
scanId: "scan_abc123",
violationIds: ["color-contrast", "image-alt"],
}),
});
const job = await res.json();{
"jobId": "rem_def456",
"scanId": "scan_abc123",
"status": "processing",
"violationsRequested": 2,
"createdAt": "2026-03-30T12:10:00Z"
}/api/remediation/:jobIdCheck the status of a remediation job.
curl https://api-production-f2e2.up.railway.app/api/remediation/rem_def456 \
-H "Authorization: Bearer <clientId>.<secret>"const res = await fetch("https://api-production-f2e2.up.railway.app/api/remediation/rem_def456", {
headers: {
"Authorization": "Bearer <clientId>.<secret>",
},
});
const job = await res.json();{
"jobId": "rem_def456",
"scanId": "scan_abc123",
"status": "completed",
"fixes": [
{
"violationId": "color-contrast",
"status": "fixed",
"nodesFixed": 8
},
{
"violationId": "image-alt",
"status": "fixed",
"nodesFixed": 3
}
],
"completedAt": "2026-03-30T12:12:45Z"
}/api/clients/:id/exportExport all data associated with your account in machine-readable JSON format. Supports GDPR data portability requirements.
curl https://api-production-f2e2.up.railway.app/api/clients/cl_xyz/export \
-H "Authorization: Bearer <clientId>.<secret>"{
"client": {
"id": "cl_xyz",
"name": "Acme Corp",
"email": "admin@acme.com",
"createdAt": "2026-01-15T08:00:00Z"
},
"scans": [ ... ],
"reports": [ ... ],
"remediationJobs": [ ... ],
"exportedAt": "2026-03-30T12:15:00Z"
}/api/healthCheck the API health status. No authentication required.
Rate Limits
API requests are rate-limited based on your subscription plan. When you exceed the limit, the API returns a 429 Too Many Requests response with a Retry-After header indicating when you can retry. We recommend implementing exponential backoff in your integration.
Error Handling
The API uses standard HTTP status codes. Error responses include a JSON body with details:
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired API token."
}
}- 400: Bad request (invalid parameters)
- 401: Unauthorized (missing or invalid token)
- 403: Forbidden (insufficient permissions)
- 404: Resource not found
- 429: Rate limit exceeded
- 500: Internal server error
Need help? Contact Support · Terms of Service · Privacy Policy