Use case4 min read2026-07-28

Track Perplexity citations

Perplexity is the most citation-forward engine in AI search: nearly every answer arrives with numbered sources, and users click them. That makes it the cleanest place to run a citation program — the signal is dense, ordered and comparable between runs, with none of the "did it browse this time?" ambiguity other engines carry. Tracking those citations means recording, per query, which URLs Perplexity numbered and where yours sat — this week, last week, the week a competitor's post displaced you. AgentGEO returns the numbered list as sources[] on every fetch, so the tracker is a loop over your query file.

Read this page with an AI

The question this answers is concrete: which pages does Perplexity trust for the queries my buyers ask — and is my page one of them? Position matters here more than anywhere: source [1] frames the whole answer.

How Perplexity citation tracking works

  1. Fetch with surfaces: ["perplexity"]. Each delivered record carries the answer text and the numbered source list — title, URL, position — already structured.
  2. Reduce URLs to hosts and store with dates. Host-level rows make "who owns this query" legible; keep the full URL too for the page-level story.
  3. Watch position, not just presence. Moving from source [4] to source [1] changes what the answer says about you. Store position every run so the trend is visible.
perplexity_citations.py
import requests
from collections import Counter

QUERIES = [
    "best crm for small business",
    "hubspot alternatives",
]

hosts = Counter()
for query in QUERIES:
    resp = requests.post(
        "https://api.agentgeo.org/v1/fetches",
        json={"query": query, "surfaces": ["perplexity"]},
        headers={"Authorization": "Bearer ag_live_your_key_here"},
        timeout=200,
    )
    resp.raise_for_status()
    for answer in resp.json()["answers"]:
        for src in answer.get("sources") or []:
            host = src["url"].split("/")[2].removeprefix("www.")
            hosts[host] += 1
            print(f"{query[:32]:32} [{src['position']}] {host}")

print("\nmost-cited hosts:")
for host, n in hosts.most_common(10):
    print(f"  {n:3}  {host}")

The ranked host list is the strategy input: the hosts Perplexity keeps citing for your category are the publications worth pitching, the formats worth copying, and — where the host is a competitor — the pages you need an answer to. The full Python walkthrough adds URL normalization and dated persistence.

If a fetch fails on a slow scrape, the error carries providerFields.snapshot_id — retry with that snapshot_id (same single surface) to collect the finished answer without paying twice. Build the retry in; don't re-fetch blind.

Let your agent run it

Over MCP, ask the agent "who does Perplexity cite for our money queries, and did anything change since the last run?" — the geo-citations skill shipped in agentgeo-mcp runs the loop, diffs against stored runs and reports in prose with the table attached.

One line to install
claude mcp add agentgeo -- npx -y agentgeo-mcp --key ag_live_...

Alternatives

Perplexity's own API serves its answers to build products on — it is not shaped for brand monitoring across engines, and its output differs from what the consumer surface shows. Dashboards track Perplexity among their engines behind their UI (Otterly covers this well for marketers). DIY scraping hits the usual wall: the citation markup is exactly the part that changes without notice.

More use cases

This is the single-engine deep cut of AI citation tracking; pair it with AI Overviews monitoring for the Google side — see all use cases.

See who Perplexity cites for your category: Get a free AI-visibility audit →

Get my free audit

FAQ

Direct answers to the questions this page raises.

Density and order. Perplexity numbers sources on nearly every answer, so a fixed query set yields a comparable citation list every run — the cleanest longitudinal signal in AI search. ChatGPT cites mainly when it browses; AI Overviews only when an overview appears at all.

Records come from managed scrapers reading the consumer surface, not from a developer LLM API — so the source list is the one attached to the answer a user would get, with position preserved. Answers still vary between runs; that variance is real and worth recording.

Read their cited page before writing anything. Perplexity tends to reward pages that answer the query directly near the top. The record gives you the URL — the fix is editorial, and now it's targeted.

No — every plan is paid, and a workspace fetches nothing live until it has one. What costs nothing: the human-run audit, and ag_test_ keys, which return labelled demo records at zero credits.

Keep reading

Where this page leads next.

Run these checks on your own brand

Two ways in. Send a URL and a person runs the fetches for you, free — or connect your agent over MCP, on a plan, and run them yourself. Either way you get the raw answers and their citations, never a score.