# Brave Search Scraper (`parsebird/brave-search-scraper`) Actor

Scrape Brave Search results for any query: rank, title, URL, displayed URL, snippet, domain, date, thumbnail and sitelinks. Pick country, language and safe search. Export as JSON, CSV or Excel, or use the API.

- **URL**: https://apify.com/parsebird/brave-search-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.39 / 1,000 search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Brave Search Scraper

**Brave Search Scraper** extracts organic web results from [Brave Search](https://search.brave.com) for any keyword: rank, title, URL, displayed URL, snippet, domain, date, thumbnail and sitelinks. Pick from 39 countries, a search language and a safe search level, and get clean SERP data without a Brave Search API key.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Track rankings on Brave's independent search index: every result comes with its exact position, page number, publication date and sitelinks, deduplicated across pages and ready for SEO reports, monitoring or AI pipelines.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/brave-search-scraper. Scrapes organic web results from Brave Search (search.brave.com) for one query per run. Call via ApifyClient: client.actor("parsebird/brave-search-scraper").call(run_input={"query": "best electric cars 2025", "maxItems": 50, "country": "us", "language": "en", "safeSearch": "moderate"}). Inputs: query (string, required; Brave search operators such as site:, "exact phrase" and -word work), maxItems (integer, default 50, min 1; Brave shows about 20 results per page and up to roughly 100-120 per query), country (string, default "us"; one of all, ar, au, at, be, br, ca, cl, cn, dk, fi, fr, de, gr, hk, in, id, it, jp, kr, my, mx, nl, nz, no, ph, pl, pt, ru, sa, sg, za, es, se, ch, tw, tr, gb, us), language (string, default "en"; search language preference such as de, fr, es, ja, pt-br, zh-hans), safeSearch ("off" | "moderate" | "strict", default "moderate"), proxyConfiguration (optional, default Apify US residential proxy). Output: one row per result with position (1-based rank), resultTitle, link, displayedUrl, snippet, domain, siteName, date (as shown by Brave), publishedAt (ISO date), thumbnail, siteLinks[{title, link, snippet}], page, searchQuery, country, language, safeSearch, scrapedAt. Pricing: pay per event, $3.99 per 1,000 results on the Free plan plus a small run start fee. Full API spec: https://apify.com/parsebird/brave-search-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is Brave Search Scraper?

**Brave Search Scraper** turns a [Brave Search](https://search.brave.com) results page into structured data. Type a query, as you would on search.brave.com, and click **Start**. To try it, keep the prefilled query **best electric cars 2025**: the run saves 50 ranked results in a few seconds.

Brave Search runs on its own web index rather than reselling Google or Bing results, so its rankings are a separate signal worth tracking. Brave Search Scraper works as a **Brave Search API alternative** for SERP data: no API key, no setup. Download results as **JSON, CSV or Excel**, or read them through the [Apify API](https://docs.apify.com/api/v2).

### What can Brave Search Scraper do?

- 🔎 **Scrape any Brave Search query**, including search operators such as `site:reddit.com`, `"exact phrase"` and `-word`.
- 🏁 **Record exact rankings**: each result gets its 1-based position and the page it was on.
- 🌍 **Localize results** for 39 countries, or turn off country ranking with **All regions**.
- 🗣️ **Set a search language** and a **safe search** level (off, moderate, strict).
- 🔗 **Collect sitelinks** shown under navigational results, such as the section links under `amazon.com` or `nytimes.com`.
- 📅 **Get dates and thumbnails** when Brave shows them, both as displayed (`1 day ago`) and as an ISO timestamp.
- ♻️ **Skip duplicates** across pages, so the same URL is never saved or charged twice.
- 🛡️ **Rotate IPs automatically**: every page goes out through a fresh proxy IP, and rate-limited requests are retried.

Because it runs on Apify, you also get:

- [Scheduling](https://docs.apify.com/platform/schedules) to track rankings daily, weekly or at any interval
- [API access](https://docs.apify.com/api/v2) with [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) clients
- [Integrations](https://docs.apify.com/platform/integrations) with Make, Zapier, Google Sheets, Slack, webhooks and more
- Export to JSON, CSV, Excel, XML and HTML

### What data can you extract from Brave Search?

| Field | Description |
|-------|-------------|
| `position` | Rank of the result, starting at 1, counted across pages |
| `resultTitle` | Title of the result |
| `link` | Full URL of the result |
| `displayedUrl` | URL as Brave displays it, such as `caranddriver.com › rankings › best-electric-cars` |
| `snippet` | Description text under the result, with highlight tags removed |
| `domain` | Hostname of the result, such as `www.caranddriver.com` |
| `siteName` | Site name Brave shows, such as `Car and Driver` or `Reddit` |
| `date` | Date as Brave displays it, such as `June 25, 2025` or `1 day ago`, when shown |
| `publishedAt` | Page date as an ISO timestamp, when Brave has one |
| `thumbnail` | Thumbnail image URL, when shown |
| `siteLinks` | Sub-links under the result, each with `title`, `link` and `snippet` |
| `page` | Results page the result appeared on (1, 2, 3 …) |
| `searchQuery`, `country`, `language`, `safeSearch` | The search settings used. `country` is the country Brave actually applied |
| `scrapedAt` | When the result was scraped (ISO 8601, UTC) |

Fields Brave doesn't show for a result are `null`, or an empty list for `siteLinks`.

### How to scrape Brave Search step by step

1. Open [Brave Search Scraper](https://apify.com/parsebird/brave-search-scraper) and sign in to Apify.
2. Enter a **Search query**, such as `best electric cars 2025` or `site:github.com web scraper`.
3. Set **Max results**. Brave shows about 20 results per page.
4. Pick a **Country**, a **Search language** and a **Safe search** level, or keep the defaults (United States, English, Moderate).
5. Click **Start**, then download your data as JSON, CSV or Excel from the **Output** tab.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| query | string | **Yes** | — | Search query. Brave search operators work |
| maxItems | integer | No | `50` | Most results to save (minimum 1) |
| country | string | No | `us` | Country Brave ranks results for: one of 39 country codes, or `all` for All regions |
| language | string | No | `en` | Search language preference, such as `de`, `fr`, `es`, `ja`, `pt-br`, `zh-hans` |
| safeSearch | string | No | `moderate` | `off`, `moderate` or `strict` |
| proxyConfiguration | object | No | Apify US residential | Proxy settings. Set it only to change the default |

Example input:

```json
{
    "query": "best electric cars 2025",
    "maxItems": 50,
    "country": "us",
    "language": "en",
    "safeSearch": "moderate",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US"
    }
}
```

### Output example

```json
[
    {
        "position": 1,
        "resultTitle": "Best Electric Vehicles for 2026, Tested",
        "link": "https://www.caranddriver.com/rankings/best-electric-cars",
        "displayedUrl": "caranddriver.com › rankings › best-electric-cars",
        "snippet": "C/D SAYS: The 2025 Volkswagen ID.Buzz represents the modern revival of the brand's beloved Microbus and is the first electric minivan on the market.",
        "domain": "www.caranddriver.com",
        "siteName": "Car and Driver",
        "date": null,
        "publishedAt": null,
        "thumbnail": "https://hips.hearstapps.com/hmg-prod/images/2023-evoty-the-contenders-649324baab1b1.jpg",
        "siteLinks": [],
        "page": 1,
        "searchQuery": "best electric cars 2025",
        "country": "us",
        "language": "en",
        "safeSearch": "moderate",
        "scrapedAt": "2026-11-07T12:59:47.872Z"
    },
    {
        "position": 1,
        "resultTitle": "Amazon | 本, ファッション, 家電から食品まで | ...",
        "link": "https://www.amazon.co.jp/",
        "displayedUrl": "amazon.co.jp",
        "snippet": "Amazon.co.jp 公式サイト。アマゾンで本, 日用品, ファッション, 食品, ベビー用品, カー用品ほか一億種の商品をいつでもお安く。通常配送無料(一部を除く)",
        "domain": "www.amazon.co.jp",
        "siteName": "Amazon Japan",
        "date": null,
        "publishedAt": null,
        "thumbnail": null,
        "siteLinks": [
            { "title": "Amazon タイムセール", "link": "https://www.amazon.co.jp/gp/goldbox", "snippet": "Tokushoho © 1996-2026, Amazon.com, Inc." },
            { "title": "Prime Video：映画、TV番組、スポーツ番組、ライブTVを視聴…", "link": "https://www.amazon.co.jp/gp/video/storefront", "snippet": "Tokushoho © 1996-2026, Amazon.com, Inc." }
        ],
        "page": 1,
        "searchQuery": "amazon",
        "country": "jp",
        "language": "ja",
        "safeSearch": "moderate",
        "scrapedAt": "2026-11-07T13:03:57.069Z"
    }
]
```

The second row is from a separate run for `amazon` with country Japan, shortened to two sitelinks.

### How to use the Brave Search API in Python and JavaScript

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("parsebird/brave-search-scraper").call(run_input={
    "query": "best project management software",
    "maxItems": 100,
    "country": "gb",
    "language": "en-gb",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["position"], item["domain"], item["resultTitle"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/brave-search-scraper').call({
    query: 'site:reddit.com best budget headphones',
    maxItems: 40,
    country: 'us',
    safeSearch: 'strict',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((row) => console.log(row.position, row.link));
```

Get your token in [Apify Console](https://console.apify.com/settings/integrations). See every option on the [API tab](https://apify.com/parsebird/brave-search-scraper/api).

### Use cases

- **SEO rank tracking:** check where your pages rank on Brave Search for your target keywords, by country.
- **Competitor research:** see which domains own the first pages for a keyword, and how that changes over time.
- **Search engine comparison:** put Brave's rankings next to other engines to see where your visibility differs.
- **Content research:** collect titles, snippets and dates of the top pages before writing on a topic.
- **AI and RAG pipelines:** feed fresh, ranked web results with snippets and links into LLM agents.
- **Brand monitoring:** schedule runs for your brand name and spot new pages, reviews and threads.

### How does Brave Search Scraper work?

1. It opens the Brave Search results page for your query with your country, language and safe search settings.
2. It reads the result data Brave embeds in the page, so titles, URLs, dates and sitelinks come out exactly as Brave has them.
3. It moves through the pages (about 20 results each) until it reaches **Max results** or Brave says there are no more.
4. Every page goes through a fresh proxy IP. If Brave limits a request, the scraper retries it on a new IP.
5. It skips URLs it already saved, numbers results in order, and saves rows page by page, so a stopped run keeps its results.

### How much does it cost to scrape Brave Search?

Brave Search Scraper uses pay-per-event pricing. Compute and proxy costs are included in the event price.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `apify-actor-start`, per run | **$0.005** | **$0.005** | **$0.005** | **$0.005** |
| `result-scraped`, per 1,000 | **$3.99** | **$3.79** | **$3.59** | **$3.39** |

Each saved search result is one `result-scraped` event. Duplicates are skipped and never charged. For example, 50 results for one keyword cost about $0.20 on the Free plan, plus $0.005 for the run start. A start event fires once per run for each GB of run memory, and the default memory stays within one. To cap your spending, set a maximum cost per run in the run options. The run stops at that limit and keeps what it saved.

### Is it legal to scrape Brave Search?

Brave Search Scraper only collects data that search.brave.com shows publicly, without logging in. Web scraping of public data is generally legal, but what you may do with the data depends on your purpose and your country. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Search results can include titles and snippets of third-party pages that are protected by copyright, and pages that mention people. Check Brave Search's terms too, and ask a lawyer if you are unsure. This section is not legal advice.

### Other search scrapers you may like

- [Startpage Search Scraper](https://apify.com/parsebird/startpage-search-scraper): private search results from Startpage
- [Baidu 百度 Search Scraper](https://apify.com/parsebird/baidu-search-scraper): Chinese web search results from Baidu
- [Sogou WeChat Article Search Scraper](https://apify.com/parsebird/sogou-wechat-search-scraper): WeChat articles through Sogou search
- [Google Shopping Scraper](https://apify.com/parsebird/google-shopping-scraper): product listings and prices from Google Shopping
- [Bing Images Scraper](https://apify.com/parsebird/bing-images-scraper): image search results from Bing
- [YouTube Search Scraper & API](https://apify.com/parsebird/youtube-search-scraper): videos from YouTube search
- [Reddit Search Scraper](https://apify.com/parsebird/reddit-search-scraper): posts and comments from Reddit search
- [Similarweb Scraper](https://apify.com/parsebird/similarweb-scraper): website traffic and ranking data

### FAQ

**Do I need a Brave Search API key?**
No. Brave offers its own paid [Brave Search API](https://brave.com/search/api/) with keys and plans. Brave Search Scraper reads the public search pages instead, so you only need an Apify account.

**How many results can I get per query?**
As many as Brave shows, which is usually around 100–120. In our tests, `best electric cars 2025` returned 115 unique results over 6 pages, and a narrow query with operators returned 32. When Brave runs out, the run ends with the message "all Brave Search shows for this query".

**Why do I get fewer results than Max results?**
Brave stops offering more pages for that query. Later pages can also repeat results from earlier pages; those are skipped and not charged.

**Does the search language filter results?**
It sets a preference, not a strict filter. Brave mostly ranks by the query's own language, so a German query in Germany returns mostly German pages, while an English query stays mostly English whatever language you pick. Combine **Country** and a query in the target language for the most local results.

**Do the results depend on the proxy location?**
For queries with local intent, such as `weather forecast`, Brave also uses the location of the IP address. The default proxy is a US residential IP. For local results elsewhere, pick a proxy country to match in **Proxy configuration**.

**What happens if I pick a country Brave doesn't support?**
The country list only offers the 39 countries Brave Search supports, plus All regions. The `country` field in each row shows the country Brave actually applied.

**Can I run several keywords?**
Each run takes one query. For many keywords, start several runs through the [API](https://apify.com/parsebird/brave-search-scraper/api), or save each keyword as an Apify [task](https://docs.apify.com/platform/actors/running/tasks) and schedule them.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly or at any interval, and send results to Google Sheets, Slack or your own app with [integrations](https://docs.apify.com/platform/integrations).

**Something doesn't work. Where do I report it?**
Open a ticket on the [Issues tab](https://apify.com/parsebird/brave-search-scraper/issues). Include your run link so we can look into it.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/brave-search-scraper/changelog.md

# Actor input Schema

## `query` (type: `string`):

Enter what you'd type into Brave Search. Search operators work too, for example <code>site:reddit.com</code>, <code>"exact phrase"</code> or <code>-word</code>.

## `maxItems` (type: `integer`):

Stop after this many results. Brave Search shows up to about 100–120 results per query (around 20 per page), so higher values return everything available.

## `country` (type: `string`):

Pick the country Brave Search ranks results for. 'All regions' turns off country ranking.

## `language` (type: `string`):

Pick the language Brave Search should prefer. Brave treats this as a preference: results in other languages can still appear, mostly when the query itself is in another language.

## `safeSearch` (type: `string`):

Pick Brave Search's safe search level. Strict filters adult content out of web results.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Uses US residential proxies by default. Brave Search limits requests per IP, so every page uses a new IP. Without a proxy, the scraper switches to Apify Proxy by itself when Brave starts limiting.

## Actor input object example

```json
{
  "query": "best electric cars 2025",
  "maxItems": 50,
  "country": "us",
  "language": "en",
  "safeSearch": "moderate",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "best electric cars 2025",
    "maxItems": 50,
    "country": "us",
    "language": "en",
    "safeSearch": "moderate",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/brave-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "best electric cars 2025",
    "maxItems": 50,
    "country": "us",
    "language": "en",
    "safeSearch": "moderate",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/brave-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "best electric cars 2025",
  "maxItems": 50,
  "country": "us",
  "language": "en",
  "safeSearch": "moderate",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call parsebird/brave-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/brave-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4gYxDex7kCey1ZERC/builds/8ORXfCMpnHSS3qGeI/openapi.json
