Lead scraping is the automated collection of public business data, such as names, categories, phone numbers, websites, business email addresses and company profiles, so your sales team can build a lead list without copying it by hand. The quickest way to start lead scraping is to search Google Maps for a trade and a city, read the contact details each business publishes on its own website, and enrich the companies you care about with LinkedIn firmographics.
This guide shows that workflow on Scrape.ly with a real run from 23 October 2026 (five web design agencies in Austin, 25 seconds, $0.025), then the same pipeline in Python, what it costs at scale, and the compliance rules that decide whether your outreach is welcome or a liability.
What lead scraping collects, and where it comes from
B2B lead data lives in three public places: business listings (Google Maps), the businesses' own websites (contact, imprint and about pages), and company pages (LinkedIn). Each has a ready-made Actor in the Store, all from the same publisher, so the fields line up.
| Actor | Input | What you get | Price |
|---|---|---|---|
| Google Maps Email Extractor | search term + location | Maps listing (name, category, rating, address, phone, website) plus emails, phones and social links found on the website | $4.00 per 1,000 places |
| Contact Details Scraper | website URLs you already have | emails, phones and links to 13 social networks, one merged row per site | $1.50 per 1,000 pages |
| LinkedIn Company Search | keyword + company size | name, industry, location, follower count, company URL | $2.00 per 1,000 companies |
| LinkedIn Company Details Scraper | company URLs | employee count and range, followers, company type, founding year, website | $2.00 per 1,000 companies |
If you only need the listing without the website pass, the plain Google Maps Scraper costs $3.60 per 1,000 places. The Store has more than one lead scraper for other sources too, but these four cover the classic local and B2B list.
Who uses lead scraping, and for what
- Agencies selling to local businesses. A web design, SEO or bookkeeping firm needs every dentist, roofer or restaurant in a territory, with a phone number and a website to look at before the call.
- SaaS and B2B sales teams. Search companies by keyword and size, then pull their website and headcount to decide who fits the ideal customer profile.
- Partnerships and channel sales. Find resellers, installers or distributors in each region you expand into.
- CRM hygiene. Run the contact scraper over the websites already in your CRM to fill in missing phones and company social profiles.
- Market sizing. Count businesses per category and city before you commit a sales team to a region.
A real lead scraping run: web design agencies in Austin
On 23 October 2026 we ran the Google Maps Email Extractor for "web design agency" in Austin, USA, with a cap of 5 places. It finished in 25 seconds and was charged $0.0250. The log shows the two stages, the Maps search and the website pass:
2026-10-23T03:03:41.429Z [scrapely.actor] INFO Geocoded Austin, USA to 30.267152999999997, -97.7430608
2026-10-23T03:03:44.329Z [scrapely.actor] INFO web design agency: 19 places found, 5 kept
2026-10-23T03:03:44.330Z [scrapely.actor] INFO Reading websites for 5 places
2026-10-23T03:03:56.606Z [scrapely.actor] INFO Done: 5 places. Websites 5 read: 5 reachable, 2 with emails, 0 unreachable; 11 pages (0 failed), 2 http->https, 0 retries, 0 bot walls
2026-10-23T03:03:57.461Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false| Business | Rating (reviews) | Phone on Maps | Website | Emails on site | Company profiles found |
|---|---|---|---|---|---|
| GLIDE® | 5.0 (40) | yes | glidedesign.com | 0 | LinkedIn, Facebook, Instagram, X |
| Rodeo Creative (formerly Parrot Digital) | 5.0 (53) | yes | madebyrodeo.co | 2 | Facebook, Instagram, YouTube |
| Brand & Bloom | 4.9 (35) | no | brandandbloomdesigns.com | 0 | Instagram, TikTok |
| Way Creative Studio | 4.9 (22) | yes | waycreative.studio | 1 | LinkedIn, Instagram, X |
| Lucid Crew Web Design - Austin SEO | 5.0 (23) | yes | lucidcrew.com | 0 | LinkedIn, Instagram, X, YouTube |
We show email counts rather than the addresses themselves; in your own export they look like info@example.com. Three things in this table are the craft of lead scraping:
- Two of five sites published an email. Both were shared mailboxes (the "contact", "info" and "hello" kind), not a person's address. The other three offer a phone or a contact form. The Actor never guesses addresses, so an empty field means the site didn't print one.
- Every business had at least one company social profile. LinkedIn and Instagram links are often the better first touch for agencies and studios, and they tell you whether the business is active.
- Business sites also link people. One site linked the personal LinkedIn and X profiles of individuals next to its company pages. We dropped those from our sample. Your pipeline should do the same: keep company pages, leave personal profiles out unless you have a reason and a legal basis.
For enrichment, the LinkedIn Company Details Scraper adds firmographics. In our run for the LinkedIn scraping guide (22 October 2026, 3 companies, 6.6 seconds, $0.0062), it returned:
| Company | Industry | Employees on LinkedIn | Followers | Founded |
|---|---|---|---|---|
| Notion | Software Development | 7,211 | 1,132,188 | 2016 |
| Stripe | Technology, Information and Internet | 16,694 | 1,782,319 | 2010 |
| Software Development | 330,447 | 42,553,244 | not listed |
Employee count, industry and founding year are exactly the fields you filter on when you score leads.
How to build a lead list without code
- Define the target. Write down the trade or keyword, the territory and the minimum quality bar, for example "web design agency, Austin, 4 stars or better, has a website".
- Find the businesses. Open the Google Maps Email Extractor, enter search terms and a location, and set Max places per search term or URL. Use the filters that match your bar: Set a minimum star rating, Scrape places with/without a website and Skip closed places. Each saved place costs $0.0008 extra while a filter is on, which is cheaper than paying for places you'd throw away.
- Fill the gaps. Export the websites that came back without an email and run them through the Contact Details Scraper with Maximum link depth 1 and Merge contacts on, so it reads the contact and about pages behind the homepage.
- Add company targets. For non-local B2B lists, start from LinkedIn Company Search with a keyword and Company sizes, then pass the company URLs to the Company Details Scraper for headcount and website.
- Schedule and deduplicate. In Automations, create an automation On a schedule (weekly works for most territories), add the saved inputs under Run, and under Keep choose Only new items since the last run with the key field
placeId. Send the rows to Google Sheets or a webhook into your CRM. The automations guide covers every option.
Set Max cost per run in the run options, and the run stops when it reaches it. A territory that turns out bigger than you expected never becomes a surprise bill.
Lead scraping with Python and the API
Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN. The website pass makes runs take 25 seconds or more, so start the run asynchronously and read the items when it's done:
# 1. start the run; the response's data.id is the run ID
curl -X POST "https://api.scrape.ly/v2/actors/cornerledger~google-maps-email-extractor/runs" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchStringsArray": ["web design agency"], "locationQuery": "Austin, USA", "maxCrawledPlacesPerSearch": 5}'
# 2. wait (up to 60 s per call; repeat until status is SUCCEEDED)
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID?waitForFinish=60" \
-H "Authorization: Bearer $SCRAPELY_TOKEN"
# 3. read the items as CSV
curl "https://api.scrape.ly/v2/actor-runs/RUN_ID/dataset/items?format=csv" \
-H "Authorization: Bearer $SCRAPELY_TOKEN"This Python script (pip install scrapely-client-python) runs the whole pipeline: Maps search with filters, a deeper contact crawl for sites without an email, and a CSV that keeps only shared business mailboxes:
import csv
import os
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
SHARED_MAILBOXES = {"info", "contact", "hello", "office", "sales", "team", "studio", "support"}
def run_items(actor, run_input):
run = client.actor(actor).call(run_input=run_input)
return list(client.dataset(run.default_dataset_id).iterate_items())
places = run_items("cornerledger/google-maps-email-extractor", {
"searchStringsArray": ["web design agency"],
"locationQuery": "Austin, USA",
"maxCrawledPlacesPerSearch": 50,
"website": "withWebsite",
"skipClosedPlaces": True,
})
missing = [p["website"] for p in places if p.get("website") and not p.get("emails")]
if missing:
crawled = run_items("cornerledger/contact-info-scraper", {
"startUrls": [{"url": url} for url in missing],
"maxRequestsPerStartUrl": 5,
"maxDepth": 1,
"mergeContacts": True,
})
found = {row["originalStartUrl"]: row.get("emails") or [] for row in crawled}
for p in places:
p["emails"] = p.get("emails") or found.get(p.get("website"), [])
with open("leads.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["business", "category", "rating", "phone", "website", "email", "linkedin"])
for p in places:
shared = [e for e in p.get("emails") or [] if e.split("@")[0].lower() in SHARED_MAILBOXES]
writer.writerow([p["title"], p.get("categoryName"), p.get("totalScore"), p.get("phone"),
p.get("website"), shared[0] if shared else "", (p.get("linkedIns") or [""])[0]])Keeping only shared mailboxes is a deliberate choice: it is the data a business publishes to be contacted, and it keeps named individuals out of your list unless you add them on purpose.
AI agents can run the same search over MCP. Add https://api.scrape.ly/mcp to Cursor or Claude Code and ask: "Use scrapely to find 20 web design agencies in Austin on Google Maps with the emails and social profiles on their websites, and give me a CSV."
What it costs
Every Actor charges a fixed fee per result, plus a little platform usage. Our runs:
- Google Maps Email Extractor: 5 places × $0.004 = $0.02 in result fees; $0.0250 charged in total (compute $0.0017, residential proxy $0.0033).
- LinkedIn Company Details: 3 companies × $0.002 = $0.006; $0.0062 charged in total.
A worked example for a monthly list: 1,000 places with the website filter on is 1,000 × ($0.004 + $0.0008) = $4.80. A deeper crawl of 400 sites that showed no email, up to 5 pages each, is at most 2,000 pages × $0.0015 = $3.00. Enriching 200 shortlisted companies on LinkedIn adds 200 × $0.002 = $0.40. That is $8.20 in result fees for the month, before platform usage. The Free plan's $5 of monthly credit covers a first territory; the Starter plan at $19 a month includes $19 of credit.
What to watch out for
- Missing emails are normal. Two of five in our run. Don't fill the gap by guessing
firstname@patterns: guessed addresses bounce, hurt your sender reputation and can reach people who never published them. Use the phone, the contact form or the company's LinkedIn page instead. - Personal data hides in business data. Sole traders list their own name and mobile number, and business sites link employees' profiles. Decide up front which fields you keep and drop the rest, as the script does.
- Duplicates across searches. "Web designer" and "web design agency" return many of the same places. Deduplicate on
placeId(Maps) or the domain (websites). - Stale listings. Turn on Skip closed places and re-run territories on a schedule rather than buying a list once.
- Blocking. Maps and many small-business sites rate-limit bursts. The Actor runs on Scrape.ly's residential proxy inside the run; our run read 11 pages with 0 bot walls, and you never manage IPs.
Is lead scraping legal? GDPR and CAN-SPAM in practice
Collecting public business listings is common practice, and the Actors above read only public pages without logging in. What you do with the data afterwards is where the law bites. This is not legal advice; for a campaign at scale, ask a lawyer about your markets.
GDPR (EU and UK). Personal data is any information relating to an identified or identifiable person (Art. 4(1)), so a named employee's work email is personal data even when it's printed on a website. Recital 47 says that "the processing of personal data for direct marketing purposes may be regarded as carried out for a legitimate interest", but only after a balancing test that considers what people can reasonably expect (Recital 47). If you collect personal data from a website rather than from the person, Article 14 requires you to tell them who you are, why you process the data and where it came from, at the latest at your first message. Under Article 21, anyone can object to direct marketing at any time, and then "the personal data shall no longer be processed for such purposes". The French regulator CNIL's guidance on scraping adds minimisation: define precise collection criteria in advance and delete what you don't need.
CAN-SPAM (US). The FTC's compliance guide is explicit that "the law makes no exception for business-to-business email". Every commercial email needs accurate headers, an honest subject line, a clear notice that it is an ad, your physical postal address and a working opt-out that you honor within 10 business days. Each violating email can cost up to $53,088, and the guide lists harvesting email addresses among the aggravated violations.
In practice: collect business data and shared mailboxes, keep only the fields you'll use, say where you found the contact in your first message, include an opt-out, and suppress anyone who objects. Our guide to web scraping law covers the cases and statutes behind scraping itself.
Why Scrape.ly
- The whole pipeline in one place. Maps listings, website contacts and LinkedIn company data are ready-made Actors from one publisher, with matching fields and one bill.
- Pay per lead, not per seat. $4.00 per 1,000 places with emails, $1.50 per 1,000 pages crawled, a maximum charge per run and a prepaid balance.
- No invented data. Empty fields mean the page didn't say; the Actors never guess an email.
- Built-in automation. Schedules, "only new items", Google Sheets, Slack and CRM webhooks come with the platform, and the same Actors run from Claude or Cursor over MCP.
FAQ
What is lead scraping?
Lead scraping is collecting public business information, such as company names, categories, phones, websites, business emails and social profiles, with software instead of by hand. The result is a lead list you can filter, score and load into a CRM.
Can I scrape leads from Google Maps?
Yes. Google Maps lists name, category, rating, address, phone and website for most local businesses, and the Google Maps Email Extractor adds the contacts printed on each website. Our step-by-step guide on how to scrape Google Maps covers the listing fields and filters in detail.
Is there a LinkedIn lead scraper?
For companies, yes: LinkedIn Company Search finds companies by keyword and size, and the Company Details Scraper adds headcount, industry and website, both from logged-out public pages. Collecting people's profiles is a different, more sensitive job; our LinkedIn scraping guide explains what's public and what isn't.
Is it legal to scrape emails from websites?
Reading a page that any visitor can see is generally lawful, but sending marketing email is regulated. In the EU and UK, a person's work email is personal data under GDPR, with information and objection rights; in the US, CAN-SPAM applies to business-to-business email too. Shared business mailboxes, clear identification and an opt-out keep you on the right side.
What is a B2B lead scraper?
A B2B lead scraper collects company-level data (business listings, firmographics, company contact points) rather than consumer data. On Scrape.ly that means the Maps, Contact Details and LinkedIn company Actors above, chained in a workflow or a script.
How much does lead scraping cost?
With pay-per-result Actors, a list of 1,000 local businesses with emails from their websites costs about $4 to $5 in result fees, plus small platform usage. Our run of 5 places cost $0.025 in total.



