# SEO Audit Tool — On-Page Analyzer & Broken Link Checker (`igor_nersisian/seo-site-auditor`) Actor

Crawl any website and audit every page for on-page SEO — titles, meta descriptions, headings, broken links, structured data, Open Graph, mobile-readiness, mixed content and more. Every page gets a 0-100 score and a prioritized issue list. Bulk URLs, JSON/CSV export, no monthly SaaS subscription.

- **URL**: https://apify.com/igor\_nersisian/seo-site-auditor.md
- **Developed by:** [Igor Nersisian](https://apify.com/igor_nersisian) (community)
- **Categories:** SEO tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 page audits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEO Audit Tool — On-Page Analyzer, Page Scores & Broken Link Checker

Crawl any website and get a **complete on-page SEO audit of every page**: a **0–100 SEO score**, a prioritized issue list (errors / warnings / notices), **broken link detection**, meta tag analysis, heading structure, structured data, Open Graph, mobile-readiness and basic performance signals — in clean JSON/CSV you can hand to a client or pipe into a dashboard.

Built for **agencies, freelancers, in-house SEO teams and site owners** who want repeatable, schedulable technical audits without a $100+/mo SaaS subscription.

### What it checks on every page

| Category | Checks |
|---|---|
| **Indexing** | HTTP status, noindex flags, canonical URL, redirect chains |
| **Meta tags** | Title presence & length, meta description presence & length, charset, viewport (mobile) |
| **Content** | H1/H2 structure, word count, thin content detection, text-to-HTML ratio, `lang` attribute |
| **Links** | Internal/external counts, **broken links (404/410/5xx/dead hosts)** — each unique link checked once per run |
| **Media** | Images missing alt text |
| **Social** | Open Graph (og:title/description/image), Twitter card |
| **Structured data** | JSON-LD blocks and their schema.org types |
| **Security** | HTTPS usage, mixed content on secure pages |
| **Performance** | Server response time, HTML document size |

Every issue comes with severity and a human-readable message; every page gets a score, and results are sorted **worst pages first** so you know where to start.

### Input example

```json
{
    "startUrls": ["https://your-website.com"],
    "crawlWebsite": true,
    "maxPages": 100,
    "checkBrokenLinks": true
}
```

### Output example (one page)

```json
{
    "url": "https://your-website.com/pricing",
    "score": 76,
    "statusCode": 200,
    "title": "Pricing",
    "titleLength": 7,
    "metaDescription": null,
    "h1Count": 1,
    "brokenLinkCount": 2,
    "brokenLinks": [{ "url": "https://your-website.com/old-page", "status": 404 }],
    "imagesWithoutAlt": 3,
    "wordCount": 420,
    "jsonLdTypes": ["Organization"],
    "issues": [
        { "severity": "error", "code": "missing-meta-description", "message": "Page has no meta description." },
        { "severity": "error", "code": "broken-links", "message": "2 broken links found on this page." },
        { "severity": "warning", "code": "short-title", "message": "Title is only 7 characters (recommended 30–60)." }
    ]
}
```

### Use cases

- **Client audits & reports** — run once, export CSV, deliver a prioritized fix list.
- **Continuous monitoring** — schedule weekly; diff scores over time and alert on regressions via Apify integrations (Slack, email, webhooks).
- **Pre-launch QA** — catch noindex flags, broken links and missing metas before a site goes live.
- **Migration verification** — crawl after a redesign/replatform and compare against the old baseline.

### Scheduling & integrations

Run on a [schedule](https://docs.apify.com/platform/schedules), export **JSON, CSV, Excel**, or connect **Google Sheets, Zapier, Make, Slack, webhooks** and the [Apify API](https://docs.apify.com/api/v2). MCP-compatible for AI agents.

### FAQ

**Does it render JavaScript?**
No — it audits server-rendered HTML, which is also what search engine crawlers parse first. This keeps audits fast and affordable. JS-only content will show as thin content, which is itself a useful SEO signal.

**How is the score calculated?**
Errors cost 12 points, warnings 6, notices 2, from a base of 100. The formula is consistent across runs, so scores are comparable over time.

**Will it crawl the whole site?**
It follows internal links from your start URLs up to `maxPages`. Subdomains are treated as separate sites (not followed).

# Actor input Schema

## `startUrls` (type: `array`):

Pages to audit. With <b>Crawl website</b> enabled, the actor also follows same-domain links from these pages.

## `crawlWebsite` (type: `boolean`):

Follow internal links from the start URLs and audit every discovered page (up to <b>Max pages</b>). Disable to audit only the exact URLs provided.

## `maxPages` (type: `integer`):

Maximum number of pages to audit per run.

## `checkBrokenLinks` (type: `boolean`):

Verify every internal link found on audited pages and report dead links (404/410/5xx) per page. Each unique link is checked only once per run.

## `checkExternalLinks` (type: `boolean`):

Extend the broken-link check to external (outbound) links. Slower on link-heavy sites.

## `proxyConfiguration` (type: `object`):

Proxy for requests. Apify Proxy (automatic) is recommended for reliable crawling.

## Actor input object example

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "crawlWebsite": true,
  "maxPages": 50,
  "checkBrokenLinks": true,
  "checkExternalLinks": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://example.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("igor_nersisian/seo-site-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://example.com"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("igor_nersisian/seo-site-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://example.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call igor_nersisian/seo-site-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=igor_nersisian/seo-site-auditor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wPTDLL2c8290cFKpV/builds/T6kIvMFB2gXN3f7Hy/openapi.json
