# Brave News Search Scraper (`automation-lab/brave-news-search-scraper`) Actor

Search Brave News by keyword and export ranked headlines, publishers, publication times, snippets, destination URLs, and thumbnails for monitoring, research, or RAG.

- **URL**: https://apify.com/automation-lab/brave-news-search-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Brave News Search Scraper

Search Brave's independent news index and export clean, ranked article records without opening every publisher page.

Use **Brave News Search Scraper** to turn keyword searches into structured headlines, publishers, publication times, destination URLs, snippets, thumbnails, and ranking context. Run one query for quick research or schedule a list of brand, market, policy, and competitor queries for continuous monitoring.

- 🔎 Search up to 20 keyword queries in one run
- 📰 Export up to 200 ranked articles per query
- 🌍 Localize results by country and language
- 🕒 Filter to the past day, week, month, or year
- 🔗 Keep direct publisher URLs and the exact Brave source page
- 🤖 Send results to AI agents, RAG pipelines, Sheets, Slack, or a warehouse

The Actor uses the public Brave News result surface. It does **not** require a Brave API key, a Brave account, or publisher credentials.

### What does Brave News Search Scraper do?

The Actor opens Brave News in a hardened Chromium session, searches each supplied query, parses the rendered result cards, and saves one dataset row per unique destination URL.

For every result, it preserves:

- the query and per-query rank;
- headline and publisher;
- relative or absolute publication time;
- normalized publication timestamp when it can be derived;
- article destination URL and source domain;
- Brave's visible snippet and thumbnail when available;
- the exact Brave result-page URL;
- country, language, freshness, and retrieval context.

It stays within search-result metadata. It does not visit publisher articles or claim to return full article bodies.

### Who is it for?

#### Media monitoring and PR teams

Track company, executive, product, campaign, and issue coverage. Schedule daily queries and compare rank, source mix, or headline changes over time.

#### Researchers and journalists

Collect a reproducible set of ranked articles from an independent search index. Keep the source URL and retrieval timestamp for an audit trail.

#### Competitive-intelligence teams

Monitor competitor launches, funding, partnerships, litigation, hiring, and market commentary with multiple precise searches in one run.

#### RAG and AI-agent builders

Feed fresh headlines, snippets, dates, and direct URLs into retrieval pipelines. Use the records for discovery, then let a separate authorized article extractor fetch full text only where needed.

#### Data and automation engineers

Schedule the Actor, stream dataset items through webhooks, or call it through the Apify API and MCP.

### Why use Brave News instead of another news index?

Brave operates an independent search index and can surface a different mix and ranking of sources than Google or Bing. That makes it valuable both as a primary discovery source and as a comparison layer.

- 🧭 **Independent rankings:** compare what Brave surfaces for the same keyword.
- 🔐 **No user search profile required:** the Actor uses anonymous public results.
- 🧩 **Structured context:** every row includes query, rank, localization, and source page.
- 📅 **Repeatable monitoring:** run the same query set on a schedule.
- 📤 **Portable output:** export JSON, CSV, Excel, XML, RSS, or Parquet from Apify.

### What Brave News data can you extract?

| Field | Type | Meaning |
| --- | --- | --- |
| `query` | string | Original keyword search |
| `rank` | number | Position within that query |
| `headline` | string | Article headline shown by Brave |
| `url` | URL | Direct publisher destination |
| `publisher` | string | Source or publisher label |
| `publicationTimeText` | string | Brave's visible date or relative time |
| `publishedAt` | ISO date | Parsed or estimated timestamp when available |
| `snippet` | string | Search-result summary |
| `thumbnailUrl` | URL | Brave-hosted thumbnail when present |
| `sourceDomain` | string | Destination hostname |
| `sourceUrl` | URL | Exact Brave News result page |
| `country` | string | Ranking country requested |
| `language` | string | Search language requested |
| `freshness` | string | Requested recency window |
| `retrievedAt` | ISO date | Actor retrieval timestamp |

Optional fields are omitted when Brave does not show them; the Actor does not invent missing metadata.

### How to scrape Brave News in 5 steps

1. Open the Actor input form.
2. Add one or more searches under **News search queries**.
3. Choose the maximum articles per query, country, language, and freshness.
4. Click **Start** and wait for the dataset to fill.
5. Download the results or connect the dataset to your workflow.

A small first run with one query and 10 articles normally finishes well within two minutes.

### Input parameters

#### News search queries

`queries` accepts 1–20 non-empty strings. Each query can contain up to 400 characters and 50 words.

Brave operators are useful for precise monitoring:

- `"exact phrase"` for an exact phrase;
- `site:reuters.com climate technology` for one publisher;
- `electric vehicles -sports` to exclude a term;
- `Acme Corp funding` for a brand and event combination.

#### Maximum articles per query

`maxResultsPerQuery` ranges from 1 to 200. Use 10–20 for quick checks and larger limits only when you need deeper pagination.

#### Country and language

`country` is a two-letter code such as `US`, `GB`, `DE`, or `AU`. `language` accepts Brave search language codes such as `en`, `de`, `fr`, `es`, or `pt-br`.

#### Freshness

Choose `any`, `day`, `week`, `month`, or `year`. Freshness is applied by Brave before the Actor parses result cards.

#### Safe Search

Choose `off`, `moderate`, or `strict`. The default is `moderate`.

#### Proxy and retries

Direct browser access is the default and avoids proxy bandwidth costs. If Brave challenges a run, enable Apify Proxy or provide custom proxy URLs. `maxRequestRetries` controls bounded fresh-session retries.

### Example input

```json
{
  "queries": [
    "artificial intelligence regulation",
    "site:reuters.com semiconductor supply chain"
  ],
  "maxResultsPerQuery": 25,
  "country": "US",
  "language": "en",
  "freshness": "week",
  "safeSearch": "moderate",
  "maxRequestRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Example output

```json
{
  "query": "artificial intelligence regulation",
  "rank": 1,
  "headline": "Lawmakers set out a new framework for artificial intelligence",
  "url": "https://example.com/news/ai-framework",
  "publisher": "Example News",
  "publicationTimeText": "2 hours ago",
  "publishedAt": "2026-07-18T00:30:00.000Z",
  "snippet": "The framework outlines rules for high-risk AI systems...",
  "thumbnailUrl": "https://imgs.search.brave.com/example",
  "sourceDomain": "example.com",
  "sourceUrl": "https://search.brave.com/news?q=artificial+intelligence+regulation&source=news",
  "country": "US",
  "language": "en",
  "freshness": "week",
  "retrievedAt": "2026-07-18T02:30:00.000Z"
}
```

The example illustrates the schema; live headlines and rankings change as Brave refreshes its index.

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

This Actor uses pay-per-event pricing:

- **$0.005** when a search run starts;
- a tiered amount for each unique article saved.

The formula-derived BRONZE article price is **$0.00010108 per article**. FREE is $0.00011625; SILVER, GOLD, PLATINUM, and DIAMOND receive progressively larger volume discounts. Platform compute is included in PPE pricing for supported plans.

At BRONZE, a 20-article run costs about **$0.00702**: one $0.005 start plus 20 article events. Check the live pricing tab before a large scheduled workflow because the Store price is authoritative.

### Tips for better Brave News results

- 🎯 Use specific entity and event terms instead of one broad noun.
- 🧪 Compare multiple query variants in the same run.
- 🏷️ Add `site:` when monitoring one publisher.
- 🕒 Use `day` or `week` for alerts and `month` or `any` for research.
- 🌍 Match country and language to the market you are studying.
- 📉 Start with 10–20 articles before increasing pagination.
- 🔁 Schedule repeat runs and compare datasets by query plus URL.

### Monitoring brands and competitors

A useful daily query set might include:

```json
{
  "queries": [
    "Acme Corp",
    "Acme Corp product launch",
    "Acme Corp funding OR acquisition",
    "Acme competitor partnership"
  ],
  "maxResultsPerQuery": 40,
  "freshness": "day"
}
```

Use a webhook or automation to alert only on destination URLs not seen in your previous run.

### Integrations and workflow patterns

#### Google Sheets or Airtable watchlist

Schedule the Actor, export rows, and upsert by `query + url`. Analysts get a shared watchlist without copying search pages manually.

#### Slack or Microsoft Teams alerts

Send new day-filtered results to a webhook. Include publisher, headline, publication time, and direct URL in the message.

#### RAG discovery pipeline

Use Brave records as the discovery stage. Filter by domain and freshness, then pass selected URLs to a separate article extractor that respects publisher access rules.

#### BigQuery, Snowflake, or PostgreSQL

Store recurring snapshots and analyze source share, headline themes, rank volatility, and coverage velocity.

#### Zapier and Make

Trigger a scheduled Actor run, wait for completion, iterate dataset items, and route matches into CRM, email, or incident workflows.

### Use Brave News Search Scraper with the Apify API

The Actor ID is `automation-lab/brave-news-search-scraper`.

#### JavaScript / Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/brave-news-search-scraper').call({
  queries: ['climate technology funding'],
  maxResultsPerQuery: 20,
  country: 'US',
  language: 'en',
  freshness: 'week'
});
const items = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/brave-news-search-scraper').call(run_input={
    'queries': ['climate technology funding'],
    'maxResultsPerQuery': 20,
    'country': 'US',
    'language': 'en',
    'freshness': 'week',
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~brave-news-search-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": ["climate technology funding"],
    "maxResultsPerQuery": 20,
    "freshness": "week"
  }'
```

### Use Brave News Search Scraper with MCP

Apify MCP lets Claude Code and other compatible clients run the Actor as a tool.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/brave-news-search-scraper"
```

#### Claude Desktop, Cursor, or VS Code

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/brave-news-search-scraper"
    }
  }
}
```

#### Specific MCP example prompts

Try these exact prompts:

- “Search Brave News for semiconductor export controls from the past week.”
- “Find the top 30 UK news results for offshore wind investment.”
- “Monitor these three competitors and return only Reuters or Bloomberg links.”

### Scheduling and change detection

Create an Apify schedule for hourly, daily, or weekly runs. For change detection:

1. keep a named store or external table of seen URLs;
2. compare the newest dataset against that set;
3. notify on unseen `query + url` combinations;
4. retain `rank` and `retrievedAt` for trend analysis.

The Actor itself returns a fresh snapshot and does not maintain cross-run alert state.

### Reliability and proxy guidance

Brave can rate-limit automated traffic. The Actor uses a normal browser fingerprint, conservative page pacing, and browser-session rotation.

If a run reports a Brave challenge:

- enable Apify Proxy in the input;
- try the SHADER group first because it is cheaper than residential traffic;
- use residential only when datacenter sessions are consistently challenged;
- keep retries bounded rather than repeatedly loading a blocked page.

The Actor fails non-zero when every query encounters extraction failure, so schedules and integrations do not mistake a challenge page for successful empty data.

### Limitations

- Rankings and result counts change continuously.
- Brave may show fewer records than requested for narrow searches.
- `publishedAt` is estimated for relative labels such as “2 hours ago.”
- Some cards have no thumbnail or machine-parseable publication date.
- The Actor does not fetch article bodies, authors, paywalled content, comments, or publisher analytics.
- Country and language influence ranking but do not guarantee every result originates in that country or language.
- Brave can change its page structure or anti-automation controls.

### Is scraping Brave News legal?

The Actor accesses publicly visible search-result metadata without logging in. Web scraping legality depends on jurisdiction, intended use, the data collected, and applicable terms.

You are responsible for:

- having a lawful purpose for collection and processing;
- respecting Brave and publisher terms;
- avoiding personal-data misuse;
- honoring copyright, database, and privacy rules;
- applying appropriate retention and access controls.

Search snippets are discovery metadata, not a license to republish full articles. Consult qualified counsel for regulated or high-risk use cases.

### Troubleshooting

#### Why did the Actor return fewer articles than requested?

The query or freshness window may genuinely have fewer unique results. Broaden the query, use a longer freshness window, or lower the expected count. Duplicate destination URLs are intentionally removed per query.

#### Why did the run fail with a Brave challenge?

Enable `proxyConfiguration`, start with SHADER, and retry. If your environment has repeated challenges, rotate sessions or use an appropriate residential country. The logs state whether a challenge or navigation failure caused the retry.

#### Why is `publishedAt` missing?

Brave sometimes shows publication text that cannot be safely normalized. The original `publicationTimeText` remains available.

#### Why are there no full article bodies?

V1 deliberately stays on Brave's news-result metadata. Use a separate publisher-page extractor where you have permission to retrieve full text.

### Frequently asked questions

#### Does this Actor require a Brave Search API key?

No. It uses the anonymous public Brave News web interface.

#### Can I search multiple keywords in one run?

Yes. Add up to 20 unique queries. Rank resets to 1 for each query.

#### Can I filter one publisher?

Yes. Use Brave's `site:` operator, for example `site:npr.org renewable energy`.

#### Can I export CSV or Excel?

Yes. Open the dataset and choose CSV, Excel, JSON, XML, RSS, or another supported format.

#### Can I schedule monitoring?

Yes. Apify schedules can run the same input repeatedly. Use webhooks or integrations to notify on new URLs.

#### Does Safe Search remove all sensitive content?

No automated filter is perfect. Select `strict` for stronger filtering and review outputs for your use case.

### Related news scrapers

Use another Automation Lab Actor when you need a different index or source:

- [Google News Scraper](https://apify.com/automation-lab/google-news-scraper) — Google News RSS search and topics.
- [Bing News Scraper](https://apify.com/automation-lab/bing-news-scraper) — compare Microsoft/Bing news rankings.
- [GDELT Global News Search Scraper](https://apify.com/automation-lab/gdelt-global-news-search-scraper) — global event and news discovery.
- [Reuters Latest News Feed Scraper](https://apify.com/automation-lab/reuters-latest-news-feed-scraper) — source-specific Reuters monitoring.
- [Yahoo News Search Scraper](https://apify.com/automation-lab/yahoo-news-search-scraper) — another ranked news-search surface.

Combining independent indexes can improve source coverage and reveal ranking differences.

### Support

If a valid query repeatedly fails, open an Actor issue with:

- the run URL;
- your input with secrets removed;
- the country and language used;
- whether proxy configuration was enabled;
- the expected result page or example article.

That evidence makes challenge and parser changes faster to diagnose.

# Actor input Schema

## `queries` (type: `array`):

Enter one or more keyword searches. Brave search operators such as quotes, minus terms, and site: filters are supported.

## `maxResultsPerQuery` (type: `integer`):

Stop after this many unique ranked news articles for each query.

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

Two-letter country code used by Brave to localize rankings, for example US, GB, DE, or AU.

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

Brave search language code, for example en, de, fr, es, or pt-br.

## `freshness` (type: `string`):

Restrict results to Brave's selected recency window.

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

Choose Brave's filtering level for explicit or suggestive content.

## `maxRequestRetries` (type: `integer`):

Number of fresh browser sessions to try after a challenge or navigation failure.

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

Optional Apify or custom proxy. Direct access is used when disabled; enable a proxy if Brave challenges your run.

## Actor input object example

```json
{
  "queries": [
    "artificial intelligence"
  ],
  "maxResultsPerQuery": 10,
  "country": "US",
  "language": "en",
  "freshness": "any",
  "safeSearch": "moderate",
  "maxRequestRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "queries": [
        "artificial intelligence"
    ],
    "maxResultsPerQuery": 10,
    "country": "US",
    "language": "en",
    "freshness": "any",
    "safeSearch": "moderate",
    "maxRequestRetries": 2,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/brave-news-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 = {
    "queries": ["artificial intelligence"],
    "maxResultsPerQuery": 10,
    "country": "US",
    "language": "en",
    "freshness": "any",
    "safeSearch": "moderate",
    "maxRequestRetries": 2,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "artificial intelligence"
  ],
  "maxResultsPerQuery": 10,
  "country": "US",
  "language": "en",
  "freshness": "any",
  "safeSearch": "moderate",
  "maxRequestRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/brave-news-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/brave-news-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/4qjzNNHh7avsw9c3s/builds/f7YbEgfWK2RC2iR0m/openapi.json
