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.
Get a free AI-visibility audit → · Read the docs → — No card, no account.
Get my free auditHow Perplexity citation tracking works
- Fetch with
surfaces: ["perplexity"]. Each delivered record carries the answer text and the numbered source list — title, URL, position — already structured. - 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.
- 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.
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.
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