Most marketers go to Apollo, Hunter, or Clay to build a list. Using those tools, the going rate is ten to fifteen cents per verified contact. At scale, it can get expensive.
Luckily, these tools aren't magic. Most of their contacts are pulled from publicly available sources. With Claude Code and a little creativity, you can find many of those tool's contacts for a third of the cost.
To build your own, you'll need Claude Code, Open Router, and API keys to Hunter.io and Bouncer.
This waterfall is dead simple. It tries the cheapest (free) option first and escalates through the steps to more expensive options. The expensive options are at the bottom because most contacts never need them.
It's a simple python script written in Claude Code, that pulls API keys from your .env files as needed.
Stage one uses Perplexity Sonar. I access this model through Claude Code via Open Router. Web search is built into the model, so it pulls live from the internet. I give it companies and preferred job titles. It comes back with names and, often, the actual email. Half a cent a call. This finds most people on its own. If you don't already have a list of companies, I recommend Apify for cheap and easy scrapers. Don't use Apify to find contacts though, it'll be expensive.
If Sonar comes up empty, the tool goes to Stage 2, a free website scrape using a Direct HTTP request. It reads the company's pages that are most likely to have contacts and their contact information. Pages like /About, /Team, /Leadership, and /Contact. This will work for most websites, but if you find yourself getting blocked, BrightData is a great alternative (but it does cost a cent or two per call).
Now we've usually got something to work with from Sonar and the direct site scrape. The question is what.
The ideal case is that we got a list of people AND at least one real email at the company. If that's true, the tool reads the email format right off that real email, e.g. first.last, firstlast, flast, first, etc.
If we got people but no emails at all, we ask Hunter for the pattern. It only costs one cent.
Now the tool has two things: a list of names, and a pattern. It applies the pattern to each name and generates the email. Free.
The final stage uses Bouncer to SMTP-check every generated email to make sure it's validated. This step is a requirement. It ensures you aren't emailing dead mailboxes and risk tanking your outbound domains. One cent per check. Bounces get dropped. What survives is a list of verified, real, in-the-inbox-tomorrow contacts at the companies you wanted to reach.
For the hard targets where Sonar and the site scrape both came back empty on names too, the tool falls back to a Google SERP scrape through Bright Data. Gemini Flash parses the results into names and LinkedIn URLs. Slower and more expensive, but surfaces the people the earlier stages missed.
| # | Stage | Provider | Cost |
|---|---|---|---|
| 1 | AI search | Perplexity Sonar | $0.005 |
| 2 | Free site scrape | httpx direct request | $0 |
| 3 | Pattern detect | Read off existing email | $0 |
| 4 | Pattern fetch (fallback) | Hunter Pattern API | $0.01 |
| 5 | Generate the guess | Apply pattern to name | $0 |
| 6 | Verify guess | Bouncer SMTP | $0.01 |
| 7 | Hard-target fallback | Bright Data SERP + Gemini Flash | ~$0.02 |
This waterfall is optimized for emails, not phone numbers. Phone numbers will be more expensive to source. This also isn't a replacement for Clay, but it is a lightweight, very inexpensive way for bootstrappers or lean teams to build a quality email list for (literally) pennies. Thank you Abe Lincoln.
I use Bouncer because I had leftover credits, but MillionVerifier is even cheaper.