# SEO, GEO & AEO Website Audit Crawler with 0-100 Scores (`abi4/seo-geo-aeo-audit-tool`) Actor

Comprehensive multi-page website audit crawler analyzing Traditional Technical SEO, Generative Engine Optimization (GEO), Answer Engine Optimization (AEO), and AI Search Readiness (llms.txt).

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

## Pricing

from $3.50 / 1,000 audited page (seo/geo/aeo)s

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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, GEO & AEO Website Audit Tool

> **Comprehensive multi-page website audit crawler with deterministic 0-100 scores, 11 category breakdowns, prioritized remediation hints, and an interactive client-ready HTML dashboard (`REPORT.html`).**

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue.svg)](https://apify.com)
[![Python 3.12](https://img.shields.io/badge/Python-3.12-green.svg)](https://python.org)
[![Crawlee](https://img.shields.io/badge/Crawlee-BeautifulSoup-orange.svg)](https://crawlee.dev/python)

***

### 🚀 Overview

Between 2024 and 2026, search shifted from keyword matching to AI synthesis. While traditional Google SEO remains vital for discovery, users increasingly obtain answers from generative AI platforms: **ChatGPT Search, Perplexity AI, Claude Search, and Google AI Overviews**.

Most legacy SEO audit tools (which often charge premium pay-per-event rates of up to **$40.00 per 1,000 pages**) evaluate only traditional Googlebot criteria. They completely ignore modern AI discovery signals: `/llms.txt` machine access, structured Q\&A schemas, empirical citation density, and `robots.txt` AI search permissions.

The **SEO, GEO & AEO Website Audit Tool** bridges this gap:

- **Traditional Technical SEO (70% Weight)**: Evaluates 9 core categories: Metadata, Headings, Content Depth, Technical Indexability, Schema.org Markup, Performance Proxies, Link Quality, Image Optimization, and WCAG Accessibility.
- **AI Search Visibility / GEO / AEO (30% Weight)**: Probes `/llms.txt`, `/llms-full.txt`, `robots.txt` AI permissions (`OAI-SearchBot`, `PerplexityBot`), question headings, BLUF definitions, and empirical citation density.
- **100x Cost Advantage**: Runs on lightweight asynchronous HTTP workers (Crawlee for Python) instead of heavy 4GB-8GB headless Chromium browsers.

***

### 📊 Scoring Architecture

The 0-100 scoring system is **100% deterministic, mathematically bounded, and lose-points-only**:

$$\text{TotalAuditScore} = \text{round}(0.70 \times \text{SEO}*{\text{Score}} + 0.30 \times \text{AI}*{\text{Score}})$$

#### Rating Bands

- **Excellent**: 80 - 100 (Optimal crawlability and high generative citation probability)
- **Good**: 60 - 79 (Minor non-critical warnings)
- **Needs work**: 40 - 59 (Noticeable gaps in content, structure, or AI machine access)
- **Poor**: 0 - 39 (Severe technical or indexing defects)

***

### ⚙️ Input Parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array of Objects | `[{"url": "https://apify.com"}]` | One or more seed URLs to begin auditing. |
| `crawlPages` | Boolean | `true` | Recursively follow internal links up to `maxPages`. |
| `maxPages` | Integer | `10` | Maximum number of pages to crawl (1-1000). |
| `maxConcurrency` | Integer | `5` | Parallel page audit workers (1-20). |
| `respectRobotsTxt` | Boolean | `true` | Adhere to rules in the site `robots.txt`. |
| `includeSubdomains` | Boolean | `false` | Follow links across subdomains. |
| `excludeUrlPatterns` | Array of Strings | `[]` | Regex patterns to skip (e.g. `/\\.(pdf\|zip)$/`). |
| `proxyConfiguration` | Object | `{ "useApifyProxy": false }` | Apify Proxy configuration. |
| `auditMetaTags` | Boolean | `true` | Title, description, Open Graph, Twitter cards, SERP pixel widths. |
| `auditHeadings` | Boolean | `true` | H1-H6 hierarchy, single H1 check, skipped levels, H1-Title consistency. |
| `auditContent` | Boolean | `true` | Word count, paragraph counts, Flesch Reading Ease score. |
| `auditTechnical` | Boolean | `true` | Canonicals, viewport, robots directives, charset, HTTPS. |
| `auditPerformance` | Boolean | `true` | HTML payload weight, script count, stylesheet overhead. |
| `auditSchema` | Boolean | `true` | JSON-LD structured data, @graph expansion, rich entity validation. |
| `auditLinks` | Boolean | `true` | Internal/external counts, empty anchors, generic anchor text. |
| `auditImages` | Boolean | `true` | Image alt attribute coverage and presence. |
| `auditAccessibility`| Boolean | `true` | Form labels, button text, HTML lang, semantic landmarks. |
| `auditAiReadability`| Boolean | `true` | Probes `/llms.txt`, markdown alternates, text-to-HTML ratio. |
| `auditAnswerReadiness`| Boolean | `true` | Question headings, BLUF definitions, FAQ/HowTo schema. |
| `auditAiBotAccess` | Boolean | `true` | Inspects `robots.txt` for AI search crawlers. |

***

### 📦 Outputs

#### 1. Default Dataset

Emits two types of records:

- **`page` records**: Detailed per-page audit result containing all sub-scores, extracted indicators, and prioritized issues.
- **`site-summary` record**: Overall roll-up containing average scores, rating band, category averages, page distribution, and top 15 site-wide issues.

#### 2. Key-Value Store Artifacts

- **`OUTPUT`**: Instant machine-readable JSON site summary for API integrations and CI/CD webhooks.
- **`REPORT.html`**: Standalone, interactive client-ready dashboard with SVG score dials, animated progress bars, and filterable issue tables.

***

### ⚡ How to Use in 3 Simple Steps

1. **Enter Target URL**: Paste your website or landing page into `startUrls` (e.g., `https://example.com`).
2. **Choose Scope & Concurrency**: Set `maxPages` (e.g., `10` for a fast audit, up to `1000` for an enterprise site) and adjust audit category switches if desired.
3. **Run & View Report**: Click **Start**. Review your composite 0–100 score in the console, or open the **Key-Value Store** tab to preview or download your self-contained, interactive `REPORT.html` dashboard.

***

### 📈 Client-Ready Executive Reporting & Webhooks

- **Interactive Visual Dashboard (`REPORT.html`)**: Opens directly in any browser with interactive score donuts, category breakdown bars, and a filterable table of issues complete with fix hints. Perfect for client audits and agency deliverables.
- **Automated CI/CD Quality Gates**: Call this Actor from GitHub Actions or GitLab CI. Check the `OUTPUT` JSON summary and fail builds or pull requests if the site's `totalScore` drops below your target threshold (e.g. 80/100).
- **Slack & Email Notifications**: Connect the Actor run webhooks to Slack or Zapier to receive automated alerts whenever a site's health score drops.

***

### ❓ FAQ & Support

#### How is the 0–100 score calculated?

Scores are mathematically bounded and lose-points-only based on audit findings: 70% is weighted toward Traditional Technical SEO (metadata, headings, canonicals, schema, image alts) and 30% toward AI Search & GEO Visibility (citation density, Q\&A formatting, `/llms.txt`, and AI search crawler access).

#### Can I share the HTML report with clients?

Yes! The `REPORT.html` file generated in the Key-Value Store is completely self-contained with embedded styling. You can download and send it directly to clients or host it anywhere.

#### Need custom features or have feedback?

Submit an inquiry via the **Issues** tab in the Apify Console. We respond promptly and continually update our scoring rules.

# Actor input Schema

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

One or more website URLs to audit. Accepts website homepages or specific landing pages.

## `crawlPages` (type: `boolean`):

Whether to recursively discover and audit internal links starting from the seed URLs.

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

Maximum number of pages to crawl and audit (1-1000). Direct cost and time control lever.

## `maxConcurrency` (type: `integer`):

Maximum parallel request workers (1-20).

## `respectRobotsTxt` (type: `boolean`):

Whether to respect crawler exclusion rules in the target domain's robots.txt file.

## `includeSubdomains` (type: `boolean`):

Whether to crawl across subdomains of the primary seed domain.

## `excludeUrlPatterns` (type: `array`):

List of regex patterns (e.g. /.(pdf|zip)$/) or substrings to skip during crawl.

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

Optional Apify Proxy configuration to bypass anti-scraping and rate-limiting defenses.

## `auditMetaTags` (type: `boolean`):

Analyze Title, Description, Open Graph, Twitter Cards, canonical tags, and SERP pixel widths.

## `auditHeadings` (type: `boolean`):

Verify H1-H6 hierarchy, single H1 tag, skipped heading levels, and H1-Title topic consistency.

## `auditContent` (type: `boolean`):

Evaluate word count, paragraph counts, sentence length, and Flesch Reading Ease readability index.

## `auditTechnical` (type: `boolean`):

Check canonicals, viewport, robots directives, charset, and SSL certificates.

## `auditPerformance` (type: `boolean`):

Measure HTML payload size, script counts, and stylesheet overhead.

## `auditSchema` (type: `boolean`):

Extract and validate JSON-LD structured data, @graph entities, and high-impact search schemas.

## `auditLinks` (type: `boolean`):

Analyze internal/external links, empty anchors, and generic anchor text ('click here').

## `auditImages` (type: `boolean`):

Verify image alt tags and image presence across all crawled pages.

## `auditAccessibility` (type: `boolean`):

Audit form input labels, button text, HTML lang attributes, and semantic landmarks.

## `auditAiReadability` (type: `boolean`):

Inspect /llms.txt, /llms-full.txt, text-to-HTML ratio, markdown alternate links, and semantic containers.

## `auditAnswerReadiness` (type: `boolean`):

Evaluate question headings, BLUF answer definitions, step lists, and FAQ/HowTo schema.

## `auditAiBotAccess` (type: `boolean`):

Inspect robots.txt directives for AI search crawlers (OAI-SearchBot, PerplexityBot, ClaudeBot, GPTBot).

## `generatePdfReport` (type: `boolean`):

Synthesize a client-ready executive PDF report (REPORT.pdf) and save to Key-Value Store.

## `exportRemediationChecklist` (type: `boolean`):

Generate role-categorized task checklists (Developer, Content, SEO) in CSV, Markdown, and JSON formats.

## `auditCoreWebVitals` (type: `boolean`):

Benchmark LCP, CLS, INP, and TTFB via Google PageSpeed Insights API with synthetic fallbacks.

## `googlePsiApiKey` (type: `string`):

Optional Google PageSpeed Insights API key for high-volume performance audits.

## `webhookUrl` (type: `string`):

Optional Slack, Discord, or Zapier webhook endpoint for instant audit completion and degradation alerts.

## `minScoreAlertThreshold` (type: `integer`):

Trigger webhook alerts if the overall site audit score is below this threshold (0-100).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "crawlPages": true,
  "maxPages": 10,
  "maxConcurrency": 5,
  "respectRobotsTxt": true,
  "includeSubdomains": false,
  "excludeUrlPatterns": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "auditMetaTags": true,
  "auditHeadings": true,
  "auditContent": true,
  "auditTechnical": true,
  "auditPerformance": true,
  "auditSchema": true,
  "auditLinks": true,
  "auditImages": true,
  "auditAccessibility": true,
  "auditAiReadability": true,
  "auditAnswerReadiness": true,
  "auditAiBotAccess": true,
  "generatePdfReport": false,
  "exportRemediationChecklist": true,
  "auditCoreWebVitals": false,
  "googlePsiApiKey": "",
  "webhookUrl": "",
  "minScoreAlertThreshold": 60
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `report` (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": [
        {
            "url": "https://apify.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("abi4/seo-geo-aeo-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": [{ "url": "https://apify.com" }] }

# Run the Actor and wait for it to finish
run = client.actor("abi4/seo-geo-aeo-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": [
    {
      "url": "https://apify.com"
    }
  ]
}' |
apify call abi4/seo-geo-aeo-audit-tool --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abi4/seo-geo-aeo-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/j3xxOQLIalkYBMhmP/builds/okd3JOvIGCcdmould/openapi.json
