{"slug": "your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to", "title": "Your Backlinks Are Indexed But Invisible to AI Search — I Built a Free Checker to Prove It", "summary": "A developer built a free checker that tests whether backlinks are visible to AI search engines, not just indexed by Google. The tool extends an existing Google Sheets script to check for AI Overview citations and LLM recognition, highlighting a growing gap between traditional SEO indexation and AI-driven search visibility.", "body_md": "A few weeks back I published [a Google Sheets tool to check backlink indexation with SerpApi](https://dev.to/seobysubham/i-built-a-google-sheets-tool-to-check-backlink-indexation-with-serpapi-and-why-i-made-it-1h0k) — a simple, manual-only script that tells you whether a backlink has actually been picked up by Google, instead of guessing.\n\nIt worked well. One backlink I was tracking got indexed by Google in under 72 hours. Good news, right?\n\nThen, out of curiosity, I opened ChatGPT and asked it about the exact page that backlink pointed to.\n\nIt had no idea the page existed.\n\nNot \"I don't have real-time data.\" Not a vague guess. It simply didn't know the content was there — despite Google indexing it days earlier.\n\nThat gap is the entire premise of this post: **being indexed by Google and being visible to AI search are two completely different things**, and almost nobody is measuring the second one.\n\nSo I extended my original checker to test for both.\n\nFor over a decade, indexation was the finish line. If Google crawled your page and added it to the index, you were in the game — rankings were just a matter of time and optimization from there.\n\nThat assumption is breaking down.\n\nA growing share of search now happens inside AI systems — ChatGPT, Perplexity, and Google's own AI Overviews — that don't work like the traditional index. They don't list ten blue links; they synthesize an answer from a handful of sources they trust enough to cite. A page can be perfectly indexed and still never make it into that shortlist.\n\nFor anyone doing SEO or link building, that means a new failure mode nobody's watching for: a backlink that \"worked\" by every traditional metric, but contributes zero visibility where a growing number of searches actually happen.\n\nI wanted a way to see that gap directly, on my own sites, without relying on vibes.\n\nThe original tool answered one question per backlink: *is this indexed?*\n\nThe updated version answers three:\n\n`site:`\n\nquery)Each backlink row in the Google Sheet ends up with three simple signals instead of one, plus a combined score so I can sort and prioritize at a glance.\n\nSame stack as before: Python, the SerpApi library, and Google Sheets as the interface — no dashboard, no database, nothing to maintain.\n\nThis part is unchanged from the original tool — a straightforward `site:`\n\nsearch through SerpApi to confirm the URL is indexed:\n\n``` python\nimport requests\n\ndef check_indexation(url, serpapi_key):\n    params = {\n        \"engine\": \"google\",\n        \"q\": f\"site:{url}\",\n        \"api_key\": serpapi_key\n    }\n    response = requests.get(\"https://serpapi.com/search\", params=params)\n    results = response.json()\n    return bool(results.get(\"organic_results\"))\n```\n\nSerpApi's Google engine returns an `ai_overview`\n\nblock when one is present for a query. I check whether my domain shows up anywhere inside its sources:\n\n``` python\ndef check_ai_overview(keyword, target_domain, serpapi_key):\n    params = {\n        \"engine\": \"google\",\n        \"q\": keyword,\n        \"api_key\": serpapi_key\n    }\n    response = requests.get(\"https://serpapi.com/search\", params=params)\n    results = response.json()\n\n    ai_overview = results.get(\"ai_overview\", {})\n    sources = ai_overview.get(\"references\", [])\n\n    cited = any(target_domain in src.get(\"link\", \"\") for src in sources)\n    return {\n        \"has_ai_overview\": bool(ai_overview),\n        \"domain_cited\": cited\n    }\n```\n\nIf there's no AI Overview at all for that keyword yet, I record that too — it's a useful signal on its own.\n\nThis one is more experimental, and I want to be upfront about that. I send a small, consistent prompt to the OpenAI API asking whether the model has knowledge of the page or domain, and log the raw response for manual review rather than trying to auto-parse a yes/no:\n\n``` python\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=\"YOUR_OPENAI_KEY\")\n\ndef check_llm_recognition(url, domain):\n    prompt = (\n        f\"Are you aware of the website or page at {url} \"\n        f\"(domain: {domain})? If so, briefly describe what it's about. \"\n        f\"If you have no knowledge of it, say so directly.\"\n    )\n    response = client.chat.completions.create(\n        model=\"gpt-4o-mini\",\n        messages=[{\"role\": \"user\", \"content\": prompt}],\n        max_tokens=150\n    )\n    return response.choices[0].message.content\n```\n\nI run the same prompt structure against Perplexity's API too, since its answers are grounded in live search rather than training data alone — it tells me something different: not \"does the model remember this,\" but \"would this page surface in a real-time AI search right now.\"\n\nEach backlink gets logged as a row with:\n\n| Backlink URL | Indexed? | AI Overview exists? | Domain cited in Overview? | LLM recognizes page? | Notes |\n|---|\n\nI don't collapse this into a single fake \"score out of 100\" — SEO tools do that too often and it hides more than it reveals. Instead I flag any row where **Indexed = Yes** but both AI columns are **No**. Those are the interesting rows. That's the actual gap.\n\nOut of the backlinks I re-checked from my last batch:\n\nThe AI Overview number was the useful one. It's the closest thing to a real-time \"does AI search actually see this\" signal available right now, and it's a much smaller percentage than the indexation rate. That gap is exactly what I was trying to surface.\n\nSame reasoning as the original tool, and it applies even more here:\n\nManual-only isn't a limitation here — it's the correct way to use a signal that's still this noisy.\n\nA few things worth being upfront about, since overselling this would defeat the point of writing it:\n\nIf you're building something similar, treat every AI-visibility signal as directional, not authoritative.\n\nThe full script (indexation + AI Overview + LLM recognition check) is a single Python file plus a Google Sheet template — no server, no signup, nothing to host. If you want to run it on your own backlinks, I'm happy to share the setup in the comments or a follow-up post.\n\nIf you've noticed the same indexed-but-invisible gap on your own sites, I'd genuinely like to hear what you found — drop it below.\n\nI write and build tools like this as part of my link-building work at [SEO by Subham](https://seobysubham.com) — if you're curious about the manual, white-hat approach behind the original indexation checker too, it's all there.", "url": "https://wpnews.pro/news/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to", "canonical_source": "https://dev.to/seobysubham/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to-prove-it-43p0", "published_at": "2026-08-28 00:31:23+00:00", "updated_at": "2026-08-28 01:19:02.380470+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-products"], "entities": ["SerpApi", "Google", "ChatGPT", "Perplexity", "OpenAI"], "alternates": {"html": "https://wpnews.pro/news/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to", "markdown": "https://wpnews.pro/news/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to.md", "text": "https://wpnews.pro/news/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to.txt", "jsonld": "https://wpnews.pro/news/your-backlinks-are-indexed-but-invisible-to-ai-search-i-built-a-free-checker-to.jsonld"}}