# AI Search (GEO), llms.txt Generator & Schema.org Auditor (`ausbizstack/ai-geo-llms-txt-auditor`) Actor

Audits websites for 2026 AI Search (GEO) readiness (/llms.txt, /llms-full.txt, 9 AI crawler rules & Schema.org JSON-LD) and auto-generates ready-to-deploy /llms.txt, /llms-full.txt, JSON-LD markup, and client pitch playbooks.

- **URL**: https://apify.com/ausbizstack/ai-geo-llms-txt-auditor.md
- **Developed by:** [AusBizStack Intelligence](https://apify.com/ausbizstack) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 ai search geo domain 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/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

## AusBizStack AI Search (GEO), `llms.txt` Generator & Schema Auditor (`ausbizstack/ai-geo-llms-txt-auditor`)

Audit any list of **US, UK, EU, Canadian, or Australian websites** for **2026 AI Search / Generative Engine Optimization (GEO)** readiness—and **automatically generate ready-to-deploy `/llms.txt`, `/llms-full.txt`, and `<script type="application/ld+json">` (`Organization` + `WebSite` + `FAQPage`) deliverables** for every domain in one run.

Built by **AusBizStack** as the companion deliverable engine to **`ausbizstack/b2b-lead-abn-tech-enricher`** for SEO/GEO agencies, Clay / n8n / Make.com workflows, and MCP AI Agents (`mcp.apify.com`).

***

### What This Actor Does in One Run

1. **Audits `/robots.txt` Across 9 Major AI Crawlers:**
   - Inspects explicit and wildcard rules for `GPTBot`, `OAI-SearchBot`, `ChatGPT-User`, `ClaudeBot`, `Claude-Web`, `PerplexityBot`, `Google-Extended`, `CCBot`, and `Applebot-Extended`.
   - Identifies whether a prospect is accidentally blocking ChatGPT Search, Claude, or Perplexity from citing their business.
2. **Verifies Live `/llms.txt`, `/llms-full.txt` & `/sitemap.xml`:**
   - Checks HTTP 200 status, validates Markdown structure (filtering out soft-404 HTML pages), and counts sections and curated links.
3. **Extracts Homepage & Subpage Metadata + Existing Schema.org JSON-LD:**
   - Extracts `<title>`, meta descriptions, canonical URLs, H1/H2 hierarchy, top internal navigation/documentation links, social profiles, **strictly role-based corporate emails (`info@`, `sales@`, `support@`, `bookings@` — zero personal emails)**, phone numbers, and Australian 11-digit ABNs (validated via the ATO modulo-89 checksum).
   - Inspects existing `application/ld+json` blocks for `Organization`, `LocalBusiness`, `WebSite`, `FAQPage`, `Product`, and `Service`.
4. **Scores Every Domain (`aiGeoReadinessScore` & `agencyPitchScore`):**
   - Computes a **0–100 `aiGeoReadinessScore`**, a **0–100 `agencyPitchScore`**, and a structured `identifiedGaps` checklist.
5. **Auto-Generates Ready-to-Deploy Client Deliverables:**
   - `generatedLlmsTxt`: Complete, spec-compliant `/llms.txt` Markdown file tailored to the business.
   - `generatedLlmsFullTxt`: Expanded `/llms-full.txt` reference corpus for LLM RAG ingestion.
   - `generatedJsonLdSchema`: Copy-paste `<script type="application/ld+json">` containing valid `Organization` + `WebSite` + `FAQPage` Schema.org markup.
   - `agencyDeliverableSummary`: Client-ready executive audit summary and pitch angle so agencies can close **$500–$1,500 AI Search Optimization Packages** in seconds.

***

### Input Example

```json
{
  "targets": [
    "https://www.canva.com",
    "https://stripe.com",
    "https://www.xero.com",
    "https://dishoom.com"
  ],
  "crawlInternalPages": true,
  "maxInternalPages": 2,
  "generateLlmsTxt": true,
  "generateLlmsFullTxt": true,
  "generateJsonLdSchema": true,
  "concurrency": 4,
  "requestTimeoutSecs": 12
}
```

***

### Output Example (Abbreviated)

```json
{
  "inputTarget": "https://dishoom.com",
  "domain": "dishoom.com",
  "websiteUrl": "https://www.dishoom.com/",
  "companyName": "Dishoom",
  "countryDetected": "UK",
  "status": "ok",
  "pagesInspected": 3,
  "aiGeoReadinessScore": 55,
  "agencyPitchScore": 90,
  "hasLlmsTxt": false,
  "hasLlmsFullTxt": false,
  "hasRobotsTxt": true,
  "hasSitemapXml": true,
  "allowedAiCrawlers": [
    "GPTBot",
    "OAI-SearchBot",
    "ChatGPT-User",
    "ClaudeBot",
    "Claude-Web",
    "PerplexityBot",
    "Google-Extended",
    "CCBot",
    "Applebot-Extended"
  ],
  "blockedAiCrawlers": [],
  "existingJsonLdTypes": ["Organization", "WebSite"],
  "identifiedGaps": [
    "Missing /llms.txt Markdown index — AI agents (ChatGPT, Claude, Perplexity) must scrape noisy DOM HTML.",
    "Missing /llms-full.txt expanded RAG documentation corpus.",
    "Missing FAQPage Schema.org JSON-LD markup for direct Q&A citation in AI Overviews."
  ],
  "roleEmails": ["hello@dishoom.com", "press@dishoom.com", "reservations@dishoom.com"],
  "phones": ["+44 20 7420 9320"],
  "agencyDeliverableSummary": "AI Search (GEO) Readiness Audit for Dishoom (dishoom.com): Current Score 55/100 (Projected 92/100 after deploying attached deliverables)...",
  "generatedLlmsTxt": "# Dishoom\n\n> Dishoom pays homage to the Irani cafés of Bombay...",
  "generatedLlmsFullTxt": "# Dishoom\n\n> ...\n\n## Extended RAG Knowledge Base & Entity Profile (/llms-full.txt)...",
  "generatedJsonLdSchema": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@graph\": [...]\n}\n</script>"
}
```

### API authentication

Pass your token as a header, never in the URL:

```bash
curl -X POST "https://api.apify.com/v2/acts/ausbizstack~ai-geo-llms-txt-auditor/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" -d '{...}'
```

### ✅ Zero Charge for Failed Domains

You are charged only when real intelligence data is returned. Failed, timed-out or unreachable targets still appear in the dataset with `status` and an error reason, but cost **$0**.

### Acceptable Use & Spam Act 2003 (Cth) Compliance

This Actor returns publicly available business information only. You are responsible for how you use it. If you send commercial electronic messages to Australian recipients you must comply with the *Spam Act 2003* (Cth): have consent (express or inferred), identify yourself accurately, and include a functional unsubscribe. Respect any website notice stating that unsolicited messages are not wanted, and comply with the Privacy Act 1988 (Cth), GDPR and other applicable laws. Do not use this Actor for bulk unsolicited messaging.

# Actor input Schema

## `targets` (type: `array`):

Enter website URLs or bare domains (e.g., https://www.canva.com, https://stripe.com, https://www.xero.com, https://dishoom.com).

## `crawlInternalPages` (type: `boolean`):

Fetch up to 2 internal subpages (/about, /contact, /pricing, /docs) to enrich the generated /llms.txt, /llms-full.txt, FAQPage JSON-LD, and role-based corporate contact details.

## `maxInternalPages` (type: `integer`):

Maximum number of internal links to inspect per domain (1 to 4).

## `generateLlmsTxt` (type: `boolean`):

Automatically generate a spec-compliant /llms.txt Markdown index tailored to the audited website.

## `generateLlmsFullTxt` (type: `boolean`):

Automatically generate an expanded /llms-full.txt document designed for LLM retrieval-augmented generation (RAG) and answer engines.

## `generateJsonLdSchema` (type: `boolean`):

Automatically generate a <script type="application/ld+json"> payload containing Organization, WebSite, and FAQPage structured data.

## `concurrency` (type: `integer`):

Number of domains audited in parallel (1 to 15).

## `requestTimeoutSecs` (type: `integer`):

Timeout per HTTP request in seconds.

## Actor input object example

```json
{
  "targets": [
    "https://www.canva.com",
    "https://stripe.com",
    "https://www.xero.com",
    "https://dishoom.com"
  ],
  "crawlInternalPages": true,
  "maxInternalPages": 2,
  "generateLlmsTxt": true,
  "generateLlmsFullTxt": true,
  "generateJsonLdSchema": true,
  "concurrency": 50,
  "requestTimeoutSecs": 5
}
```

# Actor output Schema

## `audits` (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 = {
    "targets": [
        "https://www.canva.com",
        "https://stripe.com",
        "https://www.xero.com",
        "https://dishoom.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ausbizstack/ai-geo-llms-txt-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 = { "targets": [
        "https://www.canva.com",
        "https://stripe.com",
        "https://www.xero.com",
        "https://dishoom.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ausbizstack/ai-geo-llms-txt-auditor").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 '{
  "targets": [
    "https://www.canva.com",
    "https://stripe.com",
    "https://www.xero.com",
    "https://dishoom.com"
  ]
}' |
apify call ausbizstack/ai-geo-llms-txt-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ausbizstack/ai-geo-llms-txt-auditor"
        }
    }
}
```

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/qcE3Tgoo6fzB3znyH/builds/Q0xy8cjFqKBgOG2uI/openapi.json
