Yelp Business Leads — Email & Contact Enrichment avatar

Yelp Business Leads — Email & Contact Enrichment

Pricing

from $1.99 / 1,000 business leads

Go to Apify Store
Yelp Business Leads — Email & Contact Enrichment

Yelp Business Leads — Email & Contact Enrichment

Turn Yelp into a ready-to-contact prospect list. Search businesses by keyword + location, then auto-enrich each with a verified email, social handles & phone pulled from its website. Deduped, CRM-ready leads for sales & local outreach. Pay per lead.

Pricing

from $1.99 / 1,000 business leads

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

3

Monthly active users

15 days ago

Last modified

Share

Turn Yelp into a ready-to-contact prospect list, not a listing dump. Search any niche + city (e.g. plumbers in Austin, TX) and get one clean lead per business with everything Yelp shows — name, phone, website, rating, reviews, category, address, hours — plus the part every other Yelp scraper leaves out: a contactable email, social-media handles, and extra phone numbers harvested from the business's own website, with the email run through a deliverability check.

A Yelp listing tells you a business exists. This actor gives you a way to actually reach the owner — so the output drops straight into a cold-email or CRM workflow instead of needing a second enrichment tool.

What makes it different

Other Yelp scrapers stop at the listing: name, phone, maybe a website link. To email those prospects you then need a second tool to visit each site and dig out an address. This actor does both jobs in one run:

  1. Yelp listing — the full business profile (phone, website, rating, reviews, hours, category, address).
  2. Website enrichment — for every business with a website, it visits the homepage + contact/about page and pulls:
    • Email — the best contactable address, de-obfuscated (handles name [at] domain tricks)
    • Deliverability — MX lookup + best-effort SMTP probe → emailStatus (deliverable / risky / unknown) + a 0–100 score
    • Socials — LinkedIn, Facebook, Instagram, X/Twitter, YouTube, TikTok
    • Extra phones — any numbers on the site beyond the Yelp listing

Plus the reliability the field is short on: Yelp is reached through a managed-access browser that handles the protected target, so it keeps returning leads on days request-based scrapers get blocked.

What you need

Nothing but a search. No Yelp account, no API key, no proxy or email-tool subscription of your own:

  • Search terms — e.g. plumbers, HVAC contractors, dentists, med spas
  • Location — e.g. Austin, TX, New York, NY, 90210

…or paste direct Yelp business URLs for targeted lookups.

Input

FieldTypeDescription
searchTermsstring[]Keywords: "plumbers", "law firms", "dentists"
locationstringCity / state / zip: "Austin, TX", "90210"
businessUrlsstring[]Direct Yelp URLs or business aliases (instead of search)
maxResultsintegerMax per search term (0 = all, up to Yelp's ~240 cap)
enrichContactsbooleanON by default — visit each website for email + socials
verifyEmailsbooleanMX + best-effort SMTP deliverability on the best email
includeReviewsbooleanAdd up to 3 recent review snippets per business
categoriesstringCategory alias filter, e.g. "plumbing"
sortBystringbest_match / rating / review_count / distance

Turn enrichContacts off for a faster, listing-only run (name, phone, rating, category) when you don't need emails.

Output (per business lead)

{
"business_id": "WavvLdfdP6g8aZTtbBQHTw",
"name": "Gary's Plumbing & Heating",
"url": "https://www.yelp.com/biz/gary-s-plumbing-austin",
"phone": "(512) 444-1234",
"website": "https://garysplumbingatx.com",
"address": "1234 Lamar Blvd",
"city": "Austin",
"state": "TX",
"zip": "78703",
"rating": 4.5,
"review_count": 247,
"categories": "Plumbing, Water Heater Installation/Repair",
"is_closed": false,
"search_term": "plumbers",
"hours_open": "Mon: 08:00-18:00; Sat: 09:00-14:00",
"email": "gary@garysplumbingatx.com",
"emailStatus": "deliverable",
"emailScore": 100,
"emailIsRole": false,
"mxFound": true,
"allEmails": ["gary@garysplumbingatx.com", "info@garysplumbingatx.com"],
"socials": {
"facebook": "https://facebook.com/garysplumbingatx",
"instagram": "https://instagram.com/garysplumbingatx"
},
"websitePhones": ["+15124441234"],
"enrichedFrom": ["https://garysplumbingatx.com/contact"],
"enrichmentStatus": "enriched",
"scraped_at": "2026-06-15T10:30:00+00:00",
"parse_confidence": 1.0
}

enrichmentStatus tells you what happened per lead: enriched (contacts found), no_contacts (site had none), fetch_failed (site unreachable), no_website (no site on Yelp), or disabled (enrichment off).

Use cases

  • Cold email + outreach — build a list of local businesses with a verified email, ready for your sequencer
  • Sales prospecting — phone and email and socials per business, no second enrichment tool
  • Agency lead gen — pull targeted local-business lists with contact data to sell or work
  • Local market research — compare ratings, review counts and categories across a territory

Pricing

Pay-per-lead: billed per business returned, enrichment included. No subscription, no minimums, and no separate charge for the email step — compute runs on your own Apify account.

Frequently asked questions

Do I need a Yelp API key, a proxy, or an email-finder subscription? No. You supply a search term and location; the actor reaches Yelp, visits each business website, and returns the contact data in one run.

How accurate are the emails? Each business's best email is picked (a personal, on-domain address beats a generic info@) and checked: MX always, plus an SMTP probe where the mail host is reachable. emailStatus + emailScore tell you how confident to be. Some hosts block SMTP probing, in which case the email is still returned with an unknown status and the MX result.

What if a business has no website? You still get the full Yelp listing (name, phone, rating, etc.) with enrichmentStatus: "no_website". You're never charged extra for the enrichment attempt.

Will it keep working when Yelp blocks other scrapers? Yelp is reached through a managed-access browser that handles its protection layer, so it stays reliable on days request-based scrapers return nothing.


Not affiliated with Yelp Inc. Collects publicly available business information for legitimate lead-generation and research use; respect Yelp's terms and applicable law.

Integrations

The JSON/dataset output drops into the tools you already run, no glue code:

  • n8n / Make / Zapier — pipe every new lead into 500+ apps (Google Sheets, Airtable, HubSpot, your CRM): n8n, Make, Zapier.
  • Webhooks — fire your endpoint the moment a run finishes (docs).
  • MCP server — expose this actor as a tool to Claude, Cursor, or any MCP client so an AI agent can pull leads mid-conversation (guide).
  • API & SDKs — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all Apify integrations.

Usage statistics

This Actor creates a small, content-free summary at the end of each run. It is used only to monitor reliability and improve this Actor. A copy is saved as USAGE_STATS in your own Apify key-value store, so you can see the exact record created for your run.

Set disableUsageStats to true in the input to opt out. Nothing is sent then; your USAGE_STATS record only says that statistics were disabled.

Only these fields are recorded:

  • schema version, Actor name and build number;
  • UTC start and finish hour (not a precise timestamp);
  • run duration, number of results and time to the first result, each as a coarse range;
  • whether the result was empty, the end status, and an error type from a fixed list;
  • memory setting and counts of charged events;
  • names of the input fields you set, never their values;
  • the selected option for input fields that offer a fixed list of choices (for example a sort order).

We do not collect input text, search terms, URLs, domains, usernames, email addresses, names, proxy credentials, tokens, scraped records, output items, raw error messages, stack traces, or hashes of any of those values. Records are kept for no longer than 13 months, used only as aggregated operational statistics, and never sold or shared.

Additional fields (Phase 2)

This Actor also records your Apify user ID, whether Apify marks the account as paying, the size range of list inputs, the selected country when the input offers a fixed list of countries, and one category from a fixed Actor taxonomy. We use these fields only for aggregate reliability, repeat-use and cross-Actor analysis; reports suppress any cell with fewer than five distinct users.

The same disableUsageStats: true input flag turns these fields off too. The user ID is removed after 13 months; we do not export, sell, share, or attempt to re-identify this data.

Run-outcome signals (v2)

To learn whether a run did what it was asked to do, the record also holds a few more coarse ranges and yes/no flags. None of them contains content:

  • the result limit you asked for (a range, when the input has one) and what share of it was delivered;
  • results delivered per input item you listed (a range);
  • output quality as ranges: how fully the result fields were filled, the share of rows that look like errors, the share of duplicate rows, and how many different fields appeared. These are counted in memory while results are saved; no result content is kept;
  • how the run was started (console, API, schedule, webhook, another Actor);
  • how it ended: stopped by you, timed out, reached the requested limit, stopped by the charge limit, and how many times the platform moved the run;
  • if this Actor reports it: how many items to process worked or failed (ranges) and one failure reason from a fixed list;
  • a short code made from the names of the input fields you set, never their values.

Repeat-run fingerprint (v2)

When your Apify user ID is recorded (see above), the record also holds an 8-character one-way code made from your input (proxy settings left out) and this Actor's name. It only lets us see that the same account ran the same input again soon after an unsatisfying run; we never see the input itself. It is stored only in the database, never published, and reports use it in aggregate with the same five-user minimum. It is the one exception to the statement above that no hashes are collected, and disableUsageStats: true turns it off.