You have a solid product. Your documentation is thorough. Your pricing page is clear. But when someone asks Perplexity "what is the best [your category] tool," your competitor's name appears in the generated answer and yours does not.

Traditional SEO explains why you rank below them on Google. It does not explain why answer engines choose to cite them by name inside a generated response while ignoring your domain entirely.

Generative Engine Optimization (GEO) competitor analysis answers that exact question. It measures how answer engines evaluate your site and your competitor's side by side across six structural dimensions that determine citation probability.


What GEO Competitor Analysis Actually Measures

When someone asks an AI search engine a question, the engine does not simply return links. It crawls both domains, parses their HTML structure, extracts semantic signals, and scores each page on how likely it is to provide a clear, direct, machine-readable answer to the query.

Ife's GEO Competitor endpoint (POST /api/v1/geo-competitor) automates this evaluation. It runs a full AEO audit on both your site and your competitor's site, then calculates a weighted citation probability score across six categories:

Dimension Weight What It Measures
Topic Semantic Density35%How frequently the target keyword appears in your page titles, H2 headings, and meta descriptions relative to total word count
Direct Answer Confidence30%Whether your page contains tables, FAQ schema, lists, and structured H2 sections that answer questions directly
AI Crawler Access15%Whether robots.txt allows GPTBot, PerplexityBot, ClaudeBot, and other AI crawlers to access your content
Knowledge Graph & Schema15%Presence of JSON-LD structured data (FAQPage, SoftwareApplication, Organization) that answer engines use for entity extraction
Semantic Content Density10%How much useful information your page body, headings, and word count contain
Machine Readability10%Whether you publish /llms.txt and /llms-full.txt developer manifests that give AI crawlers a high density content summary

The final citation probability is a weighted composite:

citation_probability = (0.35 * topic_score) + (0.30 * direct_answer_score) + (0.15 * crawler_access) + (0.15 * schema_score)

Running a Head-to-Head Comparison

The API accepts two URLs and an optional topic keyword to measure semantic relevance against:

curl -X POST https://ife.sluxia.com/api/v1/geo-competitor \
  -H "Authorization: Bearer YOUR_IFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "your_url": "https://yourcompany.com",
    "competitor_url": "https://competitor.com",
    "topic": "real time web scraping API"
  }'

In Python:

import requests

payload = {
    "your_url": "https://yourcompany.com",
    "competitor_url": "https://competitor.com",
    "topic": "real time web scraping API"
}

response = requests.post(
    "https://ife.sluxia.com/api/v1/geo-competitor",
    headers={
        "Authorization": "Bearer YOUR_IFE_API_KEY",
        "Content-Type": "application/json"
    },
    json=payload
)

report = response.json()
print(f"Winner: {report['winner']}")
print(f"Score Delta: {report['score_delta']}")

Reading the Response

A full response contains four major sections. Here is what each one tells you:

1. The Winner and Score Delta

{
  "topic": "real time web scraping API",
  "winner": "competitor",
  "score_delta": 22
}

The winner field tells you which domain answer engines are more likely to cite for the given topic. The score_delta is the absolute difference in citation probability percentage between the two sites. A delta of 22 means the competitor's citation probability is 22 percentage points higher than yours.

2. Per-Site Breakdown

{
  "your_site": {
    "url": "https://yourcompany.com",
    "domain": "yourcompany.com",
    "geo_score": 74,
    "citation_probability_pct": 61,
    "grade": "B+",
    "topic_relevance": 58,
    "direct_answer_confidence": 70
  },
  "competitor_site": {
    "url": "https://competitor.com",
    "domain": "competitor.com",
    "geo_score": 88,
    "citation_probability_pct": 83,
    "grade": "A",
    "topic_relevance": 72,
    "direct_answer_confidence": 85
  }
}

The topic_relevance score is calculated by counting how many times the target keyword appears in your page titles, meta descriptions, and H2 headings, normalized against total word count. A low topic relevance score means answer engines do not associate your page strongly with the search query.

The direct_answer_confidence score measures whether your page is structured to answer questions directly: HTML tables contribute 30 points, FAQPage schema contributes 25 points, lists contribute 20 points, and having at least two H2 sections contributes 15 points.

3. The Advantage Matrix

{
  "advantage_matrix": [
    {
      "category": "Topic Semantic Density",
      "your_score": 58,
      "competitor_score": 72,
      "advantage": "competitor"
    },
    {
      "category": "Direct Answer Confidence",
      "your_score": 70,
      "competitor_score": 85,
      "advantage": "competitor"
    },
    {
      "category": "AI Crawler Access",
      "your_score": 90,
      "competitor_score": 85,
      "advantage": "yours"
    },
    {
      "category": "Knowledge Graph & Schema",
      "your_score": 60,
      "competitor_score": 90,
      "advantage": "competitor"
    },
    {
      "category": "Semantic Content Density",
      "your_score": 74,
      "competitor_score": 88,
      "advantage": "competitor"
    },
    {
      "category": "Machine Readability (llms.txt)",
      "your_score": 0,
      "competitor_score": 100,
      "advantage": "competitor"
    }
  ]
}

This matrix shows where you are losing. In this example, the competitor leads on five of six dimensions. Your only advantage is AI crawler access, meaning you allow more bots through robots.txt. But that advantage is wasted because your site lacks the schema markup and machine-readable manifests those crawlers need to extract structured answers from your pages.

4. Content Gaps and Action Plan

{
  "content_gaps_identified": [
    "Competitor publishes /llms.txt manifest. Generate and deploy /llms.txt to yourcompany.com.",
    "Competitor has FAQPage schema markup. Add FAQPage JSON-LD to yourcompany.com to capture direct Q&A LLM citations.",
    "Competitor uses structured HTML <table> data; add HTML <table> markup to capture tabular LLM answers.",
    "Competitor allows more AI search crawlers in robots.txt. Unblock AI bots on yourcompany.com."
  ],
  "competitive_action_plan": [
    "Competitor publishes /llms.txt manifest. Generate and deploy /llms.txt to yourcompany.com.",
    "Competitor has FAQPage schema markup. Add FAQPage JSON-LD to yourcompany.com to capture direct Q&A LLM citations.",
    "Competitor uses structured HTML <table> data; add HTML <table> markup to capture tabular LLM answers.",
    "Competitor allows more AI search crawlers in robots.txt. Unblock AI bots on yourcompany.com."
  ]
}

The gap analysis compares specific structural properties between the two domains and tells you what to fix.


Common Reasons Competitors Win the Citation Battle

Running GEO competitor analysis across dozens of SaaS and developer tooling domains consistently surfaces the same problems:

Problem Why It Costs You Citations
Missing /llms.txtAnswer engines have no high density manifest to parse. The competitor's manifest gives crawlers a ready-made product summary.
No FAQPage schemaCompetitor pages with FAQ schema are directly extractable as Q&A pairs. Your prose paragraphs require inference.
Thin heading structurePages with only one H1 and no H2/H3 hierarchy give crawlers no topic boundaries. Competitors with clear section headings get cited section by section.
Aggressive bot blockingCloudflare challenge pages, rate limiting, and aggressive WAF rules block GPTBot and PerplexityBot. The competitor's open robots.txt gets crawled instead.
No structured tablesAnswer engines prefer HTML <table> elements for comparison and specification queries. Unstructured text lists lose.

Automating Competitor Monitoring

Running a one-time comparison is useful. Running it weekly against your top three competitors catches shifts in citation probability before they show up in your traffic analytics.

import requests
import json

API_KEY = "YOUR_IFE_API_KEY"
BASE = "https://ife.sluxia.com/api/v1/geo-competitor"

competitors = [
    {"url": "https://competitor-a.com", "topic": "web scraping API"},
    {"url": "https://competitor-b.com", "topic": "web scraping API"},
    {"url": "https://competitor-c.com", "topic": "web scraping API"},
]

your_site = "https://yourcompany.com"
results = []

for comp in competitors:
    resp = requests.post(
        BASE,
        headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
        json={"your_url": your_site, "competitor_url": comp["url"], "topic": comp["topic"]}
    )
    report = resp.json()
    results.append({
        "competitor": comp["url"],
        "winner": report["winner"],
        "delta": report["score_delta"],
        "your_probability": report["your_site"]["citation_probability_pct"],
        "their_probability": report["competitor_site"]["citation_probability_pct"],
        "gaps": report["content_gaps_identified"]
    })

for r in results:
    print(f"\nvs {r['competitor']}:")
    print(f"  Winner: {r['winner']} (delta: {r['delta']})")
    print(f"  Your citation probability: {r['your_probability']}%")
    print(f"  Their citation probability: {r['their_probability']}%")
    for gap in r["gaps"]:
        print(f"  Gap: {gap}")

This script gives you a weekly comparison report you can use to prioritize content work.


Using GEO Competitor Analysis Inside Your IDE

Ife exposes geo_competitor as a native MCP tool. If you are using Cursor, Windsurf, Claude Desktop, Zed, or OpenCode CLI, you can run competitor comparisons directly from your editor without switching to a terminal:

# Inside your AI IDE with Ife MCP connected:
ife geo_competitor your_url="https://yourcompany.com" competitor_url="https://competitor.com" topic="real time web scraping"

The MCP server handles authentication, error handling, and response formatting. Your AI agent gets the full structured report as context for generating code, writing content, or restructuring your docs.


What To Do After You Identify the Gaps

The gap analysis gives you a prioritized list. Here is the order that moves the citation probability the most with the least engineering time:

  1. Generate and deploy /llms.txt (30 minutes). Ife's /llms-generator endpoint auto-creates the manifest from your existing docs. Serve it at your domain root.
  2. Add FAQPage JSON-LD schema (1-2 hours). Your top 10 product-related questions from search console data wrap in FAQPage structured data on your product and documentation pages.
  3. Add HTML tables to main pages (2-3 hours). Comparison and specification sections convert from text lists to <table> elements. Answer engines extract tabular data with much higher confidence.
  4. Audit robots.txt for AI crawlers (15 minutes). GPTBot, PerplexityBot, ClaudeBot, and Bytespider should not be blocked. Aggressive challenge rules for these user agents need removal.
  5. Rewrite headings with targeted H2s (1-2 hours). Vague section headers ("Overview", "Details") should include your target keywords directly ("Real Time Web Scraping API Overview", "Pricing for High Volume Web Scraping").

Each step maps to a dimension in the advantage matrix. Re-run the GEO competitor comparison after each change to measure the citation probability shift.