API reference
UnifyComply API
Scan PDFs for accessibility from WordPress, Drupal, and custom apps. All documents are processed in memory only — no long-term PDF storage.
Overview
The API accepts a PDF (file upload or URL), runs a set of automated accessibility checks, and returns a structured report with score, status, and human-readable issues.
Zero-storage processing: PDF bytes live only in memory during the scan request. The service stores only metadata such as scores, issue summaries, and timestamps — never the original PDF file.
Authentication
Each request must include your API key. You can pass it either as an Authorization header or as X-API-Key.
Authorization: Bearer YOUR_API_KEY
X-API-Key: YOUR_API_KEYEndpoints
1. Upload PDF — POST /v1/scans/upload
Send a PDF file using multipart/form-data.
2. Scan via URL — POST /v1/scans/url
Provide a public HTTPS link to a PDF as JSON: { "url": "https://..." }.
3. Async scan — POST /v1/scans/async
Start a scan and return immediately. You can send either a file upload or a JSON body with a URL. The response includes a scan_id and processing_status.
4. Get result — GET /v1/scans/:id
Poll this endpoint with the scan_id until processing_status becomes completed or failed.
Copy-ready examples
cURL — scan by URL
curl -X POST https://api.example.com/v1/scans/url \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/file.pdf"}'cURL — upload PDF
curl -X POST https://api.example.com/v1/scans/upload \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@/path/to/document.pdf"JavaScript (fetch) — scan by URL
async function scanPdfByUrl() {
const res = await fetch("https://api.example.com/v1/scans/url", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/file.pdf" }),
});
const data = await res.json();
if (!res.ok) {
throw new Error(data.message || "Scan failed");
}
return data;
}Example response
When a scan is completed, the API returns a unified object including processing status, compliance status, score, and structured issues:
{
"id": "scan_12345",
"source": {
"type": "url",
"label": "https://example.com/file.pdf"
},
"processing_status": "completed",
"compliance_status": "partially_compliant",
"score": 72,
"summary": "Some accessibility issues need attention. Fix the critical and warning items first, then review the remaining suggestions.",
"issues": {
"critical": [
{
"id": "no-text-layer",
"severity": "critical",
"title": "This document is not readable by screen readers",
"description": "The PDF does not contain selectable text. It is likely a scanned or image-only document.",
"recommendation": "Run the document through OCR so that screen readers can read the text."
}
],
"warning": [],
"info": []
},
"createdAt": "2026-03-17T12:34:56.000Z"
}For full request and response schemas, use the OpenAPI page (Swagger + inline YAML). To feed Postman, codegen, or CI, download the YAML from that page — the file URL is the same one tools use, but it is not meant to be read as a normal site page.