Get the SEO report
const url = 'https://api.overwatch.weareheavy.dev/v1/sites/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/seo-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/seo-report \ --header 'x-api-key: <x-api-key>'The on-page SEO report, derived live from the latest crawl that extracted SEO data: issues grouped by rule (ranked by severity, then by recoverable score points), a worst-first per-page view, and a summary with the 0-100 score and an indexability verdict.
Issues are derived at read time from per-page field snapshots, so
changes to the site’s excludePaths globs apply retroactively -
duplicate detection recomputes from the filtered page set. The score
frozen on the run row feeds the trend; the report’s live score can
differ briefly after a settings change.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”The site’s UUID.
Responses
Section titled “ Responses ”The latest SEO-extracting run, its issues, and summary.
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.
Issues grouped per rule, most severe and most impactful first.
object
Stable rule id (e.g. title-missing, meta-noindex).
One-paragraph editor-facing remediation guidance.
Pages affected by this rule.
Score points recoverable by fixing this rule site-wide.
Affected pages (capped), each with an optional detail string and the offending value itself (the title/description/canonical/robots text).
object
Every page with at least one issue, ranked worst-first.
object
The page’s own 0-100 score.
The page’s findings, with the offending content where applicable.
object
object
object
false iff something actively blocks search
visibility - a noindex on a sitemap/root page,
or a canonical crediting another site.
JSON-LD posture (informational): coverage, the site’s type inventory, and pages carrying none. Broken or rich-results-ineligible blocks surface as issues.
object
The site’s JSON-LD type inventory, most-used first.
object
Pages with no structured data at all (capped).
Example
{ "run": { "state": "running", "kind": "crawl" }, "byRule": [ { "severity": "critical" } ], "byPage": [ { "findings": [ { "severity": "critical" } ] } ], "summary": { "verdict": { "risk": "high" } }}Missing or invalid credentials.
object
A human-readable error message.
Example
{ "error": "invalid api key"}The site was not found, the SEO app is not enabled, or no completed crawl has extracted SEO data yet.
object
A human-readable error message.
Example
{ "error": "no runs yet"}