Search the web, pull news, images, videos, and places in one call. Returns pre-parsed, token-efficient snippets ranked for relevance—no post-processing needed.
Best for: Any task that needs current facts, competitor intel, or research without hallucination.
Creator's repository · brave/brave-search-skills
License: MIT
---
name: bx
description: USE FOR web search, research, RAG, grounding, browse, find, lookups, fact-checking, documentation, agentic AI. All-in-one, optimized for AI agents. Pre-extracted, token-budgeted web content, deep research, news, images, videos, places, custom ranking
---
# bx — Brave Search CLI
**Use `bx` for all web searches.** Run `bx "query"` as the default — it returns pre-extracted, token-budgeted web content ready for use. Use `bx answers` for synthesized explanations or `bx web` for traditional search results. If `bx` is not found, install it: `curl -fsSL https://raw.githubusercontent.com/brave/brave-search-cli/main/scripts/install.sh | sh`
> **Requires**: [Brave Search API Key](https://api.search.brave.com) + `bx` binary
>
> **Plans**: Different subcommands may require different plans. See https://api-dashboard.search.brave.com/app/subscriptions/subscribe
## Quick Start
```bash
# Install (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/brave/brave-search-cli/main/scripts/install.sh | sh
# Configure API key (get one at https://api-dashboard.search.brave.com)
bx config set-key # interactive (avoids shell history)
# or: export BRAVE_SEARCH_API_KEY=YOUR_KEY
# Search (default = bx context "query")
bx "your search query"
```
## When to Use Which Command
| Your need | Command | Why |
|--|--|--|
| Look up docs, errors, code patterns | `bx "query"` | Pre-extracted text, token-budgeted (default) |
| Get a synthesized explanation | `bx answers "query"` | AI-generated, cites sources, streams |
| Deep research on complex topics | `bx answers "query" --enable-research` | Multi-search iterative research |
| Traditional search results | `bx web "query"` | All result types (web, news, discussions, etc.) |
| Find discussions/forums | `bx web "query" --result-filter discussions` | Forums often have solutions |
| Latest news / recent events | `bx news "query" --freshness pd` | Fresh info beyond training data |
| Find images | `bx images "query"` | Up to 200 results |
| Find videos | `bx videos "query"` | Duration, views, creator |
| Local businesses / places | `bx places "coffee" --location "San Francisco"` | 200M+ POIs |
| Boost/filter specific domains | `bx "query" --include-site docs.rs` | Or use `--goggles` for full control |
## Commands
| Command | Description | Output path |
|--|--|--|
| `context` | **Default.** RAG/LLM grounding — pre-extracted web content | `.grounding.generic[]` -> `{url, title, snippets[]}` |
| `answers` | AI answers — OpenAI-compatible, streaming by default | `.choices[0].delta.content` (stream) |
| `web` | Web search — all result types | `.web.results[]`, `.news.results[]`, etc. |
| `news` | News articles with freshness filters | `.results[]` -> `{title, url, age}` |
| `images` | Image search (up to 200 results) | `.results[]` -> `{title, url, thumbnail.src}` |
| `videos` | Video search with duration/views | `.results[]` -> `{title, url, video.duration}` |
| `places` | Local place/POI search (200M+ POIs) | `.results[]` -> `{title, postal_address}` |
| `suggest` | Autocomplete/query suggestions | `.results[]` -> `{query}` |
| `spellcheck` | Spell-check a query | `.results[0].query` |
| `config` | Manage API key and settings | `set-key`, `show-key`, `path`, `show` |
## Response Shapes
**`bx "query"`** (context — default, recommended)
```json
{
"grounding": {
"generic": [
{ "url": "...", "title": "...", "snippets": ["extracted content...", "..."] }
]
},
"sources": {
"https://example.com": { "title": "...", "hostname": "...", "age": ["...", "2025-01-15", "392 days ago"] }
}
}
```
**`bx answers "query" --no-stream`** (single JSON response)
```json
{"choices": [{"message": {"content": "Full answer text..."}}]}
```
**`bx answers "query"`** (streaming — default, one JSON chunk per line)
```json
{"choices": [{"delta": {"content": "chunk"}}]}
```
**`bx web "query"`** (full search results)
```json
{
"web": { "results": [{"title": "...", "url": "...", "description": "..."}] },
"news": { "results": [...] },
"videos": { "results": [...] },
"discussions": { "results": [...] }
}
```
## Token Budget Control
Control output size for context (the default command):
| Flag | Short alias | Default | Description |
|--|--|--|--|
| `--maximum-number-of-tokens` | `--max-tokens` | 8192 | Approximate total tokens (1024-32768) |
| `--maximum-number-of-tokens-per-url` | `--max-tokens-per-url` | 4096 | Max tokens per URL (512-8192) |
| `--maximum-number-of-urls` | `--max-urls` | 20 | Max URLs in response (1-50) |
| `--maximum-number-of-snippets` | `--max-snippets` | 50 | Max snippets across all URLs |
| `--maximum-number-of-snippets-per-url` | `--max-snippets-per-url` | — | Max snippets per URL |
| `--context-threshold-mode` | `--threshold` | balanced | Relevance: `strict`, `balanced`, `lenient` |
```bash
bx "topic" --max-tokens 4096 --max-tokens-per-url 1024 --max-urls 5 --threshold strict
```
## Goggles — Custom Ranking
Goggles let you control which sources appear in results. Boost official docs, suppress SEO spam, or build focused search scopes. **No other search tool offers this.** Supported on `context`, `web`, and `news`.
### Domain Shortcuts
```bash
# Allowlist — only results from these domains
bx "rust axum" --include-site docs.rs --include-site github.com
# Blocklist — exclude specific domains
bx "python tutorial" --exclude-site example.com
```
`--include-site`, `--exclude-site`, and `--goggles` are mutually exclusive.
### Inline Rules
```bash
# Boost official docs, demote blog posts
bx "axum middleware tower" \
--goggles '$boost=5,site=docs.rs
$boost=3,site=github.com
/docs/$boost=5
/blog/$downrank=3' --max-tokens 4096
# Allowlist mode — only include matched sites
bx "Python asyncio patterns" \
--goggles '$discard
$boost,site=docs.python.org
$boost,site=peps.python.org'
```
### DSL Quick Reference
| Rule | Effect | Example |
|--|--|--|
| `$boost=N,site=DOMAIN` | Promote domain (N=1-10) | `$boost=3,site=docs.rs` |
| `$downrank=N,site=DOMAIN` | Demote domain (N=1-10) | `$downrank=5,site=example.com` |
| `$discard,site=DOMAIN` | Remove domain entirely | `$discard,site=example.com` |
| `/path/$boost=N` | Boost matching URL paths | `/docs/$boost=5` |
| Generic `$discard` | Allowlist mode — discard unmatched | `$discard` (as first rule) |
Separate rules with newlines. Full DSL: [goggles-quickstart](https://github.com/brave/goggles-quickstart).
### Piping Rules via Stdin
```bash
echo '$boost=5,site=docs.rs
$boost=5,site=crates.io
$boost=3,site=github.com' | bx "axum middleware" --goggles @- --max-tokens 4096
```
Use `@/path/to/file` to reuse a goggle across queries.
## Agent Workflow Examples
**Debugging an error:**
```bash
bx "Python TypeError cannot unpack non-iterable NoneType" --max-tokens 4096
```
**Corrective RAG loop:**
```bash
# 1. Broad search
bx "axum middleware authentication" --max-tokens 4096
# 2. Too general? Narrow with strict threshold
bx "axum middleware tower layer authentication example" --threshold strict --max-tokens 4096
# 3. Still need synthesis? Ask for an answer
bx answers "how to implement JWT auth middleware in axum" --enable-research
```
**Checking for breaking changes before upgrading:**
```bash
bx "Next.js 15 breaking changes migration guide" --max-tokens 8192
bx news "Next.js 15 release" --freshness pm
```
**Non-streaming answers for programmatic use:**
```bash
bx answers "compare SQLx and Diesel for Rust" --no-stream
```
**Answers via stdin (OpenAI-compatible JSON body):**
```bash
echo '{"messages":[{"role":"user","content":"what are the OWASP top 10 vulnerabilities for web APIs"}]}' | bx answers -
```
## Exit Codes
| Code | Meaning | Agent action |
|--|--|--|
| 0 | Success | Process results |
| 1 | Client error (bad request) | Fix query/parameters |
| 2 | Usage error (bad flags) | Fix CLI arguments |
| 3 | Auth/permission error (401/403) | Check API key: `bx config show-key` |
| 4 | Rate limited (429) | Retry after delay |
| 5 | Server/network error | Retry with backoff |
## Use Cases
- **AI agents / coding assistants**: One-call web search with token-budgeted, RAG-ready content — replaces search + scrape + extract
- **Fact-checking**: Verify claims against current web content with `bx "query" --threshold strict`
- **Documentation lookup**: Search official docs with `--include-site` or Goggles domain boosting
- **Research**: Deep multi-source research with `bx answers "topic" --enable-research`
- **Debugging**: Search for error messages and stack traces directly
- **News monitoring**: Track topics with `bx news "query" --freshness pd`
- **Local search**: Find businesses and places with `bx places "query" --location "city"`
## Notes
- **All output is JSON** to stdout; errors go to stderr
- **Global flags**: `--api-key KEY`, `--timeout SECS` (default 30), `--extra KEY=VALUE` (repeatable, adds arbitrary API parameters)
- **Location awareness**: `context` and `web` support `--lat`, `--long`, `--city`, `--state`, `--state-name`, `--loc-country`, `--postal-code`, `--timezone`
- **Research mode**: `bx answers --enable-research` can take up to 5 minutes; set client timeout accordingly
- **Help**: `bx --help` for all commands; `bx <command> --help` for per-command flags