Brave search
TL;DR
About
In March 2025 Anthropic listed Brave Search as a subprocessor, and Simon Willison found Claude's web search citations matching Brave's results page. Brave uses its own index (it dropped Bing in 2023), so a Google ranking tells you little here. Take a docs team that moved 300 guides to /docs last month. A week later someone runs a site: query per folder, /docs/api then /docs/sdk, with country "us", pages until hasMore goes false and checks the URLs against the sitemap. Folders matter because a domain-wide query runs dry after a handful of pages. An answer flagged operatorsApplied false counts as zero found. A guide still absent gets a search on its quoted title, then goes to the companion submit_url script, which requests a recrawl but cannot promise indexing. Guides Brave has never read carry the placeholder snippet 'We cannot provide a description for this page right now'. Brave's AI answer and forum cards stay out of the output.
Input
query requiredSearch query. The operators site:, quoted phrases and OR are honored. site:domain also covers its subdomains (site:example.com returns docs.example.com), and site:domain/path narrows to a path prefix, which is the cheapest way to slice a large site.
offset optional0-based page index (0 is the first page, about 20 results). The pool behind one query is limited and its depth varies by query; past its end Brave re-serves earlier pages. hasMore in the output says whether a next page exists: keep paging while it is true, and dedupe on url anyway. Default 0.
Default: 0country optionalISO-3166 alpha-2 country whose Brave results to read, e.g. "us". When omitted, Brave answers for the country of the browser's own network location, so the same query read from two places gives two different result pages. Pass it whenever readings must be comparable across browsers, or must stand in for another reader's, such as an assistant's US-side web search.
exactMatch optionalDeprecated; has no reliable effect, because Brave may correct spellings without saying so. To search a literal string, put it in quotes in query. Default false.
Output
count requiredHow many results were read from this page (results.length). Not a match count. A full page has about 16 to 20.
query requiredoffset requiredhasMore requiredWhether Brave offers a next page for this query. false on the last page of the pool and on an empty answer. Past the end, Brave can show an earlier page again, so dedupe on url.
results requiredThe organic web results on the page, in rank order. Empty only when Brave said so (see emptyBecause). If the script reads zero results from a page that Brave answered normally, it fails with an error and does not return an empty list.
emptyBecause requiredWhy results is empty, in Brave's own terms: Brave relaxed the operators, or Brave showed its no-matches banner. null when results is not empty.
operatorsApplied requiredWhether Brave applied the operators in query. false means Brave found too few matches, dropped the operators and answered a relaxed query, so the results are not filtered by them. Always true for a query with no operators.
country optionalThe country the results were read for, lowercased, as passed in. null when none was passed and the page is in the locale of the browser's own network location.
rewrittenTo optionalAlways null. Brave tells about a rewrite only in translated text, which the script does not read. Put the query in quotes to stop Brave from rewriting it.
Example output
Shape only: placeholder values generated from the output schema, not a real run.
{
"count": 3,
"query": "…",
"offset": 3,
"country": 3,
"hasMore": true,
"results": [
{
"age": "…",
"url": "https://example.com/item/123",
"title": "Example",
"snippet": "…"
}
],
"rewrittenTo": "…",
"emptyBecause": "…",
"operatorsApplied": true
}