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
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.