# 🍽️ Restaurant Leads Scraper - Owner Emails & Phones (`renzomacar/restaurant-leads-scraper`) Actor

Restaurant leads by cuisine and city: name, address, phone, website, owner emails, social profiles, rating and price level - extracted live from each restaurant's site. $8 per 1,000 leads.

- **URL**: https://apify.com/renzomacar/restaurant-leads-scraper.md
- **Developed by:** [Renzo Madueno](https://apify.com/renzomacar) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.44 / 1,000 leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🍽️ Restaurant Leads Scraper — Owner Emails & Phones

Restaurants are the biggest local-business category on earth — and one of the hungriest for what you sell: POS systems, delivery platforms, food distribution, marketing, reservation software, payroll, insurance, equipment. This scraper gives you every restaurant in a city as a structured lead — **name, cuisine category, address, phone, website, emails scraped from the restaurant's own site, Instagram/Facebook, price level, rating and review volume** — for $8 per 1,000 restaurants, no subscription.

Where a generic scraper hands you a name and a phone number, this one visits each restaurant's website and pulls out the contact email (often the owner's or manager's inbox at independent spots), extra phone lines, and the social profiles where the restaurant actually answers messages.

### Use cases straight from the field

- **Food-service distributors & wholesalers** — every independent restaurant in your delivery radius, with `latitude`/`longitude` for route planning.
- **POS / online-ordering / reservation SaaS** — the `techStack` column shows who's on WordPress vs. a modern platform; no website at all (`onlyWithWebsite: false`) means no online ordering — your best demo targets.
- **Restaurant marketing agencies** — `rating` under 4.0 with high `reviewsCount` = a busy restaurant with a reputation problem. That's a warm intro, not a cold call.
- **Ghost-kitchen & delivery platform expansion teams** — census a neighborhood by cuisine before entering it.
- **Commercial realtors & equipment dealers** — `priceLevel` ($ to $$$$) segments fast-casual from fine dining instantly.

### Segment by cuisine, not just "restaurants"

The category selector ships with the segments buyers actually slice by: `restaurant`, `pizza restaurant`, `mexican restaurant`, `sushi restaurant`, `italian restaurant`, `fast food restaurant`, `cafe`, `bakery`. Pick several — each runs as its own Google Maps search against your city, deduplicated at the end. Need something narrower ("vegan restaurant in Portland, OR", "food truck in Austin, TX")? Paste raw queries in the advanced field, one per line.

### Sample output row

```json
{
  "name": "La Nonna Trattoria",
  "category": "Italian restaurant",
  "address": "2145 N Clark St, Chicago, IL 60614",
  "phone": "+1 312-555-0182",
  "website": "https://lanonnachicago.com",
  "email": "ciao@lanonnachicago.com",
  "socialProfiles": { "instagram": "https://instagram.com/lanonnachi", "facebook": "..." },
  "priceLevel": "$$",
  "rating": 4.6,
  "reviewsCount": 894,
  "placeUrl": "https://maps.google.com/?cid=..."
}
```

### FAQ

**How do I reach the owner, not the hostess stand?**
The email published on an independent restaurant's website is very often owner- or manager-monitored (`info@`, or a personal name at the domain). For chains you'll get the location's contact. Instagram DMs — captured in `socialProfiles` — are the second-best owner channel in this industry.

**How many restaurants can one run collect?**
Up to ~120 per search (Google Maps' ceiling per query). A cuisine-segmented run over a big city — 8 categories × 120 — can deliver 500–900 unique restaurants after deduplication. Neighborhood-level custom queries go deeper still.

**What percentage have emails?**
Lower than office-based industries — typically 30–55%, since some restaurants run on Instagram and a phone alone. Every row always has phone + address; filter `emailFound = true` when you need an email-only file, or keep the rest for call/DM lists. Tip: `onlyWithWebsite` drops site-less spots before you're charged.

**Can I filter by price level or rating?**
Filter after export — every row carries `priceLevel`, `rating` and `reviewsCount`. A common play: `reviewsCount > 200 AND rating < 4.2` = high-traffic restaurants that need reputation help.

**Does it handle non-US cities and languages?**
Yes — any Google Maps market. Use `language` for local results: `taquería in Guadalajara` with `es`, `brasserie in Paris` with `fr`, `izakaya in Osaka` with `ja`.

**Is the data fresh enough for outreach this week?**
It's scraped the moment you press Run. Restaurants churn ~10–15% a year, which is exactly why pre-built restaurant databases go stale faster than any other vertical — and why live discovery matters here more than anywhere.

**What will 1,000 restaurant leads cost me?**
$0.02 (run start) + 1,000 × $0.008 = **$8.02**, all-in. Re-running a city monthly costs the same small amount — no license, no seats.

### Pricing

Two events, nothing else: **run start $0.02** (2 GB) · **$0.008 per restaurant lead** pushed to your dataset.

### Where the data comes from

Public business listings on Google Maps plus each restaurant's own public website — the same pages any customer can open in a browser. No reservations data, no customer data, no logins. When you use the emails for outreach, follow the applicable rules (CAN-SPAM in the US, GDPR/PECR in Europe) and include a working unsubscribe.

### Bars, breweries and taprooms

The cuisine picker stops at food service, but drinking establishments sit in the same Maps index and are reached with custom queries:

```
brewery in Denver, CO
taproom in Denver, CO
cocktail bar in Denver, CO
sports bar in Aurora, CO
wine bar in Boulder, CO
```

Expect a different contact profile than restaurants: independent bars publish an email on their own site less often, but almost all of them link Instagram. `socialProfiles.instagram` is captured from the venue's own website, so for this segment the Instagram handle is frequently the highest-value column in the row — it is where the owner actually reads messages.

### Delis, juice bars, dessert counters and the long tail of food service

Anything Google Maps categorises is fair game. Useful lines for distributors and POS vendors:

```
sandwich shop in Columbus, OH
delicatessen in Columbus, OH
juice bar in Columbus, OH
smoothie shop in Dublin, OH
ice cream shop in Westerville, OH
donut shop in Columbus, OH
```

These are phone-first segments. Every row carries the Google Maps phone in `phone`, plus up to four additional numbers found on the venue's own site in `websitePhones` — and the Maps number is stripped out of that array, so a duplicate never eats one of the four slots. For a small deli the second number is often the owner's mobile rather than the counter line.

### Catering halls, banquet rooms and ghost kitchens

A separate buyer set — event software, linen and rental suppliers, delivery platforms — and a separate query set:

```
banquet hall in Tampa, FL
catering company in Tampa, FL
event venue with catering in St. Petersburg, FL
ghost kitchen in Tampa, FL
commissary kitchen in Tampa, FL
```

Venues run larger, better-maintained websites than street-level restaurants, which shows up as higher email coverage and a `contactPageUrl` on nearly every row. Use `reviewsCount` to separate an established hall doing 200 events a year from a room somebody started renting last spring.

# Actor input Schema

## `searchTerms` (type: `array`):

Which restaurant/cuisine segments to find. Each selected category runs as its own search in your location; results are deduplicated.

## `location` (type: `string`):

City, region or country to search in, e.g. 'Chicago, IL', 'Austin, TX', 'London, UK'.

## `searchQueries` (type: `array`):

Full searches, one per line (e.g. 'vegan restaurant in Portland, OR'). When set, these override the category picker + location. Use several queries to cover multiple cities or neighborhoods in one run.

## `maxResults` (type: `integer`):

Maximum number of companies to find per search. One search typically yields up to ~120 companies.

## `maxPagesPerSite` (type: `integer`):

How many pages to check on each company website when hunting for emails (homepage, /contact, /about...). More pages = more emails found, slightly slower run.

## `onlyWithWebsite` (type: `boolean`):

Drop companies that have no website (they can never have an email). You are not charged for dropped companies.

## `includeGenericEmails` (type: `boolean`):

Keep every published address, including shared inboxes like info@, hello@ and contact@. Disable to drop only non-deliverable system addresses (noreply@, no-reply@, donotreply@, mailer-daemon@, postmaster@, webmaster@, hostmaster@, abuse@).

## `language` (type: `string`):

Language code for the discovery search (e.g. 'en', 'es', 'fr', 'de').

## Actor input object example

```json
{
  "searchTerms": [
    "restaurant"
  ],
  "location": "Chicago, IL",
  "maxResults": 5,
  "maxPagesPerSite": 1,
  "onlyWithWebsite": false,
  "includeGenericEmails": true,
  "language": "en"
}
```

# Actor output Schema

## `leads` (type: `string`):

Complete B2B leads (company, website, phone, address, emails, social profiles), one item per lead in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "restaurant"
    ],
    "location": "Chicago, IL",
    "maxResults": 5,
    "maxPagesPerSite": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("renzomacar/restaurant-leads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["restaurant"],
    "location": "Chicago, IL",
    "maxResults": 5,
    "maxPagesPerSite": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("renzomacar/restaurant-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "restaurant"
  ],
  "location": "Chicago, IL",
  "maxResults": 5,
  "maxPagesPerSite": 1
}' |
apify call renzomacar/restaurant-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,renzomacar/restaurant-leads-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vCUd1L0UBGok0BuAA/builds/h40rS6HWeuHf8jsht/openapi.json
