A Singapore Government Agency Website

Scan report files

Files in the results folder

Oobee writes these files to the scan’s results folder. Refer to Read and export scan reports for how to find and use them.

File Created Format Contents
report.html Always HTML Interactive report with all issues, pages scanned and pages not scanned
summary.pdf Always PDF Printable summary of issue types and counts
report.csv Always CSV One row per issue in the Must Fix, Good to Fix and Manual Review Required categories
scanDetails.csv Always CSV Three Base64 columns: scanData_base64, scanItems_base64, scanItemsSummary_base64
scanData.json.gz.b64 -g yes Gzip, Base64 Scan overview and metadata
scanItems.json.gz.b64 -g yes Gzip, Base64 Detailed issues by category and rule
scanItemsSummary.json.gz.b64 -g yes Gzip, Base64 Issue totals and WCAG pass percentages
scanIssuesSummary.json.gz.b64 -g yes Gzip, Base64 Rules by category with pages affected
scanPagesSummary.json.gz.b64 -g yes Gzip, Base64 Pages affected and not affected
scanPagesDetail.json.gz.b64 -g yes Gzip, Base64 Pages affected and not affected, with issue types per page
sitemap.txt Always Text One scanned URL per line
elemScreenshots/ Screenshots on Folder Element screenshots in elemScreenshots/html and elemScreenshots/pdf
pageDOMs/ OOBEE_SAVE_DOM or OOBEE_SAVE_PAGE_SCREENSHOT set Folder Saved page DOMs and page screenshots
Zip file -o Zip Copy of the results, named by the -o value

Each JSON file is also written uncompressed as <name>.json during the scan. With -g yes, Oobee keeps both the .json and .json.gz.b64 files. Without it, Oobee deletes both.

Decode a compressed JSON file

A .json.gz.b64 file is gzip-compressed JSON encoded as Base64. Decode it with a command or a script.

Platform Command
macOS base64 -D -i scanData.json.gz.b64 | gunzip > scanData.json
Linux base64 -d scanData.json.gz.b64 | gunzip > scanData.json

In JavaScript, with the pako library installed:

const decompressedBytes = pako.inflate(compressedBytes);
const jsonString = new TextDecoder().decode(decompressedBytes);
const result = JSON.parse(jsonString);

report.csv columns

Column Description
customFlowLabel Label of the custom flow, or None
deviceChosen Device or viewport scanned, for example Desktop
scanCompletedAt Scan completion time in ISO 8601 format
severity mustFix, goodToFix, needsReview or error
issueId Rule identifier, for example aria-prohibited-attr
issueDescription Description of the issue
wcagConformance Related axe-core WCAG tags, comma-separated, for example wcag2a,wcag412
url URL of the affected page
pageTitle Title of the affected page
context HTML snippet of the affected element
howToFix Suggested fix
axeImpact Impact from axe-core: critical, serious, moderate or minor
xpath XPath of the affected element
learnMore URL with more information on the rule

Oobee prefixes a single quote to any field that starts with =, +, -, @, a tab or a carriage return, so that spreadsheets do not run it as a formula. Rows with severity error list pages the scan skipped.

"customFlowLabel","deviceChosen","scanCompletedAt","severity","issueId","issueDescription","wcagConformance","url","pageTitle","context","howToFix","axeImpact","xpath","learnMore"
"Custom Flow","Desktop","2025-03-13T10:09:18.733Z","needsReview","aria-prohibited-attr","Elements must only use permitted ARIA attributes","wcag2a,wcag412","https://example.com/page1","Example Page 1","<a class=""nav-link"" aria-label=""Example Link"">Example</a>","aria-label attribute is not well supported on an <a> with no valid role attribute.","serious","a[aria-label=""Example Link""]","https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr"

scanItemsSummary.json fields

Field Description
oobeeAppVersion Oobee version used for the scan
mustFix, goodToFix, needsReview Each has totalItems and totalRuleIssues
topTenPagesWithMostIssues Pages with the most issues: url, pageTitle, totalIssues, totalOccurrences
wcagLinks Map of WCAG criteria to their documentation URLs
wcagPassPercentage passPercentageAA, totalWcagChecksAA, totalWcagViolationsAA and the same three fields for AA plus AAA
progressPercentage averageProgressPercentageAA and averageProgressPercentageAAandAAA
issuesPercentage The fields in the next table
issuesPercentage field Description
avgTypesOfIssuesCountAtMustFix, avgTypesOfIssuesCountAtGoodToFix, avgTypesOfIssuesCountAtMustFixAndGoodToFix Average count of issue types per page at each level
avgTypesOfIssuesPercentageOfTotalRulesAtMustFix, avgTypesOfIssuesPercentageOfTotalRulesAtGoodToFix, avgTypesOfIssuesPercentageOfTotalRulesAtMustFixAndGoodToFix Average percentage of the total rules affected per page at each level
totalRulesMustFix, totalRulesGoodToFix, totalRulesMustFixAndGoodToFix Number of rules in each category
pagesAffectedPerRule Number of pages affected by each rule, keyed by rule ID
pagesPercentageAffectedPerRule Percentage of pages affected by each rule, keyed by rule ID
totalPagesScanned, totalPagesNotScanned Page counts
topTenIssues Most common issues: category, ruleId, description, axeImpact, conformance, totalItems

scanIssuesSummary.json fields

Field Description
oobeeAppVersion Oobee version used for the scan
mustFix, goodToFix, needsReview, passed Arrays of rules in each category
rule Rule identifier
description Short description of the rule
axeImpact Impact from axe-core
helpUrl URL with more information on the rule
conformance WCAG criteria the rule maps to
totalItems Number of times the rule was detected
pagesAffectedCount Number of pages where the rule was detected

scanPagesSummary.json and scanPagesDetail.json fields

Both files hold pagesAffected, pagesNotAffected, scannedPagesCount, pagesNotScanned and pagesNotScannedCount. scanPagesDetail.json adds a typesOfIssues array to each page.

Field Description
pageTitle, url Title and URL of the page
totalOccurrencesFailedIncludingNeedsReview Failed checks, including Manual Review Required
totalOccurrencesFailedExcludingNeedsReview Failed checks, excluding Manual Review Required
totalOccurrencesMustFix, totalOccurrencesGoodToFix, totalOccurrencesNeedsReview, totalOccurrencesPassed Occurrences by category
typesOfIssuesCount Unique issue types on the page
typesOfIssuesExcludingNeedsReviewCount Unique issue types, excluding Manual Review Required
typesOfIssuesExclusiveToNeedsReviewCount Unique issue types that appear only as Manual Review Required
categoriesPresent Categories found on the page
conformance WCAG criteria related to the page’s issues
typesOfIssues scanPagesDetail.json only: ruleId, wcagConformance, occurrencesMustFix, occurrencesGoodToFix, occurrencesNeedsReview, occurrencesPassed
pagesNotScanned Skipped pages: url, pageTitle, actualUrl, metadata, httpStatusCode

Status codes for skipped pages

The httpStatusCode and metadata fields in pagesNotScanned give the reason a page was not scanned.

Code Metadata
0 Page Excluded
1 Not A Supported Document
2 Web Crawler Errored
3 Blocked by Safe Browsing
200 Oobee was not able to scan the page due to access restrictions or compatibility issues
599 Uncommon Response Status Code Received

For the HTTP status codes below, metadata is the code followed by its standard name, for example 403 - Forbidden.

Range Codes recorded
1xx 100, 101, 102, 103
2xx 204, 205
3xx 300, 301, 302, 303, 304, 305, 307, 308
4xx 400 to 418, 421 to 426, 428, 429, 431, 451
5xx 500 to 508, 510, 511

Oobee’s source notes that the crawler library returns status codes 100, 102 and 103 as 599. They are listed here because Oobee has a name for each code, but they are reported as 599 in practice. Not every code in the table appears in every scan.

Chat with me!
Bot Launcher