📄

Finding Boulder link targets with DataForSEO

Private deliverable. Enter the hub password to continue.

That's not right. Try again.

← Back to the hub

Finding Boulder link targets with DataForSEO

Built and run August 2, 2026. Script: scripts/boulder_link_targets.py. Full output: research/boulder-link-targets-ranked.csv (311 domains). Total API spend for the run: $0.81.

The trap in the question

"Find the Boulder websites with the highest domain authority" is a query that returns a useless list. Sorted purely by authority, the top of Boulder is colorado.edu, nist.gov, noaa.gov, bouldercolorado.gov and dailycamera.com. Enormous scores, and with one exception none of them will ever link to a med spa.

There's a second trap underneath it, and I walked straight into it on the first run. If you mine the backlink profiles of real Boulder businesses and sort those by authority, you get this:

bit.ly, w3.org, yahoo.com, squarespace.com, constantcontact.com, outlook.com

Those are URL shorteners, footer boilerplate, and SaaS the business happens to pay for. Every backlink profile is full of them, they all carry enormous Domain Rank, and sorting by rank floats them to the top every time. Authority is a filter, never a sort order.

The list you actually want answers a different question: which locally relevant domains have already demonstrated they will link to a Boulder business?

The method

Two discovery legs, then score, then classify.

Leg 1, SERP discovery. Fifteen queries chosen because the pages that rank for them are pages that list local businesses: "best of Boulder awards", "Boulder chamber of commerce members", "Boulder nonprofit corporate sponsors", "Boulder events calendar sponsors", "Boulder small business spotlight", and so on. Run through /serp/google/organic/live/advanced at depth 50, location-set to Boulder. That produced 257 domains for $0.09.

Leg 2, backlink mining. This is the higher-signal leg. Find real Boulder businesses across five verticals (med spa, dentist, law firm, restaurant, home remodeling), then pull each one's referring domains via /backlinks/referring_domains/live. A domain that already links to a Boulder dentist is proven to link to a local business, which is the only proof that matters. Sixteen seed businesses produced 1,718 referring domains for $0.47.

Scoring. Every unique domain goes through /backlinks/bulk_ranks/live and /backlinks/bulk_referring_domains/live. Both take up to 1,000 targets per call, so scoring 1,936 domains cost $0.24. This is the cheap part, which is why it pays to be generous with the candidate list and strict with the filter.

Classification. Drop .gov, .edu, .mil. Drop a blocklist of infrastructure and SaaS. Keep only domains that are either locally named or ranked for a Boulder-scoped query. Then tier what's left by whether it links out to local businesses.

That takes 1,936 raw domains down to 311 real ones.

Tier A: proven, and locally visible

These both rank for Boulder queries and already link to businesses in the seed set. This is the pitch list. The last column is out of 16 seed businesses, so 4 means this domain links to a quarter of a random sample of Boulder businesses, which is a lot.

Domain Rank Ref domains Seeds linked
denverpost.com 527 133,054 4
westword.com 493 36,383 4
coloradosun.com 484 19,898 1
dailycamera.com 475 21,304 3
denver7.com 453 22,384 1
denvergazette.com 436 11,566 2
aboutboulder.com 435 1,098 4
timescall.com 422 7,276 1
5280.com 420 16,296 4
colorado.com 420 16,640 4
citylifestyle.com 381 8,083 2
boulderchamber.com 377 723 4
uncovercolorado.com 365 15,392 2
bouldercountyarts.org 340 524 1
boulderweekly.com 334 5,058 3
bouldercoloradousa.com 324 3,009 1
yellowscene.com 317 1,292 1
boulderstartupweek.com 312 276 1
longmontleader.com 299 3,709 5

aboutboulder.com and boulderchamber.com are the standouts. Both link to four of sixteen seed businesses on modest referring-domain counts, which means they link out readily and a pitch has a real chance. longmontleader.com links to five, the most of any domain in the set.

Low rank, high relevance. These are the community sponsorship and local-events targets, and they're cheap or free to get into.

Domain Rank Ref domains Seeds linked
mountainaireboulder.com 206 81 2
denverinsider.org 164 378 3
boulderpleinairfest.com 105 42 2
bouldercounty365.com 85 34 2
popgalleryboulder.com 48 39 2
openstudiosboulder.org 0 36 2
boulderbeat.com 0 36 2

Do not skip these because the rank is low. boulderbeat.com scores 0 and is a real, actively read Boulder news site. Domain Rank lags badly on young sites, and a link from a genuine local publication is worth more to AI visibility than its rank suggests, because AI can't see Domain Rank at all. It sees whether a real local publication mentions you.

Thirty domains that rank for Boulder queries but weren't found linking to a seed business. Worth pitching, lower confidence. The genuinely useful ones here are bizwest.com (379), boulderdowntown.com (335), bouldereconomiccouncil.org (300) and business.boulderchamber.com (321).

Ignore greatnonprofits.org, taxexemptworld.com, causeiq.com and doublethedonation.com. They're national nonprofit databases that surfaced from the "nonprofit sponsors" query, and they're not link targets for a commercial business. The filter can't tell the difference; a human can, in about five seconds.

Two API gotchas that cost real time

Both worth knowing before you build anything else on DataForSEO.

  1. The live SERP endpoint accepts exactly one task per POST. Send an array of five and it returns 40000 You can set only one task at a time for tasks two through five, but the first one succeeds and the response looks healthy. My first run silently lost 12 of 15 queries and reported a plausible-looking 83 domains. Loop, don't batch.
  2. /backlinks/referring_domains/live rejects a filters key with 40501 Invalid Field: 'filters'. It returns a task error, not an exception, so the whole leg came back empty and the script cheerfully printed "0 referring domains". Filter client-side.

The pattern in both: DataForSEO reports failures inside the response body with a 200 at the HTTP layer. Always check status_code per task.

Rerunning it

py -3.13 scripts/boulder_link_targets.py --dry-run

Full run is about $0.81 and roughly ten minutes. It's city-agnostic:

py -3.13 scripts/boulder_link_targets.py --city "Fort Collins,Colorado,United States" --city-short "Fort Collins Colorado"

Widen the seed set by editing SEED_VERTICALS. More seeds means more proven linkers, and the marginal cost is about $0.03 per seed, so going from 16 to 50 seeds costs roughly a dollar and materially improves Tier A and B.

What I'd do with this

Tier A and B together are 47 domains, which is a quarter's worth of outreach for one person. Given the 74,000-email A/B test in the AI-and-links research, write these by hand. The list is small enough that hand-writing is affordable, and that's exactly the situation where the human-written reply rate advantage pays.

The chamber, the arts council, Open Studios, Startup Week and Plein Air Fest are sponsorship and membership plays rather than pitches, which means they're purchasable, renewable, and hard for a competitor to dislodge once you're listed.

Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.