Overview of the Tenon API Response

Upon submission of your request against the Tenon API, we will return a JSON formatted response for your client application to consume. This response will include a large amount of detail useful to you in determining the quality of your request and will detail the test results generated based on that request.

This document explains every possible node in the JSON response.

  • status: HTTP status code from the Test API. Values will be 200, 400, 401, 402, 403, 404, 405, 500, or 522
  • message: A specific text message indicating the nature of the response
  • documentSize: size, in bytes of the document you gave us to test
  • responseExecTime: How long, in seconds, it took for us to test your document
  • responseTime: Time of your request, localized to GMT
  • sourceHash: an MD5 hash of your document source, useful in uniquely identifying your tested documents
  • urlHttpCode: the HTTP status code that your page sent back
  • resultUrl: (if "store" was set to "1" in your request) a URL at which you can view the test results on the Tenon website
  • request: This node is a complete mirror of the request you sent to us. Any values echoed here which you did not supply in your request will be set to their defaults, as discussed in "Understanding Tenon API Request Parameters"
    • appID
    • certainty
    • docID
    • importance
    • key
    • level
    • priority
    • priorityWeightissueLocation
    • ref
    • responseID
    • projectID
    • uaString
    • url
    • viewport
      • height
      • width
    • fragment
    • store
  • clientScriptErrors: this node will generate an array of errors generated by the script(s) in your tested document. These errors may impact our ability to effectively test your document, so we list them here so you can fix them and retest. Each error contains the following information:
    • message: The exception message
    • stacktrace: This is a full stack trace of the error
      • file: the file where the error exists
      • line: the line where the error exists
      • function: the function where the error exists
  • globalStats:The global stats node exists to allow you to compare your document against others that have been tested. Global Stats are a calculation of all tested documents. These stats relate only to "density" - that is, per KB of code, what percentage contain accessibility issues.
    • allDensity: Density, as a percentage, of both errors and warnings
    • errorDensity: Density, as a percentage, of errors only
    • warningDensity: Density, as a percentage, of warnings only
  • resultSummary: The resultSummary node provides a high level overview of our test results.
    • density: As mentioned above in 'globalStats' the density node is a calculation of the issue density in your tested document
      • allDensity
      • errorDensity
      • warningDensity
    • issues: This is a count of the issues in your document
      • totalErrors
      • totalIssues
      • totalWarnings
    • issuesByLevel: This is a count of the issues in your document, separated out by WCAG Level.
      • A
        • count
        • pct
      • AA
        • count
        • pct
      • AAA
        • count
        • pct
    • tests: this is a count of how many tests Tenon API ran (total), how many passed and how many failed:
      • failing
      • passing
      • total
  • resultSet: The resultSet will contain an array for each issue discovered during testing. Each issue will be presented with the following keys. Each of these are described in full in the document titled "Understanding Issue Reports in Tenon.io API Response"
    • bpID
    • certainty
    • priority
    • errorDescription
    • errorSnippet
    • errorTitle
    • issueID
    • position
      • line
      • column
    • viewPortLocation
      • width
      • height
      • top-left
        • x
        • li>
      • bottom-right
        • x
        • li>
    • ref
    • resultTitle
    • signature
    • standards
    • tID
    • xpath
  • apiErrors: will list out any errors on the Tenon API itself. We hope that this node is always empty. However, if you do see anything here, we'd appreciate it if you'd pass on the following additional information in this section. It will include:
    • line
    • message
    • sourceId
    • tID

JSON Response Example

Here's an example of the JSON response

    "apiErrors": [],
    "documentSize": 113805,
    "globalStats": {
        "errorDensity": "145",
        "warningDensity": "11",
        "allDensity": "156",
        "stdDev": "375"
    "message": "success",
    "request": {
        "certainty": "0",
        "docID": "85001FBE-65DD-4942-FE94-D3D33A9E2E1F",
        "importance": "0",
        "key": "null",
        "level": "AAA",
        "priority": "0",
        "ref": "1",
        "reportID": "43B4C1A5-B553-5CEA-5AC1-D1CCA9008ABB",
        "responseID": "f27aa22a14a15316f721af629a3a0439",
        "projectID": "DEFAULT_PROJECT",
        "uaString": "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
        "url": "http://example.com",
        "viewport": {
            "height": 768,
            "width": 1024
        "fragment": "0",
        "store": "0"
    "responseExecTime": "1.17",
    "responseTime": "2015-02-04T20:55:51.404Z",
    "resultSet": [
            "bpID": 106,
            "certainty": 100,
            "errorDescription": "Link found which contains no text. Because Accessibility APIs use a link's text do determine its accessible name, this link will have no name and will not be announced by assistive technologies.",
            "errorSnippet": "<a class=\"gb_D gb_Ta\" href=\"http://www.example.com/intl/en/options/\" title=\"Apps\" aria-haspopup=\"true\" aria-expanded=\"false\" data-ved=\"0CAkQvSc\" data-eqid=\"0click\"></a>",
            "errorTitle": "Blank link text found",
            "position": {
                "column": 71,
                "line": 24
            "priority": 100,
            "ref": "https://tenon.io/bestpractice.php?bpID=106&tID=57",
            "resultTitle": "Ensure link text (and alternate text for images, when used as links) describes the destination or purpose of the link.",
            "signature": "18c1e927a023f074aa9dce6df3092e51",
            "standards": [
                "Web Content Accessibility Guidelines (WCAG) 2.0, Level A: 2.4.4 Link Purpose (In Context)",
                "Web Content Accessibility Guidelines (WCAG) 2.0, Level AAA: 2.4.9 Link Purpose (Link Only)"
            "tID": 57,
            "xpath": "/html/body/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[2]/div[1]/a[1]"
    "resultSummary": {
        "density": {
            "allDensity": 5,
            "errorDensity": 5,
            "warningDensity": 0
        "issues": {
            "totalErrors": 6,
            "totalIssues": 6,
            "totalWarnings": 0
        "issuesByLevel": {
            "A": {
                "count": 5,
                "pct": 83.33
            "AA": {
                "count": 1,
                "pct": 16.67
            "AAA": {
                "count": 1,
                "pct": 16.67
        "tests": {
            "failing": 6,
            "passing": 50,
            "total": 56
    "sourceHash": "605ce048930a2c07bbac7255b8fe5de8",
    "status": 200,
    "urlHttpCode": 200,
    "clientScriptErrors": []