Roofing Contractor Lead Scraper — Emails & Phones avatar

Roofing Contractor Lead Scraper — Emails & Phones

Pricing

from $30.00 / 1,000 roofing contractor leads

Go to Apify Store
Roofing Contractor Lead Scraper — Emails & Phones

Roofing Contractor Lead Scraper — Emails & Phones

Find roofing contractor leads in any US city: phone, website, address, rating, public email with a mail check and roofing services. USD 35 per 1,000 leads.

Pricing

from $30.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

3 hours ago

Last modified

Share

Roofing Contractor Lead Scraper builds roofing contractor leads from Google Maps: it finds roofing companies in any US city or niche and returns each company's name, phone, website, address, rating, review count, public email with a mail-record (MX) check, detected roofing services and social links. It is built for teams that sell to roofers, such as roofing software, material suppliers, insurers and marketing agencies, and it costs USD 35 per 1,000 leads on the FREE tier (USD 30 per 1,000 on GOLD).

What data does the roofing contractor lead scraper return?

Each dataset row is one roofing business:

FieldWhat it contains
business_name, business_type, categoryCompany name, the niche you searched and the Google Maps category
phone, website, addressContact details as shown on Google Maps
rating, review_count, hoursGoogle Maps star rating, number of reviews and opening hours when shown
email, email_source_urlBest public email found on the company website and the page it came from
email_verified, email_verification_status, email_verification_noteResult of the email check (statuses below)
all_emailsUp to 5 public emails, each with its own check result and source page
servicesRoofing services detected on the website, for example Roof Repair, Metal Roofing, Storm Damage, Gutter Installation
facebook, instagram, linkedin, twitterPublic social profile links found on the website
google_maps_url, place_id, latitude, longitudeMap link, place identifier and coordinates
scraped_at, source_urlCollection time and the Maps search used

Missing values are null or empty lists. The run summary is saved as OUTPUT: outcome (DATA, EMPTY, BLOCKED, REJECTED or FAILED), the search query, leads delivered, lead events charged, emails found and warnings.

How do I get a list of roofing companies with emails and phone numbers?

Pick a roofing niche and a location, then set how many leads you want. The Actor searches Google Maps for "<niche> in <location>", opens each business, then visits its website (home page plus up to three contact, about or service pages, contact pages first) to find emails, including addresses hidden by email-protection scripts, services and social links.

InputExampleNotes
businessTypeStorm Damage RooferRoofing Contractor, Residential Roofer, Commercial Roofer, Roof Repair Service, Metal, Flat or Shingle Roofing Contractor, Storm Damage Roofer, Gutter Installer, or Custom
locationDenver, COCity, state, ZIP code or region
searchQuerysolar roof installers in Austin, TXUsed only when businessType is Custom
maxResults501 to 200 leads (default 25; the Console prefill asks for 3)
enrichEmails, verifyEmails, enrichSocialstrueWebsite emails, mail-record check and social links (all on by default)
emailRequirementfoundany keeps every company, found keeps leads with a public email; smtp_verified is rejected on the cloud (see below)

Commercial roofers in Houston, keeping only leads with an email:

{
"businessType": "Commercial Roofer",
"location": "Houston, TX",
"maxResults": 50,
"emailRequirement": "found"
}

A custom niche:

{
"businessType": "Custom",
"searchQuery": "tile roofing contractors in Phoenix, AZ",
"maxResults": 25
}

How reliable are the emails?

Emails are only as available as contractors make them. In a 10-lead Phoenix cloud run on 2026-10-27 the Actor found a public website email for 8 companies, after it started reading contact pages first and decoding protected addresses (earlier builds found one in five). The Actor never sends email. It checks syntax and the domain's mail (MX) records. Where the run can open SMTP connections, it also asks the mail server whether it would accept the address and a random one, without sending anything:

  • smtp_verified: the server accepted this mailbox and rejected a random one
  • catch_all: the domain accepts any address, so this one cannot be confirmed
  • mx_only: mail records exist, but the mailbox itself was not confirmed
  • smtp_rejected, invalid_domain: the mailbox or domain does not accept mail
  • not_checked: verification was turned off

Cloud runs cannot open SMTP connections (outbound mail port 25 timed out in every 2026-10-27 test run), so on Apify every found email ends as mx_only and no lead reaches smtp_verified. The Actor tests this once at the start instead of waiting on each address, records it as smtpCheckAvailable in OUTPUT, and rejects emailRequirement: "smtp_verified" before any search, with no lead charges. Use emailRequirement: "found" for email-only lists.

Does it give me homeowner roofing leads?

No. It returns roofing businesses, not homeowners who need a roof. Use it to prospect roofing companies (B2B leads). If you are a roofer looking for customer jobs, this is the wrong tool.

When should I use it, and when not?

Use it when you need a fresh list of roofing contractors in a market, with phone, website and any public email, for outreach, territory planning or supplier research.

Use another Actor when:

How do I run it from code?

JavaScript with apify-client:

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: 'Residential Roofer',
location: 'Tampa, FL',
maxResults: 40,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const lead of items) console.log(lead.business_name, lead.phone, lead.email);

Python with apify-client:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("muhammadafzal/roofing-contractor-lead-scraper").call(run_input={
"businessType": "Metal Roofing Contractor",
"location": "Nashville, TN",
"maxResults": 25,
"emailRequirement": "found",
})
for lead in client.dataset(run.default_dataset_id).iterate_items():
print(lead["business_name"], lead["email"], lead["email_verification_status"])

Use it from an AI assistant

Roofing Contractor Lead Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add the single-tool URL https://mcp.apify.com/?tools=muhammadafzal/roofing-contractor-lead-scraper to your client and ask, for example: "Find 30 commercial roofing contractors in Atlanta with phone numbers, websites and any public email." Each lead is charged at the prices below, so include a result limit in your request.

What does the output look like?

Two records from a cloud run on 2026-10-26 (shortened):

[
{
"business_name": "T Rock Roofing & Contracting",
"business_type": "Roofing Contractor",
"category": "Roofing contractor",
"services": ["Roof Repair", "Roof Replacement", "Commercial Roofing", "Metal Roofing", "Storm Damage", "Gutter Installation"],
"phone": "+1 469-931-9867",
"email": "info@dallasroofer.com",
"email_verified": null,
"email_verification_status": "mx_only",
"email_verification_note": "MX records exist; SMTP result was inconclusive",
"email_source_url": "https://dallasroofer.com/",
"website": "https://www.dallasroofer.com/",
"address": "9330 Lyndon B Johnson Fwy #900, Dallas, TX 75243, United States",
"rating": 4.9,
"review_count": 818,
"facebook": "https://www.facebook.com/trockroofers",
"linkedin": "https://www.linkedin.com/company/t-rock-roofing-and-contracting",
"place_id": "0x864c1ff1d7ea3cd3:0xfc3e94e948dced49",
"latitude": 32.91215,
"longitude": -96.73876,
"scraped_at": "2026-10-26T07:26:00.283Z"
},
{
"business_name": "New View Roofing",
"category": "Roofing contractor",
"services": [],
"phone": "+1 469-966-1196",
"email": null,
"all_emails": [],
"website": "https://newviewroofing.com/?utm_source=google&utm_medium=organic&utm_campaign=gmb",
"address": "4722 Gaston Ave, Dallas, TX 75246, United States",
"rating": 4.9,
"review_count": 703
}
]

How much do roofing contractor leads cost?

The Actor uses pay-per-event pricing, and platform usage is included in the event prices. One lead event is charged after each record is saved; companies filtered out by emailRequirement are not charged.

EventFREEBRONZESILVERGOLD / PLATINUM / DIAMOND
Roofing contractor lead (one dataset row)USD 0.035USD 0.035USD 0.035USD 0.03
Actor start (per started GB of allocated memory)USD 0.005USD 0.005USD 0.005USD 0.005

Worked totals on the FREE tier at the default 1 GB memory (one start event, USD 0.005):

  • 3 leads (Console prefill): 3 × USD 0.035 + USD 0.005 = USD 0.110
  • 100 leads: 100 × USD 0.035 + USD 0.005 = USD 3.505

A search with no matches charges only the start events. If you set a maximum cost per run, the Actor stops after the last lead the budget covers.

Limits and reliability

  • Speed: on 2026-10-27, 3 leads with website, email and social checks took 56 seconds and 10 leads took about 5.5 minutes in cloud runs; slow Maps pages are retried. The default 600-second timeout fits roughly 15 to 20 leads. The run stops opening Maps listings in time to save and charge what it collected, and says so in OUTPUT; raise the timeout for larger lists.
  • Scale: 1 to 200 leads per run, deduplicated by name and address.
  • Coverage: some company websites cannot be read (1 of 10 in the 2026-10-27 run), which leaves email, services and socials empty for that lead. hours lists the weekly opening hours shown on Maps, for example Monday: 8 AM to 5 PM; ....
  • Errors: a Google Maps access challenge ends the run as failed with outcome BLOCKED and 0 lead events; invalid input combinations end as REJECTED with a message.

FAQ

Is there a free roofing leads tool?

You can run this Actor on Apify's free plan with no subscription. Each delivered lead is charged at the FREE-tier price above.

Does it find the owner's personal email?

No. It only collects emails published on the company website, usually addresses like info@ or office@, ranked first.

Can I search several cities in one run?

One run covers one search. Run it once per city, or use Custom with a regional query such as roofing contractors in Dallas-Fort Worth.

What roofing services can it detect?

Sixteen: roof repair, replacement, new installation, residential, commercial, asphalt shingles, metal, flat (TPO/EPDM), tile, slate, storm damage, emergency repair, inspection, gutters, skylights and waterproofing.

Can I import the leads into a CRM?

Yes. Export the dataset as CSV or Excel, or pull it through the Apify API into HubSpot, Salesforce or a sheet.

Why is smtp_verified rejected?

Apify cloud runs cannot open SMTP connections, so no mailbox can be confirmed individually and emails end as mx_only. The run stops before searching rather than charge for leads it would filter out. Use found instead.

The Actor reads public Google Maps listings and public company websites. It does not log in, send email or bypass access controls. Business contacts can include personal data: use them lawfully and follow CAN-SPAM, TCPA, Do Not Call and anti-spam rules for outreach. This tool is not affiliated with Google, and this is not legal advice.

Last verified: 2026-10-27