Email finder
The Ultron Email Finder takes a name plus a company (or a LinkedIn URL) and returns the most likely email address with a verification confidence. It resolves the company domain, generates pattern candidates, then asks a sibling Cloudflare worker to verify deliverability over SMTP. A separate track resolves personal addresses (Gmail, Outlook) when the corporate domain is unknown or yields nothing.
Overview
- Worker
ultron-enrich-email- Runtime
- Python 3 with Apify SDK, httpx, beautifulsoup4, browserforge
- Source
apify-actors/email-finder/- SMTP verifier
- Cloudflare worker
ultron-smtp-verify(CF allows outbound 25) - Tracks
- company domain + pattern, personal address search
- Output verdict
- valid, accept_all, role, invalid, unknown
The Email Finder is the scraper that turns prospects into deliverable contacts. It runs after the Maps or LinkedIn scrapers produce names but no emails. The confidence scoring is conservative: a result with status valid and confidence above 0.85 is treated as deliverable by the outreach skills; anything below skips, falls back to a different pattern, or routes the prospect to the LinkedIn DM track.
Input
Two tracks
Corporate pattern path and personal address path. Most leads go through both.
| Track | Inputs | Output |
|---|---|---|
| Corporate pattern | name + company + (url | resolved domain) | Highest-confidence company email per pattern |
| Personal address | name + linkedin handle + plausible personal providers | Gmail / Outlook address when the lead leaves one in their public LinkedIn profile or commits to one in OSS |
Domain resolution
The same company can have several public domains. The resolver cascades.
The resolver does not trust any one source. A LinkedIn page can point at a stale site; an old Brave index can return the new owner's site for an acquired brand; whois can be hidden. The cascade picks the candidate that survives an MX check, which is the cheapest evidence that mail can actually be delivered.
SMTP verification
Apify blocks outbound port 25, so verification runs on a sibling Cloudflare worker.
Personal email track
When the corporate domain yields nothing.
personal_track.py tries a small set of public sources for a personal address: the lead's GitHub commit history (parses author email from the most recent public commits), their LinkedIn contact info section if visible, and a handful of personal-domain heuristics. Results are verified the same way as corporate addresses. Confidence on personal addresses caps at 0.75; corporate matches always outrank them when both exist.
Output shape
One row per input lead with the best match and the runner-up.
How to trigger it
The skill emits a capability call. The platform translates it into an Apify run.