Smart Email Finder & Verifier — Website + DNS avatar

Smart Email Finder & Verifier — Website + DNS

Pricing

from $4.00 / 1,000 published email found and checkeds

Go to Apify Store
Smart Email Finder & Verifier — Website + DNS

Smart Email Finder & Verifier — Website + DNS

Find published company website emails from domains or CSV. Check syntax, DNS mail routing, mail provider, SPF, DMARC and selected DKIM records; preserve source pages and address flags. Also check an existing email list. Mailbox existence stays unknown.

Pricing

from $4.00 / 1,000 published email found and checkeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Smart Email Finder & Verifier for company websites

Turn a list of company websites into published email addresses with source pages and syntax/DNS checks. The Actor follows relevant contact, help, team, about, and legal links, combines repeated appearances, and ranks the resulting addresses by evidence and contact relevance. It also checks an existing email list in verify mode. Import websites from a public CSV, identify the MX provider family, and inspect SPF, DMARC and selected DKIM DNS records alongside each eligible address.

Use it when your CRM, company research, or directory export already contains websites and you want to review contact information before enriching those records. Each result identifies the address, where it appeared, when it was checked, domain mail routing, and role/disposable/free-provider flags. Authentication checks add mailProvider, spfRecords, dmarcRecords, dkimChecks, and authenticationStatus. SPF/DMARC records describe domain configuration. A selected DKIM record is DNS evidence; these checks do not validate message signatures or mailbox acceptance. Disable includeAuthenticationChecks for the original lightweight syntax/DNS path, or supply up to 10 dkimSelectors.

Verification means syntax and DNS mail routing. mail_server_found means the domain has a mail route. mailboxStatus remains unknown: the Actor does not confirm an individual inbox, catch-all behavior, or deliverability. Ranking scores order published evidence; they are not probabilities. For mailbox-level decisions, continue with a verification service authorized for your workflow.

Quick start: find company website emails

{
"websites": ["https://www.python.org/about/help/"],
"mode": "find",
"maxWebsites": 1,
"maxPagesPerWebsite": 3,
"maxResults": 10
}

Domains such as python.org are accepted and use HTTPS. Supplying a known contact page gives the crawler a more focused starting point. Only linked pages on the same hostname, including its www form, are followed. URL query strings and fragments are removed. A domain is scanned once; the first supplied URL for that domain is retained.

Import a company website CSV

{
"csvUrl": "https://example.org/companies.csv",
"csvColumn": "website",
"maxWebsites": 10,
"maxPagesPerWebsite": 5,
"maxResults": 100
}

Use a public UTF-8 CSV with a header row. BOMs and quoted fields are supported. Files are bounded to 2 MB and 1,000 nonempty rows. Only values from csvColumn are retained. Direct websites and CSV websites are combined, with the first URL for each domain retained. Use ordinary public URLs; query strings are removed, and credentialed URLs and cross-host redirects are outside this import contract.

Check an existing email list

{
"mode": "verify",
"emails": ["psf@python.org", "not-an-email", "sales@example.org"],
"maxResults": 10,
"maxConcurrency": 3
}

Every unique supplied address gets a check result, including malformed addresses. Domain case is normalized, while local-part case is preserved. The Actor identifies explicit MX records, domains that declare a null MX, and implicit routing through address records. Temporary DNS failures remain unknown. International and quoted local parts receive an unsupported-format explanation for review.

A practical company enrichment workflow

A research team starts with a spreadsheet of company websites. They paste those websites into websites, start discovery, and export email, websiteDomain, sourceUrls, status, and reasonCodes. Source pages allow the team to inspect why an address belongs in the company record. Role and disposable flags help route rows for review. A second verify call can check addresses already in the spreadsheet using the same output fields.

Start with Google Maps Email Extractor when your starting point is a business search. Use Bulk Website Contact Extractor when you also want phones and social links. This Actor focuses on email evidence and the combined discovery/check workflow.

What one result contains

Find mode returns one unique website/email pair. An address published on two supplied websites can therefore appear twice with separate provenance. Verify mode returns one unique supplied address. A website with no usable email produces an uncharged website_diagnostic row with email: null.

FieldHow to use it
recordType, recordIdDistinguish email rows from coverage diagnostics and identify results stably.
email, emailDomain, websiteDomainJoin addresses back to company records.
sourceUrls, extractionMethodsInspect the published evidence: mailto, visible text, bracket obfuscation, JSON-LD, or Cloudflare email encoding.
status, verificationLevel, mailboxStatusRead the scope of verification before using a result.
mailRoute, mxRecordsInspect explicit, implicit, null, missing, or unresolved domain routing.
isRoleBased, isDisposable, isFreeProvider, isExternalSegment and review address characteristics; provider lists are incomplete.
mailProvider, spfRecords, dmarcRecords, dkimChecks, authenticationStatusReview observed domain authentication records and selector coverage separately from mailbox existence.
suggestedEmail, reasonCodesReview possible domain typos and the reasons behind each decision. Suggestions never replace the input.
rankingScore, pagesScanned, checkedAtOrder evidence, understand website coverage, and track freshness.

The following is an illustrative complete email result. DNS records and timestamps reflect the time of each run.

{
"recordId": "0000000000000000000000000000000000000000000000000000000000000000",
"recordType": "email",
"website": "https://www.python.org/about/help/",
"websiteDomain": "python.org",
"email": "psf@python.org",
"emailDomain": "python.org",
"sourceUrls": ["https://www.python.org/about/help/"],
"extractionMethods": ["mailto"],
"isExternal": false,
"mailProvider": "unknown",
"spfRecords": [],
"dmarcRecords": [],
"dkimChecks": [],
"authenticationStatus": "not_checked",
"syntaxValid": true,
"status": "mail_server_found",
"verificationLevel": "syntax_dns",
"mailboxStatus": "unknown",
"mailRoute": "explicit_mx",
"mxRecords": [{"exchange": "mail.python.org", "priority": 50}],
"isDisposable": false,
"isRoleBased": false,
"isFreeProvider": false,
"suggestedEmail": null,
"reasonCodes": ["MX_PRESENT", "MAILBOX_NOT_CHECKED"],
"rankingScore": 80,
"pagesScanned": 1,
"checkedAt": "2026-10-14T00:00:00.000Z"
}

Inputs and work limits

InputDefault and limits
websitesPublic company domains or URLs; up to 100 supplied entries. Required for find mode.
csvUrl, csvColumnPublic UTF-8 website CSV, 2 MB / 1,000 rows; default column website.
includeAuthenticationChecksEnabled; inspect SPF, DMARC and selected DKIM DNS records.
dkimSelectorsUp to 10 labels; defaults include default, google, selector1, selector2, s1, s2, k1.
modefind by default; verify checks emails.
emailsUp to 5,000 supplied strings, processed within maxResults. Required for verify mode.
maxWebsites10 processed websites; range 1–100.
maxPagesPerWebsite5 attempted linked content pages; range 1–20. Robots requests are additional.
maxResults100 dataset rows; range 1–1,000, including uncharged website diagnostics.
maxConcurrency3 concurrent websites or address checks; range 1–10. Pages within a website are sequential.
requestTimeoutSecs15 seconds per content request including DNS and redirects; range 5–45.
includeExternalEmailsEnabled. Retains addresses on other domains, including a business's published free-provider address.
includeRoleEmailsEnabled. Retains department addresses such as sales and support.

The crawler reads static HTML and follows relevant links. It respects robots.txt, uses a descriptive user agent, bounds redirects and response sizes, and spaces requests within a website. JavaScript-only content, logins, CAPTCHA-protected pages, unlinked pages, and offsite redirects need a different collection route. Missing contact data describes the pages actually read rather than the entire website.

Pricing and cost control

The Actor uses Pay per event with Apify platform usage paid by the customer. Use the live Pricing tab when estimating the current event prices and platform rates.

EventCharge unit
Actor startPlatform startup event, scaled by allocated memory.
Published email found and checkedOne persisted unique website/email pair; syntax/DNS/provider and enabled authentication checks are included.
Supplied email checkedOne persisted unique supplied address in verify mode, including invalid-address results.

Website diagnostics are uncharged. Repeated occurrences of one address on a website do not add email events. There is no external API key or third-party verification subscription in this implementation.

Estimate find-mode event cost as startup + published website/email pairs × current email-found price. Estimate verify-mode event cost as startup + unique supplied addresses processed × current email-checked price. Add platform compute, storage, and transfer usage separately. maxResults bounds rows, and Apify's run charge limit can stop processing earlier. The run status shows a ceiling before result work, and RUN_SUMMARY records accepted result-event counts; its event-cost figure excludes the startup event and platform usage.

API, exports and agent use

Call asynchronously through the Apify API using an account token held in your environment:

curl --request POST \
'https://api.apify.com/v2/acts/khadinakbar~smart-email-finder-verifier/runs' \
--header "Authorization: Bearer $APIFY_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"websites":["https://www.python.org/about/help/"],"maxPagesPerWebsite":3,"maxResults":10}'

Read the returned run ID until it is terminal, then fetch the dataset identified by defaultDatasetId. Export as JSON, CSV or Excel in Console. Read OUTPUT and RUN_SUMMARY in the default key-value store for outcome, coverage, accepted result events, stop reason, and dataset links. Dataset retrieval requires the caller's authorized access.

For an AI agent, a useful prompt is:

Find published contact emails for these company websites. Keep source URLs and role flags. Read the run summary, return the checked addresses, and describe mail-server evidence separately from mailbox existence.

Choose this Actor when the starting point is a website list or an email list and the required output is source-backed addresses with syntax/DNS evidence. Supply complete JSON input, wait for the run, and retrieve its dataset. It is a batch Actor with schema-defined inputs and outputs. Hosted MCP client execution and third-party destination delivery should be evaluated in the client you use.

Best results and outcome recovery

COMPLETE means the requested checks finished with email results. PARTIAL means useful work exists but a request failed, robots restrictions reduced coverage, a limit stopped work, or execution was interrupted. VALID_EMPTY means the readable scoped pages had no eligible email, or robots restrictions prevented collection without a request failure. INVALID_INPUT explains what to correct. UPSTREAM_FAILED means content requests all failed without useful email results. CONFIG_ERROR means execution or storage needs attention.

Review source URLs and reason codes before retrying. Use a smaller batch or a known public contact URL for a focused crawl. The Actor preserves time for its terminal records and reports runtime_deadline when it stops before the platform timeout. A pending storage effect is preserved on interruption; the Actor stops an ambiguous replay instead of risking duplicate billing. Inspect the dataset and run charge ledger before deciding how to reconcile that run. Changed inputs or builds need a fresh run storage scope.

Builder's note

I found during fixture testing that adjacent menu labels can merge into an address-shaped string if a scraper flattens HTML carelessly. This implementation separates text nodes, extracts explicit mailto and structured evidence, and combines source pages. That makes the evidence behind a result easier to inspect than an address-only regex dump. I also reduced checkpoint writes: each new pending marker includes preceding acknowledged effects, and the finalizer flushes the last effect. An ambiguous effect still stops automatic replay.

Data use

Collect only information you are authorized to collect, respecting applicable laws, privacy rules, and each site's terms of service. Public visibility does not itself grant permission for outreach. The Actor sends no email, stores results in the caller's Apify storage, and uses no shared contact database. Configure your Apify retention and remove collected data when your purpose is complete.