Perplexity is the most citation-heavy AI search engine. Almost every answer comes with numbered sources, which makes it the easiest place to measure whether your pages are being used. The catch is that Perplexity does not offer a webmaster console, so no single report lists every page it cites from your site.
What you can do is collect evidence at five levels, from “Perplexity has crawled this page” up to “someone clicked this page in a Perplexity answer”. Each level has its own data source, and putting them side by side shows not just which pages get cited, but where the rest drop out.
Table 1: The Five Methods at a Glance
| Method | What It Proves | Cost | Effort |
|---|---|---|---|
| GA4 referral report | Page was cited and clicked | Free | 5 minutes |
| Manual checks in Perplexity | Page is cited for a specific question | Free | Slow for more than 20 queries |
| Server logs | Page was crawled or fetched live for an answer | Free | Needs log access |
| Search API | Page ranks in Perplexity’s own search index | $5 per 1,000 queries | Short script |
| Sonar API | Page is cited in a generated answer | About $5 to $12 per 1,000 queries plus tokens | Short script |
- Method 1: Find Cited Pages That Got Clicks in GA4
- Method 2: Check Perplexity Answers by Hand
- Method 3: Read Perplexity’s Bots in Your Server Logs
- Method 4: See If Your Pages Rank in Perplexity Search
- Method 5: Track Citations at Scale With the Sonar API
- Reading the Gaps Between Rungs
- Tools That Track Perplexity Citations for You
- FAQs
Method 1: Find Cited Pages That Got Clicks in GA4
Start here because it costs nothing and shows the pages that already send you visitors. Every page in this report was cited in an answer, since Perplexity only links to sources it shows.
- Open GA4 and go to Reports > Engagement > Landing page.
- Add a filter for Session source containing
perplexity. This catches perplexity.ai and its subdomains. - Set the date range to at least 90 days, since low-volume pages may get only a few visits a month.
- Add Key events or Engagement rate as a column to see which cited pages actually perform.
Since May 2026, GA4 also groups many AI referrals in an AI Assistant channel, so you can start from that channel and drill into Perplexity. Two limits apply: Perplexity’s mobile app does not always pass a referrer, so some cited clicks land in Direct, and pages that are cited but never clicked will not show up here at all. The next methods fill those gaps.
Method 2: Check Perplexity Answers by Hand
For a short list of high-value questions, nothing beats asking Perplexity directly. Each answer shows source cards above the text and numbered markers inline, and the Sources view lists every URL used.
- Write down the 10 to 20 questions your buyers actually ask, in their words rather than as keywords.
- Ask each one in a logged-out or private window, so your own history does not shape the result.
- Record each cited URL, its position in the source list, and whether your domain appears at all.
- Repeat monthly. Perplexity answers shift as its index refreshes, so one check is a snapshot, not a ranking.
Manual checks show what real users see, including features the API does not return. They just do not scale. Past about 20 questions, move to Method 5.
Method 3: Read Perplexity’s Bots in Your Server Logs
Perplexity uses two user agents, and they tell you different things:
Table 2: Perplexity’s Two User Agents
| User Agent | What It Does | What a Hit Tells You | Respects robots.txt |
|---|---|---|---|
| PerplexityBot | Crawls pages to build Perplexity’s search index | The page can be found and cited (rung 1) | Yes |
| Perplexity-User | Fetches a page live when a user asks a question | The page was read while answering a real query (rung 3) | Generally no, since a user requested it |
Perplexity-User is the more valuable signal. Each hit means the page was pulled in for a real person’s question, which is very close to proof of citation. This command lists the pages it fetched most often:
grep "Perplexity-User" access.log \
| awk '{print $7}' | sed 's/?.*//' \
| sort | uniq -c | sort -rn | head -50
Swap in PerplexityBot to see which pages are being indexed. Pages that PerplexityBot crawls but Perplexity-User never fetches are indexed but losing out at answer time. Pages that neither bot visits have an access problem.
Verify the Bot Is Real
User agent strings are easy to fake. Perplexity publishes IP ranges for PerplexityBot and Perplexity-User. Match logged IPs against those lists before trusting the counts. Our bot traffic statistics show how common spoofed AI crawlers have become.
Method 4: See If Your Pages Rank in Perplexity Search
Perplexity’s Search API returns the ranked pages from its own index for any query, without generating an answer. It costs $5 per 1,000 requests ($1 for fast mode), with no token charges. That makes it a cheap way to check rung 2: is your page even in the pool Perplexity picks sources from?
import os, requests
def perplexity_search(query, country="US"):
r = requests.post(
"https://api.perplexity.ai/search",
headers={"Authorization": f"Bearer {os.environ['PERPLEXITY_API_KEY']}"},
json={"query": query, "max_results": 20, "country": country},
timeout=30,
)
r.raise_for_status()
return r.json()["results"]
for pos, item in enumerate(perplexity_search("how to find orphan pages in wordpress"), 1):
print(pos, item["url"])
If your page is missing from the top 20 for a question, it is very unlikely to be cited in the answer. Fix that the way you would fix a ranking problem: a clearer title, a direct answer near the top and stronger topical authority.
Method 5: Track Citations at Scale With the Sonar API
The Sonar API runs the full answer pipeline and returns two lists with every response: search_results, the pages it retrieved, and citations, the URLs behind the numbered markers in the answer (Perplexity’s API docs show both). Comparing them is the most useful thing you can do, because it separates pages that were considered from pages that were cited.
Put your questions in a file called prompts.txt, one per line, set your domain and run the script below. It asks each question three times, since answers vary between runs.
import os, re, csv, time, requests
from collections import defaultdict
from urllib.parse import urlparse
DOMAIN = "example.com"
RUNS = 3
KEY = os.environ["PERPLEXITY_API_KEY"]
stats = defaultdict(lambda: {"retrieved": 0, "cited": 0, "prompts": set()})
def ask(question):
r = requests.post(
"https://api.perplexity.ai/chat/completions",
headers={"Authorization": f"Bearer {KEY}"},
json={"model": "sonar",
"messages": [{"role": "user", "content": question}],
"web_search_options": {"search_context_size": "low"}},
timeout=60,
)
r.raise_for_status()
return r.json()
def mine(url):
host = urlparse(url).netloc.lower()
return host == DOMAIN or host.endswith("." + DOMAIN)
prompts = [l.strip() for l in open("prompts.txt") if l.strip()]
for q in prompts:
for _ in range(RUNS):
data = ask(q)
answer = data["choices"][0]["message"]["content"]
used = {int(n) for n in re.findall(r"\[(\d+)\]", answer)}
for item in data.get("search_results", []):
if mine(item["url"]):
stats[item["url"]]["retrieved"] += 1
for i, url in enumerate(data.get("citations", []), 1):
if mine(url) and i in used:
stats[url]["cited"] += 1
stats[url]["prompts"].add(q)
time.sleep(1)
total = len(prompts) * RUNS
with open("perplexity_citations.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["url", "retrieved", "cited", "citation_rate", "prompts"])
for url, s in sorted(stats.items(), key=lambda x: -x[1]["cited"]):
w.writerow([url, s["retrieved"], s["cited"],
f"{s['cited'] / total:.0%}", " | ".join(sorted(s["prompts"]))])
print("Saved perplexity_citations.csv")
The output CSV gives each of your URLs a retrieved count, a cited count, a citation rate across all runs and the questions that triggered it.
Table 3: Estimated Cost of a Sonar Citation Audit (Our Estimate)
| Audit Size | Requests | Request Fees (Low Context) | Tokens (Approx.) | Total (Approx.) |
|---|---|---|---|---|
| 50 questions x 3 runs | 150 | $0.75 | $0.25 | Around $1 |
| 200 questions x 3 runs | 600 | $3.00 | $1.00 | Around $4 |
| 1,000 questions x 3 runs | 3,000 | $15.00 | $5.00 | Around $20 |
Request fees use Perplexity’s published Sonar rate of $5 per 1,000 requests at low search context. The token figures are our estimate, assuming about 1,000 tokens per response at $1 per million tokens each way.
API Answers Are Not Identical to the App
The consumer app uses its own model choices, Pro Search and some personalization, so its sources can differ from Sonar’s. Treat API results as a consistent, repeatable sample for trends, and spot-check your most important questions by hand with Method 2.
Reading the Gaps Between Rungs
The real value comes from lining the methods up. A page that drops out between two rungs has a specific problem, and each gap has its own fix.
Table 4: Where Pages Drop Out and What to Do
| Gap | What It Means | Fix |
|---|---|---|
| Not crawled by PerplexityBot | Bot is blocked or cannot reach the page | Allow PerplexityBot in robots.txt and your CDN or firewall bot rules |
| Crawled, but not in Search API results | Page does not rank for the question | Sharpen the title and opening answer, build topical depth |
| Retrieved, but rarely cited | Perplexity found the page but used a better source | Put a direct, quotable answer in the first 100 words, add specific numbers and dates |
| Cited, but no GA4 clicks | Answer satisfies the user without a visit | Add tools, data or downloads the answer cannot replace |
| Cited and clicked | Working page | Refresh it regularly; Perplexity favors recently updated sources |
The retrieved-but-not-cited gap is usually the biggest and the most fixable. Perplexity tends to quote passages that answer the question in one or two plain sentences, much like a featured snippet. Our guide to LLM SEO covers passage-level formatting in more depth, and the differences between GEO and SEO explain why ranking alone does not guarantee a citation.
Tools That Track Perplexity Citations for You
If you would rather not run scripts, several AI visibility platforms run prompt sets across Perplexity and other assistants on a schedule and report which of your URLs get cited, alongside competitors. Our roundup of AI visibility tracking tools compares the main options and their pricing. The trade-off is cost: most charge a monthly fee that is far higher than running the Sonar script yourself, in exchange for dashboards, competitor tracking and coverage of the consumer apps.
FAQs
Does Perplexity Have a Webmaster Tool Like Search Console?
No. Perplexity has no publisher console that lists cited pages. You need to combine GA4 referrals, server logs and API checks to build that list yourself.
Can I Block Perplexity From Citing My Site?
You can block PerplexityBot in robots.txt, which removes your pages from its index. Perplexity-User fetches pages on behalf of users and generally does not follow robots.txt, so blocking it needs a firewall rule using Perplexity’s published IP ranges.
Why Does My Page Appear in Perplexity Sources but Not in GA4?
Either nobody clicked the citation, or the visit arrived without a referrer, often from the mobile app, and GA4 counted it as Direct.
How Often Should I Check Perplexity Citations?
Monthly is enough for most sites. Run each question several times per check, because Perplexity’s sources vary between runs.
Do Perplexity Citations Help Google Rankings?
Not directly. A citation is not a backlink Google counts, but cited pages often earn clicks, mentions and links that do support rankings over time.
Also See: