Blog

How do Perplexity and ChatGPT decide which sources to cite? AI citations measured over 450 runs and two audits: documentation-shaped pages win

Two reports dated 2 September 2026 say Perplexity's citations can be manufactured (three sites, 215,128 generated 'best software' pages) and often do not contain the figure they are cited for (34.7% of 1,826). Our self-hosted monitor asked ChatGPT fifteen procurement questions five times each across six snapshots: 1,926 citations, two-thirds to documentation, three competitors' doc domains holding 34.9–40.6% in every snapshot, and our own site cited in 0 of 450 runs while AI crawlers fetched it hundreds of times a day. One selection rule is consistent with all three, though the audits tested Perplexity and we test ChatGPT.

Linden Kern22 min read
Data card on a dark field: the figure 0 of 450, labelled as the number of ChatGPT runs across six snapshots from 24 August to 2 September 2026 that cited pirouter.ai, beside six small bars showing the share of each snapshot's citations taken by three competitors' own documentation domains, between 34.9 and 40.6 percent

Two reports published on the same day, 2 September 2026, answer half of this question for Perplexity: its citations can be manufactured at scale, and about a third of the ones attached to a number do not contain that number. Our own measurement answers the other half for ChatGPT: across six snapshots and 450 runs of fifteen procurement questions, roughly two-thirds of its 1,926 citations went to documentation pages, another eighth to terms-of-service and SLA pages, and three competitors’ documentation domains held between 34.9% and 40.6% of all citations in every snapshot. Put the three datasets side by side and one selection rule is consistent with all of them — a hypothesis, not a finding, since the two audits tested Perplexity and our instrument tests ChatGPT: each engine cites whatever is shaped like a reference document for the exact question — a docs page, a terms page, a directory entry, a buying guide with its ranking in JSON-LD — and it does not much care who wrote it or how well known the site is. Manufactured pages win by manufacturing that shape. Documentation wins by having it natively. Our own site, which AI crawlers fetched several hundred times a day over the same period, was cited in 0 of 450 runs. The rest of this post reads the two audits carefully, lays out what our instrument saw, and then spends a whole section on what six snapshots cannot tell you.

Two audits on the same day, and what each one actually measured

The first report is from a site called Trellner Research. On 2 September it put 380 buyer-intent software categories — “CRM software” through “museum collection management software” — to perplexity/sonar and perplexity/sonar-pro through OpenRouter, one prompt per category per model, 760 calls in all, each asking for a ranked top five as JSON with every product’s official homepage. That produced 7,534 citations across 2,055 distinct domains, and the report looked every domain up in the Tranco top-million list for 1 September and in the Wayback Machine (Manufactured sources behind AI recommendations).

The distribution is the finding. 59.8% of citations point at domains ranked worse than #100,000 on Tranco; 23.4% point at domains not in the top million at all; the ten most-cited domains take only 17.3% between them, so this is not a story about a few famous sites. The top of the list is g2.com (291 citations), reddit.com (261) and then guideflow.com (194) — a vendor of interactive product demos whose marketing blog was cited across 96 of the 380 categories, none of which it competes in. Wikipedia was cited three times in 7,534.

Further down sit three sites — wifitalents.com, worldmetrics.org and gitnux.org — with 181 citations between them, 2.4% of the total, in 41 categories. The report’s case that they are one operation rests on shared registrar and registration window, a shared pair of Cloudflare nameservers, an identical page template, and blogs of exactly six posts each about the other brands in the set. Their sitemaps list 70,731, 71,684 and 72,713 pages under /best/<something>-software/ respectively — 215,128 generated buying guides. None of the three domains existed before December 2023. Two of them give their homepage the HTML title “Facts & Grounding Page”, and the report’s dry observation is that grounding “is not a term buyers use”; it is the name of the retrieval step these pages are addressed to.

The report is unusually explicit about what it does not show, and I will hold it to that. It covers Perplexity only; “nothing here should be read as a claim about any other engine.” The two model tiers returned a byte-identical citation list in 289 of 380 categories, so they are “one search stack sampled twice”, not two measurements. There was one prompt wording, one run per category, and no repeat sampling. The categories are the authors’ own list, not a sample of what buyers ask. And, in its words, “we have not shown that any of this changes the answers” — nobody removed the manufactured sources and re-ran the question. Common control of the three sites is inferred from infrastructure and template; the report does not know who operates them, and neither do I.

The second report, from Haus Research, measured something different on the same day: not where citations come from but whether they hold up. It asked 310 factual questions about 210 technology companies — founding year, latest funding round, headcount, entry price, headquarters, revenue, disclosed breaches, current CEO, acquisitions, uptime SLA — at temperature 0 to the same two Perplexity models, with GPT-4.1 plus a web plugin as a control (Perplexity citation audit). The Perplexity models mark claims inline as [n], which is what makes an audit possible: each marker is a specific assertion that this sentence came from that URL. There were 2,511 markers. Of the 1,826 attached to a sentence stating a figure, 34.7% pointed at a page that either would not open to an ordinary reader or opened and contained none of the numbers in the sentence. Scored per claim instead of per marker, 14.4% of 872 claims fail. Only 1.3% of URLs were dead; the large categories are gated pages (16.1% — logins, paywalls, bot walls) and readable pages that simply do not say it. The clean example is a price: asked for Vercel’s cheapest paid plan, the model answered “$20/month” and cited Vercel’s plans page, which the report says names the plans and does not contain the string.

Two of Haus’s secondary findings matter for what follows. Half of the dead URLs were pages “minted per company per question type” — /directory/<company>-offices, /plans/<company>, /sla/<company> — published at scale to catch exactly the query asked and taken down as cheaply as they went up. And the GPT-4.1 control behaved differently in a way the report records without much comment: it cited 2.0 sources per answer against Perplexity’s 9.8, and 36.4% of them were the company’s own domain against 23.4%. Haus also lists its limits: one snapshot, English-language questions about technology companies, models reached through OpenRouter rather than the consumer product, and a fetcher identified as a bot, which inflates the gated share. Its own summary of scope is the right one: “We are not measuring whether Perplexity is right. We are measuring whether the thing it offers as proof functions as proof.”

I should say what I do not know about these two. Neither site names an author I could find. When the reports reached Hacker News, several commenters said the prose reads as machine-written, one noted that trellner.com is itself outside the Tranco million the report leans on, and another doubted the shared-nameserver inference; the threads stood at 206 and 104 points when I collected them on 3 September. Both reports publish their datasets and scripts under CC BY 4.0 and describe their method in enough detail to re-run. I have not re-run them. I am treating them as two method descriptions with numbers attached — which is what they are — and I will not lean on either for a claim its own limitations section rules out.

What we measure every day or two, and what the instrument can see

Since 24 August we have run an open-source AI-visibility monitor we self-host (Elmo) against a fixed list of fifteen questions. Ten are procurement questions of the kind a developer asks when choosing an LLM gateway or router — “Which LLM gateway supports automatic failover across multiple providers?”, “OpenRouter vs LiteLLM vs Portkey: which should I use?”, “Which LLM router lets me set per-API-key spending quotas?” Five are informational questions that articles on this blog answer — “How much advance notice do LLM providers give before raising prices?”, “Does quantizing the KV cache break tool calls?” Each question is put five times to one engine: ChatGPT through OpenAI’s API with web search enabled, version string gpt-5.6-terra in every run. Every URL the answer cites is stored with the run. That is 75 runs per snapshot. Six snapshots exist — 24, 25, 26, 28 and 30 August and 2 September; daily at first, then every second or third day — for 450 runs and 1,926 citations.

We read it under a few rules, and they shape every number below. Counts carry their denominators; “cited in 0 of 75 runs” is a measurement, “ranked nowhere” is not, because an AI answer has no rank. Comparisons are at the domain level, not the URL level, for a reason the last section shows. And one engine is one engine: nothing here is a statement about Perplexity, Claude, Gemini or Google’s AI Mode, none of which we have measured.

One thing the instrument cannot see deserves saying up front. The API returns the citations but not the rewritten search queries the model issued to find them; in all 450 runs that field is a placeholder. So we know which documents were chosen and not which query fetched them.

Where 1,926 citations went: two-thirds to documentation

I classified every cited URL by host and path pattern — a subdomain beginning docs., developers., learn. or platform., a path segment such as /docs/ or /guides/, a /terms/ or /policies/ or /sla path, and so on. It is a heuristic; its limits are in the last section. Under it, the six snapshots pooled look like this.

Page typeCitations (six snapshots)Share2 September alone
Documentation1,24764.7%211 of 323
Terms of service / legal / SLA23112.0%38
Blog or news post1145.9%19
Paper or PDF965.0%13
GitHub repository or file854.4%13
Product or comparison page392.0%8
Model card281.5%6
Homepage160.8%2
Forum or community thread30.2%1
Unclassified673.5%12

Documentation, terms, papers, repositories and model cards — the categories a librarian would shelve as reference — come to 1,687 of 1,926, or 87.6%. Blog posts, of any author, are 5.9%.

The three most-cited domains show how narrow the target is. docs.litellm.ai received 22 citations on 2 September, every one of them to the same URL: the documentation root. openrouter.ai received 69 across 17 distinct URLs, 64 of them under /docs/ — the provider-selection guide (16), the quickstart (13), an organization-management cookbook (10), the FAQ (8) — and five to a blog tutorial on team spend controls. portkey.ai received 34 across 11 URLs, 33 of them under /docs/. Pricing pages, comparison pages and homepages for those three products barely appear.

The near-absence of forums is worth a moment, because Trellner found reddit.com second on its list with 261 of 7,534. Our 1,926 citations include three community threads — two on Google’s AI developer forum, one on OpenAI’s. The two results are not in conflict. Ask “best CRM software” and the reference-shaped documents on the web are review aggregators and discussion threads; ask “which router lets me set per-key budgets” and the reference-shaped documents are the routers’ own docs, because that is where the parameter names live. The source pool follows the shape of the question. What stays constant across both is the shape the engine reaches for.

Horizontal bar chart of the ten most-cited domains on 2 September 2026: openrouter.ai 69, portkey.ai 34, docs.litellm.ai 22, github.com 20, docs.aws.amazon.com 20, developers.cloudflare.com 17, openai.com 14, vercel.com 11, cloud.google.com 9, learn.microsoft.com 9; the first three bars, the tracked competitors' own domains, are drawn in dark ink and the rest in grey
Fig. 1 — Where the 323 citations of 2 September went: the ten most-cited of 46 domains. Dark bars are the three tracked competitors' own domains, 125 citations between them. Data: our self-hosted monitor, 75 ChatGPT runs.

Three competitor domains take 34.9–40.6% of every snapshot, and that is a band, not a trend

We track ten competitors. Three of them — OpenRouter, LiteLLM and Portkey — own the two most-cited domains in every snapshot (openrouter.ai and portkey.ai) and the third in five of six: on 28 August github.com took third place and docs.litellm.ai fell to fourth. Here is what those three took, snapshot by snapshot.

SnapshotCitationsDomainsTo the three domainsShareTop ten domains’ share
24 Aug3414713439.3%67.4%
25 Aug3203812840.0%70.3%
26 Aug3154512840.6%68.3%
28 Aug3034611136.6%66.7%
30 Aug3244711334.9%66.0%
2 Sep3234612538.7%69.7%

The 2 September figure is up on 30 August, and it would be easy to write “rising”. I will not. Six points that read 39, 40, 41, 37, 35, 39 are a band, not a trend, and the honest statement is the boring one: about two citations in five go to three domains, and that has been true on every day we looked. The wider concentration is just as steady — the ten most-cited domains hold two-thirds of citations in every snapshot — and the tail is thin: of the 46 domains cited on 2 September, 15 were cited exactly once.

At the run level, on 2 September, 37 of 75 runs cited at least one of the three domains, and 47 of 75 mentioned at least one tracked competitor by name — LiteLLM in 39 runs, OpenRouter in 31, Portkey in 28, with a run free to mention several. The answers average 4.3 citations each; five of the 75 cited nothing at all.

One question is worth reading on its own. “OpenRouter vs LiteLLM vs Portkey: which should I use?” drew 35 citations across its five runs: 11 to openrouter.ai, 11 to portkey.ai, 10 to github.com, most of those the LiteLLM repository. The parties being compared supplied nearly all of the evidence about themselves. There is nothing improper in that — those are their documentation pages, and documentation is what one should read — but notice that the engine did not go looking for a third party. A commenter on the Trellner thread, toddmorey, reported the same pattern from agent traces: “many of the comparison pages cited in research are often hosted by one of the companies being compared.”

Crawled hundreds of times a day, cited in 0 of 450 runs

Now the part that is about us, which I include because it is the only case where I can see both ends of the pipe.

Cloudflare sits in front of pirouter.ai and reports requests by user agent over a 24-hour window. In our 30 August daily report the AI agents were ClaudeBot at 199 requests and ChatGPT-User at 57. In the 3 September report they were meta-externalagent at 370, Amazonbot at 52, ChatGPT-User at 33, OAI-SearchBot at 22, PerplexityBot at 7, GPTBot at 1 — and ClaudeBot at 0. The crawlers rotate; on the 30th the biggest was Anthropic’s, four days later Meta’s, and one went from 199 to nothing. What did not rotate is the other end: in the 2 September snapshot, as in the five before it, no run cited a pirouter.ai URL and no answer mentioned us.

OpenAI’s crawler documentation is precise about what those agents are for, and the distinction matters here. GPTBot fetches for training; OAI-SearchBot fetches to build the search index; and ChatGPT-User fetches when a user’s question triggers a visit — it “is not used for crawling the web in an automatic fashion” (Overview of OpenAI crawlers). Perplexity draws the same line between PerplexityBot and Perplexity-User (Perplexity crawlers). So 33 ChatGPT-User and 22 OAI-SearchBot requests in one day mean our pages were fetched both for the index and in the course of live answers. They were read. They were not cited.

Being fetched is the first of three gates. The second is being in the candidate set the engine retrieves for a given question; the third is being selected into the answer. Our data sees the first gate and the third. The first is open: hundreds of fetches a day. The third is shut: 0 of 450. Somewhere between them we are either retrieved and passed over or not retrieved at all, and the instrument cannot tell me which; the second gate is exactly what the placeholder query field hides.

Data card with two figures side by side: 56, labelled as requests to pirouter.ai from OpenAI's three user agents in one 24-hour window in the 3 September 2026 Cloudflare report, and 0 of 75, labelled as ChatGPT runs citing pirouter.ai in the 2 September 2026 snapshot
Fig. 2 — Fetched and not cited. Left: ChatGPT-User 33 + OAI-SearchBot 22 + GPTBot 1 requests in one 24-hour Cloudflare window (3 September report). Right: ChatGPT runs citing pirouter.ai in the 2 September snapshot. The two windows are adjacent, not identical.

We tried the obvious thing, and I can report how it went. On 29 August we published a documentation-style answer to one of the gap questions, “What are the best OpenRouter alternatives for production workloads?” — seven vendors’ docs read on one day, six production columns, every gap marked (OpenRouter alternatives for production workloads). On 30 August and again on 2 September that question was asked five times each. Fifty citations the first day, thirty-nine the second; the leading hosts were docs.aws.amazon.com (11, then 8), learn.microsoft.com (6, then 7), vercel.com and developers.cloudflare.com. None of the 89 was ours. On 30 August we published a configuration walk-through for another gap question (Multi-provider failover across LiteLLM, Portkey, OpenRouter and Cloudflare). On 2 September “Best LLM router or gateway for multi-provider failover” drew 31 citations in five runs, 22 of them to portkey.ai, openrouter.ai and docs.litellm.ai. Three or four days is not long, and I do not read either result as a verdict on the articles. I read them as a description of what the engine reached for: the vendors’ own pages.

The cleanest case is the question we wrote an article specifically to answer: “How much advance notice do LLM providers give before raising prices?” Our piece reads the notice clauses in seven providers’ terms (Price notice is a contract clause). In six snapshots — 30 runs, 164 citations — that question cited nothing on the three competitor domains and nothing of ours. It cited openai.com/policies, cloud.google.com/terms, Cohere’s terms of use, Anthropic’s commercial-terms PDF, AWS service terms. The engine went straight to the primary documents our article was about, and cited the documents rather than the reading of them. If you write a secondary source about a primary source that is online, expect the engine to cite the primary.

Why manufactured pages and documentation win for the same reason

Set the three datasets next to each other and look at what the cited pages have in common, rather than who published them.

Trellner’s three sites state their rankings in JSON-LD, so, in the report’s words, a page “can be read without interpretation”. Each page announces an editorial process and names three staff; one labels its verdict “AI-verified · Expert reviewed”; two title their homepage “Facts & Grounding Page” and describe it as “company, legal, methodology, and compliance details in one machine-readable record”. Whatever else they are, these pages are built in the shape of a reference: one structured claim per page, a named author, a stated method, a record a machine can parse. The report does not show that the shape changed any recommendation. It shows that the shape got retrieved, 181 times, from domains that did not exist two years earlier.

Haus’s failing citations cluster in the same shape from the other direction. About a quarter of sonar’s sourcing for questions about real companies went to directories and lead lists — Tracxn, PitchBook, ZoomInfo, Crunchbase and their imitators — pages “generated from databases, published at scale to rank, gated or retired without notice”. Half the dead links were pages minted per company per question type. These are not essays either. They are fact-record-shaped pages that exist to be the thing a retrieval step lands on, and the engine attached its markers to them whether or not the fact was there.

Our data is the benign version of the same rule. For a procurement question about gateways, the reference-shaped documents on the web are the gateways’ own documentation, and 1,247 of 1,926 citations went there; when the question was about contractual notice, another 231 went to terms and SLA pages. Nobody manufactured those. They simply have, natively, the properties the retrieval layer selects for: one page per concrete question, headings that match the query, parameter names and figures on the page, a stable URL. A blog post — this one included — is a different shape: an argument across several questions, dated, with its numbers embedded in prose.

I want to be careful about how far to push this. The two audits are about Perplexity and ours is about ChatGPT; the audits are one day and ours is six; none of us measured whether removing the manufactured pages would change a single recommendation, and Trellner says so outright. What the three agree on is narrower and, I think, solid: the retrieval layers behind AI answers select on document shape and query match, and they do not currently apply much scepticism about who is behind a document or why it exists. Haus’s control result fits the same picture from the OpenAI side — GPT-4.1 with web search cited 2.0 sources per answer and put 36.4% of them on the company’s own domain, against Perplexity’s 9.8 and 23.4% — and so does ours: fewer citations per answer, weighted heavily to the primary party’s own pages.

The Hacker News threads carried first-hand versions of both faces. One commenter wrote that their company has “been in business for about 10 years, but asking any LLM about recommendations in this niche will not mention our tool at all”, and that some of the “best software” sites had reached out “with an offer where we can then pay them an annual fee depending on which position we would like”. Another reported API key requests and sales “up 5x over the summer” while doing “basically zero traditional marketing or SEO”, and suspected AI search tools were suggesting their services. Both are anecdotes and I cite them as anecdotes. A third put the structural point in one line: “The search engine is now the citation, and the citation is a page that exists to be cited.”

What six snapshots cannot tell you

This is the section I would read first if I were you.

One engine, through one door. Every run is ChatGPT through the API with web search on, not the consumer app, whose retrieval settings may differ. The word “AI” in the singular does not appear in our conclusions for that reason, and nothing above confirms or contradicts the two Perplexity reports’ figures. The agreement I have claimed is about mechanism, not numbers.

Fifteen questions we wrote. They are the questions we care about being found for, phrased the way we think a developer phrases them. Trellner made the same admission about its 380 categories. A different list would produce a different source pool, and the two-thirds figure belongs to this list.

Five runs give a band, not a point. A question cited in 0 of 5 runs one day and 1 of 5 the next has not changed in any way we can detect. This is why our daily gap table reports “5 of 5” and “1 of 5” and never a percentage, and why every share in this post carries a denominator in the hundreds.

The URL layer is weather. Across six snapshots 405 distinct URLs were cited; 216 of them appeared in exactly one snapshot and 26 in all six. At the domain level the picture is far steadier: 78 domains, 26 present in all six, 25 in only one. openrouter.ai was cited between 57 and 69 times per snapshot, but which of its pages led changed — the provider-selection guide on three days, the quickstart on two, the FAQ on one. Anything you read about a specific URL from one snapshot is weather, which is why every comparison above is by domain.

The page-type table is a regex. A guide under /blog/ on a vendor’s site counts as a blog post even when it reads like documentation; a documentation page on an unusual path can fall into “unclassified”, and 67 did. The two-thirds figure would move a few points under a different rule. It would not become one-third.

We cannot see the query. The rewritten search terms the model issued are a placeholder in all 450 runs, so the second gate — what was retrieved and then passed over — is inferred, never observed.

One small thing the data does show, for anyone who runs a site: 290 of the 323 citation URLs on 2 September carried utm_source=openai. That parameter is how ChatGPT-referred visits will appear in your analytics, and it is the one place the third gate is visible from outside.

What we do with it

The gap table this monitor produces — every question where the engine cited somebody and not us — is one of the inputs to what we write, and two of the articles linked above came out of it. I have shown that neither was cited within four days, and tried to say honestly why: for those questions the engine wants the vendor’s own page, and an article about vendors’ pages is one step removed from it. We do not have a method that gets a site cited. We have 0 of 450 and a table that says where the citations went instead.

Two things would sharpen the picture, and both are on the list. A second engine, so that “ChatGPT” stops standing in for “AI”. And a provider that returns the rewritten queries, so we can finally watch the second gate instead of inferring it from the first and the third. Until then the honest summary of six snapshots is short. The citations went to whatever was shaped like a reference. Some people answered that by building 215,128 pages. Vendors answered it, without meaning to, by writing documentation. We are still writing essays, and measuring.