# TheFork Email Scraper (`leads-scraper/thefork-email-scraper`) Actor

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

- **URL**: https://apify.com/leads-scraper/thefork-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

### TheFork Email Scraper

The TheFork Email Scraper collects publicly indexed contact emails connected to `thefork.com`, `thefork.co.uk` and `lafourchette.com`, the reservation network that dominates restaurant booking across France, Spain, Italy, Portugal and much of the rest of Europe.
It builds Google queries with the `site:` operator against all three domains, fetches them through the Apify GOOGLE\_SERP proxy, and extracts emails from the result blocks.
No login, no browser, no TheFork API — only what Google has already published in its index.

**Start with the measured part.** In a live test run, roughly 10 parsed results produced 10 rows with a usable venue identity, 8 resolvable profile URLs and 6 unique emails.
Identity coverage is excellent: nearly every row comes back attached to a named restaurant, which is exactly what a European restaurant lead generation workflow needs.

The catch is language. TheFork is a multilingual platform, and `lafourchette.com` in particular is a French-language index.
English keywords against a French, Spanish or Italian index match a thin slice of what is actually there — which is why `countryCode` and local-language keywords are the two levers that matter most here.

#### What one run of the TheFork Email Scraper produces

Each dataset row is one unique email plus whatever venue context Google printed around it.
You get the raw title, an account label, a cleaned snippet, the exact query used and a truncation flag.
The TheFork Email Scraper pushes rows to the Apify dataset as they are found, so you can export CSV, JSON or Excel mid-run.

#### Exporting and integrating the TheFork Email Scraper dataset

Because rows are written incrementally, an aborted or migrated run still leaves a usable dataset behind.
Export from the Apify console, pull the dataset over the API, or schedule the TheFork Email Scraper and push results straight into your CRM.

### Multilingual keywords and `countryCode` in the TheFork Email Scraper

This is the most important configuration section here, and your main lever over result volume.
The shipped defaults — `keywords` of `restaurant` and `bistro` — are a sensible European starting point, but they under-search the Spanish, Italian and Portuguese parts of the index badly.

Run one job per market: set `countryCode` and the keyword language together, and never mix them.
Google personalises results by country vantage, so a French-language run from a US vantage point returns far less than the same run with `countryCode: "FR"`.

#### Local-language keyword suggestions for the TheFork Email Scraper

| Market | `countryCode` | Keywords worth trying |
|---|---|---|
| France | `FR` | `restaurant`, `bistrot`, `brasserie`, `traiteur`, `cave à manger` |
| Spain | `ES` | `restaurante`, `tapas`, `marisquería`, `asador`, `bodega` |
| Italy | `IT` | `ristorante`, `trattoria`, `osteria`, `pizzeria`, `enoteca` |
| Portugal | `PT` | `restaurante`, `tasca`, `marisqueira`, `churrasqueira` |
| United Kingdom | `GB` | `restaurant`, `gastropub`, `bistro`, `wine bar` |
| Belgium / Netherlands | `BE`, `NL` | `restaurant`, `brasserie`, `eetcafé` |

Intent modifiers should be translated too. Replace the defaults with local terms so the expanded queries match real page copy.

| Intent | French | Spanish | Italian |
|---|---|---|---|
| email | `email` | `correo` | `email` |
| contact | `contact` | `contacto` | `contatti` |
| catering | `traiteur` | `catering` | `catering` |
| reservations | `réservation` | `reservas` | `prenotazioni` |
| group bookings | `groupes` | `grupos` | `gruppi` |

Pair a format noun with an intent word — `brasserie contact`, `trattoria prenotazioni` — instead of searching a bare noun.

#### European free-mail domains for `customDomains`

The default `customDomains` are `@gmail.com` and `@yahoo.com`.
Gmail is universal in Europe and should stay. The domains below are worth testing per market; they are suggestions based on how each country publishes contact details, not guarantees of volume.

| Domain | Market |
|---|---|
| `@orange.fr` | France — the largest legacy ISP mailbox |
| `@wanadoo.fr` | France — still common on older restaurant listings |
| `@free.fr` | France |
| `@laposte.net` | France |
| `@hotmail.fr` / `@hotmail.es` / `@hotmail.it` | France, Spain, Italy |
| `@libero.it` / `@alice.it` | Italy |
| `@sapo.pt` | Portugal |
| `@gmail.com` | Keep everywhere |

Each extra domain multiplies the query count, because the TheFork Email Scraper searches every keyword against every domain.
Three or four domains per market run is a good balance.

### How the TheFork Email Scraper works: SERP parsing, not an API

The TheFork Email Scraper runs the same six steps on every query it builds.

1. It reads your input: keywords, location, email domains and limits.
2. It builds Google queries with the `site:` operator, for example `site:thefork.com OR site:thefork.co.uk OR site:lafourchette.com brasserie "@orange.fr" contact`.
3. It fetches result pages through the Apify GOOGLE\_SERP proxy using async `aiohttp` requests.
4. It parses each result block structurally — locating the `<h3>` and the smallest surrounding block — rather than by CSS class name.
5. It extracts emails with a domain-filtered regex and normalises obfuscated forms.
6. It deduplicates globally and pushes each lead to the dataset immediately.

All three domains are covered by a single `site:` alternation, so a French run reads `lafourchette.com` and `thefork.com` in the same query.
There is no browser, no JavaScript rendering, no authentication and no cookies, and the TheFork Email Scraper never signs into TheFork.

### TheFork Email Scraper features

Everything listed below is implemented in the TheFork Email Scraper today.

| Feature | What it means in practice |
|---|---|
| Query expansion | Base, quoted, `intitle:` and one variant per modifier; base queries run first |
| Tri-domain search | `thefork.com`, `thefork.co.uk` and `lafourchette.com` in every query |
| Global deduplication | An email found by several queries is stored exactly once |
| Email normalisation | Understands `name [at] domain [dot] com`, `name (at) domain`, `name @ domain`, `domain .com`, zero-width characters and the full-width `＠` |
| Junk filter | Rejects placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character locals |
| Boundary-correct matching | `@gmail.com` will 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 |
| Structural parsing | Independent of Google's obfuscated CSS class names |
| Whole-page fallback | A markup change degrades to "emails without account details" rather than "no emails" |
| Block detection | CAPTCHA, "unusual traffic" and consent pages are detected and retried, not counted as empty |
| Retries | Up to 3 attempts per page with exponential backoff and a fresh proxy session per request |
| Failed-query requeue | Blocked or failed queries are re-queued once at the end of the run |
| Concurrency | An `asyncio` worker pool with a shared stop signal on `maxEmails` |
| Resumable state | Key-value store state keyed by an input hash; saves on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |

### TheFork Email Scraper input fields

These are the exact input fields the TheFork Email Scraper accepts, with the defaults it ships with.

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["restaurant","bistro"]` | Search terms describing the venues you want |
| `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 — `FR`, `ES`, `IT`, `PT`, `GB` |
| `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 |

#### Example TheFork Email Scraper input

```json
{
  "keywords": ["brasserie", "bistrot", "traiteur"],
  "location": "Lyon",
  "customDomains": ["@gmail.com", "@orange.fr", "@wanadoo.fr"],
  "maxEmails": 200,
  "countryCode": "FR",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "traiteur", "réservation", "groupes"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### City-level prospecting with `location`

`location` is the highest-leverage field in the TheFork Email Scraper for any European territory sale.
It appends a quoted phrase to every query, so you get one dataset per city instead of one undifferentiated continental file.

Useful values are the metros where TheFork is densest: `Paris`, `Lyon`, `Marseille`, `Bordeaux`, `Madrid`, `Barcelona`, `Milano`, `Roma`, `Lisboa`, `London`.
Arrondissement and district names work too — `Le Marais`, `Eixample`, `Trastevere` — when you want a walkable prospecting route.

Match the `location` language to the `countryCode`: `Milano` with `IT`, not `Milan` with `US`.
Leave it empty for a first exploratory run, then narrow once you know which keyword and language combination returns rows.

### TheFork Email Scraper output fields

Every dataset item the TheFork Email Scraper writes carries all fourteen of these 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 |
| `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 or snippet text, cleaned of labels and engagement counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email |
| `foundAt` | ISO 8601 UTC timestamp |

#### Example TheFork Email Scraper output

```json
[
  {
    "network": "TheFork",
    "keyword": "brasserie",
    "query": "site:thefork.com OR site:thefork.co.uk OR site:lafourchette.com brasserie \"@orange.fr\" contact \"Lyon\"",
    "title": "Brasserie du Rhône - Lyon 2e | TheFork",
    "accountName": "Brasserie du Rhône",
    "fullName": "Brasserie du Rhône - Lyon 2e",
    "username": "brasserie-du-rhone-lyon-r712345",
    "profileUrl": "https://www.thefork.com/restaurant/brasserie-du-rhone-lyon-r712345",
    "url": "https://www.thefork.com/restaurant/brasserie-du-rhone-lyon-r712345",
    "description": "Cuisine lyonnaise. Groupes et privatisation : contact.brasserierhone@orange.fr",
    "email": "contact.brasserierhone@orange.fr",
    "emailDomain": "@orange.fr",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T13:41:52Z"
  },
  {
    "network": "TheFork",
    "keyword": "traiteur",
    "query": "site:thefork.com OR site:thefork.co.uk OR site:lafourchette.com traiteur \"@gmail.com\" groupes \"Lyon\"",
    "title": "Traiteur et réceptions à Lyon - LaFourchette",
    "accountName": "LaFourchette",
    "fullName": "Traiteur et réceptions à Lyon",
    "username": null,
    "profileUrl": "",
    "url": "",
    "description": "Sélection de restaurants proposant un service traiteur. Devis : lyon.traiteur.pro@gmail.com",
    "email": "lyon.traiteur.pro@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": true,
    "foundAt": "2026-08-31T13:44:07Z"
  }
]
```

Note the `profileUrl` shape: TheFork routes venues under `/restaurant/`, so the canonical link the TheFork Email Scraper builds is `https://www.thefork.com/restaurant/{venue-slug}`, normalised to the `.com` domain even when Google indexed the French or UK one.
The second row shows the honest case — a listicle page with an address but no venue path, so `username` is `null` and `profileUrl` is empty.

#### What a measured TheFork Email Scraper run looked like

Per roughly 10 parsed results in a live test: 10 rows with a usable identity, 8 resolvable profile URLs, 6 unique emails.
Identity is close to complete; email density is moderate.

That combination suits list-building more than volume harvesting.
You will usually know exactly which restaurant a row belongs to, which makes the dataset easy to reconcile against a CRM.

### Restaurant lead generation use cases for the TheFork Email Scraper

Here is where the TheFork Email Scraper fits into real B2B prospecting and market research workflows.

| Use case | How to configure it |
|---|---|
| Reservation and table-management sales in Europe | One market per run: `countryCode` plus local keywords |
| POS and payments prospecting | Add `owner` and a translated `contact` modifier |
| Food and beverage distribution | `keywords: ["brasserie","trattoria","asador"]` per market |
| Wine and spirits supply | `keywords: ["cave à manger","enoteca","bodega"]` |
| Catering and events sourcing | Use `traiteur`, `catering`, `groupes` and `gruppi` as modifiers |
| Packaging and equipment suppliers | Target `pizzeria` and `churrasqueira`, high-throughput formats |
| Hospitality recruitment | `owner` plus the local `contact` word for decision-maker inboxes |
| Multi-country market mapping | Run FR, ES, IT and PT jobs and compare row counts per format keyword |
| Local agency client acquisition | One arrondissement or district per run |
| CRM enrichment | Match on `profileUrl` — the `/restaurant/{slug}` form is canonical and stable |

### Practical TheFork Email Scraper recipes

**France baseline.** French keywords, French modifiers, `countryCode: "FR"`, `location: "Paris"`, `maxEmails: 200`.
This is the configuration most likely to return a large, well-identified dataset.

**Language A/B test.** Run the English defaults and a local-language keyword set as two jobs with the same `maxEmails`.
The row-count difference tells you empirically what the translation is worth in your category.

**Four-market sweep.** Four runs — FR, ES, IT, PT — each with its own keywords, modifiers and mail domains.
Merging them afterwards is trivial; running them together dilutes the country vantage point.

**Widen before you deepen.** Google caps a single query at roughly 300 results, so more format keywords beat more pages per query.
Raise `maxPagesPerQuery` last.

**Pair for coverage.** Run the [Just Eat Email Scraper](https://apify.com/leads-scraper/just-eat-email-scraper) beside this one for European takeaway operators, and the [Tripadvisor Restaurants Email Scraper](https://apify.com/leads-scraper/tripadvisor-restaurants-email-scraper) for venues that are not on any booking network.

### Responsible use, GDPR and CAN-SPAM

This Actor targets European markets, so the GDPR is the primary regime and it applies to any email that identifies a natural person, published or not.
Public availability is not consent to send. France's CNIL, Spain's AEPD and Italy's Garante all take a strict line on unsolicited commercial email; if you also mail US recipients, CAN-SPAM applies.

Practical steps that keep a TheFork Email Scraper workflow defensible:

- Strongly prefer role addresses (`contact@`, `reservation@`, `info@`) over addresses naming an individual.
- Record a lawful basis for processing before you send anything, and document it.
- Keep provenance for every lead — the `query`, `url` and `foundAt` fields exist for exactly this.
- Give a clear sender identity, a stated purpose and a working opt-out in every message.
- Honour opt-outs and erasure requests immediately, and check suppression lists before each follow-up.
- Delete data you are not actively using rather than warehousing scraped lists.

This is operational guidance, not legal advice.

### Related Actors

The TheFork Email Scraper is one of 35 Actors in a Travel, Hospitality and Food family that all share this engine.
For the same restaurant motion outside Europe, pair it with the [OpenTable Email Scraper](https://apify.com/neuro-scraper/opentable-email-scraper) and [Resy Email Scraper](https://apify.com/leads-scraper/resy-email-scraper) for the US, and the **OpenRice Email Scraper** for Asia.

| Actor | What it collects |
|---|---|
| [TheFork Email and Phone Number Scraper](https://apify.com/leads-scraper/thefork-email-and-phone-number-scraper) | Emails and phone numbers from TheFork |
| [TheFork Phone Number Scraper](https://apify.com/leads-scraper/thefork-phone-number-scraper) | Public phone numbers from TheFork |
| [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 |
| [Grubhub Email Scraper](https://apify.com/leads-scraper/grubhub-email-scraper) | Public contact emails from Grubhub |
| [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 |
| [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 |

### TheFork Email Scraper limitations

Read these before planning anything around TheFork Email Scraper output.

- **English defaults under-search a multilingual index.** Without local-language keywords and a matching `countryCode` you will see a fraction of what is available.
- **Publicly indexed emails only.** The TheFork Email Scraper finds addresses already visible in Google's index. Anything behind a booking widget, a contact form or a login is unreachable.
- **Google's ~300-result cap.** A single query returns roughly 300 results at most, which is why `expandQueries` defaults to `true`.
- **`possiblyTruncated`.** When `true`, Google's snippet ellipsis touched the email and it may be cut off. Verify before sending.
- **`username` and `profileUrl` can be empty.** They are populated only when Google exposes a resolvable `/restaurant/` path; in testing about 8 of 10 rows did. Listicle and city pages will have `username: null`. That is a Google limitation, not a bug.
- **Moderate email density.** Identity coverage is high but only about 6 unique emails came out of 10 parsed results in testing.
- **Apify GOOGLE\_SERP proxy required.** The TheFork Email Scraper cannot run without Apify proxy credentials.
- **Free-plan cap.** Free Apify plans stop at 100 emails per run. Paid plans are uncapped.
- **No guaranteed volume.** Results vary with keywords, domains, location and Google's index on the day.
- **Not affiliated with TheFork.** This is an independent tool, not supported, endorsed by or connected to TheFork or LaFourchette.

### TheFork Email Scraper FAQ

Common questions about the TheFork Email Scraper, its inputs and its output.

#### How many results should I expect from the TheFork Email Scraper?

In a live test, roughly 10 parsed results produced 10 identified venues, 8 profile URLs and 6 unique emails. Identity is excellent, email density moderate. Total volume depends on your keywords, language, domains and `countryCode`, and no row count is guaranteed.

#### Does it search lafourchette.com as well?

Yes. Every query covers `thefork.com`, `thefork.co.uk` and `lafourchette.com` in one `site:` alternation, so a French run reads the French brand too.

#### Should I use English or local-language keywords?

Local. Use `brasserie` and `bistrot` for France, `restaurante` and `tapas` for Spain, `trattoria` and `osteria` for Italy. Translate the modifiers as well — `contacto`, `prenotazioni`, `réservation`.

#### What should I set `countryCode` to?

One market per run: `FR`, `ES`, `IT`, `PT`, `GB`, `BE` or `NL`. Google personalises heavily by country, and mixing markets in one job dilutes every query.

#### Which email domains work best?

Keep `@gmail.com`, then add market-specific providers: `@orange.fr` and `@wanadoo.fr` for France, `@libero.it` for Italy, `@sapo.pt` for Portugal, `@hotmail.es` for Spain. These are suggestions, not guarantees.

#### How do I use `location` for city-level prospecting?

Put a city or district in it in the local language — `Lyon`, `Barcelona`, `Milano`, `Le Marais` — and run one job per territory.

#### Does the TheFork Email Scraper log into TheFork?

No. It never logs in, never calls a TheFork API and never opens thefork.com in a browser. It reads Google results through the Apify GOOGLE\_SERP proxy.

#### Whose emails am I actually finding?

Business inboxes that restaurants publish for reservations, group bookings and catering enquiries. Treat them as business contacts, and note that GDPR still applies to addresses naming a person.

#### Does the TheFork Email Scraper verify deliverability?

No. It extracts and normalises what Google indexed. Check rows flagged `possiblyTruncated` before using them.

#### Can I resume an interrupted run?

Yes. State lives in the key-value store keyed by a hash of your input, with saves on Apify's `PERSIST_STATE`, `MIGRATING` and `ABORTING` events.

#### What happens when Google blocks a request?

Block, CAPTCHA and consent pages are detected rather than treated as empty. Pages get up to three attempts with exponential backoff, and failed queries are re-queued once at the end of the run.

#### Is scraping TheFork contact emails legal?

The TheFork Email Scraper only reads publicly indexed Google results. Whether you may then contact those addresses is a separate GDPR question, and European regulators are strict about it. See the responsible use section and take your own legal advice.

### Leave a review

If the TheFork 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.

### Support

Questions, a bug, or you need a custom build of the TheFork Email Scraper? Contact **<neurodata.apify@gmail.com>**.

# Actor input Schema

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

Search terms describing the TheFork 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 TheFork.

## `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",
    "bistro"
  ],
  "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 TheFork 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",
        "bistro"
    ],
    "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/thefork-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",
        "bistro",
    ],
    "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/thefork-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",
    "bistro"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "catering",
    "reservations",
    "owner"
  ]
}' |
apify call leads-scraper/thefork-email-scraper --silent --output-dataset

```

## MCP server setup

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