Skip to main content
RemediADA
DOCS

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.app

If 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.

Example header
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

POST/api/scans

Create a new accessibility scan for a given URL.

curl
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}'
JavaScript (fetch)
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();
Response (201 Created)
{
  "id": "scan_abc123",
  "url": "https://example.com",
  "status": "queued",
  "depth": 5,
  "createdAt": "2026-03-30T12:00:00Z"
}
GET/api/scans/:id

Retrieve the current status and details of a scan.

curl
curl https://api-production-f2e2.up.railway.app/api/scans/scan_abc123 \
  -H "Authorization: Bearer <clientId>.<secret>"
JavaScript (fetch)
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();
Response (200 OK)
{
  "id": "scan_abc123",
  "url": "https://example.com",
  "status": "completed",
  "pagesScanned": 12,
  "violationsFound": 47,
  "completedAt": "2026-03-30T12:05:32Z"
}
GET/api/reports/:scanId

Get the full accessibility report for a completed scan.

curl
curl https://api-production-f2e2.up.railway.app/api/reports/scan_abc123 \
  -H "Authorization: Bearer <clientId>.<secret>"
JavaScript (fetch)
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();
Response (200 OK)
{
  "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
    }
  ]
}
GET/api/clients/:id/scans

List all scans for your client account. Supports pagination.

curl
curl "https://api-production-f2e2.up.railway.app/api/clients/cl_xyz/scans?page=1&limit=20" \
  -H "Authorization: Bearer <clientId>.<secret>"
JavaScript (fetch)
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();
Response (200 OK)
{
  "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
  }
}
POST/api/remediation/request

Request automated remediation for violations found in a scan.

curl
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"]}'
JavaScript (fetch)
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();
Response (202 Accepted)
{
  "jobId": "rem_def456",
  "scanId": "scan_abc123",
  "status": "processing",
  "violationsRequested": 2,
  "createdAt": "2026-03-30T12:10:00Z"
}
GET/api/remediation/:jobId

Check the status of a remediation job.

curl
curl https://api-production-f2e2.up.railway.app/api/remediation/rem_def456 \
  -H "Authorization: Bearer <clientId>.<secret>"
JavaScript (fetch)
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();
Response (200 OK)
{
  "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"
}
GET/api/clients/:id/export

Export all data associated with your account in machine-readable JSON format. Supports GDPR data portability requirements.

curl
curl https://api-production-f2e2.up.railway.app/api/clients/cl_xyz/export \
  -H "Authorization: Bearer <clientId>.<secret>"
Response (200 OK)
{
  "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"
}
GET/api/health

Check 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 response
{
  "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