We tested 10 Brave Search query patterns on 100 real B2B companies to find senior people currently working there (their LinkedIn profiles). 1,000 searches, $0.125 total, 0 errors. Measured 2026-09-28.
- Best single query:
linkedin "at {Company}" (CEO OR founder OR chief OR president OR VP OR "head of" OR "general manager" OR director OR partner OR principal). Found 1+ senior person at 67 of 100 companies. - Best 3-query combo found 1+ senior person at 81 of 100 and 2+ at 56 of 100, for about $0.375 per 1k companies.
site:did nothing for us. Through the RapidAPI Brave endpoint, any query containingsite:returned zero results. Brave's own site documents the operator (https://search.brave.com/help/operators ), so the official API may behave differently. We did not test it.- Expect about 1 in 5 raw matches to be the wrong company (name collisions). Put a cheap LLM review step after the search.
A hit = a linkedin.com/in/ result whose title has a senior title, names the company in the employer or headline, and is not "ex-" / "former".
| Pattern | Query template | 1+ found | 2+ found |
|---|---|---|---|
| G | linkedin "at {co}" (CEO OR founder OR chief OR president OR VP OR "head of" OR "general manager" OR director OR partner OR principal) |
67 | 40 |
| B | "{co}" linkedin (VP OR "head of" OR "general manager") |
59 | 26 |
| C | "{co}" linkedin (director OR partner OR principal) |
52 | 19 |
| J | {co} linkedin CEO founder VP director (no quotes, no OR) |
50 | 22 |
| D | linkedin.com/in "{co}" (all titles OR'd) |
50 | 14 |
| A | "{co}" linkedin (CEO OR founder OR chief OR president) |
49 | 20 |
| E | linkedin.com/in "{domain}" (all titles OR'd) |
49 | 16 |
| H | "{co}" linkedin "vice president" |
45 | 19 |
| F | "{co}" linkedin |
35 | 8 |
| I | pattern A, page 2 | 0 | 0 |
| Queries per company | Patterns | 1+ found | 2+ found | Cost per 1k companies |
|---|---|---|---|---|
| 1 | G | 67 | 40 | $0.125 |
| 2 | F + G | 76 | 47 | $0.25 |
| 3 | F + G + H | 81 | 56 | $0.375 |
| 4 | B + F + G + H | 84 | 63 | $0.50 |
| 10 | all | 86 | 67 | $1.25 |
Cost is Brave via RapidAPI at $0.000125 per search.
- Write the query the way the headline is written. LinkedIn titles read "VP Sales at Acme". Quoting
"at Acme"matches that phrasing directly and beat every other pattern. - Long OR lists underperform. Splitting titles across separate searches, or one title per search, found more people than one big OR list.
- The domain is a weak anchor. Profiles rarely print
acme.com, so domain queries found fewer people than name queries. site:and page 2 returned nothing on the RapidAPI Brave endpoint. Putlinkedinorlinkedin.com/inin the query as plain words instead.- Name collisions are the main error. In a 25-hit sample, about 5 were the wrong company: "Runway" matched Runway Growth Capital, "Mercor" matched Mercor Slovakia, "SHIELD" matched Shield AI. Short or generic company names are the worst. Pass the target domain plus each candidate's headline to a small model and ask "same company? yes/no".
Same shape as pattern G, swapping the title list. These are templates, not measured. Only the senior-leadership numbers above were tested.
| Department | Query |
|---|---|
| Sales | linkedin "at {co}" ("VP Sales" OR "Head of Sales" OR "Sales Director" OR CRO OR "Chief Revenue Officer") |
| Marketing | linkedin "at {co}" (CMO OR "VP Marketing" OR "Head of Marketing" OR "Marketing Director" OR "Head of Growth" OR "Demand Generation") |
| RevOps / Sales Ops | linkedin "at {co}" ("Revenue Operations" OR RevOps OR "Sales Operations" OR "GTM Operations") |
| Engineering | linkedin "at {co}" (CTO OR "VP Engineering" OR "Head of Engineering" OR "Engineering Director") |
| Product | linkedin "at {co}" (CPO OR "VP Product" OR "Head of Product" OR "Director of Product") |
| Data / AI | linkedin "at {co}" ("Head of Data" OR "Chief Data Officer" OR "VP Data" OR "Head of AI" OR "Director of Analytics") |
| Security / IT | linkedin "at {co}" (CISO OR CIO OR "Head of Security" OR "VP IT" OR "IT Director") |
| Finance | linkedin "at {co}" (CFO OR "VP Finance" OR "Head of Finance" OR Controller OR "Finance Director") |
| People / HR | linkedin "at {co}" (CHRO OR "Chief People Officer" OR "VP People" OR "Head of People" OR "HR Director") |
| Talent / Recruiting | linkedin "at {co}" ("Head of Talent" OR "Talent Acquisition" OR "Recruiting Manager" OR "Head of Recruiting") |
| Customer Success | linkedin "at {co}" ("VP Customer Success" OR "Head of Customer Success" OR "Customer Success Director" OR CCO) |
| Partnerships | linkedin "at {co}" ("Head of Partnerships" OR "VP Partnerships" OR "Partnerships Director" OR "Business Development") |
| Operations | linkedin "at {co}" (COO OR "VP Operations" OR "Head of Operations" OR "Operations Director") |
| Legal | linkedin "at {co}" ("General Counsel" OR "Chief Legal Officer" OR "Head of Legal" OR "Legal Counsel") |
| Procurement | linkedin "at {co}" (Procurement OR "Head of Purchasing" OR "Sourcing Manager" OR "Vendor Management") |
Tips for departments:
- If a department comes back thin, run a second query with fewer titles, or just one (
linkedin "at {co}" "Head of Marketing"). Short OR lists did better in our test. - Add a plain
"{co}" linkedinquery as a catch-all. On its own it is weak, but it adds people the titled queries miss. @works too: many headlines read "Head of Data @ Acme". Trylinkedin "@ {co}"as a variant.
import html, re
SENIOR = re.compile(r"\b(owner|founder|co-founder|chief|ceo|cto|cfo|coo|cmo|cro|cpo|president|vp|vice president|head of|director|general manager|partner|principal)\b", re.I)
FORMER = re.compile(r"\b(ex|former|formerly|prev|previously|past)\b[-\s@:]", re.I)
def norm(s):
return re.sub(r"[^a-z0-9]", "", str(s).lower())
def parse(result, company):
"""One Brave web result -> {name, title, url} if it is a current senior person at company, else None."""
url = str(result.get("url") or "")
if "linkedin.com/in/" not in url:
return None
title = html.unescape(str(result.get("title") or "")).replace(" | LinkedIn", "")
desc = html.unescape(str(result.get("description") or ""))
parts = [p.strip() for p in re.split(r"\s[-–|]\s", title) if p.strip()]
if len(parts) < 2:
return None
name, headline = parts[0], " - ".join(parts[1:])
m = re.search(r"Experience:\s*([^·]+?)\s*(?:·|$)", desc)
employer = m.group(1).strip() if m else ""
c = norm(company)
if not (c and (c in norm(employer) or c in norm(headline))):
return None
if not SENIOR.search(headline) or FORMER.search(headline):
return None
return {"name": name, "title": headline, "url": url.split("?")[0]}
Swap SENIOR for a department regex to score department queries. Dedupe on the /in/<slug> part of the URL across queries.