How to Find Pages Cited by Perplexity: 5 Methods, From Free to API

5/5 - (5 votes)

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.

pages cited by perplexity
Five levels of evidence that Perplexity uses a page, and where to find each one

Table 1: The Five Methods at a Glance

MethodWhat It ProvesCostEffort
GA4 referral reportPage was cited and clickedFree5 minutes
Manual checks in PerplexityPage is cited for a specific questionFreeSlow for more than 20 queries
Server logsPage was crawled or fetched live for an answerFreeNeeds log access
Search APIPage ranks in Perplexity’s own search index$5 per 1,000 queriesShort script
Sonar APIPage is cited in a generated answerAbout $5 to $12 per 1,000 queries plus tokensShort script

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 AgentWhat It DoesWhat a Hit Tells YouRespects robots.txt
PerplexityBotCrawls pages to build Perplexity’s search indexThe page can be found and cited (rung 1)Yes
Perplexity-UserFetches a page live when a user asks a questionThe 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 SizeRequestsRequest Fees (Low Context)Tokens (Approx.)Total (Approx.)
50 questions x 3 runs150$0.75$0.25Around $1
200 questions x 3 runs600$3.00$1.00Around $4
1,000 questions x 3 runs3,000$15.00$5.00Around $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

GapWhat It MeansFix
Not crawled by PerplexityBotBot is blocked or cannot reach the pageAllow PerplexityBot in robots.txt and your CDN or firewall bot rules
Crawled, but not in Search API resultsPage does not rank for the questionSharpen the title and opening answer, build topical depth
Retrieved, but rarely citedPerplexity found the page but used a better sourcePut a direct, quotable answer in the first 100 words, add specific numbers and dates
Cited, but no GA4 clicksAnswer satisfies the user without a visitAdd tools, data or downloads the answer cannot replace
Cited and clickedWorking pageRefresh 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:

Add Comment