# How Perplexity cites its sources, and what it means for your brand

Published: 2026-11-09. Updated: 2026-11-09. Written by: Framepx Team.

Perplexity's API builds a cited answer in two steps: a web search returns results, then a model writes the answer and points to those results by number ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). For a brand, the useful part is what the docs show a search result is made of, and which controls a builder can use to include or drop it.

![How a cited answer is built: a question goes to a web search, results come back with numbers, a model writes the answer with markers that point to those numbers, and the sources are listed beside it.](/blog/perplexity-lead-en.svg "A cited answer in one picture: search, numbered results, an answer that points back to them.")

Everything below that comes from Perplexity's documentation is linked to its page. Anything about what a brand should do is our reading, and we say so each time. One limit up front: these are the developer docs. They describe the API, not the Perplexity app on your phone, and they say nothing about how results are ranked.

## What the docs describe: two roads and one retired one

The API platform has several APIs behind one key. Two matter for citations ([platform overview](https://docs.perplexity.ai/docs/getting-started/overview)):

- **Search API:** ranked web results as JSON, with `title`, `url`, `date` and a text `snippet`. No model and no generated answer.
- **Agent API:** a finished answer with citations, where the model can use a `web_search` tool.

The older road was Sonar Chat Completions. Its responses carried a `citations` list of URLs and a `search_results` list of objects, next to an answer with markers such as `[1][2][7]` ([Sonar quickstart, legacy](https://docs.perplexity.ai/docs/legacy/sonar/quickstart)). The docs now say that Sonar Chat Completions support ended on September 27, 2026, and that synchronous and streaming requests keep working while they are reformulated as Agent API requests ([migration overview](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview)). So the shape you will meet today is the Agent API's, and we describe that one first.

## How an answer gets its sources

In the Agent API, `web_search` is a tool in the request. The model decides when to call it, based on your prompt and instructions ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). The steps, as the docs lay them out:

1. The model runs one or more searches. With several reformulated queries, the result budget is split between them ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)).
2. The response can include a `search_results` item before the final message. Each result carries an `id`.
3. The answer text is a separate `message` item. The `[n]` markers sit inside that text, and each one maps to the result whose `id` is `n` ([migration guide](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/how-to)).

![An annotated response: a short request, then the search_results item with three numbered results from placeholder shops, then an answer sentence with markers [1] and [2] pointing to results 1 and 2.](/blog/perplexity-response-en.svg "The shape of a cited response. Domains are placeholders, the structure follows the docs.")

Two details are easy to miss. First, markers are not guaranteed: whether the model adds them "is prompt-dependent", and the docs say to treat each entry's `id` and `url` as the source of truth ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). The `fast`, `low`, `medium` and `high` effort levels already include inline citations, numbered like `[1]` on `fast` and typed like `[web:1]` on the others ([migration guide](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/how-to)). Second, the published default instructions of the `fast` level tell the model to cite every sentence that uses search information, to cite up to three sources per sentence, and to leave out citations if it did not search ([effort levels](https://docs.perplexity.ai/docs/agent-api/effort)). By those instructions, a cited sentence is meant to rest on a result the search found (our reading; the markers themselves depend on the prompt).

## What a source looks like

Each entry in `search_results` has seven fields ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)):

- `id`: the stable index a citation refers to
- `url`: the canonical URL of the source page
- `title`: the page title as the source returns it
- `snippet`: excerpted text extracted from the page during search
- `date`: when the page was first published, as `YYYY-MM-DD`
- `last_updated`: when it was last updated
- `source`: where the result came from, for example `web`

The Search API page adds that `snippet` is query-relevant text, cut to a token limit, and "can be an empty string"; `date` and `last_updated` can be `null` ([Search API overview](https://docs.perplexity.ai/docs/search/overview)). The docs do not say why a snippet comes back empty.

## The controls a builder holds

A builder who calls the API can narrow where answers come from. This is the part brands rarely see.

| Control | What it does | Limit |
| --- | --- | --- |
| `search_domain_filter` | Include only the listed domains or URLs, or exclude them with a `-` prefix | Up to 20 entries, allowlist or denylist, not both |
| `search_recency_filter` | Keep results from the past `hour`, `day`, `week`, `month` or `year` | One value |
| `search_after_date_filter`, `search_before_date_filter` | Keep results published inside a date window | `MM/DD/YYYY` |
| `last_updated_after_filter`, `last_updated_before_filter` | Filter by when the page was last updated, not first published | `MM/DD/YYYY` |
| `search_language_filter` (Search API) | Return only results in the listed languages | Up to 20 ISO 639-1 codes |
| `user_location` (Agent API) or `country` (Search API) | Shape results for a country, region or city | Country as a two-letter code |
| `max_results` | How many results a call collects | 1 to 50 in the Agent API tool; 1 to 20 for Search API web search |

Sources: [Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search), [Search API overview](https://docs.perplexity.ai/docs/search/overview), [domain filter](https://docs.perplexity.ai/docs/search/filters/domain-filter), [date filters](https://docs.perplexity.ai/docs/search/filters/date-time-filters), [language filter](https://docs.perplexity.ai/docs/search/filters/language-filter).

The domain filter works at domain level (`wikipedia.org`) or at URL level, and the docs use a `.gov` entry as an example ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). The recency windows map to the past hour, 24 hours, 7 days, 30 days and 365 days.

![A funnel: all web pages narrow through a domain filter, a recency or date filter, a language filter and a location filter into the small set of results the model reads.](/blog/perplexity-controls-en.svg "Each control the builder sets removes pages before the model reads anything.")

The filters compose: the docs say there is no per-request limit on combining them ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). The sizes of the limits are easier to see than to read.

![Two small bar charts: Search API limits per request, 5 queries, 20 results, 20 domains, 20 languages; and the five recency windows on a log scale, from one hour to 365 days.](/blog/perplexity-limits-en.svg "Documented limits per request, and the recency windows. Different units, so two panels.")

## What a brand can learn (our reading)

The docs do not tell a brand how to get cited. Nothing there lets you submit a page, pay for a place or ask for inclusion. What they show is the machinery. Reading it, we would draw five conclusions, and none of them is a Perplexity promise.

1. **Write for the snippet.** The `snippet` is text extracted from the page for the query. A page that states its answer plainly near the top gives that extraction something to work with. We have not tested how Perplexity picks the text.
2. **Keep a real title.** `title` is returned as the source gives it, and it is what a reader sees next to the marker.
3. **Date pages honestly and update them.** `date` and `last_updated` are fields, and the date and recency filters act on them. The docs do not say how a page with a `null` date is treated under a filter, so do not count on it.
4. **Expect several searches for one question.** The model may reformulate. Cover the nearby phrasings of a question on the page, not only one.
5. **Publish in your customers' language.** The Search API has a language filter, so a builder can limit a Turkish question to Turkish results. A Turkish buyer needs a Turkish page.

For an agency, the practical step is to look, not guess. Run your category's questions through the Search API or an Agent API call with `web_search`, and read which `url` values come back, at what dates, and with what `snippet`. The docs price `web_search` at $2.50 per 1,000 invocations, or $1.00 with `search_type: "fast"`, plus model tokens ([Web Search docs](https://docs.perplexity.ai/docs/agent-api/tools/web-search)). A script that does this is a fair job for a tool like [Claude Code](/blog/what-is-claude-code-and-what-can-a-marketer-do-with-it). For the wider picture across assistants, see [how products show up in AI answers](/blog/how-products-show-up-in-ai-answers-chatgpt-gemini-claude-perplexity).

## What we cannot tell you

- How results are ranked. The Search API pages call its results "ranked" and stop there.
- Whether the Perplexity app uses the same settings as the API. The docs describe the API, and they say the grounded search once built into Sonar is now available as the `web_search` tool ([migration guide](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/how-to)).
- How often a given site is cited. No figure in these pages speaks to that, so we give none.

Being cited is only half of the work. The page a reader lands on, or the ad that follows, still has to hold up: you can check an ad's creative before you spend with the free [creative score](/tools/creative-score). If your products live in a feed and you want finished ads from it, that is what Framepx does: an AI system that turns product feeds into ads ([how it works](/how-it-works)).

## FAQ

**Does Perplexity always cite sources?**
Not by rule. In the Agent API, markers depend on the prompt, though the `fast`, `low`, `medium` and `high` effort levels include citation instructions by default ([migration guide](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/how-to)). The `fast` level's instructions say to skip citations when no search was run ([effort levels](https://docs.perplexity.ai/docs/agent-api/effort)).

**Is `[1]` the top search result?**
The docs say `[n]` maps to the result whose `id` is `n`. They do not say that `id` 1 is the best result.

**Can I pay or submit my site to be cited?**
The docs describe no such option. The controls they list belong to the developer who calls the API.

**Is Sonar still the way to get citations?**
Support for Sonar Chat Completions ended on September 27, 2026, and the docs recommend the Agent API for all new projects ([migration overview](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview)).

## Sources

- [Perplexity API Platform overview](https://docs.perplexity.ai/docs/getting-started/overview)
- [Web Search (Agent API)](https://docs.perplexity.ai/docs/agent-api/tools/web-search)
- [Search API overview](https://docs.perplexity.ai/docs/search/overview)
- [Search domain filter](https://docs.perplexity.ai/docs/search/filters/domain-filter)
- [Search date and time filters](https://docs.perplexity.ai/docs/search/filters/date-time-filters)
- [Search language filter](https://docs.perplexity.ai/docs/search/filters/language-filter)
- [Migrate from Sonar to the Agent API](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview)
- [How to migrate from Sonar](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/how-to)
- [Effort levels](https://docs.perplexity.ai/docs/agent-api/effort)
- [Sonar quickstart (legacy)](https://docs.perplexity.ai/docs/legacy/sonar/quickstart)
