Lead File Import Checker

live$0.002/row checkedOutbound

Last updated November 1, 2026

Check a lead list before a CRM or sequencer import: email syntax, duplicates, free mail, role and disposable addresses, domain DNS and MX, live and parked sites, company name match, and missing fields. Import, review, or reject per row. No mailbox check.

Features

  • One verdict per row, and an issues column with every reason.
  • Duplicates caught the way inboxes see them, so Jane@Stripe.com and jane+news@stripe.com are one person.
  • Syntax, free mail, role, and disposable checks, plus DNS and MX for each domain.
  • One homepage read per company for live, parked, and company name match. No mailbox check.
  • Pay per event: Row checked at $0.002.

Input

rowsarrayoptional

Your lead rows as a JSON array of objects, one object per lead, with any column names. Up to 50,000 rows. Give rows, csv_url, or dataset_id, one of them.

csv_urlstringoptional

A public link to a CSV file with a header row, up to 50 MB. Comma, semicolon, tab, and pipe separators are detected. For a Google Sheet use File, Share, Publish to web, CSV.

dataset_idstringoptional

An Apify dataset ID from one of your runs, for example the output of a lead list actor.

column_mapobjectoptional

Optional. Which of your columns holds each field, for example {"email": "Work Email", "company": "Account", "domain": "Website", "first_name": "First", "last_name": "Last", "date": "Last Activity"}. Without it the actor reads common header names (Email, Email Address, Work Email, Domain, Website, Company, Company Name, First Name, Last Name).

required_fieldsarrayoptional

Fields a row must have, or it is rejected with missing_required_field. Any of email, domain, company, first_name, last_name. Default: email.

checksarrayoptional

Which checks to run. Default: all of syntax, duplicates, free_mail, role, disposable, dns, site, company_match, missing_fields, stale. Every checked row costs the same.

check_websitesstringoptional

On by default: one homepage read per company domain (64 KB at most) for the live, parked, and company name checks. Off: those checks are skipped and the run is faster. The price is the same.

stale_daysstringoptional

Optional. With a date column named in column_map, rows whose date is older than this many days get the stale issue.

max_rowsstringoptional

Check at most this many rows, from the top of the file. Default 5000, at most 50000. Rows over the limit are not checked and not charged; the status message says how many.

max_charge_usdstringoptional

Optional. The run stops before any charge that would take it past this amount and delivers every row already charged. Leave empty to rely only on the maximum cost per run you set in Apify, which the actor also honors.

Output schema

json
{
  "row_index": "integer",
  "import_verdict": "string",
  "issues": "array",
  "input_email": "string",
  "input_domain": "string",
  "input_company": "string",
  "input_first_name": "string",
  "input_last_name": "string",
  "normalized_email": "string",
  "normalized_domain": "string",
  "email_syntax_valid": "boolean",
  "is_free_mail": "boolean",
  "is_role_address": "boolean",
  "is_disposable": "boolean",
  "duplicate_group": "string",
  "is_duplicate": "boolean",
  "duplicate_of_row_index": "integer",
  "domain_resolves": "boolean",
  "has_mx": "boolean",
  "mx_host": "string",
  "site_status": "integer",
  "site_final_url": "string",
  "site_title": "string",
  "is_parked": "boolean",
  "company_name_match": "string",
  "missing_fields": "array",
  "stale_flag": "boolean",
  "input_row_json": "string",
  "row_status": "string",
  "error_reason": "string",
  "billable_events_json": "string",
  "checked_at": "string"
}

Pricing

$0.002per row checked
EventFree plan price
Row checked$0.002
Actor Start$0.001

Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.

On the Apify free plan the actor stops at $1.50 of charges a month, about 750 checked rows. Any paid Apify plan removes the cap.

Limits

  • No mailbox verification, by design. In a test on 2026-10-28, Apify's network did not connect to port 25 on any of 4 mail servers, directly or through the Apify proxy, so an SMTP mailbox check cannot run here. A valid address on a domain with an MX record can still bounce.
  • Catch all domains are not detected, for the same reason.
  • Free mail is flagged for review, not rejected, because some B2B leads (founders, freelancers) use one.
  • The company name match reads the homepage title and the site's own name tags only. A page with no Latin letters reads unknown. A brand that differs from its legal name (a company listed as "Alphabet" on google.com) reads mismatch; check those by hand.
  • Files over 50 MB, or over 50,000 rows per run, must be split.
  • A date column is read with standard date formats; an unreadable date leaves stale_flag empty.

Available on