Reading your report
What the health score measures, what each number and tab in an audit report means, how issues are grouped by template, and what partial and blocked mean.
An audit report opens at /audits/{id} when the crawl is done. Start with the Top 3 fixes, then work through "What to fix" by template: fixing one template clears the issue on every page built from it. The health score is the share of crawled pages with no error-severity issue.
Health score
health = round(100 × (1 − pages with at least one error ÷ (pages crawled − firewall-blocked pages)))
- Only issues with severity
errorlower the score. Warnings and notices do not. - A page counts once, however many errors it has.
- Pages blocked by a firewall are left out, because SEOFix could not check them.
- With no checkable pages the score is 100.
| Score | Label |
|---|---|
| 80–100 | Healthy |
| 50–79 | Needs work |
| 0–49 | Critical |
Headline numbers
The summary strip under the title shows:
| Label | Meaning |
|---|---|
| Health | The score and its label. |
| Pages | URLs fetched in this audit, with how many answered 2xx ("OK"). |
| Errors, Warnings, Notices | Issue counts by severity. One issue is one check failing on one URL. |
| Blocked | Pages a firewall challenged or blocked ("by a firewall"). |
| Pages/min | Crawl rate over the whole audit. |
| Duration | Time from start to finish. |
| Avg response | Average response time of your pages, with the 95th percentile (p95). |
The report header also has "Copy fix prompt for my agent", a markdown prompt with the top templates, issues, affected URLs and fixes, for Claude Code, Codex or Cursor.
Banners
| Banner | When | What to do |
|---|---|---|
| "A firewall blocked N% of this audit" | More than 20% of pages were blocked by a firewall challenge or skipped because of it. | Allowlist SEOFixBot (see /help/firewall-allowlisting) and run the audit again. |
| "This audit stopped at N pages." | The audit reached its page limit, so it covers part of the site. | Raise the site's Page limit (see /help/crawl-settings). On the free audit, a plan is needed. |
| "Archived — page-level details removed." | An older audit whose page data was archived. Scores and issue counts stay. | See /help/data-retention. |
Top 3 fixes
Issues are grouped into fix tasks, one per check and URL template, ranked by impact: severity × pages affected × the Search Console clicks those pages get (without Search Console: severity × pages affected). The Top 3 leaves out fixed tasks and shows at most one task per check. Only the site's latest full audit shows them. "See all N tasks" opens the full list at /sites/{id}/tasks.
Agents: get_fix_tasks and get_fix_task (MCP), or GET /v1/sites/{id}/tasks. See /help/fix-tasks-and-top-3.
Severities
| Severity | Examples | Counts toward health |
|---|---|---|
| Error | BROKEN_PAGE (4xx page), SERVER_ERROR (5xx), BROKEN_INTERNAL_LINK, TITLE_MISSING, REDIRECT_LOOP |
Yes |
| Warning | TITLE_TOO_LONG, REDIRECT_CHAIN, CANONICAL_TO_REDIRECT, NOINDEX_IN_SITEMAP |
No |
| Notice | TITLE_TOO_SHORT, ORPHAN_PAGE, EXTERNAL_REDIRECT, LLMS_TXT_MISSING |
No |
"What to fix": issues by template
The "What to fix" view has two tabs.
By template (default). Pages are grouped by URL pattern: /jobs/senior-engineer-dubai and /jobs/nurse-abu-dhabi both belong to /jobs/[slug]. Each template card shows its page count, its issues by severity and a fix for each issue.
- Templates are sorted by impact: the number of issues on the template, weighted × 10 for errors, × 3 for warnings and × 1 for notices.
- The report keeps the 50 templates with the most impact, and up to 20 issues per template.
- "Template-wide" marks an issue found on at least 80% of a template's pages (templates with 5 or more pages). Fix it once in the template.
All issues. Every check with its severity and count, filtered by All, Errors, Warnings or Notices.
Click any row to open the issue drawer: what the check means, why it matters, the fix, and the affected URLs.
Google tab
On an audit of a site, the "Google" tab shows what Google itself reports for the site's pages: indexed and not indexed, why, and which pages to fix first. It needs a verified site connected to Google Search Console. Until then the tab shows how to verify.
Since the last audit
From the second completed audit of a site on, "Since the last audit" shows the health change, new and fixed errors, and the checks that appeared or disappeared. See /help/comparing-audits.
Partial reports
A report is marked partial (partial: true) when:
- the audit reached its page limit (
pages_crawledequalsmax_pages), or - a preview stopped at 50 pages or at its 60-second time limit.
Issues found are real, but pages beyond the limit were not checked, and site-wide checks such as orphan pages or duplicates only see the crawled pages.
Firewall-blocked pages
SEOFix marks a page as blocked when the server answers 403, 429 or 503 with the signature of a firewall challenge (Cloudflare, Sucuri, DataDome or Akamai). Blocked pages:
- are not reported as broken pages, and their content is not checked;
- are left out of the health score;
- appear in
blocked.count, withblocked.providers(which firewall) andblocked.by_section(per top-level path, such as/jobs).
If the first 50 pages of a URL section (for example everything under /jobs) are all blocked, SEOFix stops requesting that section and counts the rest as skipped (blocked.skipped). If the first 50 pages of the whole crawl are all blocked, the crawl stops.
Report data over the API
curl https://api.seofix.ai/v1/crawls/1842/report \
-H "Authorization: Bearer $SEOFIX_API_KEY"
{
"crawl_id": 1842,
"health_score": 87,
"partial": false,
"totals": { "pages": 500, "ok": 471, "redirects": 18, "broken": 9, "fetch_errors": 2, "blocked": 0 },
"issue_counts": { "error": 41, "warning": 212, "notice": 96 },
"blocked": { "count": 0, "skipped": 0, "providers": {}, "by_section": {}, "sample_urls": [] },
"coverage_warning": null,
"stats": { "max_rps": 2, "effective_rps": 1.83, "slowdowns": 0, "avg_response_ms": 312, "p95_response_ms": 840 }
}
| What | API | MCP |
|---|---|---|
| Summary | GET /v1/crawls/{id}/report |
get_report |
Issues, filtered by check_code, severity or template |
GET /v1/crawls/{id}/issues |
list_issues |
| Templates | GET /v1/crawls/{id}/templates |
get_templates |
Crawled pages, filtered by status_code |
GET /v1/crawls/{id}/pages |
get_pages |
| Fix prompt | GET /v1/crawls/{id}/fix-prompt |
get_fix_prompt |
| Changes since the previous audit | GET /v1/crawls/{id}/diff |
get_diff |
/report answers 404 report_not_ready until the report exists. /issues and /pages answer 410 crawl_archived for an archived audit.
Related
- /help/your-first-audit
- /help/comparing-audits
- /help/how-the-crawler-works
- /help/blocked-pages
- /help/data-retention
More in Getting started
Still stuck? Email [email protected] with your site and what you expected to see.