How to Scrape Brave Search Results (or Just Use an API)
Brave Search is one of the few major Western search engines that runs its own crawler and its own index. Its results are genuinely different from Google's, and different from the Bing family too — Yahoo and DuckDuckGo both serve Microsoft's Bing index, while Brave does not. If you need a view of the web that is not just “Google again,” Brave is the natural target.
There are two ways to get Brave's results programmatically: scrape the public results page, or query an API that already did the work. This guide covers the first path honestly — the endpoint, the parameters, the HTML, and the anti-bot reality — then shows you why the second is usually the better deal.
TL;DR: Brave serves results at search.brave.com/search?q=QUERY. It renders a normal HTML page you can parse, paginated with an offset parameter rather than a count. The catch: Brave rate-limits non-browser clients, so a plain HTTP script gets a 403/1015 challenge instead of results. For reliable Brave data at volume, a Brave Search API returns clean JSON from engine=brave.
Brave's search endpoint and its parameters
Brave serves its web results at https://search.brave.com/search. The query goes in the q parameter, and the response is a normal HTML page — the same page you see in a browser, with each result laid out in a repeatable block you can parse.
Three parameters matter most:
| Parameter | What it does |
|---|---|
q | The query you are searching for |
country | ISO country code used to bias results to a region |
offset | Pagination. offset=0 is the first page, offset=1 the next, and so on |
There is also source=web, which keeps you on the web-results tab rather than a news or image surface. A first request looks like this:
https://search.brave.com/search?q=best+running+shoes+2026&source=web&offset=0
That is the whole surface. There is no public JSON endpoint on the site itself — the results come back as HTML, and parsing them means locating the result blocks and reading the title, destination link, and snippet from each one.
Brave renders results in HTML
Because the results arrive as HTML, you can process them with any standard HTML parser. Fetch the page, find the container that holds organic results, and walk each result block for its title, URL, and snippet.
The usual caveats apply. The generated class names on the page change without notice, so you should anchor on the structural container rather than deep generated classes, and treat an empty result set on a common query as a block rather than an answer. A challenge page still returns HTTP 200, so “I got a page” is not the same as “I got results.”
The anti-bot reality
The honest part: Brave does not want you to do this at scale. The results page sits behind an anti-bot challenge layer, and it aggressively rate-limits non-browser clients. A plain HTTP request with a generic user agent is met with a challenge or a rate-limit error — typically 403 or 1015 — long before it reaches any results.
Scraping at even modest volume means emulating a real user's browsing session: rendering the page the way a browser would, keeping the session looking human, and pacing requests carefully. This is not a one-line request loop. It means maintaining a browser-driven scraper, handling the challenge layer, and staying under the rate counter.
That is acceptable for a hobby script pulling a few dozen queries a day. It becomes a maintenance burden at production volume — which is exactly where most teams start looking for an API.
The practical path: an API
If the goal is reliable search data rather than the sport of keeping a scraper alive, a SERP API removes the entire access problem. Serpent API added Brave as its fifth public engine, so you get Brave's independent index through the same JSON contract as Google, Yahoo, Bing, and DuckDuckGo — same endpoints, same fields, same flat pricing. engine=brave is the only change:
const res = await fetch(
'https://apiserpent.com/api/search?q=best+running+shoes+2026&engine=brave&country=us',
{ headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const json = await res.json();
for (const r of json.results.organic) {
console.log(r.position, r.title, r.url);
}
Five lines, and the results are clean JSON — no parser to maintain, no challenge layer to fight. Brave's web response also includes related searches and, where available, Brave's AI digest exposed as the ai_overview field. The same call pattern returns Google, Yahoo, Bing, or DuckDuckGo with a one-parameter change.
Scrape vs API: the honest comparison
| Factor | Scraping search.brave.com | Serpent API |
|---|---|---|
| Setup | You build and maintain a browser-driven scraper | One HTTP request |
| Output | HTML you parse yourself | Structured JSON |
| Stability | Selectors and blocks drift; breaks without warning | Stable contract |
| Volume | Limited by rate limits and pacing | Scales with spend |
| Cost | $0 in cash, real engineering time | From $0.03/1K pages at Scale, pay-as-you-go |
When scraping still makes sense
Scraping still makes sense when you need a handful of results, want zero cash cost, or are building a single-purpose tool you control end to end. The API makes sense the moment you need volume, stability, or data across multiple engines — because the same endpoint that returns Brave returns the other four with a one-parameter change. Test a live query in the playground, or read the Brave Search API reference for the full endpoint list.
Brave's independent index, as JSON.
Serpent returns parsed JSON for Brave, Google, Bing, Yahoo, and DuckDuckGo through one endpoint. New accounts include 10 shared free calls on eligible endpoints, then pay-as-you-go pricing with no subscription.
Get Your Free API KeyExplore: Brave SERP API · All SERP APIs · Pricing
FAQ
Is Brave Search an independent index?
Yes. Brave runs its own crawler and its own index of billions of pages, independent of both Google and Microsoft's Bing. That makes its results genuinely different from Yahoo and DuckDuckGo, which both serve the Bing index.
What parameters does Brave's search endpoint use?
The results page is search.brave.com/search. The main parameters are q for the query, country for an ISO country code to bias results, and offset for pagination. Brave paginates with an offset rather than a result count: offset=0 is the first page, offset=1 the next, and so on.
Does scraping Brave get rate-limited?
Yes. Brave sits behind an anti-bot challenge layer and aggressively rate-limits non-browser clients. Plain HTTP clients typically get 403 or 1015 errors, and at volume even browser-driven scraping needs careful pacing.
Can I get Brave results as JSON?
Yes. Serpent API exposes Brave as a search engine, so /api/search?engine=brave returns Brave's web results as structured JSON with the same contract as Google, Yahoo, Bing, and DuckDuckGo. Brave's AI digest is returned as the ai_overview field.


