Choose the format in Report Format before a scan. HTML is the default and the only format with screenshots, tickets and editing. CSV and JSON are for spreadsheets, scripts and other tools. For the features of the HTML report, see Report Anatomy. For where report files are kept, see Where files are kept.
1. CSV format
You get a CSV report when:
- Report Format is set to CSV.
- A scan makes an HTML report. A companion CSV with the same results is saved beside it.
- An HTML report would be too large for the available memory, so a CSV is made instead. See A CSV report was produced instead of HTML.
Layout
- Encoding: UTF-8 with a byte order mark, so spreadsheet apps detect the encoding.
- Line endings: Windows-style (CRLF).
- Preamble: The file starts with three lines of text and a blank line. The column headings are on line 5.
- Rows: One row for each element that has an issue, on each page and viewport. An issue found on 40 elements gives 40 rows. After these come rows for Local LLM suggestions, manually added issues, PDF issues, PDFs that couldn't be checked, pages that weren't fully scanned and skipped pages.
- Quoting: A value that contains a comma, a double quote or a line break is wrapped in double quotes, and quotes inside it are doubled.
- Formula protection: A value that starts with
=,+,-or@(even after spaces), a tab or a line break gets a leading apostrophe and is wrapped in quotes, so a spreadsheet can't run it as a formula.
The three preamble lines are:
Generated by Octopus Scannerfollowed by the app version.Confidential. Do not share this report without authorisation.Not a substitute for manual review or legal compliance. Octopus Scanner is not affiliated with or endorsed by the scanned content.
If the scan stopped early, a fourth line starting Scan stopped early: gives the reason, such as memory running low.
Columns
| Column | Contents |
|---|---|
Issue ID | The axe rule ID, such as image-alt or color-contrast. PDF issues show the PDF check ID, such as pdf-no-title, skipped pages show skipped- followed by the skip category, such as skipped-bot-protection, and items suggested by Local LLM Review show the suggestion's title. |
Description | What the rule checks. |
Impact | critical, serious, moderate or minor. Needs Review items show needs-review. |
URL/File | The page address, or the file address for a local file scan. |
Viewport | The viewport name, such as Desktop_1280x800. |
CSS Selector | The selector of the element. When axe-core gives more than one selector, for example for an element inside a frame, they are joined with a comma and a space. |
HTML Snippet | The element's HTML. |
Help URL | A link to the rule's documentation. |
WCAG Tags | The rule's tags, separated by spaces, such as wcag2a wcag111. Needs Review items also carry needs-review. |
How to Fix | The failure summary for this element. It often spans several lines inside one quoted cell. |
Source | axe-core, Local LLM for items suggested by the optional Local LLM Review, Manual for manually added issues, PDF check for PDF issues and PDFs that couldn't be checked, Scan error for pages that weren't fully scanned or Skipped page. |
LLM Review | The LLM's second opinion when Local LLM Review was on, such as valid 90% (1 of 2 agree). For items the LLM suggested, its confidence and category, such as suggested 80% (Headings, LLM review). Empty otherwise. |
Needs Review items are included only when Include Needs Review Section is on. The CSV doesn't contain PDFs that passed every check. Use the HTML or JSON report for those.
Manual issue, PDF, scan error and skipped page rows
- Manual issues:
Issue IDismanual-followed by a number,Descriptionis the description you entered,URL/File,CSS SelectorandWCAG Tagshold the address, selector and WCAG criteria you entered,Help URLholds the evidence link andSourceisManual. - PDF issues:
Issue IDis the PDF check, such aspdf-not-tagged,pdf-no-text,pdf-image-no-altorpdf-no-language.- The full list is in PDF checks.
Descriptiongives the issue and what was found,URL/Fileis the PDF's address,Help URLlinks to the WCAG technique or criterion,WCAG Tagslists the criteria,How to Fixgives the fix andSourceisPDF check.- The viewport, selector and snippet columns are empty.
- PDFs that couldn't be checked:
Issue IDispdf-not-checked,DescriptionreadsPDF not checked: [reason],URL/Fileis the PDF's address andSourceisPDF check. - Scan errors:
Issue IDiserror-followed by the error type, such aserror-scan_error.DescriptionreadsPage not fully scanned ([type]): [message],URL/Fileis the page,Viewportis the viewport if known andSourceisScan error. - Skipped pages:
Issue IDisskipped-followed by the category,DescriptionreadsSkipped ([category]): [reason],URL/Fileis the skipped address andSourceisSkipped page. The other columns are empty. The categories are described in Skip categories.
Example
The first lines of a CSV report look like this. The values are made up.
Generated by Octopus Scanner x.y.z
Confidential. Do not share this report without authorisation.
Not a substitute for manual review or legal compliance. Octopus Scanner is not affiliated with or endorsed by the scanned content.
Issue ID,Description,Impact,URL/File,Viewport,CSS Selector,HTML Snippet,Help URL,WCAG Tags,How to Fix,Source,LLM Review
image-alt,Ensure images have alternative text,critical,https://example.com/menu,Desktop_1280x800,.hero > img,"<img src=""/hero.jpg"">",https://docs.example.com/rules/image-alt,cat.text-alternatives wcag2a wcag111,Element does not have an alt attribute,axe-core,
link-name,Ensure links have discernible text,serious,https://example.com/,Desktop_1280x800,.social > a:nth-child(2),"<a href=""https://example.com/shop""></a>",https://docs.example.com/rules/link-name,cat.name-role-value wcag2a wcag244,Element is not focusable,axe-core,
Opening the CSV in a spreadsheet
- Skip the preamble: When you import the file, start at row 5 so the column headings become the header row. If you open the file directly, delete rows 1 to 4 before you sort or filter.
- Import as text if values change: Some apps turn values that look like dates or numbers into something else. Importing every column as text keeps them as written.
- Expect apostrophes: A value that started with
=,+,-or@keeps its added apostrophe. Remove it only if you're sure the value is safe. - Count unique issues with a pivot table: Group by
Issue IDfor issue types, or byURL/Filefor the pages with most problems. - Use a script for very large files: A CSV made because the HTML report was too large can have more rows than a spreadsheet app can open.
Text description: CSV report opened in a spreadsheet
Example of a spreadsheet with column letters A to D. Row 1 holds the headings Issue ID, Description, Impact and URL/File. Row 2: image-alt, Ensure images have alternative text, critical, https://example.com/menu. Row 3: link-name, Ensure links have discernible text, serious, https://example.com/.
CSV files exported from an HTML report
The HTML report has its own CSV downloads. They use a slightly different layout:
- Export as CSV: the same three preamble lines, without any
Scan stopped early:line, and the same twelve columns, with the column headings in quotes.- It also includes manual issue, PDF issue and skipped page rows, and every instance of every rule.
- For rules where the report keeps only a sample of a very large number of matches, the full list comes from the companion CSV, with any severity you changed in the report. That needs the report open from Octopus Scanner. A report opened straight from its folder in a browser can't read the companion CSV, so it lists the sample and adds a note row naming those rules.
- Issues you have removed or hidden in the report are left out.
- The file name ends in
_instances.csv.
- Ticket instance CSV: from a ticket, with the columns
Issue ID,Page URL,Viewport,CSS Selector,HTML SnippetandFailure Detail, after the same three preamble lines and a blank line.- When the report is open from Octopus Scanner, it lists every instance of the issue.
- A saved copy opened from a folder lists the instances kept in the report and adds a line pointing to the companion CSV.
- The file is named
ticket-[issue ID]-instances.csv.
2. JSON format
A JSON report is a single object. The example below shows its top-level keys with made-up values, shortened.
{
"_notice": {
"generator": "Octopus Scanner x.y.z",
"confidential": "Do not share this report without authorisation.",
"disclaimer": "Not a substitute for manual review or legal compliance. Octopus Scanner is not affiliated with or endorsed by the scanned content."
},
"scanUrl": "https://example.com/",
"timestamp": "2026-10-17T09:30:00.000Z",
"results": {
"https://example.com/::Desktop_1280x800": [
{
"id": "image-alt",
"impact": "critical",
"tags": ["cat.text-alternatives", "wcag2a", "wcag111"],
"description": "Ensure images have alternative text",
"helpUrl": "https://docs.example.com/rules/image-alt",
"nodes": [
{
"html": "<img src=\"/hero.jpg\">",
"target": [".hero > img"],
"failureSummary": "Element does not have an alt attribute"
}
]
}
]
},
"manualIssues": [],
"pdfResults": [
{
"url": "https://example.com/menu.pdf",
"isTagged": false,
"error": null,
"checks": {
"tagged": { "status": "fail", "detail": "No tags (/StructTreeRoot) found." },
"title": { "status": "pass", "detail": "Title: \"Lunch menu\"" }
},
"findings": [
{ "id": "pdf-not-tagged", "name": "PDF is not tagged", "impact": "serious", "wcag": "1.3.1" }
]
}
],
"errors": {
"https://example.com/shop": { "type": "SCAN_ERROR", "message": "…", "viewport": "Desktop_1280x800" }
},
"skipped": {
"https://example.com/blog/feed.xml": { "reason": "Skipped non-HTML asset", "category": "not-a-page" }
},
"screenshotPaths": {},
"screenshotFilenames": {},
"environment": {
"axeVersion": "x.y.z",
"browserVersion": "x.y.z",
"scanOs": "darwin",
"viewports": ["Desktop_1280x800"]
}
}
Keys
- _notice: The generator, confidentiality and disclaimer text, the same as the CSV preamble. If the scan stopped early,
stoppedEarlygives the reason. - scanUrl: The address the scan started from.
- timestamp: When the report was written, in ISO 8601 format (UTC).
- results: One entry for each page and viewport, keyed as
[address]::[viewport]. Each value is a list of axe-core violations with their affected elements innodes. Passed rules aren't included. Needs Review items appear here with"impact": "needs-review"when Include Needs Review Section is on. - manualIssues: Issues added by hand, if any. Usually an empty list.
- pdfResults: One entry for each PDF checked when Check PDFs is on, with
isTaggedand anyerror.- A PDF that could be read also has
checks, with astatusofpass,fail,unknown(couldn't be checked) ornot-applicable(not checked) and adetailfor each oftagged,text,accessPermission,title,displayTitle,language,figureAlt,headings,tableHeaders,formFields,links,tabOrderandbookmarks, andfindings, one for each check that failed, with itsid,name,description,impact,wcag,techniqueandrecommendation. - The example is shortened.
- See PDF checks.
- A PDF that could be read also has
- errors: Pages that couldn't be scanned, keyed by address, with an error type, a message and the viewport.
- skipped: Pages that were found but not scanned, keyed by address, with a
reasonand acategory:bot-protection,http-error,auth(Sign-in required),robots,excluded,redirect,cap(Caps and duplicates),not-a-page,error(Timeout or error) orother. Every reason is explained in Messages and Skipped Pages, Skipped pages section. - screenshotPaths and screenshotFilenames: Screenshot file names. Screenshot Mode is turned off for JSON reports, so these are usually empty.
- llmReview: Only when the optional Local LLM Review ran: the model, whether the server was on your computer or your local network, counts, the second opinions for each issue type and the items suggested for LLM Review. Each violation in
resultsalso carries anllmfield with its second opinion. - environment: The axe-core version, the browser version, the operating system the scan ran on (
darwinfor macOS,win32for Windows) and the names of the viewports scanned.
The Export as JSON button in an HTML report produces a different file, named with _data.json. It holds the report's own data, grouped by issue rather than by page, with the same three preamble notices in _notice and no Scan stopped early: line, and leaves out issues you have removed or hidden.
3. File names
Every report is named the same way:
accessibility_report_[address]_[timestamp].[html|csv|json]
- [address]: The start address without
http://,https://orfile:///, in lower case, with every character other than a letter or a number replaced by_, and cut to 50 characters. - [timestamp]: When the report was created, as milliseconds since 1 January 1970 (UTC). It keeps names unique and sorts them in date order.
For example, a scan of https:// could produce accessibility_report_www_example_com_menu_1792229400000.html.
Files that belong to an HTML report share its name, without the .html:
- Companion CSV:
[name].csv, the same name with.csvin place of.html. - Screenshots folder:
[name]_screenshots, when screenshots are stored outside the report. - Screenshots ZIP:
[name]_screenshots.zip.
When you delete an HTML report in Past Reports, its screenshots folder and ZIP are deleted with it. If it has a companion CSV, Octopus Scanner asks whether to delete that too.
Don't rename reports in the reports folder. Past Reports lists only HTML, CSV and JSON files whose names start with
accessibility_report_and contain only letters, numbers, underscores (_), hyphens (-) and full stops (.). A renamed report no longer appears. Renaming a copy you share is fine.
4. Screenshots
Screenshots appear only in HTML reports. They are normally embedded in the report file, so one file holds everything.
When a scan has more than 400 screenshots, or more than 100 MB of them, they are saved in the [name]_screenshots folder beside the report instead. This keeps the report fast to open. The report shows a note naming the folder.
- Opened from Octopus Scanner: The screenshots load automatically.
- Opened from disk: Select Load Screenshots Folder at the top of the report, then choose the folder. This needs Google Chrome.
- Sharing: Send the folder, or the screenshots ZIP, with the report.
When screenshots are in a folder, the ZIP isn't saved to disk. It is built when you download it from Octopus Scanner. When screenshots are embedded, the ZIP is saved beside the report. See also Screenshots are in a folder instead of the report.
5. Integrity hash
Every HTML report shows a SHA-256 hash in its footer, labelled SHA-256. CSV and JSON reports don't have one.
- What is hashed: Octopus Scanner calculates the hash over every byte of the report file as it is written, except the 64-character hash itself. The space where the hash goes is left out of the calculation, and the hash is then written into that space.
- What it is for: It identifies the exact file Octopus Scanner produced. Any change to the file, however small, gives a different result, so it no longer matches the hash in its footer.
- Edited and re-saved copies: A copy saved with Save & Download HTML, with or without edits, keeps the original hash in its footer, relabelled Original SHA-256, but the file itself is different. The hash describes the original report, not the copy.
Octopus Scanner doesn't include a tool that checks the hash. Keep the original file if you may need to show later that a report hasn't changed.
6. Related guides
For how to read and act on the HTML report, see Report Anatomy and After Your Scan. For skip reasons and log messages, see Messages and Skipped Pages, top of the page.
Was this page helpful? Email your feedback about Report File Formats.