🚀 Leads Scraper avatar

🚀 Leads Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
🚀 Leads Scraper

🚀 Leads Scraper

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperForge

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

Leads Scraper — B2B Contacts with Verified Emails, Phones & Company Data

Filter a large B2B contact database by job title, seniority, department, location, company size, industry, revenue and funding — and get back verified emails, direct and mobile phone numbers, LinkedIn URLs and full company profiles.

Up to 30,000 leads per run, streamed into your dataset as they are found, with 40 fields per contact.


What is Leads Scraper?

Most lead tools make you choose: a fast list with no contact details, or a slow enrichment pass that costs more than the list. This Actor is neither — it queries a prepared B2B database directly and returns the person and the company and the contact details in a single row.

Two things distinguish it in practice:

  • Email quality is described, not just asserted. Every row carries email_status, email_overall_score, and four boolean flags: email_is_deliverable, email_is_catch_all, email_is_role_account, email_is_free. That is the difference between "here is an address" and "here is an address, and here is how much to trust it". Filtering out catch-all domains and info@ role accounts before you send is what keeps a domain's sending reputation intact.
  • Funding filters are first-class. fundingType with a date range finds companies that raised recently — the single strongest B2B buying signal there is, because a company that just closed a round is a company with a budget and a mandate to spend it.

Three phone fields (first_phone, mobile_phone, corporate_phone) mean multichannel sequences do not need a separate data source, and results stream in live: a 30,000-row run is usable long before it finishes.


What data can you extract?

👤 Person

FieldDescription
full_name, first_name, last_nameContact name
titleJob title
senioritySeniority level
departmentsDepartment / function
person_linkedin_urlLinkedIn profile
person_city, person_state, person_countryLocation

📧 Email and quality signals

FieldDescription
emailEmail address
email_statusVerification status
email_overall_scoreQuality score
email_is_deliverableWhether it should deliver
email_is_catch_allDomain accepts everything — verification is unreliable
email_is_role_accountShared address (info@, sales@) rather than a person
email_is_freeFree provider (Gmail, Outlook) rather than a company domain

📞 Phone

FieldDescription
first_phonePrimary number
mobile_phoneMobile
corporate_phoneCompany switchboard

🏢 Company

FieldDescription
company_name, company_idCompany identity
company_domain, company_websiteWeb presence
company_linkedin_url, company_linkedin_followersLinkedIn page and size
company_phoneCompany number
company_city, company_state, company_countryHeadquarters
company_employeesHeadcount
company_industry, company_keywordsCategorisation
company_annual_revenueRevenue
company_founded_yearFounded

💵 Funding

FieldDescription
company_total_fundingTotal raised
company_latest_fundingMost recent round type
company_latest_funding_amountAmount of that round
company_last_raised_atWhen they last raised

Why teams use a filtered lead database

For outbound sales

Title, seniority and department filters produce a list of the right people; email quality flags decide who is safe to send to.

For funding-triggered prospecting

fundingType plus a date window returns companies that just raised. New budget, new hires, new tools — the highest-intent segment in B2B.

For territory and ICP building

Combine companyEmployeeSize, industry, revenue and companyCountry to describe your ICP precisely, then measure how many companies actually fit it.

For recruiting

Filter by title and seniority in a location to map available talent, with LinkedIn URLs attached.

For multichannel sequences

Email, mobile and corporate phone on the same row means email → call → LinkedIn without stitching three sources together.

For CRM enrichment

companyDomain accepts up to ten domains, so you can pull everyone at a specific set of accounts.


How to build a lead list step by step

  1. Set Total Results — up to 30,000 per run.
  2. Add Person Filters: title keywords, seniority, department, country, state.
  3. Add Company Filters: employee size, industry, revenue, country, or up to ten specific domains.
  4. (Optional) Add Funding Filters to target recently funded companies.
  5. (Optional) Set Email Status to verified for the cleanest subset — expect fewer leads.
  6. Click Start, then export the Output tab as CSV, Excel or JSON.

⬇️ Input

Example input

{
"totalResults": 5000,
"personTitle": ["marketing manager", "head of growth"],
"seniority": ["manager", "director"],
"functional": ["marketing"],
"personCountry": ["United States"],
"companyEmployeeSize": ["51 - 200", "201 - 500"],
"industry": ["software"],
"contactEmailStatus": "verified"
}

Input reference

FieldTypeDefaultDescription
totalResultsinteger100Leads to fetch. Clamped between 100 and 30,000 — asking for fewer than 100 still returns up to 100.
contactEmailStatusstringSet to verified to keep only verified emails. Produces a cleaner but smaller list.
includeEmailsbooleanonEmail enrichment is always on; this flag is informational.
firstName / lastNamestringExact name match, case-insensitive.
personTitlearrayTitle keywords, matched as containsmarketing manager also matches Senior Marketing Manager. Multiple values are OR-ed.
seniorityarraySeniority level. Common labels are normalised, so executive maps to C-suite and junior / entry level to entry.
functionalarrayDepartment or function, matched as contains.
personCountry / personStatearrayWhere the person is based.
companyEmployeeSizearrayHeadcount ranges, e.g. 51 - 200.
companyDomainarrayUp to 10 domains — github.com, without www or https.
industryarrayCompany industries.
industryKeywordsarrayKeyword match against company keywords.
revenuearrayCompany revenue ranges.
companyCountry / companyStatearrayCompany headquarters location.
fundingTypearrayFunding round type.
fundingFromDate / fundingToDatestringWindow on the company's most recent raise.
businessModelarray⚠️ Accepted but not applied — this attribute is not held in the underlying data, so the filter is ignored.
proxyConfigurationobjectnoneOptional. No proxy by default. If the connection is rejected, the Actor retries automatically with exponential backoff.

Two honest notes. businessModel is ignored rather than applied — set it and your result set is unchanged. And any company-level filter (size, industry, revenue, funding, domain, location) restricts results to leads that have a matched company record, which naturally reduces the count.


⬆️ Output

Example output

{
"full_name": "Jane Example",
"first_name": "Jane",
"last_name": "Example",
"title": "Head of Growth",
"seniority": "director",
"departments": "marketing",
"email": "jane@examplesoftware.com",
"email_status": "Verified",
"email_overall_score": 95,
"email_is_deliverable": true,
"email_is_catch_all": false,
"email_is_role_account": false,
"email_is_free": false,
"first_phone": "+1 415 555 0142",
"mobile_phone": "+1 415 555 0199",
"corporate_phone": "+1 415 555 0100",
"person_linkedin_url": "https://www.linkedin.com/in/janeexample/",
"person_city": "San Francisco",
"person_state": "California",
"person_country": "United States",
"company_id": "5f1e2d3c4b5a6978",
"company_name": "Example Software",
"company_domain": "examplesoftware.com",
"company_website": "https://www.examplesoftware.com",
"company_linkedin_url": "https://www.linkedin.com/company/example-software/",
"company_linkedin_followers": 18400,
"company_phone": "+1 415 555 0100",
"company_city": "San Francisco",
"company_state": "California",
"company_country": "United States",
"company_employees": 180,
"company_industry": "Computer Software",
"company_keywords": "saas, analytics, b2b",
"company_annual_revenue": 24000000,
"company_total_funding": 42000000,
"company_latest_funding": "Series B",
"company_latest_funding_amount": 28000000,
"company_last_raised_at": "2026-03-18",
"company_founded_year": 2017
}

Illustrative values — a live run returns real database records.


Usage recipes

Freshly funded companies

{
"totalResults": 3000,
"fundingType": ["Series A", "Series B"],
"fundingFromDate": "2026-01-01",
"seniority": ["c_suite", "vp"],
"contactEmailStatus": "verified"
}

New round, senior decision-maker, verified email. This is the highest-intent list the Actor can build.

Safe-to-send list

Run without contactEmailStatus, then filter your export to email_is_deliverable: true, email_is_catch_all: false, email_is_role_account: false. You keep more volume than a verified-only run while still protecting your sender reputation.

Everyone at ten target accounts

{
"totalResults": 2000,
"companyDomain": ["github.com", "gitlab.com", "atlassian.com"],
"seniority": ["manager", "director", "vp"]
}

Ten domains is the cap.

Mid-market ICP

{
"totalResults": 10000,
"companyEmployeeSize": ["51 - 200", "201 - 500"],
"industry": ["software"],
"companyCountry": ["United States"],
"personTitle": ["operations"]
}

Mobile-first calling list

Filter the export for rows where mobile_phone is present. Mobile connect rates beat switchboards by a wide margin.

Territory sizing

Run a broad ICP query and count company_id values. That is your addressable account count, measured rather than estimated.


How does this compare to a lead-database subscription?

Commercial B2B databases sell annual seats with credit allocations, export caps and per-seat pricing — and the credits usually run out before the quarter does.

This Actor gives you the same style of filtered query with no subscription, no seat, and no credit pool: you run it when you need a list, and pay for the rows you take. It is not a CRM and it does not manage sequences; it is the list-building step, in a form you can call from a script.


Integrate and automate

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("scraperforge/leads-scraper").call(run_input={
"totalResults": 5000,
"personTitle": ["head of growth"],
"companyEmployeeSize": ["51 - 200"],
"contactEmailStatus": "verified",
})
for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
if lead["email_is_deliverable"] and not lead["email_is_role_account"]:
print(lead["full_name"], "|", lead["title"], "|", lead["email"], "|", lead["company_name"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });
const run = await client.actor('scraperforge/leads-scraper').call({
totalResults: 1000,
personTitle: ['head of growth'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

REST API

curl -X POST "https://api.apify.com/v2/acts/scraperforge~leads-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"totalResults":1000,"personTitle":["head of growth"]}'

n8n, Make, Zapier and AI agents

Call the Actor from n8n, Make, Zapier or an MCP-capable agent to push qualified leads straight into a CRM or a sequencer.

Schedules and webhooks

Attach a Schedule to a funding-triggered query and deduplicate on email, then route results with webhooks or the Google Sheets / Airtable / HubSpot integrations.


Pricing and what you are charged for

Billing details for this Actor are shown on the Pricing tab of its page — check there for the current model and rates before a large run. Apify shows a cost estimate before and during every run.

Charging is per lead delivered. If a spend limit is reached mid-run the Actor stops gracefully and every lead already saved is preserved.


Limits, reliability and blocking

  • totalResults is clamped to 100–30,000. Requesting 10 still returns up to 100, and 50,000 is capped at 30,000. Split larger jobs across runs with different filters.
  • businessModel is ignored. It is accepted for compatibility but not applied, because the attribute is not held in the data.
  • includeEmails is always on — the label says so, and the flag has no effect.
  • Company filters imply a company match. Any company-level filter restricts results to leads with a linked company record, which reduces the count relative to person-only filters.
  • Title and department filters are contains matches, so manager also matches Senior Product Manager. Multiple values are OR-ed, not AND-ed.
  • verified narrows results significantly. For volume with control, filter on the boolean quality flags instead.
  • Catch-all domains cannot be verified reliably. email_is_catch_all: true means the mail server accepts everything — a bounce risk regardless of the status field.
  • Not every field is populated on every row. Phone numbers, revenue and funding are sparser than name, title and email.
  • Results stream live, so a large run is usable while it is still running.
  • The connection retries with exponential backoff if it is rejected, escalating its strategy across attempts.
  • Data is a point-in-time snapshot. People change jobs constantly — re-run before a campaign rather than reusing a months-old export.
  • Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for 30,000-row runs.

This Actor returns business contact information — work emails, work phone numbers and professional details used for B2B communication.

That data is still personal data under GDPR and comparable laws. Before you contact anyone: establish a lawful basis (legitimate interest for B2B outreach requires a genuine balancing assessment), identify yourself and your organisation in every message, include a working opt-out, honour deletion and objection requests promptly, and keep records of where the data came from. Follow GDPR, CAN-SPAM, CASL and the TCPA, and check Do Not Call registries before dialling — phone outreach carries meaningfully higher regulatory risk than email in the US.

Well-targeted, relevant outreach to the right people is both the compliant path and the effective one. Bulk-blasting an unfiltered export is neither.


❓ Frequently asked questions

How many leads can I get in one run?

Up to 30,000. The minimum is effectively 100 — smaller requests are raised to it.

What do the email flags actually mean?

email_is_deliverable — should deliver. email_is_catch_all — the domain accepts everything, so verification is unreliable. email_is_role_account — a shared address like info@. email_is_free — Gmail or similar rather than a company domain.

Should I set contactEmailStatus to verified?

It gives the cleanest list and a much smaller one. For more volume with similar safety, filter on the boolean flags after export.

Why does businessModel change nothing?

It is not held in the underlying data. The input accepts it for compatibility and ignores it — this README states that plainly rather than leaving you to discover it.

Do title filters need to be exact?

No. They are contains matches, so marketing manager also matches Senior Marketing Manager.

Why did adding a company filter cut my results so much?

Company filters require a matched company record, so leads without one drop out.

Do I get phone numbers?

Yes — up to three per lead: primary, mobile and corporate. Not every lead has all three.

Can I target companies that just raised?

Yes. Combine fundingType with fundingFromDate and fundingToDate.

How many company domains can I filter on?

Ten, entered without www or https.

Which export format should I use?

CSV or Excel — the output is flat and imports straight into a CRM.


Browse the full collection on the ScraperForge profile.


💬 Feedback

Need extra filters, larger runs, or a custom enrichment pipeline? Open an issue on the Issues tab of this Actor.