EZlocal Business Data Scraper | Real-Time Leads avatar

EZlocal Business Data Scraper | Real-Time Leads

Pricing

from $1.50 / 1,000 results

Go to Apify Store
EZlocal Business Data Scraper | Real-Time Leads

EZlocal Business Data Scraper | Real-Time Leads

Collect live EZlocal business data: search US businesses by keyword and market, get full profiles with reviews, and enrich rows with websites, emails, and socials. Results stream to your dataset in real time.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Emmanuel

Emmanuel

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Share

EZlocal Real-Time Data

Collect US local business data from EZlocal at scale: search businesses by keyword and market, pull full business profiles with ratings and reviews, and enrich every row with the contact details your outreach actually needs — website, emails, and social profiles. Rows stream to your dataset as they are collected, so you can start working with results before the run has finished.

Free-trial notice — on a free Apify plan, a run is capped to a 2-result sample so you can see the shape of the data. Upgrade to a paid plan for full, unlimited exports.


Who this is for

  • Lead-gen and outreach agencies building targeted local business lists for cold email, calls, and direct mail.
  • Local SEO and marketing teams who need to know which businesses in a market exist, what they do, and how to reach them.
  • CRM and data teams enriching an existing business list with addresses, phone numbers, websites, and social profiles.
  • Sales ops and RevOps sizing markets by keyword and city before committing to a territory.
  • Market researchers comparing local business composition across metros.
  • AI-agent builders who need a clean, structured local-business feed on demand (see MCP).

What you get

Every run writes one row per business to the default dataset, plus a run summary to the OUTPUT key-value entry.

FeatureDefaultWhat it does
Business searchOnKeyword + market search. Returns name, address, phone, rating, service badges, and the business's EZlocal link.
Business URLsOffPaste specific business URLs to get the same output rows for a list you already have.
Full business detailsOffFills the same row with the description, the category path, coordinates, ZIP, rating, review count and reviews when published.
Lead details (email discovery)OffVisits the business's own website (when it has one) and adds contact emails and social profiles. Standalone — it works on its own, without full business details.

Enrichment is add-only: rows are never filtered, merged away, or dropped because a detail was missing. A business that publishes nothing still gets its search row.


Quick start

  1. Set Business search on (it already is) and press Start. The pre-filled demo searches plumber in New York, NY for 10 businesses and returns in seconds.
  2. Add a row per market you care about — for example dentist in Austin, TX, pizza in Chicago, IL.
  3. Turn on Full business details when you want the deeper profile with reviews, and Lead details (email discovery) when you want emails and socials. The two are independent — enable emails alone to keep runs fast.
  4. Optionally add a Webhook URL to push every row to your CRM or Slack as it is collected.

Input reference

FieldTypeDefaultNotes
enableSearchbooleantruePrimary feature.
searchTasks[].keywordstringplumber (demo)What to look for — plumber, dentist, roofing, pizza, auto repair.
searchTasks[].locationstringNew York, NY (demo)Market in "City, ST" format. "Chicago, Illinois" also works.
searchTasks[].maxResultsinteger10Rows this one search may return. Up to 250 per search is available across pages.
{
"enableSearch": true,
"searchTasks": [
{ "keyword": "dentist", "location": "Austin, TX", "maxResults": 50 },
{ "keyword": "pizza", "location": "Chicago, IL", "maxResults": 25 }
]
}

Depth per search: a single search returns up to 250 businesses across pages. If you ask for more than that on one row, the run collects 250 and tells you in the log so you can split the search. Different keywords and neighbouring markets reach different slices of the directory.

Business URLs

FieldTypeDefaultNotes
enableScrapeByUrlbooleanfalseLook up specific business pages.
scrapeUrlsstring[][]https://ezlocal.com/ny/new-york/... links.

Details & enrichment

The two enrichments are independent. Turn on either one on its own — Lead details (email discovery) needs no full business profile and never slows a run down more than the website visits it makes.

FieldTypeDefaultNotes
enableListingDetailsbooleanfalseFull business profile on the same row, including reviews.
enableLeadDetailsbooleanfalseEmails + socials from the business's own website. Works alone.
concurrencyinteger2Parallel enrichments (1–4). Higher is faster, a little harder on rate limits.

Delivery

FieldTypeDefaultNotes
webhookUrlstring""Additional real-time POST per row.
webhookFormatjson | slackjsonjson = full record; slack = Slack message payload.
proxyConfigurationobjectApify residential, USChange only for another country or your own proxy URLs.

Output fields

FieldDescription
type, platform, featureTypebusiness, ezlocal, and search or scrape_by_url.
name, profileUrl, profileIdBusiness identity and its EZlocal link.
category, categoriesPrimary category and the full category path (full business details).
descriptionAbout-this-business text.
phone, mobile, faxContact numbers.
websiteThe business's own site, when published.
email, emailsBest contact address plus all addresses found (lead details).
socials, instagram, facebook, linkedin, twitterSocial profiles found on the business's site.
street, city, state, zipCode, country, locationPostal address, plus a joined location.
lat, lngCoordinates, for map-ready lists.
rating, reviewCount, reviewsPublic rating data and reviews, when published.
amenitiesService badges from the card, e.g. Open 24 Hours.
claimed, ownerVerifiedListing signals, when published.
detailsFetched, leadDetailstrue when each enrichment ran for that row.
searchKeyword, searchLocation, searchTaskIndex, searchTaskLabelWhich search produced the row — handy for slicing a big export.
scrapedAtISO timestamp.

Sample row (search only, no enrichment):

{
"type": "business",
"platform": "ezlocal",
"featureType": "search",
"name": "Nyc Plumber",
"profileUrl": "https://ezlocal.com/ny/new-york/residential-plumber/092265136",
"profileId": "092265136",
"phone": "(347) 532-1861",
"street": "1391 Avenue Of The Americas",
"city": "New York",
"state": "NY",
"zipCode": "10019",
"country": "US",
"location": "1391 Avenue Of The Americas, New York, NY, 10019",
"searchKeyword": "plumber",
"searchLocation": "New York, NY",
"scrapedAt": "2026-10-14T15:00:00.000Z"
}

Webhooks

Every row is always written to the dataset. A webhook is an additional real-time push of the same row, fired as soon as it is collected — delivery failures never stop the run.

JSON (webhookFormat: "json") — the full record object:

{
"name": "Nyc Plumber",
"phone": "(347) 532-1861",
"city": "New York",
"state": "NY",
"email": "hello@example.com",
"profileUrl": "https://ezlocal.com/ny/new-york/residential-plumber/092265136"
}

Slack (webhookFormat: "slack") — a message payload you can paste straight into a Slack incoming webhook:

{
"text": ":office: *Nyc Plumber*\nNew York, NY\n*Phone:* (347) 532-1861\n<https://ezlocal.com/ny/new-york/residential-plumber/092265136|View business>"
}

MCP / AI agents

This Actor works with the Apify MCP server, so an agent can call it directly and reason over the resulting dataset.

Example question to your agent:

"Find 25 plumbers in Austin, TX on EZlocal, enrich them with full details and email, and return a table sorted by rating."

The agent can call this Actor, read the dataset, and answer — no glue code.


FAQ

Do I need a proxy? No. Apify's residential US proxy is configured by default and is the right setting for this Actor. Change it only if you want another country.

What does the free plan give me? A 2-result sample per run so you can inspect the schema. Paid plans export everything the search returns.

How fresh is the data? Every run collects live. There is no cache and no stale snapshot — re-run for current results.

Why did my search return fewer rows than I asked for? Either the market genuinely has fewer matches, or you asked for more than 250 on a single search row (the per-search ceiling). The log states which happened.

Why is a business missing an email? Emails are only discoverable when the business publishes a website and lists an address on it. Rows without a website still export with everything else.

Do I need full business details to get emails? No. Lead details (email discovery) is standalone — it goes straight to the business's website, so you can collect emails without requesting the full profile.

Can I get a business's full profile without searching? Yes — paste its EZlocal URL under Business URLs.


Support

Open an issue on the Actor's GitHub repository with the run ID, your input JSON, and what you expected. Never include proxy credentials.