$ cd ~/ai-seo-research/perplexity # updated 27 Jul 2026

Perplexity

How Perplexity retrieves and cites sources, read straight off the answer stream on my own logged-in Pro account and kept current as it changes. The full teardown is in how Perplexity picks its sources; this page is what is true now, plus every change since.

structural means a field or behaviour read straight off the wire; one clean capture proves it. directional means a frequency from a small, single-account sample: the shape, not the number. Read it on your own session with FanoutFox.

$ cat state # what is true now

The most transparent of the three at the wire. It ships you the raw output of its own intent classifiers, thresholds and all, and on the current build it labels sources with a written trust note scoped to what that domain can be believed on.

  • Classifier scorecard structural

    Sixteen intent heads arrive with every answer in classifier_results.mhe_predictions_full, each carrying a probability and the fixed bar it has to beat, plus a domain_subdomain topic label. The bars have not shifted by a digit across 26 days and several builds, so treat them as a real decision boundary.

  • Web search structural

    skip_search came back false on every query I tried, so there's no class of question answered from training alone the way ChatGPT handles how-tos. Every query here is worth competing for. Instructional ones quietly escalate to Study mode (pplx_study, search_mode STUDY) and open a video tab on top.

  • Caching structural

    None that I can find. Running the same query twice minutes apart fired a fresh SEARCH_WEB both times and regenerated the answer rather than replaying it. What it searches is a pre-crawled index though, not your live page, and result timestamps run back to 2021 and older.

  • Repeatability structural

    Retrieval isn't deterministic. Two runs of a head term returned the same 10 sources in a different order. Two runs of a long-tail query returned 30 sources then 15, with only 14 in common. One run is not a measurement.

  • Fan-out structural

    It searches the words you typed instead of inventing its way around them. Most queries ran one near-verbatim search. By the July build that step carried three close variants, one of them folding in my city unprompted. The wide multi-query fan-out belongs to Deep Research, not default search.

  • Trust field structural

    Sources can carry a trust object: a level, a tier name (credible or trusted) and a written sentence saying what that domain can be believed on. Every entry I captured was scoped to what the domain owns, so a site gets believed about its own products and services rather than in general. Nothing else exposes this.

  • Local structural

    Local queries clear the places bar and fire a second round on a map engine through its own retrieval channel (meta_data.client: search_api_local). Bind to the places index and the businesses take every citation while the roundups get nothing. Fail to bind and those same roundups inherit the whole answer.

  • Deep Research structural

    Deep Research is a different engine (pplx_alpha). It loads a named research skill, runs only about three reformulated searches, then calls GET_URL_CONTENT on two or three hand-picked URLs and reads them end to end. Whatever it reads in full dominates the citations.

  • Ranking structural

    No ranking score reaches the browser. The trust tiers get closest and they still order nothing inside an answer. Whatever sorts the retrieved set stays server-side, so anyone selling you reverse-engineered Perplexity ranking factors is guessing.

  • Privacy structural

    Logged-in Pro threads default to PRIVATE_READ. I'd earlier noted that throwaway threads come back world-readable by URL; that only held for logged-out sessions, not as a universal default.

  • What gets cited directional

    The mirror image of ChatGPT. YouTube is a first-class cited source and Reddit gets fetched then ignored. Comparison queries go to the named vendor's own vs page, news goes to the official announcement over fresher trade press, and commercial queries favour current-year listicles over the big brand pages.

$ ls changelog # 6 entries

Every change I catch in the traffic, newest first.

structural

Perplexity doesn't cache answers, and the same query twice returns a different source set

Two identical queries run minutes apart both fired a fresh search and produced a regenerated answer. On a long-tail query the retrieved set went from 30 sources to 15, with only 14 in common.

Why it matters for AI visibility

One run isn't a measurement. If you track whether you get cited in Perplexity, a single check tells you almost nothing on a long-tail query, because half the candidate set can change between two runs a minute apart. Run it several times and take the distribution. The same goes for anyone quoting you a Perplexity "position", since even on a stable head term the order moved between runs.

read the detail

Someone pushed back on the claim that Perplexity always searches, so I went and tested the obvious hole in it. If answers were cached, the search step would be theatre.

They aren’t. I ran two queries twice each, minutes apart, same logged-in Pro account, and caught all four on the wire.

Every run fired SEARCH_WEB with skip_search false. Nothing was served from a cache, and the answer prose was rewritten each time rather than replayed. On “what is technical seo” the two answers came back at 2,132 and 2,126 characters, opening “crawl, understand, and index” the first time and “crawl, understand, index, and rank” the second.

The interesting part is what happened underneath.

Head term, same set, different order. Both runs on “what is technical seo” pulled the same 10 domains. The order moved though, with Backlinko going from sixth to third between runs a couple of minutes apart.

Long tail, different set entirely. “best kettlebell weight for a third floor flat with thin floors and noisy neighbours” returned 30 sources on the first run and 15 on the second, with only 14 in common. The first run pulled 5 YouTube videos, an Instagram post and a handful of retailers that the second run never saw.

So the retrieval isn’t cached and it isn’t deterministic either. On a head term the candidate set is stable and only the ordering wobbles. Out on the long tail, half of it can turn over between two runs a minute apart.

Worth knowing before you trust any single Perplexity check, your own or a tool’s.

One schema note for anyone replicating this. Sources have moved since the July capture. They now sit at blocks[].web_result_block.web_results rather than at the top level, so an older extraction path returns nothing.

structural

The per-source trust field came back, and this time it has values in it

Sources can now carry a trust object with a numeric level, a tier name (credible or trusted) and a written sentence describing what that domain can be believed on.

Why it matters for AI visibility

Stop asking how to look authoritative. Every entry I captured was scoped to what a domain owns, so the question is what you're the unambiguous first-party source for, and whether that thing is legible on your site. Your products, your pricing, your changelog. A missing entry locks nobody out, though. YouTube carried no trust object and still took 14 of the 40 citations on the same query.

read the detail

I’d already written the negative into the article. No per-source quality signal reaches the browser, and source ranking happens server-side where you can’t see it. June had no trust signal anywhere in the stream. An older free-tier capture carried a trust field on every source sitting empty, then build 7fe6ad4 dropped it completely.

Re-ran everything on 21 July, build df49f17, and it’s back with values in it.

"trust": {
  "level": 1,
  "name": "credible",
  "description": "is credible for first-party information about Discount Tire's U.S. tire and wheel retail stores, services, warranties, and related offerings."
}

Two tiers showed up, level 1 credible and level 2 trusted, the second sitting on goodyear.eu for “official Goodyear tyre product information”.

The description is the interesting part, because it’s a sentence rather than a score. caranddriver.com is credible for “long-established, professionally edited” automotive coverage. aaa.com is credible for “official information about AAA’s own membership services”. A domain gets believed about its own patch, never in general.

Coverage looks like a hand-curated registry working down from the head of the web, not a number computed per URL on demand. On the how-to run, 6 of 15 sources carried an entry and every one was a big official domain. The 6 YouTube results had nothing. Neither did any of the 15 sources on a local run made up of small editorial sites.

Two builds in two months took this field from empty to gone to populated, so read the tier names and the wording as a system mid-rollout rather than an API you can plan against.

structural

The answer socket stopped closing, and the fan-out widened and went local

The stream no longer closes when the answer finishes, which breaks any capture script that waits for the end. The single search step also now carries three variants instead of one, including a city-personalised rewrite.

Why it matters for AI visibility

The fan-out is the half to watch. Perplexity still leads with your literal phrasing, so the exact words people type matter more here than in ChatGPT, but "barely rewrites" is drifting towards "rewrites conservatively" and the rewrites now fold in the user's city. If you sell locally, there's a query in that expansion you weren't competing for last month.

read the detail

Two changes on build df49f17, and a June capture script survives neither.

The answer socket doesn’t close any more. It goes quiet when the answer finishes and stays open, so anything waiting for the stream to end waits forever. That’s what quietly killed the first version of my script. You have to read the stream as it arrives instead, which is how the one in the teardown now works.

Then the fan-out. Re-running the commercial query, that single SEARCH_WEB step carried three queries where June had one. The verbatim string plus two close variants. One of them came back as “AI SEO tools Dubai pricing”. My city, folded into the expansion without being asked.

It’s still nothing like ChatGPT firing forty sub-queries and inventing brand names I never mentioned. The head query is your literal phrasing. But the gap is closing.

Local moved too. Same 0.996 on the places head, except the map engine got promoted and ran first this time, three rewritten variations ahead of the web search instead of after it. That session hadn’t shared location, the Places tab came back with “No places match this query”, and with no place-entities to cite the citations dropped straight back to the web results, the same class of listicle that got blanked in June.

Between them the two runs bracket the whole mechanism. When the places index delivers, businesses take every citation and the roundups watch. When it can’t, the roundups inherit the answer.

structural

Perplexity ships you its own intent classifier, thresholds and all

Every answer carries classifier_results.mhe_predictions_full, sixteen intent heads each with a probability, the fixed threshold it must clear to fire, and a topic label for the query.

Why it matters for AI visibility

Every other engine makes you guess which surface you're competing for. This one tells you. Check the head that fires on your money queries before you write anything. A "best X near me" query clears the places bar and drops you into a maps fight where articles don't rank. A how-to pulls a video tab you can't win with a page.

read the detail

Perplexity works out what kind of question you asked before it searches. Then it sends you the decision, and the working-out with it.

Sixteen classifier heads ride on every answer. Places, video, shopping, image generation, a finance card, one head each, and all of them get a probability and a fixed bar to beat.

Ask it to explain the TLS handshake and the query files under TECHNOLOGY/CYBERSECURITY at 0.73 confidence. Nothing fires. image_preview climbs to 0.318 against a 0.42 bar, so an image strip nearly turned up and then didn’t.

The thresholds are the part worth writing down. image_generation wants 0.98, places_search_intent 0.85, shopping_intent 0.80, video_preview 0.50, calculator_widget 0.30. They were identical across all 7 queries in June and identical again on a different build 26 days later, so that’s a real decision boundary rather than a per-query mood.

ChatGPT gives you one label per query and stops there. Perplexity shows its working on every surface it considered, on every single query.

Method and the capture script are in the teardown.

structural

Perplexity never skips the web, and how-tos escalate to Study mode

skip_search was false on every query tested. There is no class of question answered from training alone, and instructional queries silently switch to Study mode with a video tab attached.

Why it matters for AI visibility

In ChatGPT a how-to can be a closed box. It decides it already knows, never fetches, and no page on earth gets in. That failure mode doesn't exist here, so every query is worth competing for. Instructional content gets two slots in Perplexity, the page and the video, and most people are only building for one of them.

read the detail

The best thing in the ChatGPT teardown was the text bucket. Certain queries, mostly how-tos and definitions, get answered straight from training with an empty network tab. You can write the best page in the world and it’ll never be fetched.

Perplexity doesn’t have that gear. skip_search came back false on all 7 queries, including “how do I change a flat tyre step by step”, which is the exact question ChatGPT answered from memory without touching the web.

What it does instead is change mode without telling you. The flat-tyre query didn’t run as a normal search at all. It escalated to Study mode, model: pplx_study, search_mode: STUDY, and fired a video answer tab on top.

Same instinct as ChatGPT, opposite instinct about you. ChatGPT decided it already knew and shut the door. Perplexity decided to teach you and opened a video.

Re-ran it on the July build and got the same escalation, same video tab, video head at 0.988.

directional

YouTube and Reddit swap places compared with ChatGPT

YouTube is cited heavily on how-to and product queries while Reddit threads come back in the retrieved set and get cited zero times. The exact inverse of ChatGPT.

Why it matters for AI visibility

All that Reddit work you did for ChatGPT visibility earns you nothing here. That comes down to capability rather than taste. Perplexity can quote a video and ChatGPT couldn't, so on how-to and product queries a decent YouTube upload does the job a Reddit thread does over there. Budget for the video.

read the detail

ChatGPT cites Reddit constantly and almost never cites YouTube. The reason is dull. It fetches a YouTube page, gets metadata instead of a transcript, and has no text to bind a citation to. Reddit is nothing but text, so Reddit gets quoted.

Perplexity runs the other way entirely.

On “best noise-cancelling earbuds under $150” it pulled 10 sources and cited 2 of them, YouTube and a niche eartips brand’s review page, 38 citations each. Three Reddit threads sat in the retrieved set and got cited zero times. The flat-tyre how-to cited YouTube 22 times across 3 videos.

Treat the counts as directional. One account, one city, a handful of queries I picked myself. The direction has a mechanism under it, so trust the shape and throw the numbers away.