DEV Community

Jeffrey Turov
Jeffrey Turov

Posted on

I built a free AEO checker — is your website visible to ChatGPT, Perplexity and Google AI?

A restaurant owner in my town asked me a question I hear more and more: "When someone asks ChatGPT where to eat tonight, does it say my name?"

Honest answer: nobody knows without checking. So I built a free tool that checks — and I open-sourced the logic as an Apify Actor anyone (human or AI agent) can call.

The 7 things AI engines actually check

After auditing dozens of local business sites, the signal for "will an AI cite you" collapses to 7 technical criteria:

  1. Structured data (JSON-LD) — machines read schema.org, not your hero banner
  2. A business schema type — LocalBusiness, Organization, ProfessionalService…
  3. A meta description — the first text an AI reads about you
  4. One clear H1 — confirms the page's subject
  5. Open Graph tags — sharing + entity understanding
  6. A /llms.txt file — the identity card AI engines look for (most sites don't have one)
  7. AI bots allowed in robots.txt — most sites accidentally block GPTBot, ClaudeBot or PerplexityBot via a blanket rule or a "SEO tool" that added it silently

The killer is #7. I've seen sites with perfect schema markup that explicitly tell every AI crawler to go away.

What the Actor returns

One call, one score, exact fixes:

{
  "url": "https://www.codeur.com",
  "scoreLabel": "4/7",
  "checks": {
    "json_ld": false, "schema_type": false, "meta_description": true,
    "h1": true, "open_graph": true, "llms_txt": false, "robots_ai": true
  },
  "topFixes": [
    {"criterion": "Structured data (JSON-LD)", "fix": "Add a <script type=\"application/ld+json\"> block..."},
    {"criterion": "llms.txt file", "fix": "Publish /llms.txt summarizing who you are for AI engines."}
  ]
}
Enter fullscreen mode Exit fullscreen mode

(That's a real result — a major marketplace scores 4/7. Most local businesses score 1–2.)

It can also generate a ready-to-publish llms.txt draft for the audited site, delivered as plain text in the key-value store.

Call it from anything

curl -X POST "https://api.apify.com/v2/acts/travelmonitorlab~aeo-ai-visibility-checker/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-site.com", "generateLlmsTxt": true}'
Enter fullscreen mode Exit fullscreen mode

It's API-first and works through the Apify MCP server, so an LLM agent can audit a website mid-conversation. No browser, no proxy — a plain HTTP audit that runs in seconds and costs nothing. It's free, deliberately: it's my 12th Actor and the first one I give away, because an AEO checker is exactly the kind of tool that should be a utility, not a product.

The bug that taught me something

First deploy: every run returned SUCCEEDED… with an empty dataset and a silent log. The cause wasn't the platform — it was me: I defined async def main() and never called it. The module loaded, defined functions, and exited 0. One missing line:

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

A "successful" run proves nothing. Check the dataset, always.

Try it

If you run it on your site, drop your score in the comments — I'm curious what the distribution looks like.

Top comments (1)

Collapse
 
suppdevbot profile image
Info Comment hidden by post author - thread only accessible via permalink
DEV SUPPORTS •

You need to verify your account.

Enter fullscreen mode Exit fullscreen mode

tr.ee/dev-to

Some comments have been hidden by the post's author - find out more