How We Built an AI Email Finder with 5x Better Match Rates

Do not index
Do not index
At LinkDR, our mission is to help users earn high-quality backlinks and online authority with minimal effort. One of the hardest parts of link building? Finding real contact emails that actually work.
Most tools fall into two buckets:
  • Scrapers that return generic emails (info@, hello@, etc.)
  • APIs that give outdated, low-confidence guesses
We needed something better.
So we built our own AI-powered email finder. It uses live website data, parses it using a Gemini 2.5 Pro LLM, and combines that with enrichment via Hunter API and (soon) Clay. The result? A smart agent that:
  • Finds real, personalized emails
  • Gives context ("this belongs to the creator")
  • Links to social handles when possible
  • Achieves 5x higher match rates than traditional tools
Here's how we built it.

🤖 Our Stack: AI + APIs + Orchestration

To make this magic happen, we needed the right ingredients:
  • Gemini 2.5 Pro: The brain of the operation, understanding website content like a human.
  • Hunter API: For verifying and enriching contact data.
  • DataForSEO: For fetching the SERP data that feeds our Keyword Analyzer.
  • Trigger.dev: The conductor, orchestrating all the background tasks seamlessly.
  • PostgreSQL: Our trusty database for caching results, scoring contacts, and preventing duplicates.

⚡️ The Workflow: From Domain to Contact

Let’s walk through what happens when LinkDR needs to find contacts for a domain (like imagecompressr.com):
notion image

1. Intelligent Assessment

First, the system checks what’s missing for each domain: do we need fresh contact info, company details, or both? This avoids unnecessary API calls and keeps things fast.
// Pseudocode: Decide what needs to be filled const { needsAIFill, needsHunterFill, needsContactFill } = getDomainMissingFields(domain)

2. Parallel Processing

Based on the gaps, we kick off several processes simultaneously—AI, Hunter, and company enrichment—using robust background task orchestration.
await Promise.allSettled([ needsAIFill && fillWebsiteDetails(domain), needsHunterFill && getHunterDomainSearch(domain), needsContactFill && findEmailsForDomain(domain), ].filter(Boolean))

3. AI Deep Dive

Gemini 2.5 Pro reads the website’s HTML, looking for clues just like a human researcher—identifying authors, creators, "contact us" pages, and even subtle hints in footers or social links.
// Pseudocode: AI parses HTML and returns contacts with context const aiContacts = await gemini.extractContactsFromHtml(html, { domain }) /* [ { email: "[email protected]", type: "personal", note: "Found in footer, likely belongs to the creator 'Alex'", twitter: "@alexdev" } ] */

4. Smart Merging

Found contacts are seamlessly merged into our database. We update existing records with newer info, add new contacts, and keep track of when the data was last refreshed.
for (const contact of aiContacts) { await db.domainContact.upsert({ where: { value: contact.email }, create: { ...contact, domain }, update: { ...contact, updatedAt: new Date() } }) }

5. Contextual Notes

notion image
For transparency, the AI generates a human-readable note summarizing its findings and confidence level (e.g., “Found email in footer, likely belongs to the creator mentioned\”).

🕵️️ Resilience & Automation: Trigger.dev in Action

notion image
Making this complex process reliable requires robust orchestration. That’s where Trigger.dev comes in:
  • Efficient Batching: When multiple domains need checking (like after analyzing a keyword’s search results), Trigger.dev figures out which ones actually require updates and queues them up in batches.
  • Smart Task Management: It schedules background jobs for each domain, managing parallel data fetching and AI analysis.
  • Built-in Resilience: Web scraping and API calls can be flaky. Trigger.dev automatically retries failed steps. We even have a dedicated process that periodically sweeps for domains that failed previously due to temporary issues (like API quotas) and gives them another shot.
// Pseudocode: Batch trigger for domains needing refresh await fillDomainTask.batchTrigger( domainsToFill.map(domain => ({ payload: { domain } })) )
  • Seamless Background Processing: All this happens reliably behind the scenes, ensuring our data stays fresh without interrupting your workflow in LinkDR.
notion image

🏆 Real-World Example: How We Find the Right Contact

notion image
Suppose you search for “AI image compression” in LinkDR’s Keyword Analyzer. Here’s what happens:
  1. SERP Fetch: We pull the top 100 results from Google.
  1. Domain Check: For each domain, we check if we already have up-to-date contact info.
  1. Background Fill: For missing/stale domains, we trigger the AI/Hunter pipeline in the background.
  1. AI Reasoning: Gemini 2.5 Pro might find a line like “Built by Alex” in the footer, spot an email, and link it to a Twitter handle.
  1. Contact Merge: The system upserts this as a "personal" contact, with a note: "Found in footer, likely belongs to the creator ‘Alex’ (@alexdev)."
  1. Instant UI: You see which domains have contacts right away. As background jobs finish, new contacts appear—no need to refresh.

✅ The Results Speak for Themselves

Compared to traditional methods, our AI Email Finder delivers:
  • 5x Higher Match Rate: Finding valid, personal emails far more often than standalone tools.
  • Actionable Context: Users love the AI notes (“This email likely belongs to the founder, mentioned on the About page”).
  • Lightning-Fast Lookups: Cached results mean common domains return contact info instantly.
  • Improved Outreach: Lower bounce rates and better connection potential.
  • Smarter Automation: Providing high-quality inputs for Patricia AI, our automated backlink agent.
  • Privacy First: Sensitive details like full emails and names are automatically obscured for non-admin users viewing domain info within LinkDR. We use these internally when placing links for you. Check out pricing for more info

📄 See It In Action: Try the Keyword Analyzer

notion image
Experience the AI Email Finder firsthand within LinkDR’s Keyword Analyzer:
  1. Enter a keyword you want to rank for.
  1. LinkDR fetches the latest search results.
  1. We instantly compare the ranking domains against our internal database.
  1. The results page immediately highlights which sites already have contact information available in LinkDR (with sensitive details kept private for non-admins).
  1. Behind the scenes, we automatically queue up any domains needing a data refresh, ensuring our intelligence stays up-to-date.
  1. You can also manually trigger a refresh for any specific domain right from the results.
  1. The handy “Copy SERP Analysis” button includes the best available contact details, ready for your outreach workflow.
Discover ranking competitors, identify parasite SEO opportunities, and find the right contacts – all powered by AI. No manual scraping. No guesswork.

We’re just getting started.
Want to integrate this power into your own product? DM @illyism on X.
Want high-quality backlinks without lifting a finger?
 

Ready to get 10x more backlinks?

Build high-quality backlinks at scale with LinkDR, the automated link building platform.

Get More Traffic
Ilias Ism

Article by

Ilias Ism

Ilias is a SEO expert and LinkDR co-founder, link building with AI. He's passionate about helping businesses dominate SERPs.