# Comparing audits

> How SEOFix compares an audit with the site's previous one, how unchanged pages are re-used for 0.2 credit, and how the health trend is built.

Source: https://seofix.ai/help/comparing-audits · Category: Audits & crawling · Updated: 2026-10-08

Every full audit of a site is compared with the site's previous completed audit: the report's "Since the last audit" panel shows the health change, new and fixed errors, and which checks appeared or disappeared. Pages that have not changed since that audit are re-used instead of downloaded again and cost 0.2 credit instead of 1. The site page draws the health score of the last 12 audits as a trend.

## What is compared

An audit is compared with the latest earlier audit of the same site that:

- finished with status `done`,
- is a full audit (rechecks from "Verify fix" and previews never count),
- has not been archived (see /help/data-retention).

If there is no such audit, there is no comparison: `diff` is `null`, and the site page says "The diff appears after the second completed audit of this site".

An audit started with `POST /v1/crawls` and only a `url` is usually not linked to a site, so it is not compared. Use a site (`POST /v1/sites`, then `start_site_audit` or `POST /v1/sites/{id}/crawls`) for repeat audits.

## How "new" and "fixed" are decided

An issue is identified by its check code and URL.

- **New:** the current audit has it, the previous one does not.
- **Fixed:** the previous audit has it, the current one does not.
- Only URLs that **both** audits actually checked are compared. A page counts as checked when it was fetched without a network error, answered below 500 and was not blocked by a firewall. So:
  - pages a larger audit reaches for the first time do not show up as new issues;
  - pages the current audit did not reach, could not fetch, got a 5xx from, or was blocked on do not show up as fixed.
- Site-level issues that are not tied to a crawled page (for example on `robots.txt` or `/llms.txt`) are always compared.

## In the app

The "Since the last audit" panel on the audit and site pages shows:

| Item | Meaning |
|---|---|
| Health | Change in health score, for example `+4` or `-7`. |
| New errors | New issues with severity `error`. |
| Fixed errors | Fixed issues with severity `error`. |
| New issues, Fixed issues | Up to 6 checks each, with how many URLs changed. |
| "Show N example URLs with new issues" | Up to 20 URLs with new issues, errors first. |
| "Compare with audit #N" | Opens the previous audit. |

## Over the API

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

```json
{
  "crawl_id": 1843,
  "diff": {
    "previous_crawl_id": 1790,
    "coverage": { "common_urls": 1912, "prev_urls": 1930, "cur_urls": 1995 },
    "health_delta": -3,
    "new": { "BROKEN_INTERNAL_LINK": 14, "TITLE_TOO_LONG": 2 },
    "fixed": { "META_DESCRIPTION_MISSING": 40 },
    "new_errors": 14,
    "fixed_errors": 0,
    "new_samples": [{ "code": "BROKEN_INTERNAL_LINK", "url": "https://example.com/jobs/old-role" }]
  }
}
```

- `coverage`: URLs the previous audit checked, the current one checked, and both (the compared set).
- `new` and `fixed`: counts per check code.
- `health_delta`: current minus previous health score.

MCP: `get_diff`. To find older audits of a site, use `list_site_audits` (MCP) or `GET /v1/crawls?site_id={id}`.

A CI job can use the same response, for example to fail a pull request when `new_errors` is above 0.

## Incremental crawling (304 Not Modified)

When a site's previous full audit is available, SEOFix sends each page's stored `ETag` and `Last-Modified` values back with its request (`If-None-Match`, `If-Modified-Since`).

- If your server answers `304 Not Modified`, SEOFix re-uses that page's stored data, links and page-level issues instead of downloading it. Site-wide checks (links, duplicates, sitemaps) still run on the combined result.
- A 304 page costs 0.2 credit instead of 1. The 0.2-credit pages are added up and rounded up once per audit: 15 unchanged pages cost 3 credits, 16 cost 4.
- The report's `stats.not_modified` shows how many pages answered 304.
- When SEOFix's checks have changed since the previous audit, every page is fetched in full once, so no page keeps results from older checks.
- This only works if your server sends `ETag` or `Last-Modified` and answers conditional requests. Otherwise every page is fetched and billed normally.

Example: an audit of 2,000 pages where 1,500 answer 304 costs 500 + 300 = 800 credits.

## Health trend

The site page's "Health trend" plots the health score of the site's 12 most recent completed full audits, oldest to newest. Click a point to open that report. The latest score shows next to it, with the change "vs previous".

- Rechecks are never trend points.
- A claimed preview is a point only while the site has no completed full audit.
- With one audit the panel says "One audit so far"; the line appears from the second.

Agents read the same points from `GET /v1/sites/{id}` (`trend`: `crawl_id`, `health_score`, `finished_at`) or MCP `get_site`.

## Related

- /help/reading-your-report
- /help/monitoring-and-alerts
- /help/data-retention
- /help/plans-and-credits
