# AI Search Readiness & llms.txt Checker (GEO Audit, Bulk) (`shephouse/ai-search-readiness-geo-audit`) Actor

GEO / AI visibility audit for ChatGPT & Perplexity readiness: GPTBot/ClaudeBot robots.txt, llms.txt, schema.org FAQ/Organization, NAP, sitemap, HTTPS. 0–100 score + fixes. No LLM APIs. $0.005/site; failures free.

- **URL**: https://apify.com/shephouse/ai-search-readiness-geo-audit.md
- **Developed by:** [Jacob Calmelat](https://apify.com/shephouse) (community)
- **Categories:** SEO tools, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 website auditeds

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

### Try it free

Leave **Websites** empty to run the built-in example, or paste 1–3 public sites. On the free Apify plan the first **25 websites per run** are audited. Unreachable / non-existent hosts are **free**. This is a readiness checklist — it does **not** promise ChatGPT, Perplexity or AI Overview citations.

**Sample scores from our publish QA:** stripe.com **86**, buffer.com **86**, plausible.io **63**, wikipedia.org **55**.

**Sample output (shape):**

```json
{"domain":"example.com","status":"OK","aiReadinessScore":62,"checks":{"aiCrawlers":{"pass":true},"llmsTxt":{"pass":false},"schemaOrg":{"pass":true,"typesFound":["Organization"]}},"fixes":[{"priority":"high","check":"llms_txt","fix":"Add a public /llms.txt file…"}],"billable":true}
```

**For agencies:** audit a whole town's local-business sites, sort by `aiReadinessScore`, work the `fixes` list, and offer the [$9 GEO Fix Checklist](https://buy.polar.sh/polar_cl_uWqmgk9XXkJ6q8T3ogCgaMP1CxB4fGlYYLIRy35UMjN) as a client leave-behind.

**Related free guide:** [Check AI crawlers in robots.txt](https://shephouse-guides.pages.dev/check-ai-crawlers-chatgpt-perplexity-robots-txt/)

### AI Search Readiness (GEO) Audit — ChatGPT & Perplexity Visibility Check

Paste a list of websites. For each one this Actor runs a **Generative Engine Optimization (GEO) / AI visibility** checklist and returns **one row per site** with:

- **AI-readiness score 0–100**
- **Per-check pass/fail** (what passed, what failed, points earned)
- **Prioritized plain-English fixes**
- A short **markdown report** you can paste into a client deck or ticket

**Price: $0.005 per website audited ($5 per 1,000).** Unreachable, non-existent, invalid and non-public hosts are returned with a status code and are **not charged**.

#### What it checks (no LLM APIs, no paid add-ons)

| Check | Why it matters for AI search |
|---|---|
| **robots.txt AI crawlers** | Whether `GPTBot`, `ClaudeBot`, `PerplexityBot`, `Google-Extended` and `CCBot` are allowed |
| **llms.txt** | Presence of a public `/llms.txt` (the emerging AI-facing site summary) |
| **schema.org JSON-LD** | `Organization` / `LocalBusiness`, `FAQPage`, `Product`, `Review` / `AggregateRating` |
| **FAQ / answer-first content** | FAQPage markup, FAQ copy, `<details>` Q\&A, or question-style headings |
| **Title, meta description, H1** | Classic on-page signals answer engines still reuse |
| **NAP on homepage** | Name, address and phone (local / entity clarity) |
| **Sitemap** | Declared in robots.txt or reachable at `/sitemap.xml` |
| **HTTPS** | Final URL is HTTPS |
| **Page speed basics** | HTML response time and document size (not a full Lighthouse run) |

#### Honest caveats

- This is a **readiness / hygiene audit**, not a ranking tool. Passing every check does **not** guarantee citations in ChatGPT, Perplexity, Google AI Overviews, Copilot or any other AI answer surface.
- It does **not** call OpenAI, Anthropic, Google or any LLM API. It only fetches public pages and robots/llms/sitemap files.
- It does **not** render JavaScript. Sites that only inject schema or content client-side may look weaker than they are.
- NAP detection is heuristic (patterns + schema). Fancy designs can hide an address the tool misses.

#### Example output (shape)

```json
{"domain": "example.com", "status": "OK", "aiReadinessScore": 62,
 "checks": {"aiCrawlers": {"pass": true}, "llmsTxt": {"pass": false}, "schemaOrg": {"pass": true, "typesFound": ["Organization"]}},
 "fixes": [{"priority": "high", "check": "llms_txt", "fix": "Add a public /llms.txt file…"}],
 "reportMarkdown": "# AI Search Readiness…", "billable": true}
```

#### Who is it for?

- **SEO / GEO agencies** auditing a client portfolio for ChatGPT & Perplexity readiness
- **In-house marketers** checking whether AI crawlers are blocked before a content push
- **Local businesses** verifying NAP + LocalBusiness schema + FAQ markup
- **Developers** wiring an `llms.txt` checker into CI or a site monitor

#### How to use

1. Paste websites or domains into **Websites or domains** (leave empty to run the built-in example).
2. Run. Export CSV / Excel / JSON, or call via the Apify API / Make / Zapier / n8n / Activepieces.
3. Sort by `aiReadinessScore` and work the `fixes` list top-down (high → low).

#### Status codes (all free except `OK`)

| status | meaning |
|---|---|
| `OK` | site audited (charged $0.005) |
| `SITE_UNREACHABLE` | no usable HTTP(S) response |
| `DOMAIN_NOT_FOUND` | DNS lookup failed |
| `INVALID_HOST` / `BLOCKED_NON_PUBLIC` | bad input or non-public address |

#### FAQ

**Is this an “AI SEO” or “GEO audit” tool?**
Yes — that is the intent. It measures the public signals that commonly show up in GEO / AI-visibility checklists (crawler access, llms.txt, structured data, answer-shaped content, entity/NAP, basics). It does not scrape AI chat answers.

**Does it verify that ChatGPT can see my page today?**
No. Crawler policy and on-page readiness are necessary but not sufficient for citations.

**How is the score calculated?**
Roughly: AI crawler access 25, llms.txt 10, schema.org types 20, FAQ/answer-first 10, title/meta/H1 15, NAP 10, sitemap 5, HTTPS 5, speed basics 5. Details are in each row’s `checks` object.

**How much does it cost?**
$0.005 per successfully audited website, plus Apify’s tiny per-run start fee. Failures are free. Set “Max cost per run” to cap spend. On the free Apify plan, the first 25 websites per run are processed.

**Who built this?**
ShepHouse. ShepHouse is an **AI-operated business**: this Actor was built and is maintained by AI agents, with a human owner. Report issues in the Issues tab and we will fix them.

# Actor input Schema

## `websites` (type: `array`):

Sites to audit for AI search / GEO readiness, e.g. stripe.com or https://www.example.com/. One result row per unique domain. Leave empty to run the built-in example.

## `delaySecs` (type: `number`):

Politeness throttle per website. Minimum 0.2.

## `maxItems` (type: `integer`):

Safety cap on websites processed per run.

## Actor input object example

```json
{
  "websites": [
    "stripe.com",
    "plausible.io",
    "buffer.com"
  ],
  "delaySecs": 0.5,
  "maxItems": 1000
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "websites": [
        "stripe.com",
        "plausible.io",
        "buffer.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("shephouse/ai-search-readiness-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 = { "websites": [
        "stripe.com",
        "plausible.io",
        "buffer.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("shephouse/ai-search-readiness-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 '{
  "websites": [
    "stripe.com",
    "plausible.io",
    "buffer.com"
  ]
}' |
apify call shephouse/ai-search-readiness-geo-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shephouse/ai-search-readiness-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/qcGRCAzo2gL5CU9HO/builds/1O0HOm9e0KL9oYb0R/openapi.json
