AEO / GEO Readiness Auditor
Pricing
Pay per usage
AEO / GEO Readiness Auditor
Audits public web pages for AI answer-engine (AEO/GEO) + SEO citation-readiness — structured data, answer-up-front, freshness, E-E-A-T, meta — with a 0-100 score and concrete fixes.
AEO / GEO Readiness Auditor (Apify Actor)
Audit any public web page for how ready it is to be cited by AI answer engines (ChatGPT, Google AI Overviews, Perplexity) and by classic search — then get a 0–100 score, a letter grade, and concrete fixes. HTML-only (no headless browser), so it is fast and cheap to run.
What it checks (page-type-aware)
Structured-data presence and quality for the page type · question-shaped headings ·
concise answer-up-front block · semantic HTML · entity/sameAs signals · title · meta
description (incl. og:description fallback) · canonical · Open Graph · Twitter card · H1 ·
heading structure · substantive content (CJK-aware word count) · freshness · author/E-E-A-T ·
language · image-alt coverage. Detects page type (article / qa / product / listing /
homepage / other) and scores only the checks that apply to that type. noindex pages are
capped to 0 / F and flagged citable: false. Likely client-rendered (SPA) pages are flagged
confidence: low rather than silently failed.
Input
{"startUrls": [{ "url": "https://example.com/blog/post" }],"maxConcurrency": 5,"maxPages": 100}
maxPages is capped at 200 and maxConcurrency at 20 per run (cost guard).
Output — one STABLE record per URL (ok and error rows share this shape)
{"status": "ok","requested_url": "https://example.com/blog/post","final_url": "https://example.com/blog/post","http_status": 200,"redirected": false,"page_type": "article","citable": true,"readiness_score": 86,"grade": "A","confidence": "high","render_warning": null,"truncated": false,"blocked_from_indexing": false,"schema_types": ["Article"],"word_count": 612,"title": "...","meta_description": "...","checks": { "schemaQuality": { "pass": true, "applicable": true, "weight": 10, "detail": "..." }, "...": {} },"strengths": ["schemaQuality", "title", "..."],"recommendations": ["Add the citation-relevant schema type ...", "..."],"summary": "Strong article (86/A) — citation-ready; 2 minor opportunities remain.","audited_at": "2026-05-29T..."}
Failed fetches return the same keys with status: "error", an error message, and null
scores — so the dataset exports to a clean table. Filter status == "ok" before averaging.
Why it's useful (and money-first)
Every site owner in 2026 wants to know "will AI tools cite my page?" — there is no clean, cheap answer for that. This gives a per-page score + a fix list. It is also dual-use: the system runs it on its own (and clients') sites for the GEO/AEO citation service.
Run locally / test (no Apify account needed)
npm installnpm test # unit tests on the pure audit logic (node:test)
Publish to Apify (the account-holder's step)
The free Apify account covers building + publishing free actors (no KYC, no payment). Monetization (pay-per-result pricing + payout) requires the adult account-holder's KYC and is a later step.
npm install -g apify-cliapify login # in the free Apify accountapify push # from this directory — uploads + builds the actor
Then, in the Apify Console: set the actor to Public, write the store listing (use this README), and keep it free initially to learn the discovery algorithm and earn reviews. Only enable pricing later, via the adult account-holder, once the actor shows real repeat organic usage and clears a margin gate (profit = 0.8·revenue − compute).
Notes / safety
- SSRF-guarded: rejects non-
http(s)schemes and private/loopback/link-local/metadata hosts (e.g.169.254.169.254,localhost,10.x), and re-checks every redirect hop. - Respects robots.txt and rate-limits (
maxRequestsPerMinute), per-host politeness. - Cost-guarded:
maxPagesceiling 200,maxConcurrencyceiling 20, 1 retry, 30 s/req. - Stores derived signals only — no raw page bodies or personal data in the dataset.
- HTML-only (no JS execution): genuinely client-rendered pages are flagged
confidence: lowwith arender_warning, not silently failed. Audit only URLs you have the right to audit. - Core logic is in
src/audit.js(pure, 14 unit tests + regression cases);src/main.jsis the Apify wrapper; shared core insrc/lib/(jsonld,normalize,ssrf). - Known residual: hostname/IP-literal SSRF guard does not resolve DNS (DNS-rebinding mitigated by platform egress controls); HTML-only rendering; heuristic page-type detection.