# Restaurant Leads Scraper - Verified Emails, POS & Delivery Tech (`flash_scraper/restaurant-leads-scraper`) Actor

Find restaurant leads in any city with MX-verified emails, phone, website & cuisine, plus POS (Toast, Square), reservation (OpenTable, Resy), online ordering (ChowNow, Olo) and delivery (DoorDash, Uber Eats) tech-stack detection. A-F lead scores. No API key or proxy.

- **URL**: https://apify.com/flash\_scraper/restaurant-leads-scraper.md
- **Developed by:** [Flash Scrape](https://apify.com/flash_scraper) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.90 / 1,000 restaurant 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 — find restaurants by POS, reservation & delivery tech stack

Get **restaurant leads targetable by tech stack** — the only scraper that cross-references **POS (Toast, Square, Clover)**, **reservation systems (OpenTable, Resy, Tock)**, **online ordering (ChowNow, Olo)** and **delivery platforms (DoorDash, Uber Eats, Grubhub)** in one pass. No competitor does cross-platform stack detection. **$5 per 1,000 leads** — pay only for results you actually get.

### What does it do?

This actor finds **restaurants by city** using OpenStreetMap, then **crawls each restaurant's own website** to extract a contact **email**, social profiles, and — the premium part — which **POS system**, **reservation platform**, **online-ordering tool**, and **delivery app** it runs. The output is a clean, deduped B2B **lead list segmented by tech stack**, so you can build a query like *"all Toast restaurants in Austin that are NOT on OpenTable"* without touching a spreadsheet formula.

### Why use it / who's it for

- **Restaurant-tech & POS sales reps** (Toast, Square, Clover, Lightspeed, TouchBistro, Revel, SpotOn competitors) who need a list of prospects **not yet on their platform**, or already on a rival's — the classic "switch me" pitch.
- **Reservation and online-ordering SaaS teams** (OpenTable, Resy, Tock, ChowNow, Olo, BentoBox, Popmenu) prospecting restaurants that have a website but no booking widget installed.
- **Delivery platform BD teams** (DoorDash, Uber Eats, Grubhub) mapping which restaurants in a market are exclusive to a competitor and open to a second listing.
- **Local marketing & web agencies** targeting restaurants with weak or missing tech stacks (no reservation system, no online ordering) as a "we can set this up for you" cold-email angle.
- **Franchise and market researchers** who want a tech-adoption snapshot of a city's restaurant scene by cuisine.

### How to use it

1. Enter a **location** (city + region/country, e.g. `"Austin, Texas"`).
2. Optionally set a **cuisine filter** (e.g. `italian`, `sushi`, `mexican`) and include/exclude fast food or cafes.
3. Leave **crawlEmails** on to get emails + tech-stack detection (or turn it off for a faster listing-only run).
4. Optionally filter to **onlyWithWebsite** or **onlyWithEmail** to keep the list cold-email-ready.
5. Run it, then export the dataset to CSV, JSON, or Excel and filter by `pos_system`, `reservation_system`, `online_ordering`, or `delivery_platforms`.

### Output fields

| Field | Description |
|---|---|
| `name` | Restaurant name |
| `cuisine` | Cuisine tag (e.g. italian, pizza) |
| `amenity` / `tourism` / `shop` | Raw OpenStreetMap category tags |
| `address`, `city`, `state`, `postal_code` | Parsed street address |
| `phone` | Phone number |
| `website` | Restaurant's website URL |
| `email` | Primary contact email (site or listing) |
| `emails` | All emails found while crawling the site |
| `facebook`, `instagram` | Social profile URLs |
| `opening_hours` | OpenStreetMap opening hours string |
| `latitude`, `longitude` | Coordinates |
| `pos_system` | Detected POS platforms — Toast, Square, Clover, Lightspeed, TouchBistro, Revel, SpotOn |
| `reservation_system` | Detected reservation platforms — OpenTable, Resy, Tock, Yelp Reservations, SevenRooms, Tablein |
| `online_ordering` | Detected ordering platforms — ChowNow, Olo, Chowly, Slice, Toast Online Ordering, BentoBox, Popmenu |
| `delivery_platforms` | Detected delivery platforms — DoorDash, Uber Eats, Grubhub, Seamless, Postmates |
| `tech_signals` | Flattened list of every tech signal detected (all of the above combined) |
| `has_email`, `has_phone`, `has_website` | Boolean flags for quick filtering |
| `osm_type`, `osm_id`, `source` | Source record reference (OpenStreetMap) |

#### Example output

A real sample from a live run:

| Name | City | Phone | Email | Website | Cuisine | Tech signals |
|---|---|---|---|---|---|---|
| 24 Diner | Austin | +1-512-472-5400 | info@24diner.com | https://www.24diner.com/ | diner | Toast, OpenTable, ChowNow |
| Din Ho Chinese BBQ |  | +1-512-832-8788 | dinho@dinhochinesebbq.com | https://www.dinhochinesebbq.com/ | chinese | Toast, Square, Toast Online Ordering |
| El Alma South (Westgate) |  | +1-512-351-8010 | info@elalmacafe.com | https://www.elalmacafe.com/ |  | Toast, OpenTable |
| Eureka | Austin | +1 5127351144 | guestservices@eurekarestaurantgroup.com | http://eurekarestaurantgroup.com/blog/l… |  | Toast, OpenTable, Toast Online Ordering… |

### Input example

```json
{
  "location": "Austin, Texas",
  "cuisine": "italian",
  "includeFastFood": false,
  "includeCafes": false,
  "maxItems": 100,
  "crawlEmails": true,
  "onlyWithWebsite": true,
  "onlyWithEmail": false,
  "maxPagesPerSite": 3,
  "concurrency": 8
}
```

Only `location` is required — every other field has a sensible default.

### How much does it cost?

This actor uses **pay-per-event pricing: $0.005 per result ($5 per 1,000 leads)**, effective 2026-07-16. You're charged only for restaurant leads actually returned — no subscription, no charge for empty runs. New Apify accounts get roughly **1,000 free results per month** on the platform's free tier, so you can pull a full mid-size city's restaurant list and test the tech-stack detection before paying anything. A 5,000-lead multi-city pull costs $25; a 20,000-lead national campaign costs $100.

### FAQ

#### Is it legal to scrape restaurant contact and tech-stack data?

Yes. This actor only reads **publicly available data**: OpenStreetMap listings and restaurants' own public websites (home, contact, about, menu pages). It doesn't log in, bypass paywalls, or access private data. Always follow applicable email-outreach laws (CAN-SPAM, GDPR, etc.) once you use the leads.

#### How fresh is the data?

Restaurant listings come from **live OpenStreetMap queries** at run time, and tech-stack signals are detected by **crawling each website live** during the run — so results reflect what's on the site today, not a cached snapshot. Re-run the actor periodically to catch restaurants that switch POS, reservation, or delivery providers.

#### How accurate is the tech-stack detection?

Detection is signal-based: the crawler looks for platform-specific script tags, embed domains, and links (e.g. `toasttab.com`, `opentable.com`, `doordash.com`) across a restaurant's site pages. It's highly accurate when a platform is embedded on the site, but restaurants using a tool only in the back office (with no public-facing widget) won't show a signal for it.

#### Can I filter for restaurants NOT using a specific platform?

Yes — this is the core use case. Run the actor for your target city, export to CSV/JSON, then filter rows where `pos_system` (or `reservation_system` / `delivery_platforms`) does **not** contain your competitor's name, or contains a rival's. That gives you a ready-to-pitch "switch" list.

#### Do I need an API key or proxy?

No. Discovery uses OpenStreetMap (Nominatim + Overpass) and enrichment crawls each restaurant's own public website — no API keys, no anti-bot bypass, and it runs fine on datacenter IPs.

### Other Flash Scrape lead tools

- [Local Business Leads Scraper](https://apify.com/flash_scraper/local-business-leads) — any local business category, by city, with website platform detection
- [Google Maps Leads Scraper](https://apify.com/flash_scraper/google-maps-leads-opener) — Google Maps business leads with AI-written cold-email openers
- [Company & Domain Enricher](https://apify.com/flash_scraper/company-domain-enricher) — turn a domain list into full company records with tech stack and socials
- [Bulk Email Verifier](https://apify.com/flash_scraper/email-verifier) — verify and score every email address before you send a campaign
- [Hotel Host Leads Scraper](https://apify.com/flash_scraper/hotel-host-leads-scraper) — hotel and hospitality leads with the same enrichment approach

# Actor input Schema

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

City and region/country to search, e.g. 'Austin, Texas', 'Lyon, France', 'Casablanca, Morocco'.

## `cuisine` (type: `string`):

Optional cuisine to filter by, e.g. 'italian', 'pizza', 'sushi', 'mexican'. Leave empty for all.

## `includeFastFood` (type: `boolean`):

Also include fast-food establishments.

## `includeCafes` (type: `boolean`):

Also include cafes and coffee shops in the results (off = restaurants only).

## `maxItems` (type: `integer`):

Maximum number of restaurants to return.

## `crawlEmails` (type: `boolean`):

Visit each restaurant's own website to extract contact emails and detect its POS / reservation / ordering / delivery tech stack. Turn off for a faster, listing-only run.

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

Drop restaurants that have no website (websites are required for email + tech-stack enrichment).

## `onlyWithEmail` (type: `boolean`):

Keep only restaurants where an email was found (best for cold email).

## `verifyEmails` (type: `boolean`):

MX-verify every email and label it deliverable / risky / undeliverable via DNS-over-HTTPS (no SMTP, no proxy). Adds email\_status and email\_provider, and makes the lead score reflect real deliverability instead of mere presence.

## `onlyVerifiedEmail` (type: `boolean`):

Keep only restaurants whose email is deliverable or risky (drops undeliverable). Requires 'Verify email deliverability' to be on.

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

How many pages (home, contact, about, menu...) to crawl per website while looking for an email.

## `concurrency` (type: `integer`):

How many websites to crawl in parallel.

## Actor input object example

```json
{
  "location": "Austin, Texas",
  "includeFastFood": false,
  "includeCafes": false,
  "maxItems": 100,
  "crawlEmails": true,
  "onlyWithWebsite": true,
  "onlyWithEmail": false,
  "verifyEmails": true,
  "onlyVerifiedEmail": false,
  "maxPagesPerSite": 3,
  "concurrency": 8
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "location": "Austin, Texas",
    "onlyWithWebsite": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("flash_scraper/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 = {
    "location": "Austin, Texas",
    "onlyWithWebsite": True,
}

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

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

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

```

## CLI example

```bash
echo '{
  "location": "Austin, Texas",
  "onlyWithWebsite": true
}' |
apify call flash_scraper/restaurant-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=flash_scraper/restaurant-leads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/gJjCcICxrUw2yVqOc/builds/bcXbpJFxZSRhHjAkB/openapi.json
