# AI Answer Readiness Check (`crystalius777/ai-answer-readiness-check`) Actor

Checks whether ChatGPT search, Perplexity, Claude, Gemini and Google AI answers can reach, read and understand a website. Gives a score out of 100 and the exact fixes.

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

## Pricing

$30.00 / 1,000 website checkeds

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

## AI Answer Readiness Check

Find out whether ChatGPT search, Perplexity, Claude, Gemini, Copilot and Google's AI answers can **reach, read and
understand** your website, and get the exact fixes in plain words. Give it one website or up to 50; each one gets a score
out of 100, a grade, what already works, and a numbered list of what to fix first.

### What it checks

| Area | Share of the score | What is checked |
|---|---|---|
| Access and indexing | 30 | AI crawlers can open the home page (no bot wall or robot check), robots.txt lets search and AI answer crawlers in (Googlebot, Bingbot, OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User), no leftover noindex, valid HTTPS |
| Page basics | 20 | Title, meta description, canonical link on your own domain |
| Readable content | 20 | Enough text in the HTML itself (many AI crawlers do not run scripts), clear h1 and h2 headings, questions answered on the page (FAQ) |
| Structured data | 15 | schema.org JSON-LD that parses and names what the business and page are |
| Discovery | 15 | A real sitemap (not a web page answering at /sitemap.xml) and the basics on up to 30 inner pages from it (or, without a sitemap, linked from the home page) |

Also reported as advice, outside the score: `/llms.txt`, Open Graph tags for shared links, the page language, and whether
crawlers that only collect AI training data are blocked (a valid choice that does not hide you from AI answers).

If something cannot be read (a timeout, a page longer than the read limit, a server error), that check is marked
**could not check** and left out of the score instead of counted as a failure. A grade is given only when at least 70% of
the score could be checked.

Passing these checks makes a site easy for AI tools to read; it does not guarantee they will cite it.

### Input

```json
{
  "urls": ["https://example.com", "another-site.com"],
  "maxPages": 10
}
```

- `urls`: home page addresses, 1 to 50. An address without `https://` gets it added.
- `maxPages`: how many inner pages are also checked, taken from the site's sitemap or, without one, from the home page's links (0 to 30, default 10).

Only public websites are checked; private network addresses are refused.

### Output

One dataset row per website, plus the full report as Markdown in the key-value store (`REPORT-<site>-<n>`):

```json
{
  "url": "https://example.com/",
  "status": "checked",
  "score": 40,
  "grade": "Partly ready",
  "coverage": 0.94,
  "fixes": [
    { "id": "structured_data", "title": "Structured data (JSON-LD) describes the business",
      "evidence": "No JSON-LD structured data on the home page.",
      "fix": "Add a <script type=\"application/ld+json\"> block with schema.org data ..." }
  ],
  "checks": [{ "id": "ai_fetch", "state": "pass", "evidence": "A visitor named GPTBot gets the page (200)." }],
  "report": "# AI Answer Readiness: example.com ...",
  "billed": true
}
```

`status` is `checked`, `unreachable` (the site did not open, answered with an error or showed a robot check page),
`refused` (not a public address) or `invalid` (not a website address).

### Pricing

You pay once per website checked; a site that cannot be reached is free. A site where too little could be read for a
grade is free too. When your spending limit for a run is reached, the run stops and lists the sites it did not check.

### FAQ

**Does a high score mean ChatGPT will recommend my business?**
No. It means AI tools can find, open and understand your pages. Whether they cite you also depends on what your pages
say and on other sites that mention you.

**Why does it test as GPTBot?**
Many sites block AI crawlers by accident through firewall or bot protection settings. Opening the home page under an AI
crawler's name shows whether that happens.

**Does it change anything on my site?**
No. It only reads public pages, the same way a crawler does.

**Why is llms.txt only advice?**
It is a young proposal that some AI tools read and others ignore. It is cheap to add, so it is listed, but it does not
lower your score.

**Can someone fix the list for me?**
Yes. Each report ends with an offer from the maker of this tool to fix the items for a fixed price.

# Actor input Schema

## `urls` (type: `array`):

The websites to check, one per line (home page addresses such as https://example.com). Up to 50 per run.

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

How many inner pages (from the site's sitemap, or without one from the home page's links) are also checked for a title, a description and no noindex. 0 checks the home page only.

## Actor input object example

```json
{
  "urls": [
    "https://example.com"
  ],
  "maxPages": 10
}
```

# Actor output Schema

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

One row per website: score out of 100, grade, checked share, status and a short note. The fixes in order of importance and the full report are under Full reports.

## `reports` (type: `string`):

Every row with its full report: all checks, what each found and how to fix it.

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

How many websites were checked and charged, and any not checked because the spending limit was reached.

# 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 = {
    "urls": [
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crystalius777/ai-answer-readiness-check").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 = { "urls": ["https://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("crystalius777/ai-answer-readiness-check").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 '{
  "urls": [
    "https://example.com"
  ]
}' |
apify call crystalius777/ai-answer-readiness-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crystalius777/ai-answer-readiness-check"
        }
    }
}
```

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/bkeUBMHDRsngJK84R/builds/gTubPQAevKVjtanW1/openapi.json
