home / skills / vm0-ai / vm0-skills / brave-search

brave-search skill

/brave-search

This skill enables private Brave Search usage via curl to perform web, image, video, and news queries without tracking.

npx playbooks add skill vm0-ai/vm0-skills --skill brave-search

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
6.6 KB
---
name: brave-search
description: Brave Search API via curl. Use this skill for privacy-focused web, image, video, and news search with no tracking.
vm0_secrets:
  - BRAVE_API_KEY
---

# Brave Search API

Use the Brave Search API via direct `curl` calls to perform **privacy-focused web searches** with no user tracking.

> Official docs: `https://api.search.brave.com/app/documentation`

---

## When to Use

Use this skill when you need to:

- **Web search** with privacy-focused results
- **Image search** for finding images
- **Video search** for video content
- **News search** for current events
- **AI-powered summaries** of search results

---

## Prerequisites

1. Sign up at [Brave Search API](https://brave.com/search/api/)
2. Subscribe to a plan (Free tier available, credit card required for anti-fraud)
3. Get your API key from the [Dashboard](https://api-dashboard.search.brave.com/)

```bash
export BRAVE_API_KEY="your-api-key"
```

### Pricing

| Plan | Price | Rate Limit | Monthly Cap |
|------|-------|------------|-------------|
| Free | $0 | 1 query/sec | 2,000 queries |
| Base | $5/1000 | 20 query/sec | 20M queries |
| Pro | $9/1000 | 50 query/sec | Unlimited |

---


> **Important:** When using `$VAR` in a command that pipes to another command, wrap the command containing `$VAR` in `bash -c '...'`. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.
> ```bash
> bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
> ```

## How to Use

All examples below assume you have `BRAVE_API_KEY` set.

The base URL for the API is:

- `https://api.search.brave.com/res/v1`

Authentication uses the `X-Subscription-Token` header.

---

### 1. Basic Web Search

Search the web with a query:

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search?q=artificial+intelligence" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}"' | jq '.web.results[:3] | .[] | {title, url, description}
```

---

### 2. Web Search with Parameters

Customize search with country, language, and result count:

Write to `/tmp/brave_query.txt`:

```
best restaurants
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "country=us" -d "search_lang=en" -d "count=5"' | jq '.web.results[] | {title, url}'
```

**Parameters:**

- `q`: Search query (required, max 400 chars / 50 words)
- `country`: Two-letter country code (e.g., `us`, `gb`, `jp`)
- `search_lang`: Language code (e.g., `en`, `zh`, `ja`)
- `count`: Results per page (1-20, default: 10)
- `offset`: Pagination offset (0-9, default: 0)

---

### 3. Safe Search Filter

Control explicit content filtering:

Write to `/tmp/brave_query.txt`:

```
programming tutorials
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "safesearch=strict"' | jq '.web.results[:3] | .[] | {title, url}
```

**Options:** `off`, `strict` (Note: Image/Video search only supports `off` and `strict`)

---

### 4. Freshness Filter

Filter results by time:

Write to `/tmp/brave_query.txt`:

```
tech news
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "freshness=pd"' | jq '.web.results[:3] | .[] | {title, url, age}
```

**Options:**

- `pd`: Past day (24 hours)
- `pw`: Past week
- `pm`: Past month
- `py`: Past year
- `YYYY-MM-DDtoYYYY-MM-DD`: Custom date range

---

### 5. Image Search

Search for images:

Write to `/tmp/brave_query.txt`:

```
sunset beach
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/images/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "count=5" -d "safesearch=strict"' | jq '.results[] | {title, url: .properties.url, thumbnail: .thumbnail.src}
```

Image search supports up to 200 results per request.

---

### 6. Video Search

Search for videos:

Write to `/tmp/brave_query.txt`:

```
learn python
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/videos/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "count=5"' | jq '.results[] | {title, url, duration}
```

Video search supports up to 50 results per request.

---

### 7. News Search

Search for recent news articles:

Write to `/tmp/brave_query.txt`:

```
technology
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/news/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "count=3"' | jq '.results[:3] | .[] | {title, url, age}
```

News search defaults to past day (`pd`) freshness.

---

### 8. Pagination

Get more results with offset:

Write to `/tmp/brave_query.txt`:

```
machine learning
```

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}" -G --data-urlencode "q@/tmp/brave_query.txt" -d "count=10" -d "offset=1"' | jq '.web.results[] | {title, url}
```

`offset=1` skips the first page of results.

---

### 9. Get Raw JSON Response

View the full response structure:

```bash
bash -c 'curl -s "https://api.search.brave.com/res/v1/web/search?q=test" -H "Accept: application/json" -H "X-Subscription-Token: ${BRAVE_API_KEY}"' | jq 'keys'
```

Response includes: `query`, `mixed`, `type`, `web`, `videos`, `news`, etc.

---

## Response Structure

### Web Search Response

```json
{
  "query": { "original": "search term" },
  "web": {
  "results": [
  {
  "title": "Page Title",
  "url": "https://example.com",
  "description": "Page description...",
  "age": "2 days ago"
  }
  ]
  }
}
```

### Image Search Response

```json
{
  "results": [
  {
  "title": "Image Title",
  "properties": { "url": "https://..." },
  "thumbnail": { "src": "https://..." }
  }
  ]
}
```

---

## Guidelines

1. **URL encode queries**: Use `--data-urlencode` for special characters
2. **Respect rate limits**: Free tier is 1 query/second
3. **Use freshness for news**: Time-sensitive searches benefit from `pd` or `pw`
4. **Pagination limit**: Maximum offset is 9 (100 results total with count=10)
5. **Pro plan for local**: Local business search requires Pro subscription
6. **No tracking**: Brave doesn't track users or store search history

Overview

This skill provides curl-based access to the Brave Search API for privacy-focused web, image, video, and news searches with no user tracking. It shows how to authenticate with an X-Subscription-Token, construct queries, apply filters (safesearch, freshness, country, language), and parse JSON responses with jq. Examples use bash -c wrappers to preserve environment variables when piping. The skill is optimized for practical command-line use and automation.

How this skill works

You call Brave Search endpoints under https://api.search.brave.com/res/v1 using curl and an X-Subscription-Token header. The skill demonstrates web, image, video, and news endpoints, common query parameters (q, count, offset, country, search_lang, safesearch, freshness) and how to read the JSON response fields (web.results, images.results, videos.results, news.results). Examples include --data-urlencode for safe query encoding and bash -c wrappers to keep environment variables when piping to jq.

When to use it

  • Perform privacy-first web searches without user tracking or stored history
  • Fetch images, video links, or recent news programmatically from the command line
  • Build simple search-driven scripts or automations that return JSON for jq parsing
  • Filter results by freshness, country, language, or explicit-content settings
  • Paginate and batch queries within rate limits for research or indexing tasks

Best practices

  • Set BRAVE_API_KEY as an environment variable and use X-Subscription-Token for auth
  • Always urlencode queries with --data-urlencode or q@/path to handle special characters
  • Respect rate limits (free tier ~1 query/sec) and design retries/backoff
  • Use safesearch and freshness parameters for content safety and time-sensitive results
  • Wrap piped curl commands in bash -c '...' to avoid environment variable loss

Example use cases

  • Quickly list top web results for a keyword and extract title/url with jq
  • Pull image thumbnails and source URLs for a gallery-building script
  • Retrieve recent news articles on a topic using freshness=pd for past-day results
  • Search videos for tutorial links and include duration metadata in outputs
  • Automate multi-country queries by iterating country and search_lang parameters

FAQ

How do I authenticate requests?

Send your API key in the X-Subscription-Token header, e.g. -H "X-Subscription-Token: ${BRAVE_API_KEY}".

What is the base URL for the API?

Use https://api.search.brave.com/res/v1 and call the endpoint matching the resource (web/search, images/search, videos/search, news/search).

How do I handle special characters in queries?

Use --data-urlencode or pass a file with q@/path to ensure proper URL encoding.