# Manufactured sources behind AI software recommendations — dataset

Collected 2 September 2026 by Trellner Research. Full method in `METHOD.md`.

380 buyer-intent software categories were put to two web-grounded Perplexity
models (`perplexity/sonar`, `perplexity/sonar-pro`) via OpenRouter, one prompt
per category per model, 760 calls in total. Each answer returns a ranked top
five with the vendor's homepage domain, plus the list of URLs the model
retrieved. Every cited domain was then matched against the Tranco top-1M list
and the Wayback Machine, and every recommended vendor homepage was fetched to
see whether it still exists.

## Files

**`citations.csv`** — one row per citation (7,534 rows).

| column | meaning |
|---|---|
| `model` | `perplexity/sonar` or `perplexity/sonar-pro` |
| `category` | the category put to the model |
| `citation_url` | URL the model reported retrieving |
| `domain` | registrable domain of that URL (last two labels) |
| `tranco_rank` | rank in Tranco daily list K9QPW (2026-09-01); empty = not in the top 1M |
| `wayback_first_capture` | date of the first HTTP 200 capture of that domain in the Wayback Machine; empty = none found |

**`answers.csv`** — one row per recommended product (3,800 rows): `model`,
`category`, `position` (1-5), `product_name`, `vendor_domain`.

**`cited_domains.csv`** — one row per distinct cited domain (2,055 rows):
`domain`, `citations`, `categories_cited_in`, `tranco_rank`,
`wayback_first_capture`.

**`vendor_domains.csv`** — one row per distinct recommended homepage (1,502
rows): `domain`, `times_recommended`, `dns_resolves`, `http_status`,
`final_url` after redirects, and the separate `direct_status` and
`proxy_status` the merged verdict was taken from. 403 and 429 mean the host
blocked the fetch, not that the site is gone.

**`answers_raw.jsonl`** — the raw per-call record: model, category, timestamp,
parsed picks, citation URLs.

**`numbers.json`** — every figure quoted in the report, as produced by
`scripts/analyze.py` and `scripts/farm_facts.py`.

**`sitemaps.json`** — sitemap page counts for the sites named in the report.

**`redirect_check.json`** — for each recommended homepage that redirects off its
own domain, whether the destination page still mentions the product.

**`evidence/`** — a plain-text extract of every page named in the report, each
headed by the URL it came from, the final URL after redirects, the HTTP status
and the time it was fetched. `manifest.json` lists all of them. These are the
copies the report's claims about specific sites were checked against.

**`scripts/`** — everything used to collect and analyse the data. Run order:
`run_main.py`, `enrich.py`, `recheck_vendors.py`, `merge_vendors.py`,
`redirect_check.py`, `refetch_evidence.py`, `analyze.py`, `farm_facts.py`,
`export.py`. `run_main.py` needs an OpenRouter API key; `proxyfetch.py` reads a
proxy URL from a local file that is not included here, and falls back to
fetching directly when that file is absent.

## Licence

CC BY 4.0. Attribute to Trellner Research and link to
https://trellner.com/reports/manufactured-sources-behind-ai-recommendations/
