Deeper · 01.A
Semrush at scale.
One Semrush account allows ~10 searches a day before friction. bord runs 10 logged-in profiles in parallel through AdsPower. That gets to 70+ searches a day, all headless, all logged.
The 10-profile rotation
Semrush throttles aggressive querying. The workaround is a profile rotation: 10 separate Semrush accounts, each in its own AdsPower browser profile. Each profile runs Playwright headless via the AdsPower CDP endpoint. Each session is throttled to ~7 searches before rotating to the next profile. State is persisted to disk so cookies, fingerprints and history survive.
Never run two browser profiles in parallel. Sequential rotation only — fingerprint collisions get accounts flagged.
The journey explorer
bord-apps/semrush-search runs a daemon called the journey explorer. It walks a queue: city × vertical × language. For each row it pulls volume, KD, CPC, intent, and writes to a journal. The dashboard at localhost:4000/semrush-search shows the live state of the queue, which profile is in use, and how many searches are left in the daily budget.
The pipeline, step by step
- 01Pick a country (.ch first, .com Bali second)Country logic is set elsewhere. The semrush daemon picks the active country.
- 02Pull a vertical from the seed listPlumbing, dentist, electrician, locksmith, surf school, scooter rental, cleaning, moving, photographer, escape room, etc.
- 03Combine vertical × cityGeneva, Lausanne, Zurich, Basel for .ch. Canggu, Ubud, Seminyak for Bali. Spit out the literal Google query.
- 04Headless Semrush searchRead volume, KD, CPC, intent. Write to JSON.
- 05Filter on the four numbersvolume ≥ 300, KD < 30, CPC ≥ $2, intent commercial. Anything failing is killed and the row is marked dead.
- 06Surviving rows go to OpenProvider checkA second daemon checks domain availability. Both must be true to move on.
- 07Final list goes to the audit sheetGoogle Sheet `audit` tab is the source of truth. Every row has the Semrush data, the domain price, and a Buy/No verdict.
Why this matters
Most SEO outfits guess. bord doesn't guess. Every market has numbers attached before any code runs. That's why the conversion from launched site to first-page ranking is so high — the keywords were screened to be winnable.