# `Perplexed.Search.Hit`
[🔗](https://github.com/agoodway/perplexed/blob/v0.2.0/lib/perplexed/search/hit.ex#L1)

One search result, normalized across providers.

`description` is the provider's text about the page for this query: a
snippet, highlights, or a long summary, depending on the provider.
`content` is page text when the provider returns it (DeepSeek with
`need_content: true`), otherwise `nil`. `document` is the scraped page when
the search ran with `scrape: true` and the page was readable; otherwise
`scrape_error` says why it was not (for example
`{:unreadable, %{attempts: [direct: :blocked, impersonated: :blocked], cost: 0.0}}`).
`engines` names the upstream engines that returned the page, for
metasearch providers such as `Perplexed.Search.SearXNG`; other providers
leave it empty. `metadata` holds what else the provider said about the
result, such as DeepSeek's `rerank_score`, `authority`, `snippet` and
`site_name`; `Perplexed.answer/2` shows the ranking step the ones it
knows (see `Perplexed.Pipeline`).

# `t`

```elixir
@type t() :: %Perplexed.Search.Hit{
  content: String.t() | nil,
  description: String.t() | nil,
  document: Perplexed.Document.t() | nil,
  engines: [String.t()],
  metadata: map(),
  provider: atom(),
  published_at: String.t() | nil,
  scrape_error: term(),
  title: String.t() | nil,
  url: String.t()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
