Contact Enricher
Pricing
from $2.00 / 1,000 domain enricheds
Contact Enricher
Crawls a company's website to extract emails, phones, socials, address and tech hints, infers the company email pattern, and optionally verifies emails via MX/catch-all checks.
Pricing
from $2.00 / 1,000 domain enricheds
Rating
0.0
(0)
Developer
Elliot Rose
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Given a list of company domains or URLs, crawls a handful of high-signal
pages per site (home, contact, about, team, footer links, JSON-LD), extracts
emails, phones, socials, address, company name and tech hints, infers the
company's email pattern (e.g. {first}.{last}), optionally verifies emails
via MX lookup + catch-all detection, and emits one normalised record per
domain.
Input
| Field | Type | Default | Description |
|---|---|---|---|
domains | string[] | (required) | Domains or URLs to enrich, e.g. "acme.com" or "https://www.acme.com". urls is accepted as an alias. |
maxPagesPerSite | integer | 8 | Max pages crawled per domain (home + up to maxPagesPerSite - 1 internal links). |
verifyEmails | boolean | true | Run MX + catch-all checks on every extracted/guessed email. |
wantPersonNames | boolean | false | Include named individuals found on the site and generate up to 10 pattern-guessed personal emails. Off by default — business contact data only, per policy. |
verifierProvider | string | (none) | Optional third-party verifier API name (see src/verify.py adapter). |
verifierApiKey | string | (none) | API key for the third-party verifier, if used. |
maxConcurrency | integer | 5 | Domains processed in parallel. |
Output (one dataset row per domain)
{"domain": "acme.com","company_name": "Acme Corp","emails": [{"value": "info@acme.com","type": "generic","source": "observed","off_domain": false,"mx_ok": true,"smtp_status": "unknown","confidence": 0.9},{"value": "jane.doe@acme.com","type": "named","source": "observed","off_domain": false,"mx_ok": true,"smtp_status": "unknown","confidence": 0.9},{"value": "john.smith@acme.com","type": "named","source": "pattern","off_domain": false,"mx_ok": true,"smtp_status": "unknown","confidence": 0.6}],"email_pattern": "{first}.{last}","phones": ["+15551234567"],"socials": { "linkedin": "https://linkedin.com/company/acme" },"address": "123 Main St, Springfield, IL, 62704, US","tech_hints": { "cms": "wordpress", "analytics": "google-analytics" },"pages_crawled": 5,"source_urls": ["https://acme.com/","https://acme.com/contact","https://acme.com/about","https://acme.com/team"],"fetched_at": "2026-08-29T12:00:00+00:00"}
A failed domain produces {"domain": "...", "error": "..."} instead, and is
never charged.
When wantPersonNames is true, a person_names array is also included.
Pricing events (pay-per-event)
| Event | Suggested price | When |
|---|---|---|
domain-enriched | $0.002 | Once per successfully processed domain (one dataset row). |
email-verified | $0.004 | Per email that went through verify_email (only when verifyEmails is true). |
Failed domains are never charged.
MCP
Exposed as an MCP tool enrich_company(domain), which maps to running this
Actor with domains: [domain] and default options, returning the single
resulting record.
Limitations
- JS-only sites: the crawler is a plain HTTP client (httpx) with no headless browser — content injected client-side by JavaScript frameworks won't be seen.
- SMTP probing is often blocked: outbound port 25 is frequently blocked
from datacenter/cloud IPs, so catch-all detection and per-mailbox checks
regularly come back inconclusive. In that case
smtp_statusis"unknown"(still usable —mx_okandconfidenceare still populated from the MX lookup). - Only business contact data is emitted by default; named individuals and
pattern-guessed personal emails require the explicit
wantPersonNamesflag. - Email-pattern inference and address/company-name selection are heuristic,
not guaranteed correct — always treat guessed (
source: "pattern") emails as lower confidence than observed ones.