A simple guide to use the Brave Search Summarizer API

Example using Python

Ensure Python version 3 is installed on your machine. Install the required Python dependencies for rate limiting and issuing HTTP requests:

pip install aiohttp aiolimiter

Copy the Python script below to a file named summarizer.py. Make sure you are subscribed to the Pro AI plan. Change the value of the API_KEY variable to your generated API key in the script, and then run the script to get summarized results for the given query.

python summarizer.py

Here’s the summarizer.py module:

import asyncio
import json
import logging
from urllib.parse import urljoin

from aiohttp import ClientSession, ClientTimeout, TCPConnector
from aiolimiter import AsyncLimiter

# Configure logger
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)
log = logging.getLogger(__name__)

# Request rate and concurrency
API_MAX_CONCURRENT_REQUESTS = 1
API_RPS = 1
API_RATE_LIMIT = AsyncLimiter(API_RPS, 1)
API_TIMEOUT = 20

# Brave Search API Key
API_KEY = "your_api_key"

# Brave Search API host
API_HOST = "https://api.search.brave.com"

# Brave Search API subpaths
API_PATH = {
    "web": urljoin(API_HOST, "res/v1/web/search"),
    "summarizer_search": urljoin(API_HOST, "res/v1/summarizer/search"),
}

# Create request headers for specific endpoints
API_HEADERS = {
    "web": {"X-Subscription-Token": API_KEY, "Api-Version": "2023-10-11"},
    "summarizer": {"X-Subscription-Token": API_KEY, "Api-Version": "2024-04-23"},
}

# Create web search request params
API_PARAMS_WEB = {
    "q": "what is the second highest mountain",
    "summary": 1,
}


async def get_summary(session: ClientSession) -> None:
    # Fetch web search results so we can get a summary key
    async with session.get(
        API_PATH["web"],
        params=API_PARAMS_WEB,
        headers=API_HEADERS["web"],
    ) as response:
        log.info("Querying url: [%s]", response.url)
        # print(await response.text())
        data = await response.json()
        status = response.status

    if status != 200:
        log.error(
            "Failure getting web search results \n%s",
            json.dumps(data, indent=2),
        )
        return

    # Get the summary key from web search results
    summary_key = data.get("summarizer", {}).get("key")

    if not summary_key:
        log.error("Failure: Getting summary key")
        return

    log.info("Summarizer Key: [%s]", summary_key)

    # Fetch summary all in one
    log.info("Requesting summarizer search in blocking mode")
    async with session.get(
        url=API_PATH["summarizer_search"],
        params={"key": summary_key, "entity_info": 1},
        headers=API_HEADERS["summarizer"],
    ) as response:
        log.info("Querying url: [%s]", response.url)
        data = await response.json()
        status = response.status

        log.info(json.dumps(data, indent=2))


async def main():
    async with API_RATE_LIMIT:
        async with ClientSession(
            connector=TCPConnector(limit=API_MAX_CONCURRENT_REQUESTS),
            timeout=ClientTimeout(API_TIMEOUT),
        ) as session:
            await get_summary(session=session)


asyncio.run(main())