Show an accessibility check
Status and result of a check. ?wait=true (or a number of seconds, at most 30) waits until it is done. report_json_url and report_pdf_url are signed links to the full report.
https://api.switchfile.io/v1/accessibility/checks/{id}Example
curl "https://api.switchfile.io/v1/accessibility/checks/8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48?wait=true" \
-H "Authorization: Bearer $SWITCHFILE_API_KEY"const res = await fetch("https://api.switchfile.io/v1/accessibility/checks/8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48?wait=true", {
headers: {
Authorization: `Bearer ${process.env.SWITCHFILE_API_KEY}`,
},
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
console.log(await res.json());<?php
$ch = curl_init('https://api.switchfile.io/v1/accessibility/checks/8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48?wait=true');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SWITCHFILE_API_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException("HTTP $status: $response");
}
print_r(json_decode($response, true));import os
import requests
res = requests.get(
"https://api.switchfile.io/v1/accessibility/checks/8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48?wait=true",
headers={"Authorization": f"Bearer {os.environ['SWITCHFILE_API_KEY']}"},
)
res.raise_for_status()
print(res.json())Parameters
Path parameters
idstring (uuid)requiredID of the check
Query parameters
waitstring | numbertrue or a number of seconds: wait until the check is done, at most 30 seconds
one of "true" · example: true
Headers
X-End-UserstringService keys only: an ID for the visitor you act for (1 to 128 characters: letters, digits and . _ : @ -). Quotas and rate limits then count per visitor.
X-End-User-IpstringRequired with X-End-User: the IP address of the visitor.
Responses
200OK
created_atstringrequiredISO 8601 timestamp, for example 2026-11-06T18:00:00+00:00
creditsstring (integer) | integerrequiredCredits used, set once the check is done
errorobject | nullrequirederror.codestringrequirederror.messagestringrequiredexpires_atstring | nullrequiredInput and report are deleted at this time
finished_atstring | nullrequiredISO 8601 timestamp, for example 2026-11-06T18:00:00+00:00
idstring (uuid)requiredinputobjectrequiredinput.filenamestring | nullrequiredinput.sizestring (integer) | integerrequiredlinksobjectrequiredlinks.selfstringrequiredobjectstringrequiredone of "accessibility_check"
profilestringrequiredone of "auto", "ua1", "ua2"
report_pdfstring | nullrequiredAlso create the report as an accessible PDF in this language
one of "en"
resultobject | nullrequiredresult.completebooleanrequiredfalse if the time limit was reached; the counts cover only the checked part
result.criteriaobjectrequiredresult.criteria.appliedstring (integer) | integerrequiredMachine-checkable criteria that apply to this file
at least 0
result.criteria.failedstring (integer) | integerrequiredat least 0
result.criteria.metstring (integer) | integerrequiredat least 0
result.manual_review_neededbooleanrequiredAlways true: software cannot check everything. A person who knows the content has to review it
one of true
result.pagesstring (integer) | integerrequiredat least 0
result.profilestringrequiredone of "ua1", "ua2"
result.report_json_urlstringrequiredSigned URL of the full report as JSON
result.report_pdf_urlstring | nullrequiredSigned URL of the report as PDF (with report_pdf)
result.summarystringrequiredX of Y machine-checkable criteria met; manual review needed
result.topicsAccessibilityTopic[]requiredTopics with failed criteria, most failed checks first
result.topics[].explanationstringrequiredWhat the problem means for people who use assistive technology
result.topics[].failed_checksstring (integer) | integerrequiredNumber of failed checks in this topic
at least 0
result.topics[].fixobjectrequiredresult.topics[].fix.acrobatstring[]requiredSteps in Adobe Acrobat Pro
result.topics[].fix.indesignstring[]requiredSteps in Adobe InDesign
result.topics[].fix.wordstring[]requiredSteps in Microsoft Word
result.topics[].idstringrequiredStable topic ID, for example alt-text
result.topics[].pagesstring (integer) | integer[]requiredAffected pages, at most 100
result.topics[].titlestringrequiredstatusstringrequiredone of "queued", "processing", "finished", "failed"
200 application/json{ "id": "8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48", "object": "accessibility_check", "status": "finished", "input": { "filename": "annual-report.pdf", "size": 482113 }, "profile": "auto", "report_pdf": "en", "result": { "summary": "38 of 41 machine-checkable criteria met; manual review needed", "profile": "ua1", "complete": true, "pages": 12, "criteria": { "applied": 41, "met": 38, "failed": 3 }, "manual_review_needed": true, "topics": [ { "id": "alt-text", "title": "Figure or formula has no alternative text", "explanation": "A Figure or Formula tag has neither alternative text (/Alt) nor replacement text (/ActualText). Screen readers then announce only that there is a graphic, or skip it, so blind users miss information that exists only in the image, such as the message of a chart or the content of a formula.", "fix": { "word": [ "Right-click the picture and choose View Alt Text (Office 2019 to 2024: Edit Alt Text)." ], "indesign": [ "Select the image and choose Object > Object Export Options > Alt Text." ], "acrobat": [ "Choose All tools > Prepare for accessibility > Add alternate text." ] }, "failed_checks": 5, "pages": [ 1, 2, 7 ] } ], "report_json_url": "https://api.switchfile.io/files/2a6f8e1c-4b3d-4e7a-9c5f-8d1b0e2a4c67/report.json?expires=1762538401&signature=3f9c2a7d41e8b6c05d1f9e2a7b4c8d3e6f0a1b2c3d4e5f60718293a4b5c6d7e8", "report_pdf_url": "https://api.switchfile.io/files/2a6f8e1c-4b3d-4e7a-9c5f-8d1b0e2a4c67/report.pdf?expires=1762538401&signature=3f9c2a7d41e8b6c05d1f9e2a7b4c8d3e6f0a1b2c3d4e5f60718293a4b5c6d7e8" }, "error": null, "credits": 1, "created_at": "2026-11-06T18:00:00+00:00", "finished_at": "2026-11-06T18:00:02+00:00", "expires_at": "2026-11-07T18:00:02+00:00", "links": { "self": "https://api.switchfile.io/v1/accessibility/checks/8c3e5a71-2f4b-4d6a-9e0c-7b1d3f5a2e48" } }401The API key is missing or not valid
UNAUTHENTICATED401 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-unauthenticated", "title": "Unauthenticated", "status": 401, "code": "UNAUTHENTICATED", "detail": "Missing or invalid API key." }403Not allowed: a signed URL is wrong or expired, or X-End-User was sent without a service key
END_USER_NOT_ALLOWED403 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-end-user-not-allowed", "title": "End user not allowed", "status": 403, "code": "END_USER_NOT_ALLOWED", "detail": "The X-End-User header is only allowed with a service key." }404Does not exist for this account
NOT_FOUND404 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-not-found", "title": "Not found", "status": 404, "code": "NOT_FOUND", "detail": "Accessibility check not found." }422Invalid data. errors names the fields
INVALID_DATA422 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-invalid-data", "title": "Invalid data", "status": 422, "code": "INVALID_DATA", "detail": "The request contains invalid data.", "errors": { "id": [ "Expected string to match 'uuid' format" ] } }429Too many requests or a daily quota is used up. See Retry-After
RATE_LIMIT_EXCEEDED429 application/problem+json{ "type": "https://switchfile.io/docs/api/v1#errors-rate-limit-exceeded", "title": "Rate limit exceeded", "status": 429, "code": "RATE_LIMIT_EXCEEDED", "detail": "Too many requests. Try again in 12 seconds." }