Get the dead-link report
const url = 'https://api.overwatch.weareheavy.dev/v1/sites/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/report';const options = {method: 'GET', headers: {'x-api-key': '<x-api-key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.overwatch.weareheavy.dev/v1/sites/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/report \ --header 'x-api-key: <x-api-key>'The dead-link report from the site’s most recent crawl run: the run summary plus every broken link found, ordered by target then source URL.
Rows are fanned out one per (target × linking page) for attribution;
the headline counts (broken_count, internal_broken,
external_broken) are distinct broken targets, not occurrences —
one broken footer link counts once, not once per page. The site’s
excludePaths globs are applied retroactively, so a report persisted
before a settings change reflects the current crawl scope.
Responds 404 when the Broken Links app is not enabled for the site.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”The site’s UUID.
Responses
Section titled “ Responses ”The latest run and its broken links.
object
A single crawl run and its summary metrics.
object
Epoch ms the run started.
Epoch ms the run finished, or null while running.
Distinct broken link targets found in the run.
Distinct source pages that had at least one broken link.
Synthesized 0–100 accessibility score, or null when the run didn’t scan.
Confirmed violations with critical impact.
Internal pages the accessibility scan covered in this run.
Distinct confirmed (page, rule) accessibility violations this run (0 for crawl runs).
Violations present in the previous accessibility run but gone in this one (the “fixed” trend).
Synthesized 0-100 SEO score, or null when the run didn’t extract SEO data.
Pages an SEO snapshot was captured for (at most pages_crawled).
Derived SEO issues at the time the run finalized.
Failure reason if state is failed, otherwise null.
crawl for a broken-link crawl, a11y for a standalone accessibility scan.
A single broken link found during a run.
object
The page that contained the link.
The link target that was found to be broken.
broken for a definitive failure status, error for an unreachable target.
HTTP status code of the target, or null if no response.
The redirect chain that led to the failure, if any.
A human-readable reason for the failure.
Epoch ms the broken link was recorded.
Visible text of the linking anchor (best-effort).
Best-effort positional CSS selector to the anchor in the source page.
JSON of the anchor’s id/class/rel/title/aria-label (best-effort).
Example
{ "run": { "id": "1f5a0c9e-3b21-4a77-8c0e-2d4e6f8a1b22", "tenant_id": "7c9e6f0a-1b2c-3d4e-5f60-718293a4b5c6", "site_id": "0a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9", "started_at": 1750000000000, "finished_at": 1750000125000, "state": "completed", "pages_crawled": 482, "links_checked": 1934, "broken_count": 5, "pages_with_broken_count": 4, "internal_broken": 2, "external_broken": 3, "a11y_score": null, "a11y_critical": 0, "a11y_serious": 0, "a11y_moderate": 0, "a11y_minor": 0, "a11y_pages_scanned": 0, "a11y_issue_count": 0, "a11y_resolved": 0, "error": null, "kind": "crawl" }, "brokenLinks": [ { "id": "c0ffee00-dead-beef-cafe-000000000001", "tenant_id": "7c9e6f0a-1b2c-3d4e-5f60-718293a4b5c6", "run_id": "1f5a0c9e-3b21-4a77-8c0e-2d4e6f8a1b22", "source_url": "https://example.com/about", "target_url": "https://example.com/team/old-page", "status": "broken", "status_code": 404, "kind": "internal", "redirect_chain": null, "detail": "Not Found", "created_at": 1750000125000, "link_text": "Meet the team", "link_selector": "main > section:nth-of-type(2) a:nth-of-type(1)", "link_attrs": "{\"class\":\"team-link\"}" } ]}Missing or invalid credentials.
object
A human-readable error message.
Example
{ "error": "invalid api key"}The site was not found, the Broken Links app is not enabled, or the site has no runs yet.
object
A human-readable error message.
Example
{ "error": "no runs yet"}