# Grubhub Email Scraper (`leads-scraper/grubhub-email-scraper`) Actor

Grubhub Email Scraper SD - Grubhub Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from Grubhub results by keyword, location and email domain - Grubhub email extractor.

- **URL**: https://apify.com/leads-scraper/grubhub-email-scraper.md
- **Developed by:** [Leads Scraper](https://apify.com/leads-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Grubhub Email Scraper

Grubhub Email Scraper collects publicly indexed restaurant contact emails from Grubhub listings using Google search, then pushes each lead straight to your Apify dataset.

It is built for teams doing restaurant lead generation: POS and online-ordering vendors, food distributors, packaging suppliers, hospitality recruiters and local marketing agencies.

Every row is a business contact attached to a restaurant that publishes an address so diners can arrange catering, large orders and reservations. Grubhub Email Scraper is a B2B prospecting tool, not a personal-data harvester.

In our own test run against a sample of about 10 parsed results, Grubhub Email Scraper was the strongest of the nine food-delivery Actors in this batch: 8 of 10 rows carried an account identity, 8 of 10 carried a profile URL, and the run produced 10 unique emails.

That is an observation from one measured run, not a guarantee. Results vary with your keywords, domains and location.

If you only have budget to test one delivery-marketplace source, Grubhub Email Scraper is the one we would start with.

#### Who Grubhub Email Scraper is for

Restaurant-tech vendors use Grubhub Email Scraper to build POS sales leads: every merchant on the platform already sells online, so the digital-intent filter is done for you.

Food distributors and wholesale suppliers use it for cuisine-segmented restaurant lead generation, one metro at a time.

Packaging, disposables and equipment suppliers use Grubhub Email Scraper to reach high-volume takeout kitchens, where containers and bags are a recurring line item.

Hospitality recruiters and local marketing agencies use it to assemble local restaurant leads that are territory-shaped rather than national.

If your current restaurant prospecting runs on a bought list, this is the cheaper and fresher alternative: you control the keywords, the city and the email domains.

#### What Grubhub Email Scraper collects and why Grubhub works well

Grubhub publishes every merchant under a `/restaurant/{slug}` path, and Google indexes those pages heavily.

Because that slug is a stable, URL-safe handle, Grubhub Email Scraper can usually recover a `username` and build a canonical `profileUrl` - which is exactly why handle coverage here is higher than on marketplaces that bury merchants behind city landing pages.

Grubhub is also US-centric, so `countryCode: "US"` is the sensible default for almost every run.

Its catering surface is unusually strong. The `catering` query modifier ships in the defaults because Grubhub restaurants openly advertise large-order and catering contacts, and those pages are where the best emails sit.

Grubhub Email Scraper never logs in, never calls a Grubhub API and never opens grubhub.com. It reads Google's public result blocks - titles, snippets and site labels - through the Apify GOOGLE\_SERP proxy.

There is no browser, no JavaScript rendering, no authentication and no cookies. It is a Google SERP parsing tool pointed at one domain.

### Key features of Grubhub Email Scraper

Everything below is behaviour Grubhub Email Scraper actually implements. Nothing here is aspirational.

| Feature | What it does |
|---|---|
| `site:` operator targeting | Every query is scoped to `grubhub.com`, so results stay on-platform |
| Query expansion | Base, quoted and `intitle:` phrasings plus one variant per query modifier; base queries run first |
| Catering-tuned modifiers | Ships with `email`, `contact`, `catering`, `reservations`, `owner` |
| Domain filtering | Only emails on your `customDomains` list are kept |
| Global email deduplication | One email appears once across every query and every page |
| Obfuscated email decoding | Understands `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the `＠` full-width at sign |
| Junk filter | Rejects placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character locals |
| Boundary-correct matching | `@gmail.com` does not match inside `@gmail.company` or `@gmail.com.br` |
| Soft-wrap repair | Drops a hit that is only the tail of another email in the same block |
| Concurrency control | An `asyncio` worker pool with a shared stop signal on `maxEmails` |
| Retries with exponential backoff | Up to 3 attempts per page, with a fresh proxy session per request |
| CAPTCHA detection | Consent pages and "unusual traffic" interstitials are detected and retried, not counted as empty |
| Failed-query requeue | Blocked or failed queries are retried once at the end of the run |
| Resumable runs | State is kept in the key-value store, keyed by an input hash, and saved on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Layout-change fallback | A whole-page parser degrades to "emails without account details" instead of "no emails" |
| Dataset export | Every lead lands in the Apify dataset for CSV, JSON or Excel export |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |

### How Grubhub Email Scraper works

Six steps, and nothing hidden behind them.

1. **Read input.** Grubhub Email Scraper takes your keywords, location, email domains and limits.
2. **Build `site:` queries.** Each keyword is combined with your domains and modifiers into Google queries scoped to `grubhub.com`.
3. **Fetch SERP pages.** Pages are pulled asynchronously through the Apify GOOGLE\_SERP proxy, with proxy rotation on every request.
4. **Parse each result block structurally.** The parser locates the `<h3>` title, then walks up to the smallest surrounding block - it does not depend on Google's CSS class names.
5. **Extract emails.** A domain-filtered regex runs over the block text, with snippet extraction feeding `description`, `accountName` and the Grubhub slug.
6. **Deduplicate and push.** Emails are deduplicated globally and each lead is written to the dataset immediately, so you can watch a run fill up live.

Because parsing is structural rather than class-name based, a Google layout change degrades gracefully instead of breaking Grubhub Email Scraper outright.

Query expansion is the single most important setting. Google caps one query at roughly 300 results, so Grubhub Email Scraper works around that ceiling by asking many narrower questions instead of one broad one.

Blocked pages are handled rather than swallowed: CAPTCHA detection flags consent and "unusual traffic" pages, exponential backoff retries them, and anything still failing is re-queued once at the end of the run.

### Input for Grubhub Email Scraper

These are the nine input fields, verbatim from the Actor's schema.

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["restaurant","delivery"]` | Search terms (niche, job title, industry) |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com","@yahoo.com"]` | Only emails on these domains are kept; `@` optional |
| `maxEmails` | integer 1-10000 | `20` | Stop after this many unique emails |
| `countryCode` | string | `""` | Two-letter country for the search proxy (US, GB, DE...) |
| `expandQueries` | boolean | `true` | Search each keyword x domain in several phrasings |
| `queryModifiers` | array | `["email","contact","catering","reservations","owner"]` | Extra words combined with each keyword when expansion is on |
| `maxPagesPerQuery` | integer 1-50 | `30` | Page cap per query |
| `maxConcurrency` | integer 1-20 | `5` | Parallel queries |

A realistic catering-focused input for Grubhub Email Scraper:

```json
{
  "keywords": ["restaurant", "catering", "pizzeria"],
  "location": "Chicago",
  "customDomains": ["@gmail.com", "@yahoo.com"],
  "maxEmails": 300,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "catering", "reservations", "owner"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Getting `location` right

`location` is a plain string appended to every query, and it matters more here than anywhere else, because restaurant prospecting is inherently local.

**Run one city per run.** `"Chicago"`, then `"Manchester"`, each in its own run with its own dataset. A rep gets a territory-shaped list instead of a national blob.

**Use the neighbourhood or borough in dense metros.** `"Brooklyn"` and `"Shoreditch"` behave far better than a whole-city term where the market is huge.

**Pair `location` with `countryCode`.** For Grubhub that means `"US"`, so the search proxy resolves the right Google locale.

**Widen only when you must.** If a city returns too little, step up to a state or region rather than dropping `location` entirely.

**Remember it is matched as text.** `location` matches words printed on the indexed page, so a city Grubhub does not print will simply narrow results to nothing.

### Output of Grubhub Email Scraper

Every dataset item from Grubhub Email Scraper has all fourteen fields.

| Field | Meaning |
|---|---|
| `network` | Platform name |
| `keyword` | The keyword that produced the lead |
| `query` | The exact Google query used |
| `title` | Raw result title |
| `accountName` | Account label Google prints (handle, display name, or e.g. a subreddit) |
| `fullName` | Display name parsed from a profile-style title; empty for post captions |
| `username` | URL-safe handle when the platform exposes one; otherwise `null` |
| `profileUrl` | Canonical account URL when a handle is known; otherwise empty |
| `url` | Direct platform link when exposed, else the profile URL |
| `description` | Bio/caption snippet, cleaned of labels and engagement counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain (e.g. `@gmail.com`) |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email - verify before sending |
| `foundAt` | ISO 8601 UTC timestamp |

Sample rows. The third shows what a row looks like when Google prints a display name but no usable slug.

```json
[
  {
    "network": "Grubhub",
    "keyword": "catering",
    "query": "site:grubhub.com catering \"@gmail.com\" \"Chicago\"",
    "title": "Mario's Trattoria - Chicago | Order Online | Grubhub",
    "accountName": "Mario's Trattoria",
    "fullName": "Mario's Trattoria",
    "username": "marios-trattoria-chicago",
    "profileUrl": "https://www.grubhub.com/restaurant/marios-trattoria-chicago",
    "url": "https://www.grubhub.com/restaurant/marios-trattoria-chicago",
    "description": "Family-run Italian kitchen. Catering and large orders: mario.catering@gmail.com",
    "email": "mario.catering@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-05-14T09:22:41Z"
  },
  {
    "network": "Grubhub",
    "keyword": "restaurant",
    "query": "site:grubhub.com restaurant owner \"@yahoo.com\" \"Chicago\"",
    "title": "Northside Taqueria | Chicago | Grubhub",
    "accountName": "Northside Taqueria",
    "fullName": "Northside Taqueria",
    "username": "northside-taqueria",
    "profileUrl": "https://www.grubhub.com/restaurant/northside-taqueria",
    "url": "https://www.grubhub.com/restaurant/northside-taqueria",
    "description": "Tacos, burritos, party trays. Owner contact: northside.orders@yahoo.com",
    "email": "northside.orders@yahoo.com",
    "emailDomain": "@yahoo.com",
    "possiblyTruncated": false,
    "foundAt": "2026-05-14T09:23:07Z"
  },
  {
    "network": "Grubhub",
    "keyword": "delivery",
    "query": "site:grubhub.com delivery contact \"@gmail.com\" \"Chicago\"",
    "title": "Best delivery near Lincoln Park - Grubhub",
    "accountName": "Golden Wok Express",
    "fullName": "Golden Wok Express",
    "username": null,
    "profileUrl": "",
    "url": "https://www.grubhub.com/",
    "description": "Lunch specials and office catering - goldenwok.events@gmail.com",
    "email": "goldenwok.events@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": true,
    "foundAt": "2026-05-14T09:24:12Z"
  }
]
```

Export the dataset from Grubhub Email Scraper as CSV, JSON or Excel, or pull it through the Apify API straight into a CRM import.

For lead enrichment, `description` is often the most useful field after `email`: it carries the cleaned snippet, which frequently names the cuisine, the neighbourhood or the catering offer.

That snippet extraction is what turns a raw restaurant email list into something a rep can personalise, and it is why Grubhub Email Scraper keeps the text rather than discarding it.

### Use cases for Grubhub Email Scraper

Grubhub Email Scraper suits any team whose ICP targeting is "independent restaurants that already sell online in a given city".

| Buyer | How they use Grubhub Email Scraper |
|---|---|
| POS and online-ordering vendors | Build a restaurant contact database per metro, then work POS sales leads city by city |
| Delivery and integration platforms | Target merchants already selling online - food delivery leads with proven digital intent |
| Food distributors and wholesalers | Segment by cuisine keyword (`pizzeria`, `taqueria`, `sushi`) for territory-matched restaurant lead generation |
| Packaging and disposables suppliers | Reach high-volume takeout kitchens where containers and bags are a recurring spend |
| Equipment suppliers | Find independent kitchens for a restaurant owner email list that is not just chains |
| Hospitality recruiters | Source chef, GM and front-of-house openings by pairing `location` with cuisine keywords |
| Local marketing and SEO agencies | Assemble local restaurant leads for B2B restaurant outreach in a single postcode or borough |
| Catering platforms and event caterers | Use the `catering` modifier to surface catering leads and large-order contacts directly |

### Example runs for Grubhub Email Scraper

Five recipes that cover most of what people actually do with Grubhub Email Scraper.

**Catering leads in one borough.** Keywords `["catering", "party trays"]`, `location: "Brooklyn"`, `countryCode: "US"`, `maxEmails: 200`.

This is the recipe Grubhub Email Scraper is best at, because catering pages print the large-order contact in plain text.

**Cuisine segmentation for a distributor.** Keywords `["pizzeria", "italian restaurant"]`, `location: "Chicago"`, modifiers left at their defaults.

Cuisine segmentation gives a sales team a story to open with, which beats a generic restaurant email list every time.

**Wide-domain sweep.** Set `customDomains` to `["@gmail.com", "@yahoo.com", "@outlook.com", "@hotmail.com"]` to catch owner-operators who never set up a branded inbox.

Independent restaurants very often run on a free mailbox, so widening domains is the single cheapest way to grow a restaurant contact database.

It is also the fastest way to turn thin food delivery leads into a workable list without touching keywords at all.

**High-throughput territory build.** `maxEmails: 2000`, `maxConcurrency: 8`, `maxPagesPerQuery: 30`, one run per city.

Keep concurrency moderate; pushing it does not defeat Google's ~300-results-per-query ceiling, query expansion does.

**Small verification run.** `maxEmails: 20` with the defaults, to see what Grubhub Email Scraper returns for your niche before committing budget.

City-level prospecting is the pattern that ties all five together: one city per run, one dataset per city, one rep per dataset.

Run this way and a restaurant owner email list stays clean, attributable and easy to refresh, which matters more for B2B restaurant outreach than raw volume does.

### Responsible use

Grubhub Email Scraper collects business addresses published so diners can arrange catering, large orders and reservations. Treat them that way.

Identify yourself and your company in the first line, and say plainly why you are contacting that business address.

Give a working unsubscribe link, honour opt-outs immediately and keep them suppressed. That is a CAN-SPAM baseline, not a nicety.

Under GDPR, keep a record of your lawful basis - usually legitimate interest for B2B contact - and be ready to explain it. Do not send to consumers.

This is not legal advice. Check your own obligations in every market you email into, and adjust your process accordingly.

### Limitations of Grubhub Email Scraper

Read these before you plan a campaign around the output.

1. **Public index only.** Grubhub Email Scraper only finds emails that are publicly visible in Google's index. An email that appears only inside a logged-in Grubhub page will not be found.
2. **The ~300-result ceiling.** Google caps a single query at roughly 300 results. That is precisely why query expansion exists and why it is on by default.
3. **`possiblyTruncated: true`.** Google's snippet ellipsis may have cut the address short. Verify those rows before sending.
4. **Apify GOOGLE\_SERP proxy required.** Grubhub Email Scraper cannot run without Apify proxy credentials.
5. **Free-plan cap.** Free Apify plans are capped at 100 emails per run. Paid plans are uncapped.
6. **Handles are not always available.** `username` and `profileUrl` are only populated when the platform exposes a handle in the Google result; otherwise you get `accountName` and `fullName` with an empty handle. This is a Google limitation, not a bug.
7. **No volume guarantee.** Results vary with keywords, domains and location. Our measured sample is an observation, not a promise.

### Grubhub Email Scraper FAQ

#### How many results should I expect?

In our own test run on a sample of about 10 parsed results, Grubhub Email Scraper returned 8 rows with an account identity, 8 with a profile URL and 10 unique emails. That was the strongest showing in this batch of nine, but it is one measured sample, not a guarantee.

#### Which delivery-marketplace Actor should I run first?

Grubhub, on this evidence. The **Seamless Email Scraper** shares Grubhub's merchant catalogue and scored the same in our test, so it adds few distinct pages - while [Uber Eats Email Scraper](https://apify.com/leads-scraper/uber-eats-email-scraper) and [DoorDash Email Scraper](https://apify.com/leads-scraper/doordash-email-scraper) cover different merchants and are worth running alongside for coverage rather than instead.

#### Why is handle coverage so good on Grubhub?

Grubhub exposes each merchant at `/restaurant/{slug}`, and Google indexes those URLs. A stable slug is a usable handle, so `username` and `profileUrl` fill in far more often than on platforms that surface city or cuisine landing pages.

#### Does it log into Grubhub or use the Grubhub API?

No. Grubhub Email Scraper does not log in, does not use any Grubhub API and does not open grubhub.com. It parses public Google results through the Apify GOOGLE\_SERP proxy.

#### Is it affiliated with Grubhub?

No. This is an independent tool with no affiliation to or endorsement from Grubhub.

#### What country should I set?

Grubhub is US-centric, so `countryCode: "US"` is the sensible default. Pair it with a US city in `location`.

#### Can I get more catering contacts specifically?

Yes - keep `catering` in `queryModifiers` and add catering-flavoured keywords such as `party trays` or `office catering`. Catering pages are where large-order contacts are printed.

#### Why only `@gmail.com` and `@yahoo.com` by default?

Independent restaurant owners overwhelmingly use free mailboxes. Add `@outlook.com`, `@hotmail.com` or a branded domain to `customDomains` if you want broader restaurant contact database coverage.

#### What if a run returns very little?

Widen `location` from a neighbourhood to a city or state, add cuisine keywords, add more domains, and leave `expandQueries` on. Those four levers cover most thin runs.

#### Can I resume an interrupted run?

Yes. Grubhub Email Scraper keeps resumable state in the key-value store, keyed by a hash of the input, and persists it on Apify's `PERSIST_STATE`, `MIGRATING` and `ABORTING` events.

#### How do I get the data into my CRM?

Export the dataset as CSV, JSON or Excel, or read it through the Apify API. Most teams map `email`, `accountName`, `profileUrl` and `description` for lead enrichment and ICP targeting before a cold email outreach sequence.

#### Does it handle obfuscated addresses?

Yes. Grubhub Email Scraper applies obfuscated email decoding covering `[at]`, `(at)`, spaced `@`, spaced `.com`, zero-width characters and the full-width `＠` sign.

#### Will I get the same email twice?

No. Email deduplication is global across every query and every page in a run, so each address is written to the dataset once.

#### Does raising `maxConcurrency` get me more leads?

Not by itself. Concurrency control changes how fast Grubhub Email Scraper works through the queue; query expansion and broader domains are what change total yield.

### Related Actors

| Actor | What it collects |
|---|---|
| [Grubhub Email and Phone Number Scraper](https://apify.com/neuro-scraper/grubhub-email-and-phone-number-scraper) | Emails and phone numbers from Grubhub |
| [Grubhub Phone Number Scraper](https://apify.com/neuro-scraper/grubhub-phone-number-scraper) | Public phone numbers from Grubhub |
| [Airbnb Email Scraper](https://apify.com/leads-scraper/airbnb-email-scraper) | Public contact emails from Airbnb |
| [Booking.com Email Scraper](https://apify.com/leads-scraper/booking-com-email-scraper) | Public contact emails from Booking.com |
| [Caviar Email Scraper](https://apify.com/neuro-scraper/caviar-email-scraper) | Public contact emails from Caviar |
| [ChowNow Email Scraper](https://apify.com/neuro-scraper/chownow-email-scraper) | Public contact emails from ChowNow |
| [Contiki Email Scraper](https://apify.com/neuro-scraper/contiki-email-scraper) | Public contact emails from Contiki |
| [Craigslist Email Scraper](https://apify.com/leads-scraper/craigslist-email-scraper) | Public contact emails from Craigslist |
| [Delivery.com Email Scraper](https://apify.com/neuro-scraper/delivery-com-email-scraper) | Public contact emails from Delivery.com |
| [DoorDash Email Scraper](https://apify.com/leads-scraper/doordash-email-scraper) | Public contact emails from DoorDash |
| [EatStreet Email Scraper](https://apify.com/neuro-scraper/eatstreet-email-scraper) | Public contact emails from EatStreet |
| [G Adventures Email Scraper](https://apify.com/neuro-scraper/g-adventures-email-scraper) | Public contact emails from G Adventures |
| [GetYourGuide Email Scraper](https://apify.com/leads-scraper/getyourguide-email-scraper) | Public contact emails from GetYourGuide |
| [Hostelbookers Email Scraper](https://apify.com/leads-scraper/hostelbookers-email-scraper) | Public contact emails from Hostelworld |
| [HotelsCombined Email Scraper](https://apify.com/neuro-scraper/hotelscombined-email-scraper) | Public contact emails from HotelsCombined |
| [Intrepid Travel Email Scraper](https://apify.com/neuro-scraper/intrepid-travel-email-scraper) | Public contact emails from Intrepid Travel |
| [Just Eat Email Scraper](https://apify.com/leads-scraper/just-eat-email-scraper) | Public contact emails from Just Eat |
| [Klook Email Scraper](https://apify.com/neuro-scraper/klook-email-scraper) | Public contact emails from Klook |
| [OpenTable Email Scraper](https://apify.com/neuro-scraper/opentable-email-scraper) | Public contact emails from OpenTable |
| [Resy Email Scraper](https://apify.com/leads-scraper/resy-email-scraper) | Public contact emails from Resy |
| [TheFork Email Scraper](https://apify.com/leads-scraper/thefork-email-scraper) | Public contact emails from TheFork |
| [Toast Restaurant Email Scraper](https://apify.com/leads-scraper/toast-restaurant-email-scraper) | Public contact emails from Toast |
| [TourRadar Email Scraper](https://apify.com/leads-scraper/tourradar-email-scraper) | Public contact emails from TourRadar |
| [Traveloka Email Scraper](https://apify.com/leads-scraper/traveloka-email-scraper) | Public contact emails from Traveloka |
| [Tripadvisor Attractions Email Scraper](https://apify.com/leads-scraper/tripadvisor-attractions-email-scraper) | Public contact emails from Tripadvisor |
| [Tripadvisor Hotels Email Scraper](https://apify.com/leads-scraper/tripadvisor-hotels-email-scraper) | Public contact emails from Tripadvisor |
| [Tripadvisor Restaurants Email Scraper](https://apify.com/leads-scraper/tripadvisor-restaurants-email-scraper) | Public contact emails from Tripadvisor |
| [Uber Eats Email Scraper](https://apify.com/leads-scraper/uber-eats-email-scraper) | Public contact emails from Uber Eats |
| [Viator Email Scraper](https://apify.com/leads-scraper/viator-email-scraper) | Public contact emails from Viator |
| [Wanderlog Email Scraper](https://apify.com/leads-scraper/wanderlog-email-scraper) | Public contact emails from Wanderlog |
| [Wego Email Scraper](https://apify.com/leads-scraper/wego-email-scraper) | Public contact emails from Wego |
| [Zomato Email Scraper](https://apify.com/leads-scraper/zomato-email-scraper) | Public contact emails from Zomato |
| [Airbnb Email and Phone Number Scraper](https://apify.com/leads-scraper/airbnb-email-and-phone-number-scraper) | Emails and phone numbers from Airbnb |
| [Booking.com Email and Phone Number Scraper](https://apify.com/leads-scraper/booking-com-email-and-phone-number-scraper) | Emails and phone numbers from Booking.com |
| [Caviar Email and Phone Number Scraper](https://apify.com/neuro-scraper/caviar-email-and-phone-number-scraper) | Emails and phone numbers from Caviar |
| [ChowNow Email and Phone Number Scraper](https://apify.com/neuro-scraper/chownow-email-and-phone-number-scraper) | Emails and phone numbers from ChowNow |
| [Contiki Email and Phone Number Scraper](https://apify.com/neuro-scraper/contiki-email-and-phone-number-scraper) | Emails and phone numbers from Contiki |
| [Craigslist Email and Phone Number Scraper](https://apify.com/leads-scraper/craigslist-email-and-phone-number-scraper) | Emails and phone numbers from Craigslist |
| [Delivery.com Email and Phone Number Scraper](https://apify.com/neuro-scraper/delivery-com-email-and-phone-number-scraper) | Emails and phone numbers from Delivery.com |
| [DoorDash Email and Phone Number Scraper](https://apify.com/leads-scraper/doordash-email-and-phone-number-scraper) | Emails and phone numbers from DoorDash |
| [EatStreet Email and Phone Number Scraper](https://apify.com/neuro-scraper/eatstreet-email-and-phone-number-scraper) | Emails and phone numbers from EatStreet |
| [G Adventures Email and Phone Number Scraper](https://apify.com/neuro-scraper/g-adventures-email-and-phone-number-scraper) | Emails and phone numbers from G Adventures |

### Leave a review

If the Grubhub Email Scraper saved you time, please leave a star rating and a short review on
the Actor page.

Reviews are how other buyers judge whether a tool works, and they tell us which features to
build next.

If something did not work, email <neurodata.apify@gmail.com>
instead - bugs get fixed faster than they get complained about.

# Actor input Schema

## `keywords` (type: `array`):

Search terms describing the Grubhub accounts you want (niche, job title, industry).

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

Optional location phrase added to every query (e.g. "New York").

## `customDomains` (type: `array`):

Only emails ending with one of these domains are collected. With or without the leading @. Each domain is searched separately, so more domains means more results but a longer run - remove some for a faster, narrower search, or add your own (e.g. @company.com).

## `maxEmails` (type: `integer`):

Stop once this many unique emails have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for Grubhub.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

## `maxConcurrency` (type: `integer`):

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "restaurant",
    "delivery"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "catering",
    "reservations",
    "owner"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Grubhub Email Scraper, stored in the run's 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 = {
    "keywords": [
        "restaurant",
        "delivery"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "catering",
        "reservations",
        "owner"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leads-scraper/grubhub-email-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 = {
    "keywords": [
        "restaurant",
        "delivery",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "catering",
        "reservations",
        "owner",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("leads-scraper/grubhub-email-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 '{
  "keywords": [
    "restaurant",
    "delivery"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "catering",
    "reservations",
    "owner"
  ]
}' |
apify call leads-scraper/grubhub-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leads-scraper/grubhub-email-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/0y4DeZYOD4uUjE2QX/builds/NK2LqmdHCv5QxOpF8/openapi.json
