Roofing Contractor Lead Scraper — Verified Emails avatar

Roofing Contractor Lead Scraper — Verified Emails

Pricing

from $35.00 / 1,000 roofing contractor leads

Go to Apify Store
Roofing Contractor Lead Scraper — Verified Emails

Roofing Contractor Lead Scraper — Verified Emails

Find roofing contractors by niche and location. Extract phones, websites, services, socials, and public emails with conservative DNS, SMTP, and catch-all checks. Free-plan runs return at most 5 records; paid plans can request up to 200.

Pricing

from $35.00 / 1,000 roofing contractor leads

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Find roofing contractors by city, state, ZIP code, or custom niche query. The Actor searches live Google Maps listings, visits each contractor's public website, extracts business contact details and roofing services, and checks email deliverability using DNS, SMTP recipient acceptance, and catch-all detection.

Free-plan limit: Apify free-plan users receive at most 5 records per run. Upgrade to an Apify paid plan to request up to 200 records per run.

Use the dataset for roofing software sales, material supplier outreach, recruiting, territory planning, agency prospecting, insurance vendor research, and local market analysis. Results are available as JSON, CSV, Excel, XML, RSS, or through the Apify API and integrations.

What you get

Each result can include:

  • Business name, Maps category, address, phone, website, hours, rating, review count, coordinates, Maps URL, and place identifier
  • Public email addresses with the exact source page where each address was found
  • A conservative email verification result: smtp_verified, catch_all, mx_only, smtp_rejected, invalid_domain, unknown, or not_checked
  • Detected roofing services, including residential, commercial, repair, replacement, shingles, metal, flat/TPO/EPDM, tile, and new-roof installation
  • Public Facebook, Instagram, LinkedIn, and X/Twitter links found on the company website

The Actor never sends an email. It only performs mail-routing and SMTP handshake checks when verification is enabled.

Input

FieldTypeDefaultDescription
businessTypestringRoofing ContractorRoofing niche or Custom
locationstringDallas, TXCity, state, postal code, neighborhood, or region
searchQuerystringemptyExact Maps query when businessType is Custom
maxResultsinteger25Maximum leads to deliver, from 1 to 200; free-plan runs are capped at 5
enrichEmailsbooleantrueFind public business emails on contractor websites
verifyEmailsbooleantrueRun DNS, SMTP, and catch-all checks
emailRequirementstringanyKeep any contractor, only leads with a found email, or only smtp_verified emails
enrichSocialsbooleantrueFind public social profile links
proxyConfigurationobjectApify ProxyNetwork settings for Maps requests

The Console prefill requests only 3 results so you can inspect quality and cost before scaling.

Example input

{
"businessType": "Storm Damage Roofer",
"location": "Denver, CO",
"maxResults": 25,
"enrichEmails": true,
"verifyEmails": true,
"emailRequirement": "smtp_verified",
"enrichSocials": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Example output

{
"business_name": "Example Roofing & Exteriors",
"business_type": "Storm Damage Roofer",
"category": "Roofing contractor",
"services": ["Roof Repair", "Roof Replacement", "Storm Damage"],
"phone": "+1 303-555-0142",
"email": "estimates@example-roofing.com",
"email_verified": true,
"email_verification_status": "smtp_verified",
"email_verification_note": "SMTP accepted this mailbox and rejected a random mailbox",
"email_source_url": "https://example-roofing.com/contact",
"all_emails": [
{
"address": "estimates@example-roofing.com",
"verified": true,
"status": "smtp_verified",
"verificationNote": "SMTP accepted this mailbox and rejected a random mailbox",
"sourceUrl": "https://example-roofing.com/contact"
}
],
"website": "https://example-roofing.com/",
"address": "100 Main St, Denver, CO 80202",
"rating": 4.8,
"review_count": 214,
"hours": "Open · Closes 5 PM",
"facebook": "https://facebook.com/example-roofing",
"instagram": null,
"linkedin": null,
"twitter": null,
"google_maps_url": "https://www.google.com/maps/place/example",
"place_id": "0x123:0x456",
"latitude": 39.7392,
"longitude": -104.9903,
"scraped_at": "2026-09-12T12:00:00.000Z",
"source_url": "https://www.google.com/maps/search/storm%20damage%20roofing%20contractor%20in%20Denver%2C%20CO?hl=en"
}

Understanding email verification

Email verification is deliberately conservative:

  • smtp_verified: the receiving server accepted the discovered mailbox and rejected a generated random mailbox on the same domain.
  • catch_all: the server accepts random recipients, so the specific mailbox cannot be confirmed.
  • mx_only: the domain has mail routing, but SMTP probing was blocked, timed out, or remained inconclusive.
  • smtp_rejected: the receiving server definitively rejected the mailbox.
  • invalid_domain: invalid syntax or no MX records.
  • not_checked: verification was disabled.

An SMTP result is a point-in-time signal, not a guarantee that future mail will be delivered. Mail servers may greylist, block verification traffic, or accept mail before rejecting it later. Always follow applicable privacy, marketing, anti-spam, and data-protection laws.

Pricing

Pay per event keeps cost predictable:

  • Apify free-plan users can receive up to 5 saved records per run. Paid-plan users can request up to 200.

  • Actor start: $0.00005 per automatically calculated start event

  • Roofing contractor lead: $0.035 per saved dataset record

Approximate event prices are $0.35 for 10 leads, $1.75 for 50 leads, and $3.50 for 100 leads, plus the small start event. The Actor saves each result before charging its lead event and stops cleanly when the run's maximum charge is reached.

API example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/roofing-contractor-lead-scraper').call({
businessType: 'Commercial Roofer',
location: 'Houston, TX',
maxResults: 20,
enrichEmails: true,
verifyEmails: true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Reliability and limits

  • Google Maps and contractor websites change and may rate-limit automated access. Apify residential proxies are recommended for production.
  • Some listings do not include a website, and some websites publish only a contact form or phone number. In those cases email fields are null or empty; the Actor does not invent addresses.
  • Websites are limited to the home page plus up to two same-domain contact, about, team, service, estimate, or roofing pages.
  • SMTP port 25 may be filtered by a network or receiving server, producing the honest mx_only result.
  • emailRequirement=smtp_verified is intentionally strict and may return zero leads when mail servers block probes or use catch-all routing.
  • Google Maps result availability varies by geography and query. Run separate locations for broader coverage.
  • Diagnostics and outcome classification are saved in the OUTPUT key-value record. A run distinguishes DATA, EMPTY, BLOCKED, REJECTED, and FAILED outcomes.

Responsible use

Collect and use only lawful public business information. Respect website terms, robots policies where applicable, opt-outs, applicable privacy laws, and email-marketing rules such as CAN-SPAM, CASL, PECR, and GDPR. Do not use this Actor to harass individuals, send deceptive messages, or build sensitive-person profiles.