# Search Highlights (/features/search-highlights)

<!-- agent-signals: reading_time_min: 3 · est_tokens: 1496 · updated: 2026-07-30 -->
Related: [Search](/features/search.md), [Research Index](/features/research.md), [Scrape](/features/scrape.md), [Faster Scraping](/features/fast-scraping.md), [Batch Scrape](/features/batch-scrape.md), [JSON mode - Structured result](/features/llm-extract.md)

Search Highlights replace each result's plain website description with passages from the page that are relevant to your query. They are enabled by default on `/v2/search`; no additional parameter, output format, or `scrapeOptions` is required.

Highlights preserve the search result's URL, title, position, and ranking. For web results, the highlighted text is returned in `description`; for news results, it is returned in `snippet`.

<Note>
  If Firecrawl cannot generate a highlight for a result, the website's plain description or snippet is preserved. One unavailable page will not prevent the other search results from being returned.
</Note>

## Highlights are enabled by default [#highlights-are-enabled-by-default]

Use Search normally and Firecrawl will return highlights when relevant page content is available.

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")

      results = firecrawl.search(
          query="how does firecrawl handle javascript rendering",
          limit=5,
      )

      for result in results.web or []:
          print(result.description)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from 'firecrawl';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      const results = await firecrawl.search(
        'how does firecrawl handle javascript rendering',
        {
          limit: 5,
        }
      );

      for (const result of results.web ?? []) {
        console.log(result.description);
      }
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/search \
        -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "query": "how does firecrawl handle javascript rendering",
          "limit": 5
        }'
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl search "how does firecrawl handle javascript rendering" \
        --limit 5
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

### MCP [#mcp]

The `firecrawl_search` MCP tool also returns highlights by default:

```json title="MCP"
{
  "query": "how does firecrawl handle javascript rendering",
  "limit": 5
}
```

## Response [#response]

Highlights use the existing description fields, so the response shape stays the same as a normal search response.

````json
{
  "success": true,
  "data": {
    "web": [
      {
        "url": "https://www.firecrawl.dev/blog/javascript-web-scraping",
        "title": "Web Scraping With JavaScript: Step-by-Step Guide",
        "description": "# Web Scraping With JavaScript: Step-by-Step Guide\n## When should you use scraping APIs instead of DIY tools?\n### Setting up Firecrawl\n```\nnpm install firecrawl\n```\n\n```\nFIRECRAWL_API_KEY=fc-your-api-key-here\n```\n\n### Solving the JavaScript quotes problem\nYou describe what you want, and Firecrawl handles extraction and validation.",
        "position": 1
      }
    ]
  }
}
````

Highlights may contain Markdown when the relevant page content includes headings, lists, tables, or code. Render or process the field as Markdown if you want to preserve that structure.

## Disable highlights [#disable-highlights]

Set `highlights` to `false` when you want each website's plain description or snippet instead.

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      results = firecrawl.search(
          query="Firecrawl search API",
          highlights=False,
      )
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      const results = await firecrawl.search('Firecrawl search API', {
        highlights: false,
      });
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/search \
        -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "query": "Firecrawl search API",
          "highlights": false
        }'
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl search "Firecrawl search API" --no-highlights
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

## Behavior by result type [#behavior-by-result-type]

* **Web:** Replaces `description` with query-relevant page content when available.
* **News:** Replaces `snippet` with query-relevant page content when available.
* **Images:** Image results are returned unchanged.
* **Search with scraping:** Highlights affect the search description or snippet. Content requested through `scrapeOptions` is returned separately and is not replaced.
* **Zero Data Retention:** ZDR searches retain the websites' plain descriptions and snippets.

For every Search parameter and the complete response schema, see the [Search API reference](/api-reference/endpoint/search).
