Guide
Do AI engines cite my site? Measuring it without inventing an AI rank
Answer engines churn their citations weekly and expose no API. This is the small instrument I trust instead of buying a rank number — including the humble score it currently shows for my own site.
Key findings
- There is no API for 'did an AI engine cite me,' so the measurement is a six-prompt, three-run manual panel with a validator that rejects any capture missing counts or a real engine version.
- An unreachable engine is a coverage gap, never a zero: the dashboard prints '1/4 engines captured' so a missing surface can't fake a decline.
- 'AI ranking position' is banned outright — one 17-week study found ChatGPT swaps ~74% of its cited sources weekly, so only presence-over-time means anything.
There is no API for "did an AI engine cite me." I measure it by hand: six fixed prompts, three runs per engine, and a validator that decides what counts.
Answer engines (the AI products that answer a question directly and cite a few sources) are becoming a real way people find work like mine. A whole tool industry now sells "AI rank tracking" on top of them, and I think that number is fabricated precision: the citation lists move too fast for any single position to mean anything. So I built a smaller instrument that refuses to lie about what it saw, and this page is its manual.
_panel_contract.py (three counts plus a real version per engine, captured-only mean, explicit coverage).Why is "AI ranking position" banned outright?
Because the ground moves weekly. In an 82,619-prompt study run across 17 weeks, ChatGPT swapped roughly 74% of its cited sources week over week. A single sighting is noise, and so is a single absence. The only signal a small panel can carry is presence over time: of six fixed prompts, how many answers cited alidoes.ai or Ali this month, per engine, three runs each.
The arithmetic keeps me honest about size. Six prompts by three runs by four engines is 72 answers on a complete month, while published noise analyses of AI-visibility metrics put a tight confidence interval at something like 40–150 runs per engine. My panel is nowhere near that, on purpose. It is directional: good for spotting a trend, useless as a precise score. Its docs carry a written panel-bias caveat, because the prompt universe is arbitrary and engine-specific skews don't cancel out with more runs. The quantitative trend comes from free official surfaces instead: search-console and analytics APIs. The panel carries only what those can't show, which is how engines describe me and whether competitors get named on prompts I want to own.
I started at 15 prompts and cut the panel down on 2026-06-28, because the official surfaces had taken over the quantitative half and a bigger manual panel was quantity dressed as rigor. The sixth and final prompt, a category-collision watch, was added 2026-07-05.
What does a capture have to prove before it counts?
One shared module, _panel_contract.py, is imported by the panel writer, the dashboard, the report, and the completeness gate, so "a real capture" has exactly one meaning everywhere. Per included engine it demands exactly three integer counts in 0–6 (no floats, no missing run, no fourth run) plus the engine version actually shown on screen. Placeholder versions like "unknown" or "TODO" are rejected.
The version rule is not pedantry. A model update changes citation behavior platform-wide, and without the version recorded, a platform change is indistinguishable from a brand change.
A capture that half-exists (counts without versions, an engine nobody configured) is classified malformed. Malformed attempts are excluded from every rate but kept in the ledger (the append-only log the panel writes to) as invalid evidence. The instrument remembers its own bad measurements instead of deleting them.
How does a missing engine stay honest?
An engine I can't reach that month is omitted, and an omission renders as a coverage gap — never a zero. A zero claims "asked, and not cited." A gap admits "didn't ask." Fold the second into the first and the average drops, manufacturing a decline no engine produced. So the mean is computed over captured engines only, and the dashboard prints coverage next to every number: "1/4 engines captured." A missing surface cannot depress the average, and it cannot hide either. It's the same failure family as the green check over missing records: a status that won't state its coverage is an alibi, not a measurement.
Freshness gets the same treatment. The panel check resolves to one of five states (fresh-complete, fresh-partial, stale, no-valid-capture, invalid), and only fresh-and-complete earns the passing exit code. The scheduled side is built deliberately headless: its whole job is to notice a panel is due and write a dated worksheet for a session I drive myself. It never queries an answer engine unattended. I want measurement to be something I witness, not something that happens to me.
So, do the AI engines cite me?
Barely, and the instrument says so in those words. The latest valid capture, recorded 2026-07-24, covered one of the four intended engines. Eighteen independent ChatGPT answers produced a presence count of 1 of 6 in every run. The single hit came only on the direct identity prompt: "Who is Ali / alidoesai, and what does he do with AI agents?" On the verification prompts I most want to be cited for: nothing yet. The other three engines were omitted as coverage gaps, not scored as zeros. Since then the panel has sat paused under the review hold on my automation fleet, so today's honest read is stale and partial — printed as exactly that, never averaged around.
A weak number stated plainly beats a strong number I invented. This panel is one small instrument in the larger system behind how I know my AI is right. It enforces the same rule as everything else there: a metric must state its coverage before it may state its value.
So the question for your setup: if every average on your dashboard had to print its own coverage line ("1/4 engines," "3 of 9 sources"), how many of your trends would survive the disclosure?
Method & data
Method: the live citation-measurement instrument for alidoes.ai: the six-prompt panel harness, its shared validation contract, the append-only measurement ledger it writes, and the playbooks that fixed the cadence and the bansData: patterns and methods only; no names, dollar figures, addresses, case identifiers, or confidential content · Last checked: 2026-08-14
How this was made
AI-drafted, adversarially checked, human-directed. My AI assistant wrote this from the system's own records — the panel harness `_aeo-panel.py`, its shared validator `_panel_contract.py`, the append-only measurement ledger, and the measurement playbooks. A separate AI session then tried to break every claim against those records, and automated privacy and readability gates ran before publish. I direct this pipeline, own every boundary in it, and audit published pages on a rolling basis — if you find an error, tell me and it goes in the corrections log, dated, never silent.
I'm Ali — I run real life-and-work admin on AI agents, then check their work in the open. More at /about.
Published under my standards. Found an error? Tell me — corrections go in the corrections log, dated, never silent.
Cite this
@online{ali2026aeohonest,
author = {Ali},
title = {Do AI engines cite my site? Measuring it without inventing an AI rank},
date = {2026-08-14},
url = {https://alidoes.ai/measure-ai-citations-honestly/}
}Caught something I got wrong? Send it directly. Confirmed corrections go in the corrections log.