# SEO Audit Tool — On-Page SEO Checker, Score & Broken Links (`intelscrape/seo-audit-tool`) Actor

SEO Audit Tool: audit any website page by page for titles, meta descriptions, H1s, canonicals, noindex, alt text, thin content, structured data, Open Graph, speed, robots.txt, sitemap and broken links, with a 0-100 score and a prioritized issue list. Bulk sites. No API key.

- **URL**: https://apify.com/intelscrape/seo-audit-tool.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEO Audit Tool — On-Page SEO Checker, Score & Broken Links

![SEO Audit Tool — On-Page SEO Checker, Score & Broken Links](https://api.apify.com/v2/key-value-stores/hRabN9WfDGrT4nSvV/records/seo-audit-tool-banner.png)

🇨🇳 **SEO 审计工具**：逐页审计任意网站的标题、Meta 描述、H1、Canonical、noindex、图片 Alt、内容稀薄、结构化数据、Open Graph、响应速度、robots.txt、站点地图和死链，给出 0-100 分及按优先级排序的问题清单。支持批量网站，无需 API 密钥。

🇸🇬 **Alat Audit SEO**: audit setiap halaman laman web untuk tajuk, meta, H1, canonical, noindex, teks alt, data berstruktur, Open Graph, kelajuan, robots.txt, sitemap dan pautan rosak, dengan skor 0-100. Tiada kunci API.

#### 🤖 NEW: Connect This To Your AI!

Use this actor from Claude, ChatGPT, Cursor or any MCP client through the **[IntelScrape MCP Server](https://apify.com/intelscrape/skip--trace)**, or call it directly over the Apify API.

#### 🏆 Featured Bots by IntelScrape

- [Skip Trace Pro](https://apify.com/intelscrape/skip-trace-pro)
- [TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)
- [TikTok Email Scraper](https://apify.com/intelscrape/tiktok-scraper)
- [Amazon Product Reviews Scraper](https://apify.com/intelscrape/amazon-product-review-scraper)
- [Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper)
- [Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)

⚡ Works with n8n, Make, Zapier, Google Sheets and the Apify API.

![price](https://img.shields.io/badge/price-%244%20per%201K%20pages-blue) ![billing](https://img.shields.io/badge/billing-pay%20per%20page-green) ![checks](https://img.shields.io/badge/checks-20%2B-brightgreen) ![API key](https://img.shields.io/badge/API%20key-not%20required-orange)

**Scheduled, bulk on-page SEO audits with a 0-100 score, prioritized issues and broken-link detection, as structured data.**

> **Honest coverage & billing:** No JavaScript rendering. You pay only for results actually delivered, and a built-in cost guard stops the run at your max-charge limit.

🌍 Built for teams in the **US, China and Singapore**, and anyone who needs this data in a spreadsheet or pipeline.

⭐ Found it useful? Please leave a review; it helps others find it.

⚖️ **Lawful business use only.** Collect public data only, and comply with the source site's terms, copyright and data-protection laws (GDPR, CCPA, China PIPL, Singapore PDPA).

*Examples below are illustrative; names and values may be fictional or out of date.*

### What is SEO Audit Tool?

Most SEO problems that cost rankings are simple and fixable: a missing meta description, a duplicate H1, a stray noindex, images without alt text, a sitemap nobody created, links that now 404. Desktop crawlers and SaaS suites find them, but they cost a monthly subscription and do not scale to hundreds of client sites. **SEO Audit Tool** crawls each site, runs more than 20 on-page checks per page, tests every link, and returns a scored, prioritized issue list as clean data you can schedule, export or feed to a dashboard.

### What does it do?

- **Crawl** each site from the start URL through internal links, up to your page limit
- **Meta checks**: title and meta description presence and length, H1 count, H2/H3 counts, canonical (missing, invalid or pointing elsewhere), meta robots and X-Robots-Tag noindex
- **Content**: visible word count (thin content), images without alt text, html lang, viewport
- **Social and schema**: Open Graph title and image, Twitter card, JSON-LD types and invalid JSON-LD
- **Technical**: status code, HTTPS, redirect chain, response time, HTML size, hreflang
- **Site level**: robots.txt, blocks-all rules, sitemap from robots.txt or /sitemap.xml
- **Broken links (on by default)**: tests up to 40 links per page and lists 4xx/5xx with anchor text
- **Score 0-100** and an issue list with error, warning and notice severities

### Why choose us over cheaper scrapers?

- **Honest output**: limits are documented, missing data is labeled, never invented
- **Clean, consistent schema** ready for Excel, Sheets, BI tools or an LLM
- **No account risk**: no logins, no cookies, no API keys
- **Pay per result** with a built-in cost guard; no subscription, failed items are never charged
- **Fast and light**: no residential proxy, so runs finish in seconds and stay cheap
- **Maintained by IntelScrape** and fixed fast when the source changes

### Who is it for?

- **Agencies**: audit every client site weekly and send the worst pages first
- **Prospecting**: audit a list of local business sites and pitch fixes
- **In-house SEO**: catch regressions after deployments
- **Content teams**: find thin pages and missing descriptions
- **Website migrations**: verify canonicals, redirects and noindex after launch
- **Link hygiene**: find 404s before Google does

### How to use it

#### In Apify Console (no code)

1. Click **Try for free** / **Start**. The form is prefilled with a working example.
2. Change the inputs (see examples below).
3. Click **Start**, then export the results as **JSON, CSV, Excel, XML or HTML**, or open them in Google Sheets.
4. Optional: **Schedule** the actor to run hourly, daily or weekly.

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/intelscrape~seo-audit-tool/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": ["https://apify.com"], "maxPagesPerSite": 5, "checkBrokenLinks": true}'
```

Or use the official [Apify JavaScript](https://docs.apify.com/api/client/js/) and [Python](https://docs.apify.com/api/client/python/) clients:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("intelscrape/seo-audit-tool").call(run_input={"startUrls": ["https://apify.com"], "maxPagesPerSite": 5, "checkBrokenLinks": true})
for item in client.dataset(run["default_dataset_id"]).iterate_items():
    print(item)
```

#### With AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) or the [IntelScrape MCP Server](https://apify.com/intelscrape/skip--trace) to Claude Desktop, Cursor, ChatGPT or any MCP client, then ask in plain language, e.g. *"Run intelscrape/seo-audit-tool with the default input and summarise the results."*

### Input examples

**Five pages of one site with link check (default)**

```json
{
  "startUrls": ["https://apify.com"],
  "maxPagesPerSite": 5,
  "checkBrokenLinks": true
}
```

**Homepage only for 200 prospects**

```json
{
  "startUrls": ["bakery-one.com", "plumber-two.com"],
  "maxPagesPerSite": 1,
  "checkBrokenLinks": false
}
```

### Output fields

| Field | Description |
|---|---|
| `url / finalUrl / statusCode / redirects / https` | Fetch result |
| `score / errors / warnings / notices / issues[]` | Score and prioritized issues (severity, code, message) |
| `title / titleLength / metaDescription / metaDescriptionLength` | Meta |
| `h1[] / h2Count / h3Count` | Headings |
| `canonical / robotsMeta / xRobotsTag / lang / viewport / hreflang` | Indexing signals |
| `wordCount / imageCount / imagesMissingAlt` | Content |
| `internalLinks / externalLinks / nofollowLinks` | Links |
| `structuredDataTypes / openGraph / twitterCard` | Schema and social |
| `responseTimeMs / htmlBytes` | Performance |
| `hasRobotsTxt / robotsBlocksAll / hasSitemap / sitemapUrls` | Site-level checks |
| `linksChecked / brokenLinks[]` | Broken link results (when enabled) |

#### Sample output

```json
{
  "finalUrl": "https://apify.com/",
  "statusCode": 200,
  "score": 100,
  "errors": 0,
  "warnings": 0,
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "titleLength": 47,
  "h1": [
    "94,514 tools for your AI"
  ],
  "wordCount": 1176,
  "structuredDataTypes": [
    "Organization",
    "WebSite",
    "SoftwareApplication"
  ],
  "hasSitemap": true,
  "linksChecked": 40,
  "brokenLinks": []
}
```

### Pricing (pay per event)

| Event | When it is charged | Price |
|---|---|---|
| **Actor start** | once per run | $0.005 |
| **Page audit** | per page audited | $0.004 |
| **Broken link check** | per page whose links are tested (on by default; turn off to skip) | $0.003 |

#### Cost examples

| Run | Cost |
|---|---|
| Default run: 5 pages with link check | $0.04 |
| 100 client homepages, no link check | $0.405 |
| Weekly 200-page crawl with link check | $1.405 |

Platform usage is included in these prices. Set **Max charge per run** in the run options to cap spend; the actor stops cleanly when the limit is reached and keeps everything collected so far.

### Tips for best results

- Set maxPagesPerSite to 1 for a fast homepage audit of a prospect list.
- Sort by score ascending to fix the worst pages first.
- 401, 403 and 429 link results are listed but not counted as broken (often bot protection).
- Schedule weekly and compare scores to catch regressions.

### FAQ

#### Does it render JavaScript?

No, it audits the HTML the server returns, which is what most crawlers index first. Fully client-rendered sites will show thin content.

#### How is the score calculated?

100 minus 12 per error, 5 per warning and 2 per notice, plus a broken-link penalty. It is a prioritization aid, not a Google metric.

#### Does it check Core Web Vitals?

It measures server response time and HTML weight; lab Core Web Vitals need a browser and are not included.

#### Will it crawl my whole site?

Up to maxPagesPerSite pages (max 500) following internal links breadth-first.

#### Is a failed page charged?

No. Pages that return errors are listed and not charged.

#### Do I need a key?

No.

### Honest limits

- No JavaScript rendering.
- Some sites block automated requests; enable the proxy if pages fail.
- Link checks use HEAD then GET and may flag links behind bot protection.
- Keyword rankings and backlinks are out of scope.

### Related IntelScrape bots

- [Tech Stack Detector](https://apify.com/intelscrape/tech-stack-detector): CMS, analytics & frameworks per domain
- [Open Graph Scraper](https://apify.com/intelscrape/open-graph-scraper): link previews & meta tags
- [Subdomain Finder](https://apify.com/intelscrape/subdomain-finder): subdomains from certificate logs
- [Keyword Search Volume](https://apify.com/intelscrape/keyword-search-volume): estimated monthly Google searches & trends
- [Google Autocomplete Scraper](https://apify.com/intelscrape/google-autocomplete-scraper): keyword suggestions from Google, YouTube, Amazon & Bing
- [Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace): IntelScrape tools for AI agents

### Legal

This actor collects publicly available data only. You are responsible for using the results lawfully and in line with the source's terms and applicable privacy laws (GDPR, CCPA, PIPL, PDPA). Process personal data only with a legitimate purpose. IntelScrape is not affiliated with, endorsed by or sponsored by the data source; all trademarks belong to their owners.

# Actor input Schema

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

One URL or domain per line. The crawler starts there and follows internal links.

## `maxPagesPerSite` (type: `integer`):

1 = audit only the URL you gave.

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

Test the links on every audited page for 4xx/5xx errors. Charged per page checked.

## `maxLinksToCheck` (type: `integer`):

Unique links tested per page.

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

Not needed normally. The actor switches to Apify Proxy automatically if the source starts rate-limiting.

## Actor input object example

```json
{
  "startUrls": [
    "https://apify.com"
  ],
  "maxPagesPerSite": 5,
  "checkBrokenLinks": true,
  "maxLinksToCheck": 40,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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://apify.com"
    ],
    "checkBrokenLinks": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/seo-audit-tool").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://apify.com"],
    "checkBrokenLinks": True,
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/seo-audit-tool").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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://apify.com"
  ],
  "checkBrokenLinks": true
}' |
apify call intelscrape/seo-audit-tool --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/seo-audit-tool"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Qo5AKdZtBW0lzPDlg/builds/0WQbdv2hB4f5tMJ37/openapi.json
