Bright Data — Search
Find things on the web. Two commands live in this skill:
bdata search — classic keyword SERP (Google/Bing/Yandex). Best when you want "what ranks for keyword X."
bdata discover — AI intent-ranked discovery with optional page content. Best when you want "pages about topic Y that match intent Z."
For structured data from a known platform (Amazon, LinkedIn, TikTok, …), stop and use data-feeds instead.
Setup gate (run first)
if ! command -v bdata >/dev/null 2>&1; then
echo "bdata CLI not installed — see bright-data-best-practices/references/cli-setup.md"
elif ! bdata zones >/dev/null 2>&1; then
echo "bdata not authenticated — run: bdata login (or: bdata login --device for SSH)"
fi
Halt and route to skills/bright-data-best-practices/references/cli-setup.md if either check fails.
Pick your path
| Situation |
Action |
| Single keyword query, just SERP |
bdata search "<query>" --engine google --json --pretty |
| Paginated SERP (more results) |
loop --page 0, --page 1, … (0-indexed) |
| Multiple queries |
shell loop over a queries file |
| Intent-ranked / semantic (not keyword) |
bdata discover "<query>" --intent "<intent>" --num-results 20 |
| Want page bodies along with results, one pass |
bdata discover ... --include-content |
| News / images / shopping SERP |
bdata search "<query>" --type news (or images, shopping) |
| Want Amazon/LinkedIn/TikTok/… structured data |
stop — hand off to data-feeds |
| Have URLs, want content |
hand off to scrape |
Action
Core commands:
# Google SERP, structured JSON
bdata search "site:example.com privacy policy" --engine google --json --pretty
# Localized Bing (German results, German language)
bdata search "datenschutz" --engine bing --country de --language de --json
# Second page of results (0-indexed)
bdata search "machine learning papers" --page 1 --json
# Mobile SERP (rankings differ from desktop)
bdata search "best coffee shops" --device mobile --json
# News vertical
bdata search "openai" --type news --json --pretty
# Intent-ranked discovery
bdata discover "enterprise LLM platforms" \
--intent "vendor pages with pricing" \
--num-results 15 --json
# Discovery with page content in markdown
bdata discover "webhook best practices" \
--include-content --num-results 10 -o results.json
# Date-filtered discovery
bdata discover "react server components" \
--start-date 2025-01-01 --end-date 2025-12-31 --num-results 20
Full flag reference: references/flags.md.
search vs discover — pick the right one
| You want |
Use |
| "What Google ranks for this exact keyword" |
search |
| "Pages that match this meaning/intent" |
discover |
| "News / images / shopping vertical SERP" |
search --type <vertical> |
| "Results + page bodies in one call" |
discover --include-content |
| "Dedup / semantic ranking across queries" |
discover |
Verification gate
- JSON parses cleanly:
jq . <output> returns 0.
- Result array non-empty — if empty, the query is legitimately zero-result; relax the query and re-run. Don't claim success on empty results without telling the user.
- Required fields present:
search: results live at .organic[]; each has title + link
discover: results live at .results[]; each has title + link; if --include-content, also content
- For
discover --include-content: no block-page signatures in the content field (same list as scrape, case-insensitive):
Access Denied
Just a moment
Attention Required
Checking your browser
captcha
cf-browser-verification
cloudflare (with < 2KB total body)
- Geo sanity: if the user expected country-specific results, inspect TLDs / languages of top results. If mis-localized, re-run with explicit
--country and --language.
Red flags
- Using
search to fetch content from Amazon, LinkedIn, TikTok, etc. when data-feeds returns clean structured data in one call.
- Scraping every SERP result blindly — filter first (domain allowlist, keyword in title, relevance heuristic).
- Confusing
search (keyword) with discover (semantic). They answer different questions.
- Running multiple queries without deduping URLs across result sets before scraping.
- Assuming SERP order is universal — it's personalized by geo + device. Always set
--country and --device explicitly for reproducibility.
- Using
--page as a result count — it's a page index, not a limit. Each page returns ~10 results.
- Assuming SERP results are at
.results[] — for bdata search they live at .organic[]. (Discover uses .results[].)
- Hardcoding
--num-results 100 on discover without realizing the pipeline polls until that many are found; can be slow.
References
references/flags.md — full flags for search and discover with when-to-use notes.
references/patterns.md — multi-query dedup, SERP → filter → scrape pipeline, search vs discover decision, legacy curl fallback, shared verification checklist.
references/examples.md — (1) single Google query, (2) localized Bing, (3) batch queries + dedup into URL list, (4) discover --include-content end-to-end.
1---2name: search3description: Search the web via the Bright Data CLI — `bdata search` for Google/Bing/Yandex SERP, `bdata discover` for intent-ranked semantic results. Use when the user wants SERP results, needs URLs to feed into scraping, or wants semantic web discovery with optional page content. Hands off to `scrape` once target URLs are chosen, and to `data-feeds` when the user wants structured data from a known platform. Requires the Bright Data CLI; proactively guides install + login if missing.4---5
6# Bright Data — Search
7
8Find things on the web. Two commands live in this skill:
9
10- **`bdata search`** — classic keyword SERP (Google/Bing/Yandex). Best when you want "what ranks for keyword X."
11- **`bdata discover`** — AI intent-ranked discovery with optional page content. Best when you want "pages about topic Y that match intent Z."
12
13For structured data from a known platform (Amazon, LinkedIn, TikTok, …), **stop and use `data-feeds` instead**.
14
15## Setup gate (run first)
16
17```bash
18if ! command -v bdata >/dev/null 2>&1; then
19 echo "bdata CLI not installed — see bright-data-best-practices/references/cli-setup.md"
20elif ! bdata zones >/dev/null 2>&1; then
21 echo "bdata not authenticated — run: bdata login (or: bdata login --device for SSH)"
22fi
23```
24
25Halt and route to `skills/bright-data-best-practices/references/cli-setup.md` if either check fails.
26
27## Pick your path
28
29| Situation | Action |
30|---|---|
31| Single keyword query, just SERP | `bdata search "<query>" --engine google --json --pretty` |
32| Paginated SERP (more results) | loop `--page 0`, `--page 1`, … (0-indexed) |
33| Multiple queries | shell loop over a queries file |
34| Intent-ranked / semantic (not keyword) | `bdata discover "<query>" --intent "<intent>" --num-results 20` |
35| Want page bodies along with results, one pass | `bdata discover ... --include-content` |
36| News / images / shopping SERP | `bdata search "<query>" --type news` (or `images`, `shopping`) |
37| Want Amazon/LinkedIn/TikTok/… structured data | **stop — hand off to `data-feeds`** |
38| Have URLs, want content | **hand off to `scrape`** |
39
40## Action
41
42Core commands:
43
44```bash
45# Google SERP, structured JSON
46bdata search "site:example.com privacy policy" --engine google --json --pretty
47
48# Localized Bing (German results, German language)
49bdata search "datenschutz" --engine bing --country de --language de --json
50
51# Second page of results (0-indexed)
52bdata search "machine learning papers" --page 1 --json
53
54# Mobile SERP (rankings differ from desktop)
55bdata search "best coffee shops" --device mobile --json
56
57# News vertical
58bdata search "openai" --type news --json --pretty
59
60# Intent-ranked discovery
61bdata discover "enterprise LLM platforms" \
62 --intent "vendor pages with pricing" \
63 --num-results 15 --json
64
65# Discovery with page content in markdown
66bdata discover "webhook best practices" \
67 --include-content --num-results 10 -o results.json
68
69# Date-filtered discovery
70bdata discover "react server components" \
71 --start-date 2025-01-01 --end-date 2025-12-31 --num-results 20
72```
73
74Full flag reference: [`references/flags.md`](references/flags.md).
75
76### `search` vs `discover` — pick the right one
77
78| You want | Use |
79|---|---|
80| "What Google ranks for this exact keyword" | `search` |
81| "Pages that match this meaning/intent" | `discover` |
82| "News / images / shopping vertical SERP" | `search --type <vertical>` |
83| "Results + page bodies in one call" | `discover --include-content` |
84| "Dedup / semantic ranking across queries" | `discover` |
85
86## Verification gate
87
881. **JSON parses cleanly:** `jq . <output>` returns 0.
892. **Result array non-empty** — if empty, the query is legitimately zero-result; relax the query and re-run. Don't claim success on empty results without telling the user.
903. **Required fields present:**
91 - `search`: results live at `.organic[]`; each has `title` + `link`
92 - `discover`: results live at `.results[]`; each has `title` + `link`; if `--include-content`, also `content`
934. **For `discover --include-content`:** no block-page signatures in the `content` field (same list as scrape, case-insensitive):
94 - `Access Denied`
95 - `Just a moment`
96 - `Attention Required`
97 - `Checking your browser`
98 - `captcha`
99 - `cf-browser-verification`
100 - `cloudflare` *(with < 2KB total body)*
1015. **Geo sanity:** if the user expected country-specific results, inspect TLDs / languages of top results. If mis-localized, re-run with explicit `--country` and `--language`.
102
103## Red flags
104
105- Using `search` to *fetch content* from Amazon, LinkedIn, TikTok, etc. when `data-feeds` returns clean structured data in one call.
106- Scraping every SERP result blindly — filter first (domain allowlist, keyword in title, relevance heuristic).
107- Confusing `search` (keyword) with `discover` (semantic). They answer different questions.
108- Running multiple queries without deduping URLs across result sets before scraping.
109- Assuming SERP order is universal — it's personalized by geo + device. Always set `--country` and `--device` explicitly for reproducibility.
110- Using `--page` as a result count — it's a page index, not a limit. Each page returns ~10 results.
111- Assuming SERP results are at `.results[]` — for `bdata search` they live at `.organic[]`. (Discover uses `.results[]`.)
112- Hardcoding `--num-results 100` on `discover` without realizing the pipeline polls until that many are found; can be slow.
113
114## References
115
116- [`references/flags.md`](references/flags.md) — full flags for `search` and `discover` with when-to-use notes.
117- [`references/patterns.md`](references/patterns.md) — multi-query dedup, SERP → filter → scrape pipeline, `search` vs `discover` decision, legacy `curl` fallback, shared verification checklist.
118- [`references/examples.md`](references/examples.md) — (1) single Google query, (2) localized Bing, (3) batch queries + dedup into URL list, (4) `discover --include-content` end-to-end.