# Audit statuses and failure reasons

> Every audit status and failure_reason value, what partial means, what happens to unused credits, and what to do in each case.

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

An audit moves from `queued` to `running` to `finalizing` to `done`. It can also end as `failed` (with a `failure_reason`) or `cancelled`. Whatever the outcome, you pay only for pages actually crawled: the rest of the reserved credits returns to your balance within about a minute of the audit ending.

## Statuses

| Status | Meaning | What to do |
|---|---|---|
| `queued` | Waiting for a free crawler. | Nothing. Audits wait their turn; one queued for a long time is still valid while it is in the queue. |
| `running` | Fetching pages. `pages_crawled` goes up as pages are saved. | Nothing, or "Cancel audit". |
| `finalizing` | All pages fetched. Site-wide checks, external links and the report are being built. The app shows "Building report". | Wait. |
| `done` | The report is ready. | Read it: /help/reading-your-report. |
| `failed` | The audit stopped. See `failure_reason` below. | Depends on the reason. |
| `cancelled` | Someone cancelled it. No report is built. | Start a new audit when you want. |

In the app, the audit page shows "Queued", "Crawling", "Building report" and "Done" while it runs, and "This audit failed" or "Audit cancelled" when it stops, with the pages crawled and the failure reason.

Agents: `get_audit_status` (MCP) or `GET /v1/crawls/{id}`:

```json
{
  "crawl_id": 1843,
  "status": "failed",
  "pages_crawled": 1210,
  "max_pages": 2000,
  "credits_reserved": 2000,
  "failure_reason": "reaped: stalled",
  "max_rps": 2,
  "duration_s": 1020
}
```

## failure_reason values

| Value | Meaning | What to do |
|---|---|---|
| `reaped: never started` | The audit was queued but its job was no longer waiting in the queue after 10 minutes, so it could never start. | Start the audit again. |
| `reaped: stalled` | A running or finalizing audit reported no progress for 15 minutes and was stopped. | Start the audit again. If it happens again on the same site, contact hello@seofix.ai with the audit id. |
| `dispatch_failed: could not queue job` | SEOFix could not hand the audit to a crawler when you started it. Nothing was crawled. | Try again in a moment. |
| `setup_failed: <ErrorType>` | The audit could not start on the crawler, after retries for temporary problems. | Check that the site is reachable, then try again. |
| `internal_error` | Something failed on SEOFix's side while auditing. | Try again. If it repeats, contact hello@seofix.ai with the audit id. |
| `null` | No reason recorded. A cancelled audit normally has none. | |

The app words these as: "The crawler stopped reporting progress, so the audit was stopped." (`reaped`), "We couldn't hand the audit to a crawler." (`dispatch_failed`), "The audit couldn't start. Check that the site is reachable, then try again." (`setup_failed`) and "Something went wrong on our side while auditing." (anything else).

A site that is unreachable, or that blocks SEOFix, usually does not fail the audit. The audit finishes as `done` with fetch errors, broken pages or firewall-blocked pages in the report. See /help/blocked-pages for firewalls.

## Partial is not a status

A `done` report can be partial (`partial: true`): it reached its page limit, or a preview hit its 50-page or 60-second cap. The results are valid for the pages crawled. Raise the site's Page limit to cover more (/help/crawl-settings).

## Cancelling

- In the app: "Cancel audit" on the audit page while it is queued or running, then confirm "Cancel audit". "Keep running" closes the dialog.
- Agents: `cancel_audit` (MCP) or `DELETE /v1/crawls/{id}`. Any member of the audit's team can cancel it.

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

```json
{ "status": "cancelled" }
```

An audit that already ended answers `409 conflict` ("Crawl has already reached a terminal state and cannot be cancelled."). The crawler stops within a few seconds; pages saved until then are kept and charged, and no report is built.

## Credits when an audit ends

When an audit starts, SEOFix reserves credits equal to its page limit (`credits_reserved`). About a minute after it ends, whatever the outcome (`done`, `failed` or `cancelled`), it charges:

```
charge = pages crawled − pages answered 304 + ceil(pages answered 304 ÷ 5)
refund = credits_reserved − charge
```

The refund goes back to whoever was charged: the team owner for audits of a team's site, or the person who started an audit of a plain URL. An audit that failed before crawling anything is refunded in full. Previews and the free audit reserve nothing and charge nothing; cancelling the free audit does not give it back.

## Restarts on SEOFix's side

If a crawler restarts while your audit runs, the audit goes back to `queued` and later starts again from the beginning, with its partial results cleared. Nothing extra is charged: only the pages of the final run count.

## Webhooks

An audit started through the API with a `webhook_url` gets a `POST` to that URL when it ends as `done`, `failed` or `cancelled`, with `crawl_id`, `status`, `pages_crawled` and `health_score`, signed in the `X-Audit-Signature` header. See /help/webhooks.

## Related

- /help/how-the-crawler-works
- /help/reading-your-report
- /help/crawl-settings
- /help/plans-and-credits
