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

Source: https://seofix.ai/help/reading-your-report · Category: Getting started · Updated: 2026-10-08

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 `error` lower 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_crawled` equals `max_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`, with `blocked.providers` (which firewall) and `blocked.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

```bash
curl https://api.seofix.ai/v1/crawls/1842/report \
  -H "Authorization: Bearer $SEOFIX_API_KEY"
```

```json
{
  "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
