GEO Competitive Benchmark — AI Search Readiness vs Competitors
Pricing
$10.00 / 1,000 site auditeds
GEO Competitive Benchmark — AI Search Readiness vs Competitors
Benchmark your site vs up to 5 competitors for AI-search readiness in one run. See where rivals out-rank you for ChatGPT, Perplexity, Gemini & Claude citation — AI-crawler access, schema, extractability, speed, trust — as a ranked scoreboard + per-signal gap list. Deterministic GEO/AEO.
Pricing
$10.00 / 1,000 site auditeds
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Share
GEO Competitive Benchmark — AI Search Readiness vs Competitors
Where does your site rank against your competitors for AI-search citation — and exactly which signals are they winning on? This Actor audits your site and up to 5 competitors in a single run, ranks everyone on AI-search readiness 0–100, and hands you a per-signal gap list: which AI crawlers rivals allow that you block, which schema types they ship that you don't, and where they out-score you on extractability, speed and trust.
- 🏁 You vs up to 5 competitors, one run — a single ranked AI-readiness scoreboard, 0–100.
- 🔍 Per-signal gap list — the exact crawlers, schema types and dimensions rivals beat you on, plus prioritized fixes.
- 🤖 8 AI-search crawlers checked — ChatGPT, Perplexity, Claude, Google & Bing (robots.txt access).
- ⚡ 100% deterministic — raw-HTML audit exactly as an AI crawler sees it, no LLM guesswork, no per-run AI cost.
Quick start (API)
Benchmark your site against two rivals, five pages each, in one call:
curl -X POST "https://api.apify.com/v2/acts/foxlabs~geo-benchmark/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{ "yourSite": "https://www.notion.so", "competitors": ["https://coda.io", "https://www.clickup.com"], "maxPagesPerSite": 5 }'
Prefer no code? Open the Input tab, enter your site, add 1–5 competitors, and click Start — then download the results.
What you get
The run pushes two kinds of rows to one dataset, told apart by the type field: one scoreboard row per site, and a single benchmark record that compares you to the field.
Scoreboard row — type: "site"
| Field | Type | Description |
|---|---|---|
type | string | Record type — "site" for a scoreboard row |
domain | string | Site hostname (without www.) |
isYou | boolean | true for your site, false for a competitor |
rank | integer | Position in the AI-readiness ranking (1 = best) |
overallGeoScore | integer | Weighted GEO score, 0–100 |
band | string | strong (≥70), mid-tier (40–69) or gap (<40) |
pagesAudited | integer | Internal pages crawled & scored for this site |
accessScore | integer | AI-crawler access dimension, 0–100 |
structuredScore | integer | Structured-data (JSON-LD) dimension, 0–100 |
extractabilityScore | integer | Content-extractability dimension, 0–100 |
speedScore | integer | Speed dimension, 0–100 |
trustScore | integer | Trust/freshness dimension, 0–100 |
aiAccessText | string | Summary, e.g. "6/8 AI-search crawlers allowed" |
blockedAiBotsText | string | AI-search crawlers this site blocks, or "none" |
schemaTypesText | string | JSON-LD schema types found, or "none" |
jsRenderedPages | integer | Pages that look JavaScript-rendered (a risk to AI crawlers) |
hasLlmsTxt | boolean | Whether the site publishes an llms.txt |
A site that can't be fetched at all is still written as a type: "site" row, but with auditFailed: true, its startUrl and a note explaining why — it is excluded from the ranking and never charged.
Benchmark record — type: "benchmark"
| Field | Type | Description |
|---|---|---|
type | string | Record type — "benchmark" |
yourDomain | string | Your site's hostname |
yourRank | integer | Your position in the ranking |
totalSites | integer | Number of sites successfully audited & ranked |
yourScore | integer | Your overall GEO score |
leaderDomain | string | Highest-scoring site in the set |
leaderScore | integer | The leader's GEO score |
scoreGapToLeader | integer | Points between you and the leader |
scoreboardText | string | The full ranked scoreboard as one line |
dimensionGapsText | string | Per-dimension gaps where the best rival beats you (≥8 pts) |
botGapsText | string | AI crawlers a rival allows but you block |
schemaGapsText | string | JSON-LD types rivals ship that you don't |
winsText | string | Dimensions/signals where you already lead |
prioritizedMovesText | string | Impact-ordered fixes to climb the ranking |
generatedAtIso | string | ISO-8601 timestamp of the run |
The same benchmark data (with prioritizedMoves[] and scoreboard[] as arrays) is also saved to the key-value store under the BENCHMARK key, surfaced as the run's benchmark output.
Sample output
Illustrative — shows the shape and how the fields interlock, not a live measurement.
// Your site (a scoreboard row){"type": "site","domain": "notion.so","isYou": true,"rank": 2,"overallGeoScore": 67,"band": "mid-tier","pagesAudited": 5,"accessScore": 100,"structuredScore": 45,"extractabilityScore": 60,"speedScore": 92,"trustScore": 55,"aiAccessText": "All 8 AI-search crawlers allowed","blockedAiBotsText": "none","schemaTypesText": "Organization, WebSite","jsRenderedPages": 2,"hasLlmsTxt": false}// The leader (a competitor scoreboard row){"type": "site","domain": "coda.io","isYou": false,"rank": 1,"overallGeoScore": 82,"band": "strong","pagesAudited": 5,"accessScore": 100,"structuredScore": 75,"extractabilityScore": 78,"speedScore": 80,"trustScore": 80,"aiAccessText": "All 8 AI-search crawlers allowed","blockedAiBotsText": "none","schemaTypesText": "Organization, WebSite, Article, FAQPage, BreadcrumbList","jsRenderedPages": 0,"hasLlmsTxt": true}// The benchmark record{"type": "benchmark","yourDomain": "notion.so","yourRank": 2,"totalSites": 3,"yourScore": 67,"leaderDomain": "coda.io","leaderScore": 82,"scoreGapToLeader": 15,"scoreboardText": "1. coda.io — 82/100 (strong) | 2. notion.so — 67/100 (mid-tier) ← you | 3. clickup.com — 62/100 (mid-tier)","dimensionGapsText": "structured data: you 45 vs coda.io 75 (−30); content extractability: you 60 vs coda.io 78 (−18); trust/freshness: you 55 vs coda.io 80 (−25)","botGapsText": "none","schemaGapsText": "Article, FAQPage, BreadcrumbList, Product","winsText": "speed: you lead (92 vs best rival 80)","prioritizedMovesText": "1. 2/5 of your pages look JavaScript-rendered — serve key content in HTML (SSR/SSG) so AI crawlers can read it. 2. Add structured data your rivals already ship: Article, FAQPage, BreadcrumbList, Product (JSON-LD). 3. Improve content extractability: one H1, clear H2 sections, answer-first paragraphs, lists/tables. 4. Add trust/freshness signals: published & modified dates, author/Organization schema, canonical tags.","generatedAtIso": "2026-07-05T09:12:44.000Z"}
Input & filters
| Input | Description |
|---|---|
Your site (yourSite) | The website you want to benchmark. Ranked against the competitors below. Defaults to https://www.notion.so for a one-click demo. |
Competitor sites (competitors) | 1–5 competitor websites. Each is audited the same way and ranked side-by-side. Extra entries beyond 5 are ignored. At least one is required. |
Max pages per site (maxPagesPerSite) | How many internal pages to crawl & score per site (same-origin BFS from each start URL). 1–20, default 5. Keep low for a fast, cheap benchmark; raise for a fuller picture. |
Proxy (proxyConfiguration) | Off by default — most sites work directly (the Actor already auto-retries the www↔non-www variant). Turn on Apify Proxy with the RESIDENTIAL group only if some sites sit behind Cloudflare/WAF bot-protection. |
API convenience: yourSite also accepts the keys url, domain or site; competitors accepts competitorSites and may be a comma/newline-separated string; maxPagesPerSite accepts maxPages.
Example inputs (copy & paste)
// 1) Quick benchmark — you vs two rivals, 5 pages each{ "yourSite": "https://www.yourbrand.com","competitors": ["https://competitor-a.com", "https://competitor-b.com"],"maxPagesPerSite": 5 }// 2) Head-to-head — you vs your single biggest rival, deeper crawl{ "yourSite": "https://www.yourbrand.com","competitors": ["https://rival.com"],"maxPagesPerSite": 10 }// 3) Full competitive set — benchmark against the maximum five rivals{ "yourSite": "https://www.yourbrand.com","competitors": ["https://rival-a.com", "https://rival-b.com", "https://rival-c.com", "https://rival-d.com", "https://rival-e.com"],"maxPagesPerSite": 5 }// 4) Homepage-only quick scan — cheapest signal, one page per site{ "yourSite": "https://www.yourbrand.com","competitors": ["https://competitor-a.com", "https://competitor-b.com"],"maxPagesPerSite": 1 }// 5) Deep audit — maximum crawl depth for the fullest picture{ "yourSite": "https://www.yourbrand.com","competitors": ["https://rival.com"],"maxPagesPerSite": 20 }// 6) Rivals behind Cloudflare/WAF — route via residential proxy{ "yourSite": "https://www.yourbrand.com","competitors": ["https://protected-rival.com"],"maxPagesPerSite": 5,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } }
Use cases
- SEO / GEO agency deliverable. Show a client exactly where named rivals beat them in AI search — the
dimensionGapsText,schemaGapsTextandbotGapsTextbecome a prioritized roadmap you can bill for, refreshed on a schedule. - In-house AI-readiness tracking. Re-run monthly against the same competitor set and watch
yourRank,yourScoreandscoreGapToLeadermove — proof that your GEO work is landing. - Pre-pitch competitive research. Before a redesign or content sprint, see whether AI answer engines can even read you versus the competitor eating your citations.
- Founder reality check. A two-minute answer to "when someone asks ChatGPT or Perplexity about our category, are we readable — or is our competitor?"
- Content & schema prioritization.
schemaGapsTextand theprioritizedMovesTexttell your dev/content team the highest-impact JSON-LD and structure fixes to ship first. - robots.txt / crawler audit. Catch the silent killer — an AI-search crawler your rivals allow but your
robots.txtblocks — surfaced asbotGapsTextso you can't accidentally opt out of AI answers.
Performance & throughput
The benchmark is fully deterministic and calls no LLM or paid API — there is no per-run AI cost. For each site it fetches robots.txt and llms.txt, then does a same-origin breadth-first crawl of up to maxPagesPerSite pages, scoring each from raw HTML. Sites and pages are fetched sequentially, with a 30-second timeout per request, so wall-clock time scales with (1 + number of competitors) × maxPagesPerSite fetches and is dominated by the target sites' own response speed. A default run (you + up to 5 rivals × 5 pages) is a few dozen lightweight fetches; raising maxPagesPerSite or enabling the residential proxy adds time. There are no API keys or rate limits of our own — throughput is bounded only by your Apify plan and the sites you point it at.
Integrations
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('foxlabs/geo-benchmark').call({yourSite: 'https://www.notion.so',competitors: ['https://coda.io', 'https://www.clickup.com'],maxPagesPerSite: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const benchmark = items.find((i) => i.type === 'benchmark');console.log(`You rank ${benchmark.yourRank}/${benchmark.totalSites}`);
Python (apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("foxlabs/geo-benchmark").call(run_input={"yourSite": "https://www.notion.so","competitors": ["https://coda.io", "https://www.clickup.com"],"maxPagesPerSite": 5,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "benchmark":print("Your rank:", item["yourRank"], "/", item["totalSites"])
Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the Apify MCP server so AI agents can call it as a tool:
# Hosted MCPhttps://mcp.apify.com?tools=foxlabs/geo-benchmark# Self-hosted (Claude Desktop, Cursor, Cline)npx @apify/actors-mcp-server --tools foxlabs/geo-benchmark
Data quality & methodology
Every number is computed deterministically from each site's own HTML, robots.txt and llms.txt — nothing is fabricated, and the same site scores the same way each run (it only moves when the site itself changes). The five dimensions and their fixed weights are:
| Dimension | Weight | What it measures |
|---|---|---|
| Content extractability | 30% | One H1, H2 structure, content depth, text-to-HTML ratio, lists/tables, and a JavaScript-render check (JS-only content is invisible to AI crawlers) |
| Structured data | 25% | JSON-LD presence & useful schema types (Organization, Article, Product, FAQPage, BreadcrumbList…) |
| AI-crawler access | 20% | Whether robots.txt lets the 8 AI-search crawlers in (OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, Claude-Web, Googlebot, Bingbot) |
| Trust & freshness | 15% | Published/modified dates, author/Organization schema, canonical tags |
| Speed | 10% | Response time + page weight — fast, light pages are far more likely to be cited |
These weights are kept in sync with the GEO Auditor Actor, so a given site earns the same score in both. Training-only crawlers (GPTBot, ClaudeBot, CCBot, Google-Extended…) are intentionally not penalized — blocking them is a legitimate privacy choice — so they never drag your access score down. Sites that fail to load are marked auditFailed and excluded from the ranking rather than guessed at.
Pricing
This Actor bills per site audited (a pay-per-event site-audit charge), and only for sites that were actually reached and scored — a competitor (or your own site) that can't be fetched is never charged. There are no LLM, proxy or third-party costs unless you opt into the residential proxy for WAF-protected sites. An Apify free tier lets you evaluate the full feature set before you scale. See the Actor's pricing panel for the current per-site rate.
FAQ
What is GEO, and why benchmark it? GEO (Generative Engine Optimization, a.k.a. AEO) is making your site readable and citable by AI answer engines. Benchmarking shows your readiness relative to the competitors who are — or aren't — getting cited instead of you.
Which AI engines does this cover? The access score is driven by 8 AI-search crawlers spanning ChatGPT/OpenAI (OAI-SearchBot, ChatGPT-User), Perplexity (PerplexityBot, Perplexity-User), Claude (Claude-SearchBot, Claude-Web), Google (Googlebot) and Bing/Copilot (Bingbot).
Does it call ChatGPT or any LLM? No. It's 100% deterministic — a raw-HTML audit with fixed scoring rules. That's why there's no per-run AI cost and why results are reproducible.
How many competitors can I compare? Up to 5, plus your own site — 6 sites per run. Extra entries are ignored.
Does it render JavaScript? No, by design — most AI crawlers don't either. Pages that appear to depend on JavaScript for their content are flagged (jsRenderedPages) as a readability risk.
How is the overall score calculated? A weighted average of five dimensions: extractability 30%, structured data 25%, AI-crawler access 20%, trust/freshness 15%, speed 10% (see the methodology table).
Is this the same score as GEO Auditor? Yes — the weights and methodology are kept in sync, so a site scores consistently across both Actors. GEO Auditor goes deep on one site; this benchmarks you against rivals.
Do I need a proxy or API key? No. Most sites audit directly. Turn on the residential proxy only for sites behind Cloudflare/WAF bot-protection.
How is this different from AI Brand Monitor? This measures your readiness to be cited (on-site: structure, schema, crawler access). AI Brand Monitor measures whether you're actually mentioned in live AI answers (off-site). Use them together.
What export formats are available? JSON, CSV, Excel, or via the Apify API and integrations.
Troubleshooting
- "Provide at least one competitor site" error →
competitorswas empty. Add at least one competitor URL. - A site shows
auditFailed/ "unreachable" → it's likely behind Cloudflare/WAF, or the URL is wrong. Enable the RESIDENTIAL proxy (the Actor already auto-retries thewww↔non-wwwvariant) or check the address. - A dimension scores 0 or very low → that's usually a real signal (e.g. no JSON-LD, JS-rendered content, blocked crawlers). If it's just thin coverage, raise
maxPagesPerSiteso more pages are sampled. - Fewer sites were charged than I entered → intentional. Sites that couldn't be fetched produce no scorecard and are never billed (fair billing).
Notes, limits & legal (honest)
- Readiness, not live citations. This is a technical/structural benchmark — it measures how ready each site is to be cited by AI answers, not how often it actually is. For live mention tracking, pair it with AI Brand Monitor.
- No JavaScript execution (by design). It reads raw HTML, mirroring how most AI crawlers see a page; JS-dependent content is flagged rather than rendered.
- Sampled, not exhaustive. It scores up to
maxPagesPerSitesame-origin pages per site via a breadth-first crawl — a representative sample, not a full-site crawl. - Heuristic signals. Scores are structural indicators of AI-search readiness, not a guarantee of ranking or citation. It reads only public resources (
robots.txt,llms.txt, page HTML) with a browser-like user agent. - Not affiliated with OpenAI, Perplexity, Anthropic, Google, Microsoft/Bing or Apify. Crawler and product names are used descriptively to identify the bots and engines checked.
Support
Questions, a signal you'd like added, or a custom build? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.
If this Actor saves you time, a ⭐ review really helps.
Changelog
0.2 — 2026-07-05
- Reworked docs to the foXLabs gold standard: API quick-start, full field tables for both record types, an illustrative sample output, input recipes, integration snippets (JS/Python/Make/MCP), methodology/weights table, FAQ & troubleshooting.
- SEO title tightened and Actor description refreshed; engine list aligned to the crawlers actually checked.
0.1.2 — 2026-07-05
- Hardened output handling so an edge-case value can never trip dataset-schema validation.
0.1.6 — 2026-06-27
- Fair billing: a competitor (or your own site) that can't be fetched is no longer charged — the per-site event now fires only for sites that were actually audited.
- Rebalanced the scoring weights in sync with the GEO Auditor Actor (access + speed 40%→30%, structured data + trust/freshness gain the difference) so a given site scores consistently across both.
- Declared the
undicidependency explicitly + added a lockfile for reproducible builds.
0.1.3 — 2026-06-04
- Added the suite banner to the README.
0.1.2 — 2026-06-04
- Structured-data detection now catches nested JSON-LD
@types (e.g.SearchActioninsidepotentialAction), for more complete schema gap analysis.
0.1.1 — 2026-06-04
- Initial release: benchmark your site vs up to 5 competitors on AI-search readiness — ranked scoreboard + per-signal gaps (AI-crawler access, schema, extractability, speed, trust). Deterministic, no external per-run cost.
Part of the foXLabs data platform — public-data and AI-search intelligence Actors spanning company, contact, ownership, procurement, financial and GEO/AI-visibility data. Pairs with GEO Auditor (deep single-site GEO audit) and AI Brand Monitor (are you mentioned in live AI answers). Browse the full suite and free how-to guides at data.foxlabs.com.tr.

