The Brave Search connector lets your AI agent act in each user's Brave Search account. Each user connects their own Brave Search API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 18 tools.
- Tools
- 18
- What they doRead · write · destructive
- 18 · 0 · 018 read0 write0 destructive
- Users sign in with
- API key
What you can do
- Search the web: get real-time web results with titles, URLs, and snippets, filtered by country and language
- Get AI answers: generate cited answers and summaries grounded in live Brave Search results
- Search news, images, and videos: find recent news articles, images, and videos with freshness and safe search filters
- Find local places: search points of interest by location and get addresses, hours, ratings, and reviews
- Ground LLM responses: retrieve curated snippets and source URLs structured as context for AI-generated answers
- Suggest and correct queries: get autocomplete suggestions and spelling corrections for search queries
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Brave Search connection
In AgentKit > Connections, create a Brave Search connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'brave'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Brave Search:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'brave_local_place_search',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "brave"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Brave Search:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="brave_local_place_search",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user opens the link once and enters their Brave Search credentials there. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolbrave_chat_completionsGet AI-generated answers grounded in real-time Brave Search results using an OpenAI-compatible chat completions interface.Read-onlyChat Completions
Get AI-generated answers grounded in real-time Brave Search results using an OpenAI-compatible chat completions interface. Returns summarized, cited answers with source references and token usage statistics.
Inputs
messagesarrayrequired- Array of conversation messages. Each message must have a 'role' (system, user, or assistant) and 'content' (string).
countrystring- Target country code for search results used to ground the answer (e.g., us, gb).
enable_citationsboolean- Include inline citation markers in the response text.
enable_entitiesboolean- Include entity information (people, places, organizations) in the response.
enable_researchboolean- Enable multi-search research mode for more comprehensive answers.
languagestring- Language code for the response (e.g., en, fr, de).
modelstring- The model to use. Must be 'brave' to use Brave's search-grounded AI model.
streamboolean- Whether to stream the response as server-sent events.
brave_image_searchSearch for images using Brave Search.Read-onlyImage Search
Search for images using Brave Search. Returns image results with thumbnails, source URLs, dimensions, and metadata. Supports filtering by country, language, and safe search.
Inputs
qstringrequired- The image search query string.
countinteger- Number of image results to return (1–200). Defaults to 50.
countrystring- Country code for localised results (e.g., us, gb, de), or ALL for no restriction.
safesearchstring- Safe search filter level. Defaults to strict (drops all adult content).one of
offstrict search_langstring- Language code for results (e.g., en, fr, de).
spellcheckboolean- Whether to enable spellcheck on the query. Defaults to true.
brave_llm_contextRetrieve real-time web search results optimized as grounding context for LLMs.Read-onlyLLM Context
Retrieve real-time web search results optimized as grounding context for LLMs. Returns curated snippets, source URLs, titles, and metadata specifically structured to maximize contextual relevance for AI-generated answers. Supports fine-grained token and snippet budgets.
Inputs
qstringrequired- The search query to retrieve grounding context for. Max 400 characters, 50 words.
context_threshold_modestring- Relevance filter aggressiveness for snippet selection. Defaults to balanced.one of
strictbalancedlenientdisabled countinteger- Max number of search results to consider (1–50). Defaults to 20.
countrystring- Country code for localised results (e.g., us, gb, de). Defaults to us.
enable_localboolean- Enable location-aware recall for locally relevant results.
freshnessstring- Filter results by publish date: pd (past day), pw (past week), pm (past month), py (past year), or YYYY-MM-DDtoYYYY-MM-DD.
gogglesstring- Custom re-ranking rules via a Goggles URL or inline definition.
maximum_number_of_snippetsinteger- Maximum total snippets across all URLs (1–100). Defaults to 50.
maximum_number_of_snippets_per_urlinteger- Maximum snippets per URL (1–100). Defaults to 50.
maximum_number_of_tokensinteger- Approximate maximum total tokens across all snippets (1024–32768). Defaults to 8192.
maximum_number_of_tokens_per_urlinteger- Maximum tokens per URL (512–8192). Defaults to 4096.
maximum_number_of_urlsinteger- Maximum number of URLs to include in the grounding response (1–50). Defaults to 20.
safesearchstring- Safe search filter level.one of
offmoderatestrict search_langstring- Language code for results (e.g., en, fr, de). Defaults to en.
brave_local_descriptionsFetch AI-generated descriptions for locations using IDs from a Brave web search response.Read-onlyGet Local Descriptions
Fetch AI-generated descriptions for locations using IDs from a Brave web search response. Returns natural language summaries describing the place, its atmosphere, and what visitors can expect.
Inputs
idsarrayrequired- Array of location IDs (up to 20) obtained from the locations field in a Brave web search response.
brave_local_place_searchSearch 200M+ Points of Interest (POIs) by geographic center and radius using Brave's Place Search API.Read-onlyPlace Search
Search 200M+ Points of Interest (POIs) by geographic center and radius using Brave's Place Search API. Either 'location' (text name) OR both 'latitude' and 'longitude' (coordinates) must be provided. Supports an optional keyword query to filter results. Ideal for map applications and local discovery.
Inputs
countinteger- Number of POI results to return (1–50). Defaults to 20.
countrystring- ISO 3166-1 alpha-2 country code (e.g., us, gb). Defaults to US.
latitudenumber- Latitude of the search center point (-90 to +90). Required together with longitude as an alternative to location name.
locationstring- Location name (e.g., 'san francisco ca united states'). Required unless latitude and longitude are both provided.
longitudenumber- Longitude of the search center point (-180 to +180). Required together with latitude as an alternative to location name.
qstring- Optional keyword query to filter POIs (e.g., 'coffee shops', 'italian restaurants'). Omit for a general area snapshot.
radiusnumber- Search radius in meters from the center point.
safesearchstring- Safe search filter level. Defaults to strict.one of
offmoderatestrict search_langstring- Language code for results (e.g., en, fr). Defaults to en.
spellcheckboolean- Whether to enable spellcheck on the query.
unitsstring- Measurement system for distances in the response.one of
metricimperial
brave_local_poisFetch detailed Point of Interest (POI) data for up to 20 location IDs returned by a Brave web search response.Read-onlyGet Local POIs
Fetch detailed Point of Interest (POI) data for up to 20 location IDs returned by a Brave web search response. Returns rich local business data including address, phone, hours, ratings, and reviews. Note: location IDs are ephemeral and expire after ~8 hours.
Inputs
idsarrayrequired- Array of location IDs (up to 20) obtained from the locations field in a Brave web search response.
brave_news_searchSearch for news articles using Brave Search.Read-onlyNews Search
Search for news articles using Brave Search. Returns recent news results with titles, URLs, snippets, publication dates, and source information. Supports filtering by country, language, freshness, and custom re-ranking via Goggles.
Inputs
qstringrequired- The news search query string.
countinteger- Number of news results to return (1–50). Defaults to 20.
countrystring- Country code for localised news (e.g., us, gb, de).
extra_snippetsboolean- Include additional excerpt snippets per article. Defaults to false.
freshnessstring- Filter results by publish date: pd (past day), pw (past week), pm (past month), py (past year), or YYYY-MM-DDtoYYYY-MM-DD.
gogglesstring- Custom re-ranking rules via a Goggles URL or inline definition.
offsetinteger- Zero-based offset for pagination (0–9). Defaults to 0.
safesearchstring- Safe search filter level. Defaults to strict.one of
offmoderatestrict search_langstring- Language code for results (e.g., en, fr, de).
spellcheckboolean- Whether to enable spellcheck on the query. Defaults to true.
ui_langstring- User interface language locale for response strings (e.g., en-US).
brave_rich_results_getFetch the enriched real-time 'rich' result (weather, stocks, sports scores, currency conversion, package tracking, etc.) for a callback_key.Read-onlyGet Rich Result
Fetch the enriched real-time 'rich' result (weather, stocks, sports scores, currency conversion, package tracking, etc.) for a callback_key. The callback_key comes from the 'rich' field of a prior Web Search response — that search must have been made with a query that triggers a rich result hint (e.g. a weather or stock query).
Inputs
callback_keystringrequired- The callback key identifying which rich result to fetch, returned in a Web Search response's rich.hint.callback_key field.
brave_spellcheckCheck and correct spelling of a query using Brave Search's spellcheck engine.Read-onlySpellcheck
Check and correct spelling of a query using Brave Search's spellcheck engine. Returns suggested corrections for misspelled queries.
Inputs
qstringrequired- The query string to spellcheck.
countrystring- Country code for localised spellcheck (e.g., us, gb).
langstring- Language code for spellcheck (e.g., en, fr, de).
brave_suggest_searchGet autocomplete search suggestions from Brave Search for a given query prefix.Read-onlySearch Suggestions
Get autocomplete search suggestions from Brave Search for a given query prefix. Useful for query completion, exploring related search terms, and building search UIs.
Inputs
qstringrequired- The partial query string to get suggestions for.
countinteger- Number of suggestions to return (1–20). Defaults to 5.
countrystring- Country code for localised suggestions (e.g., us, gb, de).
langstring- Language code for suggestions (e.g., en, fr, de).
richboolean- Whether to return rich suggestions with additional metadata.
brave_summarizer_enrichmentsFetch enrichment data for a Brave AI summary key.Read-onlyGet Summary Enrichments
Fetch enrichment data for a Brave AI summary key. Returns images, Q&A pairs, entity details, and source references associated with the summary.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
brave_summarizer_entity_infoFetch detailed entity metadata for entities mentioned in a Brave AI summary.Read-onlyGet Summary Entity Info
Fetch detailed entity metadata for entities mentioned in a Brave AI summary. Returns structured information about people, places, organizations, and concepts referenced in the summary.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
brave_summarizer_followupsFetch suggested follow-up queries for a Brave AI summary key.Read-onlyGet Summary Follow-ups
Fetch suggested follow-up queries for a Brave AI summary key. Useful for building conversational search flows and helping users explore related topics.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
brave_summarizer_searchRetrieve a full AI-generated summary for a summarizer key obtained from a Brave web search response (requires summary=true on the web search).Read-onlySummarizer 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). Returns the complete summary with title, content, enrichments, follow-up queries, and entity details.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
entity_infointeger- Set to 1 to include detailed entity metadata in the response.one of
01 inline_referencesboolean- Add citation markers throughout the summary text pointing to sources.
brave_summarizer_summaryFetch the complete AI-generated summary for a summarizer key.Read-onlyGet Summary
Fetch the complete AI-generated summary for a summarizer key. Returns the full summary content with optional inline citation markers and entity metadata.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
entity_infointeger- Set to 1 to include detailed entity metadata in the response.one of
01 inline_referencesboolean- Add citation markers throughout the summary text pointing to sources.
brave_summarizer_titleFetch only the title component of a Brave AI summary for a given summarizer key.Read-onlyGet Summary Title
Fetch only the title component of a Brave AI summary for a given summarizer key.
Inputs
keystringrequired- The opaque summarizer key returned in a Brave web search response when summary=true was set.
brave_video_searchSearch for videos using Brave Search.Read-onlyVideo Search
Search for videos using Brave Search. Returns video results with titles, URLs, thumbnails, durations, and publisher metadata. Supports filtering by country, language, freshness, and safe search.
Inputs
qstringrequired- The video search query string.
countinteger- Number of video results to return (1–50). Defaults to 20.
countrystring- Country code for localised results (e.g., us, gb, de).
freshnessstring- Filter results by upload date: pd (past day), pw (past week), pm (past month), py (past year), or YYYY-MM-DDtoYYYY-MM-DD.
offsetinteger- Zero-based offset for pagination (0–9). Defaults to 0.
safesearchstring- Safe search filter level. Defaults to moderate.one of
offmoderatestrict search_langstring- Language code for results (e.g., en, fr, de).
spellcheckboolean- Whether to enable spellcheck on the query. Defaults to true.
brave_web_searchSearch the web using Brave Search's privacy-focused search engine.Read-onlyWeb Search
Search the web using Brave Search's privacy-focused search engine. Returns real-time web results including titles, URLs, snippets, news, videos, images, locations, and rich data. Supports filtering by country, language, safe search, freshness, and custom re-ranking via Goggles.
Inputs
qstringrequired- Search query string. Max 400 characters, 50 words.
countinteger- Number of search results to return (1–20). Defaults to 20.
countrystring- Country code for search results (e.g., us, gb, de). Defaults to US.
extra_snippetsboolean- Include up to 5 additional excerpt snippets per result. Defaults to false.
freshnessstring- Filter results by publish date. Use pd (past day), pw (past week), pm (past month), py (past year), or a date range YYYY-MM-DDtoYYYY-MM-DD.
gogglesstring- Custom re-ranking rules via a Goggles URL or inline definition to bias search results.
offsetinteger- Zero-based offset for pagination of results (0–9). Defaults to 0.
result_filterstring- Comma-separated list of result types to include in the response.
safesearchstring- Safe search filter level. Defaults to moderate.one of
offmoderatestrict search_langstring- Language code for result content (e.g., en, fr, de). Defaults to en.
spellcheckboolean- Whether to enable spellcheck on the query. Defaults to true.
summaryboolean- Enable summarizer key generation in the response. Use the returned key with the Summarizer endpoints.
text_decorationsboolean- Whether to include text decoration markers (bold tags) in result snippets. Defaults to true.
ui_langstring- User interface language locale for response strings (e.g., en-US, fr-FR).
unitsstring- Measurement system for unit-bearing results.one of
metricimperial
No tools match.
Workflows
Proxy API call
const result = await actions.request({ connectionName: 'brave-search', identifier: 'user_123', path: '/res/v1/web/search', method: 'GET', queryParams: { q: 'best open source LLM frameworks 2025', count: '5' },});console.log(result.data.web.results);result = actions.request( connection_name='brave-search', identifier='user_123', path="/res/v1/web/search", method="GET", params={"q": "best open source LLM frameworks 2025", "count": 5})print(result["web"]["results"])Web search
Search the web and retrieve real-time results. Works on all plans including Free.
# Search for recent articles — freshness "pw" limits results to the past 7 daysresult = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_web_search", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_news_search", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_llm_context", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_chat_completions", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_local_place_search", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_local_pois", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_web_search", tool_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 = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_summarizer_search", tool_input={"key": summarizer_key, "entity_info": True},)
print(summary["title"])print(summary["summary"])
# Step 3: Get follow-up questions for a conversational search experiencefollowups = actions.execute_tool( connection_name="brave-search", identifier="user_123", tool_name="brave_summarizer_followups", tool_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.
from langchain.agents import AgentExecutor, create_tool_calling_agentfrom langchain_anthropic import ChatAnthropicfrom langchain_core.prompts import ChatPromptTemplate
# Load all Brave Search tools — Scalekit handles auth for each calltools = actions.langchain.get_tools( providers=["BRAVE_SEARCH"], identifier="user_123", page_size=100, # avoid missing tools when a connector has more than the default page)
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"])