Brave Search
Connect to Brave Search to run privacy-first web, news, and local searches, retrieve AI summaries, get LLM grounding context, and use search-backed chat completions.
Connect to Brave Search to run privacy-first web, news, image, video, and local searches; retrieve AI-generated summaries and entity data; get LLM-optimized context for grounding; and use OpenAI-compatible chat completions backed by real-time search results.
Supports authentication: API Key
What you can build with this connector
| Use case | Tools involved |
|---|---|
| Real-time web research | brave_web_search → feed results into LLM context |
| News monitoring | brave_news_search with freshness: pd → summarise headlines |
| LLM grounding | brave_llm_context → pass structured snippets directly to your model |
| Search-augmented chat | brave_chat_completions with conversation history → cited AI answers |
| Local business lookup | brave_local_place_search → brave_local_pois → display hours, ratings, address |
| AI summaries with follow-ups | brave_web_search (summary: true) → brave_summarizer_search → brave_summarizer_followups |
Key concepts:
- Plan tiers: Free covers core search. Pro adds
brave_llm_contextand summarizer tools. AI plan addsbrave_chat_completions. Data for AI plan adds local/POI tools. - Summarizer two-step: First call
brave_web_searchwithsummary: trueto get asummarizer.key, then pass that key tobrave_summarizer_*tools. - LLM context vs web search:
brave_llm_contextreturns token-budgeted, snippet-optimised output specifically for grounding — prefer it over raw web search results when feeding an LLM. - Rate limits: Free plan allows 1 req/s. Paid plans scale to 20 req/s. Handle
429errors with backoff.
Set up the agent connector
Section titled “Set up the agent connector”Register your Brave Search API key with Scalekit so it can authenticate and proxy search requests on behalf of your users. Unlike OAuth connectors, Brave Search uses API key authentication — there is no redirect URI or OAuth flow.
-
Get a Brave Search API key
-
Go to api.search.brave.com and sign in or create a free account.
-
In the left sidebar, click API Keys → + New Key. Give it a name (e.g.,
Agent Auth) and click Create. -
Copy the key immediately — it is shown only once.

-
-
Create a connection in Scalekit
-
In Scalekit dashboard, go to Agent Auth → Create Connection. Find Brave Search and click Create.
-
Note the Connection name — you will use this as
connection_namein your code (e.g.,brave-search).

-
-
Add a connected account
Connected accounts link a specific user identifier in your system to a Brave Search API key. Add them via the dashboard for testing, or via the Scalekit API in production.
Via dashboard (for testing)
-
Open the connection you created and click the Connected Accounts tab → Add account.
-
Fill in:
- Your User’s ID — a unique identifier for this user in your system (e.g.,
user_123) - API Key — the Brave Search API key you copied in step 1
- Your User’s ID — a unique identifier for this user in your system (e.g.,
-
Click Save.

Via API (for production)
await scalekit.actions.upsertConnectedAccount({connectionName: 'brave-search',identifier: 'user_123', // your user's unique IDcredentials: { api_key: 'BSA...' },});scalekit_client.actions.upsert_connected_account(connection_name="brave-search",identifier="user_123",credentials={"api_key": "BSA..."}) -
Once a connected account is set up, make search API calls through the Scalekit proxy. Scalekit injects the Brave Search API key automatically as the X-Subscription-Token header — you never handle credentials in your application code.
You can interact with Brave Search in two ways — via direct proxy API calls or via Scalekit optimized tool calls. Scroll down to see the list of available Scalekit tools.
Proxy API calls
import { ScalekitClient } from '@scalekit-sdk/node';import 'dotenv/config';
const connectionName = 'brave-search'; // connection name from your Scalekit dashboardconst identifier = 'user_123'; // your user's unique identifier
// Get your credentials from app.scalekit.com → Developers → Settings → API Credentialsconst scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET);const actions = scalekit.actions;
// Web search via Scalekit proxy — no API key needed hereconst result = await actions.request({ connectionName, identifier, path: '/res/v1/web/search', method: 'GET', queryParams: { q: 'best open source LLM frameworks 2025', count: '5' },});console.log(result.data.web.results);import scalekit.client, osfrom dotenv import load_dotenvload_dotenv()
connection_name = "brave-search" # connection name from your Scalekit dashboardidentifier = "user_123" # your user's unique identifier
# Get your credentials from app.scalekit.com → Developers → Settings → API Credentialsscalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENV_URL"),)actions = scalekit_client.actions
# Web search via Scalekit proxy — no API key needed hereresult = actions.request( connection_name=connection_name, identifier=identifier, path="/res/v1/web/search", method="GET", params={"q": "best open source LLM frameworks 2025", "count": 5})print(result["web"]["results"])Scalekit tools
Use actions.execute_tool() to call Brave Search tools directly. Scalekit injects credentials automatically — your application code never handles the API key.
Web search
Search the web and retrieve real-time results. Works on all plans including Free.
import osfrom scalekit.client import ScalekitClient
scalekit_client = ScalekitClient( client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], env_url=os.environ["SCALEKIT_ENV_URL"],)
# Ensure a connected account exists for this user before making tool callsscalekit_client.actions.get_or_create_connected_account( connection_name="brave-search", identifier="user_123",)
# Search for recent articles — freshness "pw" limits results to the past 7 daysresult = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_web_search", input={ "q": "open source LLM frameworks 2025", "count": 5, "freshness": "pw", },)
for item in result["web"]["results"]: print(item["title"], item["url"])News search
Retrieve recent news articles by topic or keyword. Useful for monitoring a brand, topic, or competitor.
# Fetch the latest news on a topic from the past 24 hoursresult = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_news_search", input={ "q": "AI regulation Europe", "count": 10, "freshness": "pd", # pd = past 24 hours },)
for article in result["results"]: print(article["title"], article["age"], article["url"])LLM grounding context
Retrieve search results structured specifically for grounding LLM responses. Requires Pro plan. Use token_budget to stay within your model’s context window.
# Get search context sized to fit a 4 000-token budgetresult = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_llm_context", input={ "q": "vector database comparison 2025", "count": 5, "token_budget": 4000, },)
# Pass the structured context directly to your LLMgrounding_context = result["context"]print(grounding_context)AI chat completions grounded in search
Get an AI-generated answer backed by real-time Brave Search results, using an OpenAI-compatible interface. Requires AI plan.
# Drop-in replacement for OpenAI /v1/chat/completions — results are grounded in live searchresult = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_chat_completions", input={ "messages": [ {"role": "user", "content": "What are the latest developments in quantum computing?"} ], "model": "brave/serp-claude-3-5-haiku", },)
print(result["choices"][0]["message"]["content"])# Each answer includes citations back to source URLsfor source in result.get("search_results", []): print(source["title"], source["url"])Local place search and POI details
Find nearby businesses or points of interest, then retrieve full details. Requires Data for AI plan.
# Step 1: Find coffee shops near San Francisco city centreplaces = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_local_place_search", input={ "q": "specialty coffee", "location": "San Francisco, CA", "count": 5, },)
location_ids = [p["id"] for p in places["results"]]
# Step 2: Fetch rich details (hours, ratings, address) for those locations# Location IDs expire after ~8 hours — always fetch details in the same sessionpois = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_local_pois", input={"ids": location_ids},)
for poi in pois["results"]: print(poi["name"], poi["address"], poi["rating"])AI summary with follow-up queries
Get an AI-generated summary for a search query, then surface follow-up questions. Requires Pro plan.
# Step 1: Web search with summary: true to obtain a summarizer keysearch_result = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_web_search", input={ "q": "benefits of RAG vs fine-tuning for enterprise LLMs", "summary": True, "count": 5, },)
summarizer_key = search_result["summarizer"]["key"]
# Step 2: Retrieve the full AI summary using the keysummary = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_summarizer_search", input={"key": summarizer_key, "entity_info": True},)
print(summary["title"])print(summary["summary"])
# Step 3: Get follow-up questions for a conversational search experiencefollowups = scalekit_client.actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_summarizer_followups", input={"key": summarizer_key},)
for q in followups["queries"]: print("-", q)LangChain integration
Use Scalekit’s LangChain helper to load all Brave Search tools into a LangChain agent. The agent selects and calls the right tool automatically based on the user’s query.
import osfrom langchain.agents import AgentExecutor, create_tool_calling_agentfrom langchain_anthropic import ChatAnthropicfrom langchain_core.prompts import ChatPromptTemplatefrom scalekit.client import ScalekitClient
scalekit_client = ScalekitClient( client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], env_url=os.environ["SCALEKIT_ENV_URL"],)
# Load all Brave Search tools — Scalekit handles auth for each calltools = scalekit_client.actions.langchain.get_tools( providers=["BRAVE_SEARCH"], identifier="user_123",)
llm = ChatAnthropic( model="claude-sonnet-4-6", api_key=os.environ["ANTHROPIC_API_KEY"],)
prompt = ChatPromptTemplate.from_messages([ ("system", "You are a helpful research assistant with access to Brave Search tools."), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"),])
agent = create_tool_calling_agent(llm, tools, prompt)agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
response = agent_executor.invoke({ "input": ( "Find the top 5 news articles about AI regulation in Europe from the past week " "and give me a one-sentence summary of each." )})print(response["output"])Tool list
Section titled “Tool list”The following tools are available when you connect a Brave Search account. Each tool maps to a Brave Search API endpoint. Required plan is noted per tool.
brave_web_search
Section titled “brave_web_search”Search the web using Brave’s privacy-focused search engine. Returns real-time results including web pages, news, videos, images, and rich data. Supports filtering by country, language, recency, and custom re-ranking via Goggles.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query. Maximum 400 characters, 50 words. |
country | string | No | Country code (ISO 3166-1 alpha-2, e.g., US, GB, DE) to localise results. |
search_lang | string | No | Language of search results (ISO 639-1, e.g., en, fr, de). |
ui_lang | string | No | UI language for rendering result labels (e.g., en-US). |
count | integer | No | Number of results per page (1–20, default 20). |
offset | integer | No | Pagination offset (0–9). Use with count to page through up to 200 results. |
safesearch | string | No | Content filter: off, moderate (default), or strict. |
freshness | string | No | Recency filter: pd (24 h), pw (7 days), pm (31 days), py (1 year), or a date range YYYY-MM-DDtoYYYY-MM-DD. |
text_decorations | boolean | No | Include bold markers in result snippets for query-term highlighting. |
spellcheck | boolean | No | Automatically spellcheck the query before searching. |
goggles_id | string | No | URL of a Goggles re-ranking file for custom result ordering. |
units | string | No | Unit system for unit-sensitive results: metric or imperial. |
extra_snippets | boolean | No | Return up to 5 additional snippets per result. Requires Pro plan. |
summary | boolean | No | Request an AI summarizer key in the response for use with brave_summarizer_* tools. Requires Pro plan. |
brave_news_search
Section titled “brave_news_search”Search for recent news articles using Brave Search. Returns results with titles, URLs, snippets, publication dates, and source information. Supports filtering by country, language, and recency.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | News search query. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise news results. |
search_lang | string | No | Language of news results (ISO 639-1). |
count | integer | No | Number of results (1–20, default 20). |
offset | integer | No | Pagination offset (0–4). |
freshness | string | No | Recency filter: pd (24 h), pw (7 days), pm (31 days). |
extra_snippets | boolean | No | Return additional text snippets per result. Requires Pro plan. |
goggles_id | string | No | URL of a Goggles re-ranking file. |
safesearch | string | No | Content filter: off, moderate (default), or strict. |
spellcheck | boolean | No | Automatically spellcheck the query before searching. |
brave_image_search
Section titled “brave_image_search”Search for images using Brave Search. Returns image results with thumbnails, source URLs, dimensions, and metadata.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Image search query. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise results. |
search_lang | string | No | Language filter (ISO 639-1). |
count | integer | No | Number of image results to return (1–3 per API call). |
safesearch | string | No | Content filter: off, moderate (default), or strict. |
spellcheck | boolean | No | Automatically spellcheck the query before searching. |
brave_video_search
Section titled “brave_video_search”Search for videos using Brave Search. Returns results with titles, URLs, thumbnails, durations, and publisher metadata.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Video search query. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise results. |
search_lang | string | No | Language filter (ISO 639-1). |
count | integer | No | Number of results (1–20, default 20). |
offset | integer | No | Pagination offset (0–9). |
freshness | string | No | Recency filter: pd, pw, pm, or a date range. |
safesearch | string | No | Content filter: off, moderate (default), or strict. |
spellcheck | boolean | No | Automatically spellcheck the query before searching. |
brave_suggest_search
Section titled “brave_suggest_search”Get autocomplete search suggestions from Brave Search for a given query prefix. Useful for query completion, exploring related search terms, and building search UIs.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Query prefix to get autocomplete suggestions for. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise suggestions. |
count | integer | No | Number of suggestions to return (1–20, default 5). |
brave_spellcheck
Section titled “brave_spellcheck”Check and correct spelling of a query using Brave Search’s spellcheck engine. Returns suggested corrections for misspelled queries.
Required plan: Free and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | The query to spellcheck. |
country | string | No | Country code (ISO 3166-1 alpha-2) to apply locale-aware corrections. |
brave_llm_context
Section titled “brave_llm_context”Retrieve real-time web search results structured as grounding context for LLMs. Returns curated snippets, source URLs, titles, and metadata specifically formatted to maximise contextual relevance for AI-generated answers. Supports fine-grained token and snippet budgets to control context size.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query to retrieve grounding context for. |
count | integer | No | Number of web results to include (1–20, default 5). |
token_budget | integer | No | Maximum total tokens for the returned context. Use to fit within your LLM’s context window. |
snippet_budget | integer | No | Maximum number of snippets to include across all results. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise results. |
search_lang | string | No | Language filter (ISO 639-1). |
freshness | string | No | Recency filter: pd, pw, pm, py, or date range. |
safesearch | string | No | Content filter: off, moderate (default), or strict. |
brave_chat_completions
Section titled “brave_chat_completions”Get AI-generated answers grounded in real-time Brave Search results using an OpenAI-compatible chat completions interface. Returns summarised, cited answers with source references and token usage statistics. Drop-in replacement for OpenAI /v1/chat/completions for search-augmented generation.
Required plan: AI plan.
| Name | Type | Required | Description |
|---|---|---|---|
messages | array | Yes | Conversation history in OpenAI format: [{"role": "user", "content": "..."}]. Supported roles: system, user, assistant. |
model | string | No | Model identifier (e.g., brave/serp-claude-3-5-haiku). Defaults to the plan’s included model. |
stream | boolean | No | Stream the response using server-sent events (SSE). Default false. |
country | string | No | Country code (ISO 3166-1 alpha-2) to localise the underlying search. |
search_lang | string | No | Language filter for the underlying search (ISO 639-1). |
safesearch | string | No | Content filter applied to the underlying search: off, moderate, or strict. |
freshness | string | No | Recency filter for the underlying search results. |
brave_local_place_search
Section titled “brave_local_place_search”Search 200M+ Points of Interest (POIs) by geographic centre and radius. Supports searching by coordinates or location name with an optional keyword query. Returns location IDs that you can use with brave_local_pois and brave_local_descriptions to get full details.
Required plan: Data for AI plan.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | No | Keyword to filter POIs (e.g., coffee shop, hospital). |
lat | number | No | Latitude of the search centre (–90 to 90). Use with lon instead of location. |
lon | number | No | Longitude of the search centre (–180 to 180). Use with lat instead of location. |
location | string | No | Human-readable location name (e.g., San Francisco, CA). Alternative to lat/lon. |
radius | integer | No | Search radius in metres from the centre point. |
count | integer | No | Number of POI results to return (1–20, default 5). |
brave_local_pois
Section titled “brave_local_pois”Fetch detailed Point of Interest data for up to 20 location IDs returned by brave_local_place_search. Returns rich local business data including address, phone, opening hours, ratings, and reviews.
Required plan: Data for AI plan.
| Name | Type | Required | Description |
|---|---|---|---|
ids | array | Yes | List of location IDs from a brave_local_place_search response (maximum 20 IDs per call). |
brave_local_descriptions
Section titled “brave_local_descriptions”Fetch AI-generated descriptions for locations using IDs from a brave_local_place_search response. Returns natural language summaries describing the place, its atmosphere, and what visitors can expect.
Required plan: Data for AI plan.
| Name | Type | Required | Description |
|---|---|---|---|
ids | array | Yes | List of location IDs from a brave_local_place_search response (maximum 20 IDs per call). |
brave_summarizer_search
Section titled “brave_summarizer_search”Retrieve a full AI-generated summary for a summarizer key obtained from a brave_web_search response (requires summary: true on the web search call). Returns the complete summary with title, content, enrichments, follow-up queries, and entity details.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from the summarizer.key field of a brave_web_search response. |
entity_info | boolean | No | Include entity metadata (people, places, organisations) referenced in the summary. |
raw | boolean | No | Return unformatted (raw) summary text without inline citation markers. |
brave_summarizer_summary
Section titled “brave_summarizer_summary”Fetch only the complete AI-generated summary content for a summarizer key. Use when you only need the summary text without enrichments or follow-up data.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from a brave_web_search response. |
brave_summarizer_enrichments
Section titled “brave_summarizer_enrichments”Fetch enrichment data for a Brave AI summary key. Returns associated images, Q&A pairs, entity details, and source references that accompany the summary.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from a brave_web_search response. |
brave_summarizer_followups
Section titled “brave_summarizer_followups”Fetch suggested follow-up queries for a Brave AI summary key. Useful for building conversational search flows and helping users explore related topics.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from a brave_web_search response. |
brave_summarizer_entity_info
Section titled “brave_summarizer_entity_info”Fetch detailed entity metadata for a specific entity mentioned in a Brave AI summary. Returns structured information about people, places, organisations, and concepts referenced in the summary.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from a brave_web_search response. |
entity | string | Yes | Name of the entity to retrieve details for (must be present in the summary). |
brave_summarizer_title
Section titled “brave_summarizer_title”Fetch only the title component of a Brave AI summary. Use when you need a short heading for the summary without loading the full content.
Required plan: Pro and above.
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Summarizer key from a brave_web_search response. |