verisible AI visibility, measured honestly
← Field notes
2026-07-05 · geo · server-logs · crawlers

Reading your server logs for AI bots: the only non-synthetic GEO signal

Your server logs are the only AI visibility data you own outright. Every prompt-sampling dashboard, citation tracker, and “share of voice” score is an estimate generated by asking a model questions and counting answers. Your access logs are different: they record which AI bots fetched which pages, at what hour, and whether the fetch succeeded. That is measurement, not inference.

The distinction is worth sitting with, because most of the GEO tooling market sells the inferred kind. A tracker runs prompts, watches for your name, and reports a number that shifts run to run. Useful, but synthetic. The bot that visited your pricing page at 3am left a line in your log that no vendor had to reconstruct. It happened, and you have the receipt.

What is an AI crawl ledger?

It is your server or CDN access log, filtered to the user agents that AI systems use, read as a running account of AI attention. Filter for GPTBot and OAI-SearchBot (OpenAI), ChatGPT-User (live fetches during a chat), PerplexityBot, ClaudeBot and anthropic-ai (Anthropic), and Google-Extended. What falls out is a per-page picture of which AI systems care about which parts of your site, how often they come back, and where they hit walls.

Three things in that log are worth more than any dashboard:

Repeat visits to the same page mean an AI system keeps returning for it. That is a page pulling weight in answers, worth protecting and updating. Fetches of your llms.txt or a specific document tell you which content agents are treating as a reference. And failed fetches tell you where you are invisible for purely mechanical reasons.

Why do HTTP 499s belong in this ledger?

Because a 499 is a fetch that got nothing. It is the status code nginx and Cloudflare log when the client closes the connection before the server responds, and when the client is an AI fetcher, it means the assistant asked for your page and gave up waiting. One analysis found ChatGPT-User dominates 499 errors among the AI bots, with Perplexity and Claude’s fetchers doing the same. Profound’s data, via iPullRank, showed pages failing more than 75% of the time got roughly 18 times fewer citations than reliable ones.

So a cluster of 499s against ChatGPT-User on a high-value page is not noise. It is a direct readout that ChatGPT tried to cite you and could not load you in time. No synthetic tool surfaces this, because the failure never became an answer to sample. It only exists in your log. There is a trap: Apache does not record 499 by default, so on an unconfigured Apache origin this entire class of failure is invisible. Fix the log format first, or you are auditing a report with the worst line deleted.

Why not just trust a search-data tool instead?

Because “search engine data” is not one coherent thing, and we have the bruises to prove it. Running the same set of queries through a self-hosted SearXNG instance across multiple backends, DuckDuckGo answered every query, Google silently returned zero results for the same terms, and Brave suspended us after a single request. Three engines, three completely different realities, for identical inputs. Any tool that flattens that into one confident “visibility” figure is hiding the variance, not resolving it.

Your logs do not have that problem. They do not estimate what an engine might return. They record what a specific bot actually did to your specific server. That is the one signal in this whole field with no modeling error, no sampling wobble, and no vendor between you and the truth.

The work is unglamorous, which is exactly why almost nobody at SMB scale does it. Parse the log, group by bot user agent and URL, count visits and failures per page, and watch the trend over weeks. You end up with the questions that matter: which pages do AI systems fetch most, which ones are they abandoning, and is the pattern improving after you fix the pages that time out.

Pull last month’s access log, grep for the AI user agents above, and count fetches and 499s per URL. That single table tells you more about your real AI exposure than a quarter of dashboard subscriptions. Our free scan does a live fetch against your pages and flags the ones an AI bot would abandon, which is the same failure your logs are already recording whether or not anyone is reading them.

Sources

See it on your own site. Five buyer questions to an AI, and we show you whether you're in the answers.
Start tracking free