# SEO Audit Tool & AI Search Readiness (GEO) – 0-100 Page Scores (`fixandfocus/seo-geo-audit`) Actor

Audit web pages for technical SEO and AI search readiness (ChatGPT, Perplexity, Google AI Overviews): 0-100 SEO and GEO scores per page, issues by priority, a concrete fix for each, as JSON. Respects robots.txt; pay only for audited pages.

- **URL**: https://apify.com/fixandfocus/seo-geo-audit.md
- **Developed by:** [Santiago Alfonso Ramírez](https://apify.com/fixandfocus) (community)
- **Categories:** SEO tools, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 audited pages

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 & AI Search Readiness (GEO)

Audit public web pages for **technical SEO** and **GEO** (Generative Engine Optimization): how ready they are to be understood and cited by AI search engines such as ChatGPT, Claude, Perplexity and Google AI Overviews.

Every page gets two scores from 0 to 100 and a list of issues ordered by severity, each with a concrete fix. No AI guesswork: every check is deterministic, so the same page gives the same result.

### What it checks

**SEO**

- HTTP status and HTTPS
- `<title>` and meta description (presence and length)
- Exactly one `<h1>`
- Canonical URL, `noindex` in meta robots or `X-Robots-Tag`
- `lang` attribute and viewport meta tag
- Images without `alt` text
- Thin content (visible word count)
- Open Graph title and image
- HTML size and server response time
- Sitemap (`/sitemap.xml` or declared in robots.txt)

**GEO (AI search readiness)**

- Structured data: schema.org JSON-LD present and valid, with the types found
- AI crawler rules in `robots.txt` for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended and CCBot
- `/llms.txt` present
- Question-style headings that AI engines can quote
- Publication or update dates (JSON-LD or `article:*` meta)
- Text and data mining reservation (`tdm-reservation`), reported for information

### Output

One item per audited page:

```json
{
  "type": "page",
  "url": "https://example.com/",
  "status": 200,
  "scores": { "seo": 82, "geo": 40 },
  "issues": [
    { "id": "jsonld", "category": "geo", "severity": "high",
      "message": "No structured data (JSON-LD)",
      "fix": "Add schema.org JSON-LD (Organization, Article, Product, FAQPage…) so AI engines understand the page." }
  ],
  "passed": ["status", "https", "title_length", "h1"],
  "data": { "title": "…", "canonical": "…", "structuredDataTypes": [], "aiCrawlersBlocked": ["GPTBot"] },
  "responseMs": 310,
  "htmlKb": 48
}
```

Plus one `site` item per website with its robots.txt AI rules, llms.txt and sitemap.

### Who is it for

- **Agencies and freelancers**: audit a client's key pages in seconds and hand over a prioritized fix list.
- **Site owners**: check whether ChatGPT, Perplexity or Google AI can read and quote your pages (structured data, AI crawler access, llms.txt).
- **AI agents and automations**: call it from the Apify API, the Apify MCP server or with x402 payments, and get clean JSON.

### Input

| Field | Meaning |
|---|---|
| `startUrls` | Pages to audit |
| `maxPages` | Stop after this many audited pages (1-500) |
| `followInternalLinks` | Also audit pages linked from the start pages on the same host |
| `language` | Report language: English or Spanish |
| `delayMs` | Politeness delay between requests to the same site |

### Good behaviour

- Identifies itself as `BeyourspaceSEOAudit/1.0` and **respects robots.txt**: pages it is not allowed to fetch are skipped and not charged.
- Waits between requests to the same site and caps HTML at 3 MB per page.
- Stores no page text and no personal data: only the measurements shown above.
- Blocking AI crawlers is a legitimate choice; the audit reports it so you can decide.

### What it costs

$0.02 per audited page. Auditing 50 pages costs $1.00. Pages skipped because of robots.txt, non-HTML content or download errors are not charged.

### FAQ

**Does it crawl my whole website?** It audits the pages you list and, with *Follow internal links*, the pages they link to on the same site, up to 500 per run.

**Will it change my site?** No. It only reads public pages, like a search engine would, and respects robots.txt.

**Why a GEO score?** AI search engines rely on structured data, crawler access and clear, dated content. The GEO score measures exactly those signals so you can fix them.

***

### En español

Auditoría técnica SEO y GEO (preparación para buscadores con IA) de páginas públicas: puntuaciones de 0 a 100, problemas ordenados por gravedad con su solución, informe en español o inglés. Respeta robots.txt, no guarda textos ni datos personales y solo cobra las páginas auditadas.

# Actor input Schema

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

Public page URLs (https:// or http://). Each page is audited once; you are charged per audited page.

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

Stops after auditing this many pages (1-500).

## `followInternalLinks` (type: `boolean`):

Also audit pages linked from the start pages on the same host, up to the maximum.

## `language` (type: `string`):

Language of issue messages and fixes.

## `delayMs` (type: `integer`):

Politeness delay between requests to the same site (250-10000 ms).

## Actor input object example

```json
{
  "startUrls": [
    "https://apify.com"
  ],
  "maxPages": 5,
  "followInternalLinks": false,
  "language": "en",
  "delayMs": 1000
}
```

# Actor output Schema

## `audit` (type: `string`):

Dataset items: one per audited page (scores, issues with fixes, key data) and one per site (robots.txt AI rules, llms.txt, sitemap).

# 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"
    ],
    "maxPages": 5,
    "followInternalLinks": false,
    "language": "en",
    "delayMs": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("fixandfocus/seo-geo-audit").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"],
    "maxPages": 5,
    "followInternalLinks": False,
    "language": "en",
    "delayMs": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("fixandfocus/seo-geo-audit").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"
  ],
  "maxPages": 5,
  "followInternalLinks": false,
  "language": "en",
  "delayMs": 1000
}' |
apify call fixandfocus/seo-geo-audit --silent --output-dataset

```

## MCP server setup

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

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/EeAoRFqdB0tNyFgBb/builds/c8ql7GyYRNGsDacEl/openapi.json
