The finished report as JSON plus plain text, paged over the per-page results (offset, limit) or, with failedOnly=true, over the failed pages alone; a failed or cancelled job reports the pages it compared

get/jobs/{id}/report

Request

  • Base URL: https://app.difficat.com/api/v1
  • URL: https://app.difficat.com/api/v1/jobs/{id}/report
  • Auth: one of:
    • HTTP bearer
    • HTTP bearer

Path parameters

idstring required

Query parameters

failedOnlyboolean

true restricts results, total, nextOffset and text to pages whose status is fail; summary still covers every page. Read this first.

view'full' | 'digest'

digest returns one small object per page (url, status, failedChecks, issues, diffPercentage) with no diff text, screenshots or text. Combine it with failedOnly=true to read the verdict of a large job in a few kilobytes; an unfiltered digest of 1,000 pages is about 300 KB. Any other value is 400.

offsetinteger

Index of the first page result to return.

limitinteger

Page results to return; values above the maximum are clamped.

Response

OK

jobIdstring required
statusstring required
cancelledboolean
totalinteger

Page results persisted for the job.

nextOffsetinteger

Offset of the slice after this one; absent on the last slice.

textstring

The plain-text report (report.txt) over the slice; absent with view=digest.

errorstring

Present for a failed job, with its partial results.

Example response

{
  "summary": {
    "totalPages": 3,
    "totalDiscovered": 3,
    "passed": 1,
    "failed": 2,
    "duration": 4.4,
    "startedAt": "2026-09-27T13:57:14.470Z",
    "completedAt": "2026-09-27T13:57:18.870Z",
    "byType": {
      "existence": {
        "passed": 2,
        "failed": 1
      },
      "content": {
        "passed": 1,
        "failed": 1
      },
      "visual": {
        "passed": 1,
        "failed": 1
      }
    },
    "issuesBySeverity": {
      "critical": 1,
      "high": 1,
      "medium": 1
    }
  },
  "results": [
    {
      "url": "https://old.difficat.com/pricing.html",
      "targetUrl": "https://new.difficat.com/pricing.html",
      "status": "fail",
      "checks": {
        "existence": {
          "status": "pass",
          "sourceStatus": 200,
          "targetStatus": 200
        },
        "content": {
          "status": "fail",
          "diffs": [
            {
              "field": "bodyText",
              "source": "61 words",
              "target": "62 words (83.6% overlap)",
              "removed": [
                "Basic",
                "monthly"
              ],
              "added": [
                "Pro",
                "per",
                "year"
              ],
              "removedCount": 2,
              "addedCount": 3
            }
          ],
          "bodyOverlap": 0.8364
        },
        "visual": {
          "status": "fail",
          "diffPercentage": 0.0335,
          "regions": [
            {
              "x": 96,
              "y": 412,
              "width": 1248,
              "height": 388,
              "pixels": 21904,
              "share": 0.7071,
              "selector": ".hero-carousel"
            },
            {
              "x": 0,
              "y": 1876,
              "width": 1440,
              "height": 64,
              "pixels": 7826,
              "share": 0.2526
            },
            {
              "x": 1180,
              "y": 22,
              "width": 164,
              "height": 40,
              "pixels": 1248,
              "share": 0.0403
            }
          ],
          "regionCount": 3,
          "stability": {
            "probeDiffPercentage": 0.0261,
            "flakyShare": 0.8
          },
          "noisePixels": 14,
          "screenshots": {
            "source": "pricing-html-5d9d964a-source.png",
            "target": "pricing-html-5d9d964a-target.png",
            "diff": "pricing-html-5d9d964a-diff.png",
            "dimensions": {
              "source": {
                "width": 1440,
                "height": 720
              },
              "target": {
                "width": 1440,
                "height": 720
              }
            }
          }
        }
      },
      "issues": [
        {
          "type": "content-diff",
          "severity": "medium",
          "description": "bodyText mismatch",
          "details": {
            "field": "bodyText",
            "source": "61 words",
            "target": "62 words (83.6% overlap)"
          }
        },
        {
          "type": "visual-diff",
          "severity": "high",
          "description": "Visual difference of 3.35%",
          "details": {
            "diffPercentage": 0.0335
          }
        }
      ],
      "changes": [
        {
          "kind": "text",
          "fingerprint": "text:bodyText:fc21b905",
          "label": "Body text changed",
          "field": "bodyText"
        },
        {
          "kind": "visual",
          "fingerprint": "visual:.hero-carousel",
          "label": ".hero-carousel moves between loads",
          "region": {
            "x": 96,
            "y": 412,
            "width": 1248,
            "height": 388,
            "pixels": 21904,
            "share": 0.7071,
            "selector": ".hero-carousel"
          }
        },
        {
          "kind": "visual",
          "fingerprint": "visual:0,b0,1440,64",
          "label": "Looks different",
          "region": {
            "x": 0,
            "y": 1876,
            "width": 1440,
            "height": 64,
            "pixels": 7826,
            "share": 0.2526
          }
        },
        {
          "kind": "visual",
          "fingerprint": "visual:1184,32,160,32",
          "label": "Looks different",
          "region": {
            "x": 1180,
            "y": 22,
            "width": 164,
            "height": 40,
            "pixels": 1248,
            "share": 0.0403
          }
        }
      ]
    }
  ]
}

Changes

No recorded changes to this operation across all 1 revision of this API.