search
Use when the task starts from a search query instead of a known URL: Google, Bing, Yandex or another search engine results, vertical result pages such as news, images, shopping, travel or maps, AI Mod
SKILL.mdplugins/research/skills/search/SKILL.md
GitHubBright Data - Search
One name for everything that starts from a search query: Google, Bing and the other engines, the Google verticals, and the answer engines. The user never has to name a product. Pick one, do the work, and state the choice in one line the user can override with one word.
The line that decides: a query that returns a results list is this skill. Pulling records from a known place, like Google Maps reviews or a LinkedIn profile, is scrape. One known URL is fetch.
A SERP page asked for as raw HTML with no URL is still this skill - that is the REST path with brd_json left off the search URL (on a zone whose default format is HTML, see references/serp.md), because the CLI always returns parsed results for Google. With a URL, it is fetch.
The fork - now versus volume
| The ask | Path | What it is |
|---|---|---|
| No volume word. The default. | SERP API | Structured JSON in one synchronous call. About 10 results per request. |
| "Top 100", "all the results", a rank report past page one | Web Scraper API - top 100 Google results | A Web Scraper API dataset job. Trigger, poll, download. Not instant. One request for 100 results, against ten SERP requests for the same depth. |
| "daily", "weekly", "track this keyword" | SERP or the top-100 job, on a timer | Recurring and only the top ten matters -> SERP plus a cron the agent writes. Recurring and the user wants all results and their ranks -> the top-100 job on a timer. Answer-engine tracking is a dataset job plus a cron, see references/answer-engines.md. |
| "top 5", "the first 3", any number under ten | SERP API | The normal fast path, then truncate the list to what was asked. |
Only Google comes back parsed by default. On the CLI, --engine bing returns the raw results page unless you add --json, and Yandex has no parser at all, so its page comes back raw. The MCP search_engine tool returns Bing as page markdown whose links are bing.com/ck/a redirects; for clean Bing results use REST with "data_format": "parsed_bing_api". Details in references/serp.md.
A volume word always means more than the default 10, never fewer. "Top 5" is not a smaller or cheaper job, it is this same one call with a shorter answer, so never route it anywhere else and never treat it as a reason to change product.
Route silently, defaulting to SERP.
A single agentic query can also run through the MCP server's search_engine tool - the brightdata-mcp skill covers that surface.
Rank tracking - pick depth first
A top-ten snapshot on a timer is SERP plus a cron the agent writes. A full rank report every run is the top-100 dataset job on a timer, one request per run instead of ten.
Example - the fast path
The ask: "what does Google show in the US for best crm for startups?"
- Starts from a query, not a URL. Stay in this skill.
- No volume word, no "100". Fast path.
bdata search "best crm for startups" --country us --pretty
If it fails with zone "<name>" not found, a stale default_zone_serp is in the way: pass --zone with an unlocker zone from bdata zones --json, which beats every other source, and fix the config as references/serp.md describes.
Then state the choice:
Ten live Google results through SERP API. Say
top 100for the deeper set, which runs as a job and takes longer.
Answer engines belong here
What ChatGPT Search, Gemini, Perplexity or Google AI Mode answer about a brand is still a query in and an answer out. Each is its own pre-built scraper, so each runs as a dataset job, same shape as the top-100 path. Their ids are in references/answer-engines.md and in the live scrapers catalogue; confirm one with find-scraper.mjs <gd_ id> before the first trigger.
KYC
None for normal SERP use. Send the user to brightdata.com/cp/kyc only if a call is actually refused for that reason.
Read next
- Read references/serp.md before the first call, when the ask is a live results list from Google, Bing or Yandex, when the ask is one fast page of Google Images (a dataset scraper also exists, see google-scrapers.md), when a zone error blocks the call, or when the same query has to repeat on a timer.
- Read references/google-scrapers.md when the ask names a Google vertical or wants depth past page one: top 100 results, Shopping, Maps, Hotels or Flights.
- Read references/answer-engines.md when the query targets ChatGPT, Perplexity, Gemini or Google AI Mode.
- The general trigger, poll, download mechanics: the
scrapeskill'sreferences/web-scraper-api.md. Not repeated here. - A refused call: the
agent-onboardingskill for "No API key found", 401, 407, and an account with nounblockerorserpzone at all (itscheck-auth.mjs --for search). The zone name does not matter:cli_unlocker,agent_unlockerandmcp_unlockerall work. A stale or missing serp zone is different: logging in again does not clear it, so fix it in references/serp.md's zone section. Thebillingskill for cost and credits.
Red flags - stop if you catch yourself doing one of these
- Promising 100 results at SERP speed, or calling the top-100 job instant
- Reaching for the top-100 job when the user never asked for volume
- Sending a results-list ask to
scrape, or handling a records-from-a-known-place ask here - Switching product because the job repeats. Depth picks the product, "daily" is only the scheduler
- Guessing a
dataset_idinstead of looking it up live - Sending the user to KYC before a call is actually refused