UnifyComply

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_KEY

Endpoints

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.