# Yell.com Scraper: UK Business Phones, Emails & Websites (`themineworks/yell-business-email-scraper`) Actor

Scrape Yell.com by trade and town: business name, phones, website, address, rating and services. Turn on emails to find each business's address from its own website (Yell does not publish emails), charged only when found. Pay per business.

- **URL**: https://apify.com/themineworks/yell-business-email-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 business listings

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/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

## Yell.com Scraper: UK Business Phones, Emails & Websites

[![20 London restaurants in 61 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/yell-business-email-scraper-hero-fix0930.png)](https://console.apify.com/actors/NIHfrYMrPvbi0IDXS/input)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder), with over 140,000 runs across 170+ public actors.

Type a trade and a UK town, for example `plumbers` in `Leeds`, and get one row per business that Yell.com lists: name, phone in international format, address and postcode, website, Yell rating, the services on its Yell card and the link to its Yell page. Turn on **Find emails** and the actor also reads each business's own website for an email address, because Yell does not publish emails. You pay for an email only when one is found and delivered.

### Why choose this actor?

- **Emails from the business's own website, charged only when found.** In our proof run (restaurants in London, 28 Sep 2026) **9 of 20 businesses came back with an email**, all read from their own websites. The other 11 were delivered and charged as businesses only. A chain's shared inbox found on several rows is charged once per run.
- **Yell's Cloudflare wall is handled for you.** Every Apify datacenter connection we tried got Yell's Cloudflare challenge, so the actor reads search pages through Apify's unblocking proxy, about 11 seconds a page of 25 businesses, and that cost is in the price. In the proof run the one search page passed on the first attempt. Pages Yell refuses are listed in the run summary and never charged.
- **One clean row per business, no account.** An advert that repeats an organic card is merged into one row, the same business listed under a second Yell id (same name, a shared phone or website) is delivered once, a business found by two of your searches is delivered and charged once, and phones come in international format such as `+44 20 3808 8034`. No Yell account, cookies or API key.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/NIHfrYMrPvbi0IDXS/input)

**Part of The Mine Works Leads and business directories family:** [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder), [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup), [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads), [JustDial Scraper](https://apify.com/themineworks/justdial-business), [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search), [IndiaMART Scraper](https://apify.com/themineworks/indiamart-suppliers).

### Try it in one minute

Paste this input into the JSON tab and press Start. It returns the first 10 plumbers Yell lists for Leeds, from one results page, without emails:

```json
{
  "queries": ["plumbers"],
  "locations": ["Leeds"],
  "maxResultsPerSearch": 10
}
```

You can say what you want in two ways, and mix them in one run:

- **Queries and locations** (`queries`, `locations`): trades as you would type them on Yell, such as `plumbers`, `solicitors` or `dentists`, and towns, cities, regions or postcode districts such as `London`, `Leeds`, `West Yorkshire` or `N1`. Yell works out the county itself (Leeds is read as Leeds, West Yorkshire). A full postcode such as `SW1A 1AA` is searched as its district (`SW1A`), because Yell has no page for a full postcode; when Yell has no page for a place, the run summary says so and nothing is charged. Every query is searched in every location. Leave `locations` empty to search the whole UK.
- **Search pages** (`startUrls`): a Yell results page copied from your browser, either the short form `https://www.yell.com/s/plumbers-london.html` or a `https://www.yell.com/ucs/UcsSearchAction.do?keywords=...&location=...` link. The `UcsSearchAction.do` link itself is not opened, because Yell's robots.txt disallows it: its trade and town are read from it and Yell's own `/s/` page for them is read instead (other settings in the link, such as a sort order, are not kept). Business pages (`/biz/...`) are not accepted.

API and agent callers can also use other common field names: `query`, `keyword`, `keywords` or `searchTerms` for queries, `location`, `where` or `city` for locations, `urls` for search pages, and `maxResults` or `maxItems` for the limit.

Apify's free plan includes $5 of credit every month, which covers about 2,400 businesses at this actor's Free plan price with emails off ($0.002 a business plus $0.005 a run, in runs of 250), or about 300 businesses with emails on at the rate of our proof run, about 140 of them with an email.

#### Copy to your AI assistant

```text
themineworks/yell-business-email-scraper on Apify. Searches Yell.com, the UK business directory, by trade and town and returns one row per business with name, phones, address, postcode, website, Yell rating and services, plus an optional email read from the business's own website. Call ApifyClient("TOKEN").actor("themineworks/yell-business-email-scraper").call(run_input={"queries": ["plumbers"], "locations": ["Leeds"], "maxResultsPerSearch": 50, "includeEmails": true}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (array of trades such as "plumbers") unless startUrls is given. Optional: locations (array of towns, regions or postcode districts; empty = the whole UK), startUrls (Yell search pages), maxResultsPerSearch (integer 1 to 1000, default 30; Yell serves at most 250 per search), includeEmails (boolean, default false), verifyEmailDomain (boolean, default true). Rows with _type "info" are run notes, never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~yell-business-email-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
```

### Key features

- **Up to 250 businesses per search, up to 300 searches per run.** Yell serves 10 pages of 25 businesses for one search, and the actor turns them for you. Each run takes up to 50 queries times 50 locations, capped at 300 searches, and the run summary repeats the total Yell reports for each search (7,032 restaurants in London on 28 Sep 2026).
- **26 fields per business**: listing id and Yell link, name, categories, every phone, the address split into street, postcode and town, website, rating and review count, description, the services on the card, the area served, whether it is a paid advert, the email and where it was found, and the search that found the row.
- **Service-area trades handled.** Many plumbers, electricians and cleaners have no premises, and Yell shows "We serve London" instead of an address. Those rows carry `service_area` rather than a street. All 13 London plumber cards in the test pages we saved on 28 Sep 2026 were of this kind.
- **Emails read the way a person would look for them.** The homepage first, then the contact and legal pages it links to, then common paths such as `/contact-us` and `/about-us`: at most 5 pages and 20 seconds per website, 6 websites at a time. Pages a website's own robots.txt disallows are skipped. Addresses are kept only on the business's own domain or on an ordinary provider such as gmail.com, btinternet.com or sky.com; the web agency's address, placeholders and no-reply addresses are dropped. Up to 5 addresses per row, best first.
- **A mail server check on every email.** With `verifyEmailDomain` on (the default), an address is kept only when its domain has mail (MX) records, or at least an address record that mail can fall back to, so dead and misspelt domains are neither delivered nor charged.
- **Plain HTTP at 512 MB**, no browser. Every run writes a summary to the `OUTPUT` record in its key-value store: for each search the status (`ok`, `no_results` or `blocked`), the total Yell reports, pages read and refused, connection attempts, and how many emails were found.

### How to use it

#### Basic: one trade in one town

```json
{
  "queries": ["plumbers"],
  "locations": ["Manchester"],
  "maxResultsPerSearch": 100
}
```

100 businesses take 4 Yell pages, about 11 seconds each. Without emails, that is the whole run.

#### Several trades in several towns

Every query runs in every location, so this is nine searches:

```json
{
  "queries": ["electricians", "plumbers", "roofers"],
  "locations": ["Leeds", "Bradford", "Wakefield"],
  "maxResultsPerSearch": 250
}
```

A business found by two of the searches, for example a roofer who also lists under plumbers, is delivered once and charged once. Two searches run at a time.

#### Cold email list of independent restaurants

```json
{
  "queries": ["restaurants", "cafes"],
  "locations": ["Brighton", "Hove"],
  "maxResultsPerSearch": 250,
  "includeEmails": true
}
```

Keep the rows that have `email`; `email_source_url` shows the page the address was read from, so you can check it before you write. Independent businesses publish an address far more often than chains: most of the rows without an email in our London proof run were chain restaurants (Subway twice, McDonald's, Five Guys, Tortilla).

#### Count businesses town by town, for pennies

The run summary records the total Yell reports for every search in `site_total_results`. Ask for one business per search and read the totals from the `OUTPUT` record:

```json
{
  "queries": ["dentists"],
  "locations": ["Leeds", "Sheffield", "Bristol", "Nottingham", "Leicester", "Cardiff"],
  "maxResultsPerSearch": 1
}
```

Six searches, six businesses delivered, so about $0.017 on the Free plan including the run fee, and you have a market count for each town.

#### Monthly refresh on a schedule

Save any of the inputs above as a task, then in Apify Console open Schedules, add a schedule (for example the first of every month) and pick the task. Each scheduled run is billed like a manual one, and the schedule itself is free. The actor has no "only new businesses" mode, so compare `listing_id` with your last export to find the newcomers.

#### Read a search you already set up on Yell

Paste the results page from your browser:

```json
{
  "startUrls": [
    { "url": "https://www.yell.com/s/plumbers-london.html" }
  ],
  "maxResultsPerSearch": 50
}
```

Each pasted page is read from its first page on, with the same limits and charges as a typed search. For the short `/s/` form, `search_query` holds the words from the address (`plumbers london`) and `search_location` is left out. A pasted `UcsSearchAction.do` link is read as its `/s/` page, with `search_query` and `search_location` taken from the link.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `queries` | array of strings | none (prefilled with `plumbers`) | Trades or business types to search, one per line, as you would type them on Yell. Up to 50. Needed unless you give `startUrls`. |
| `locations` | array of strings | empty (prefilled with `London`) | Towns, cities, regions or postcode districts, one per line. A full postcode is searched as its district. Every query is searched in every location. Empty searches the whole UK. Up to 50. |
| `startUrls` | array | empty | Yell search result pages (`/s/...html`, or a `UcsSearchAction.do` link, which is read as its `/s/` page), read instead of or as well as the queries. |
| `maxResultsPerSearch` | integer | `30` | Most businesses per query and location, 1 to 1,000. Yell shows 25 per page and serves at most 10 pages (250 businesses) for one search. |
| `includeEmails` | boolean | `false` | Look for each business's email on its own website. Charged only for rows that come back with one. |
| `verifyEmailDomain` | boolean | `true` | Keep an email only when its domain can receive mail. Only used with `includeEmails` on. |

There is no proxy setting: Yell needs Apify's unblocking proxy for every search page, so the actor always uses it, at no extra cost. Give at least one query or one search page. A run with neither writes a note row and stops; the $0.005 start fee still applies.

### What data do you get?

One row per business. Fields with no value are left out of the row rather than sent as empty.

**The business**

- `listing_id` (Yell's id, such as `7214947`), `listing_url` (the business's Yell page), `name`, `categories` (Yell's own headings, such as `Thai Restaurants`), `description` (the one line strapline on the card), `services` (the short list on the card), `rating` and `review_count` (Yell's own stars and the number of ratings, when there are any), `sponsored` (`true` only when the business appears in these results as a paid advert alone)

**Contact**

- `phone` (the first number) and `phones` (all of them), in international format when the number is valid for the UK, otherwise as Yell shows it; `website`, with `utm_`, `fbclid`, `gclid` and `mc_` tracking parameters removed (other parameters, such as a chain's own store locator code, stay)

**Address**

- `address` (one line), `street`, `postal_code`, `city` (as Yell writes it, sometimes in capitals such as `LONDON`), `country` (always `GB`), and `service_area` for a business that serves an area instead of having an address

**Email** (with `includeEmails` on)

- `email` (the best address), `emails` (up to 5, best first), `email_source` (always `website` on Yell, which publishes no emails of its own) and `email_source_url` (the page it was read from)

**Search context**

- `source_site` (`yell.com`), `search_query`, `search_location`, `scraped_at`

Not returned: coordinates, opening hours and region. They sit on each business's own Yell page, which Yell serves only behind its challenge, so reading it would cost one more unblocking request per business, about $0.002, more than a listing pays on the cheapest plan. The actor does not open those pages.

Fill rates in the proof run (20 London restaurants, emails on): website 19, rating 11, description 10, email 9, services 8, sponsored 4.

#### Stable fields for automations

These fields were present in every one of the 20 rows of the proof run and in all 30 cards of the plumber, dentist and restaurant pages we saved for our tests, and their names will not change:

| Field | What it holds |
|---|---|
| `listing_id` | Yell's id for the business, the same in every run |
| `listing_url` | Link to the business's page on yell.com |
| `name` | Business name as listed |
| `categories` | Yell's headings for the business, as a list |
| `phone` | The first phone number |
| `phones` | Every phone number on the card |
| `country` | Always `GB` |
| `source_site` | Always `yell.com` |
| `search_query` | The query, or the words of the pasted page, that found the row |
| `scraped_at` | When the row was read (ISO 8601) |

`search_location` is present whenever the search had a location. `address`, `street`, `postal_code` and `city` were in all 20 restaurant rows but missing from every service-area plumber, so test for them, or for `service_area`, before you rely on them.

#### Output examples

Real rows from the proof run on 28 Sep 2026 (`restaurants` in `London`, emails on), trimmed where marked.

A business with an email on its own domain, read from its homepage (complete row):

```json
{
  "listing_id": "480885",
  "listing_url": "https://www.yell.com/biz/da-franco-ristorante-italiano-london-480885/",
  "name": "Da Franco Ristorante Italiano",
  "categories": ["Italian Restaurants"],
  "phone": "+44 20 8368 6224",
  "phones": ["+44 20 8368 6224"],
  "address": "30 Queens Parade, Friern Barnet Rd, London, N11 3DA",
  "street": "30 Queens Parade, Friern Barnet Rd",
  "postal_code": "N11 3DA",
  "city": "London",
  "country": "GB",
  "website": "https://www.dafrancorestaurant.co.uk",
  "email": "enquiries@dafrancorestaurant.co.uk",
  "emails": ["enquiries@dafrancorestaurant.co.uk"],
  "email_source": "website",
  "email_source_url": "https://www.dafrancorestaurant.co.uk/",
  "rating": 4.8,
  "review_count": 11,
  "description": "Quality Authentic Italian Cuisine",
  "services": ["Family Run", "Established 38 Years", "Special Occasions", "A La Carte Menu", "Wholesome Italian Food", "Set Menus"],
  "sponsored": true,
  "source_site": "yell.com",
  "search_query": "restaurants",
  "search_location": "London",
  "scraped_at": "2026-09-28T12:47:20.002Z"
}
```

A small business whose real inbox is a Gmail address published on its website (trimmed):

```json
{
  "listing_id": "6829371",
  "name": "Maureen's Pie & Mash Shop",
  "categories": ["English Restaurants"],
  "phone": "+44 7956 381216",
  "address": "6 Market Way, London, E14 6AH",
  "website": "https://maureenspieandmash.co.uk",
  "email": "maureenspienmash@gmail.com",
  "email_source": "website",
  "email_source_url": "https://maureenspieandmash.co.uk/",
  "rating": 5,
  "review_count": 3
}
```

A chain branch with no email on the pages read, charged as a business only. The chain's own code stays in the website address (trimmed):

```json
{
  "listing_id": "11046894",
  "name": "Subway",
  "categories": ["Fast Food Restaurants"],
  "phone": "+44 20 7240 0474",
  "address": "3 Adelaide Street, LONDON, WC2N 4HZ",
  "city": "LONDON",
  "website": "https://restaurants.subway.com/united-kingdom/en/london/3-adelaide-street?y_source=1_MTQ5MjU1NzYtNzAyLWxvY2F0aW9uLndlYnNpdGU%3D",
  "description": "See our Menu!",
  "source_site": "yell.com"
}
```

A business with no website on Yell, so no email lookup was possible (trimmed):

```json
{
  "listing_id": "8139843",
  "listing_url": "https://www.yell.com/biz/chicken-village-london-8139843/",
  "name": "Chicken Village",
  "categories": ["Fast Food Restaurants"],
  "phone": "+44 20 8529 9966",
  "address": "289 Manchester Rd Chorlton, London, E4 8NU",
  "rating": 5,
  "review_count": 1
}
```

The note row at the end of the run (never charged; filter on `_type` to drop it), trimmed:

```json
{
  "_type": "info",
  "delivered": 20,
  "message": "20 businesses delivered. This row is informational: it is never billed.",
  "scraped_at": "2026-09-28T12:47:23.525Z"
}
```

### Pricing

You pay per business delivered to your dataset, plus a flat start fee per run. An email is a second, separate charge, made only for rows that come back with one. The unblocking proxy Yell needs is included.

| Event | Free plan | Starter (Bronze) | Scale (Silver) | Business (Gold) and above |
|---|---|---|---|---|
| Business delivered (`listing-scraped`), per business | $0.002 | $0.0017 | $0.0014 | $0.001 |
| Business delivered, per 1,000 | $2.00 | $1.70 | $1.40 | $1.00 |
| Email found (`email-found`), per email | $0.03 | $0.025 | $0.02 | $0.015 |
| Email found, per 1,000 | $30 | $25 | $20 | $15 |
| Run start (`run-start`), once per run | $0.005 | $0.005 | $0.005 | $0.005 |

The start fee is our own `run-start` event: a flat $0.005 once per run, whatever memory you choose. It is not Apify's per GB start fee, and it is charged on every run, including a run that finds nothing. These prices took effect on 28 Sep 2026, and no change is scheduled as of 1 Oct 2026. The Pricing tab always shows the rate for your own plan; if this table and the Pricing tab ever disagree, the Pricing tab is right.

**What a real job costs.** 1,000 businesses with emails off cost $2.00 plus $0.005 on the Free plan, and $1.00 plus $0.005 on Business. With emails on, at the rate of our proof run (9 emails in 20 rows), 1,000 businesses bring about 450 emails: about $15.51 in all on Free and $7.76 on Business. Turn emails on only for the searches where you need them.

Never charged:

- search pages Yell refused, and the retries through the unblocking proxy;
- a business already delivered by another search in the same run;
- websites that were opened but gave no email (the row is charged as a business only);
- an email address already charged earlier in the same run, such as the shared inbox of a chain's branches (it is still delivered on every row);
- the note row and the `OUTPUT` run summary.

To cap what a run can cost, set a maximum total charge in the run options. The actor stops before a business the budget cannot pay for, and when the budget covers a business but not its email, the row is delivered without the email and the email is not charged.

### FAQ

#### What is Yell.com?

The UK's best known business directory, formerly the Yellow Pages. It lists tradespeople, shops, restaurants, clinics, solicitors and other businesses across the United Kingdom, with phone, address, website, Yell ratings and the services each business advertises.

#### How many businesses can I get?

Up to 250 per search, because Yell serves at most 10 pages of 25 for one search (page 11 and beyond answer "not found"), and up to 300 searches per run. The run summary shows how many businesses Yell reports for each search (5,198 plumbers in London on 28 Sep 2026), so you can see what a search leaves out. To go deeper, search town by town or with narrower trades. A run stops cleanly before its timeout (one hour by default) and keeps everything delivered so far, so raise the timeout in the run options for very large runs.

#### How fresh is the data?

Every run reads Yell live; nothing comes from a cache. `scraped_at` on each row says when it was read.

#### Do I need a Yell account, cookies or an API key?

No. The actor reads the public search pages any visitor sees, without signing in. There is nothing of yours to connect.

#### Does it respect Yell's robots.txt?

Yes. The actor reads Yell's robots.txt fresh at the start of every run and checks every page against it before asking for it, and again if Yell redirects it. It reads Yell's own listing pages (`/s/plumbers-london.html`, page 2 as `?pageNum=2`); Yell's typed search address, `/ucs/UcsSearchAction.do`, which robots.txt disallows, is never requested. Business websites are checked against their own robots.txt the same way.

#### Do I need to set up a proxy?

No. Yell puts a Cloudflare challenge in front of its pages, so the actor reads every search page through Apify's unblocking proxy, which passes it, at about 11 seconds a page. That cost is included. Business websites are fetched directly for emails, never through the unblocking proxy.

#### Will every business have an email?

No. Yell publishes no emails, so an email can only come from the business's own website, and many sites show only a contact form. In our proof run 9 of 20 London restaurants had one; of the other 11, 1 had no website, 2 websites did not load, 2 refused the request and 6 showed no usable address. Trades listed mostly by chains or lead generation adverts, such as many London plumbers, give fewer. The actor never guesses an address from a name, and you pay nothing extra for a row without an email.

#### Why do some rows have no street address?

Businesses without premises, common among plumbers, electricians and cleaners, show "We serve London" on Yell instead of an address. Those rows carry `service_area` with the area as Yell gives it, and no `address`, `street`, `postal_code` or `city`.

#### Can I search the whole UK at once?

Yes: leave `locations` empty. Yell then searches the whole country (9,636 dentists in our 28 Sep 2026 test), but a search still stops at 250 businesses, so town by town searches give far better coverage.

#### Why are there no coordinates or opening hours?

They are only on each business's own Yell page, which sits behind the same challenge and would cost one more unblocking request per business. The actor reads the search pages only, which carry everything listed under "What data do you get?".

#### Can I get only the new businesses each month?

There is no "only new" mode in this actor. Schedule the same input and compare `listing_id` with your last export.

#### Which formats can I export?

JSON, CSV, Excel, XML, HTML table and RSS from the dataset page in Apify Console, or through the Apify API.

#### Can I use it from Claude, ChatGPT or another AI agent?

- Connector URL: `https://mcp.apify.com/?tools=themineworks/yell-business-email-scraper`.
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http yell-business-email-scraper "https://mcp.apify.com/?tools=themineworks/yell-business-email-scraper"`.

#### Is it legal to scrape Yell.com?

The actor collects only publicly visible business listings and never signs in. Business contact details are still personal data when they identify a person, for example a sole trader's name and mobile number, so how you store and use them is your responsibility: follow Yell's terms and the UK GDPR, and where you send marketing messages also PECR (and CAN-SPAM or the CCPA for contacts in the US). This is general information, not legal advice. The actor is an independent tool, not affiliated with or endorsed by Yell; Yell.com is a trademark of its owner.

### Integrations

- **Google Sheets**: send each run's dataset to a sheet with Apify's Google Sheets integration.
- **Make, Zapier and n8n**: start runs and receive the businesses in your workflows.
- **Webhooks**: get a call when a run finishes, for example to load new rows into your CRM.
- **API**: start runs and read datasets from any language with the Apify API or the Python and JavaScript clients.
- **MCP clients**: Claude, ChatGPT and other agents through Apify's MCP server.

### More from The Mine Works

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads)
- [JustDial Scraper](https://apify.com/themineworks/justdial-business)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search)
- [IndiaMART Scraper](https://apify.com/themineworks/indiamart-suppliers)
- [Yandex Maps Scraper](https://apify.com/themineworks/yandex-maps-search)
- [Contact Details Scraper](https://apify.com/themineworks/website-contact-finder)
- [US Business Registry](https://apify.com/themineworks/us-state-business-registry)
- [Google Maps Scraper](https://apify.com/themineworks/google-maps-search-scraper)
- [Yellow Pages Scraper](https://apify.com/themineworks/yellowpages-us)
- [Lead Generation MCP](https://apify.com/themineworks/lead-generation-mcp)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency)
- [Google News Scraper](https://apify.com/themineworks/google-news)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp)

**Science, health and government data**

- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records)
- [data.gov.in Scraper](https://apify.com/themineworks/india-data-gov-scraper)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data)
- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup)
- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper)

**More tools**

- [Tennis Match & Player Data Scraper](https://apify.com/themineworks/tennis-match-data)
- [Google Hotels Prices Scraper](https://apify.com/themineworks/google-hotels-prices-scraper)

### Support

Found a problem or need a field? Open an issue on the actor's Issues tab and we will answer there. For a new source or a custom build, email dmineworks@gmail.com.

*Yell.com Scraper turns any Yell search into rows of UK businesses with phone, address, website and rating and, when you want it, an email read from the business's own website and checked for a working mail server.*

# Actor input Schema

## `queries` (type: `array`):

Business types or trades to search, one per line, for example plumbers. Each query is searched in every location below. Needed unless you paste search pages into Start URLs. Up to 50 per run.

## `locations` (type: `array`):

Town, city, region or postcode, one per line, typed the way you would on www.yell.com, for example London. Leave empty to search the whole country. Up to 50 per run.

## `startUrls` (type: `array`):

Optional. Paste search result pages from www.yell.com instead of, or as well as, Queries and Locations. Each page is read from its first page on.

## `maxResultsPerSearch` (type: `integer`):

Most businesses to return for each query and location, 1 to 1,000. The directory shows 25 per page, so 100 businesses take about 4 pages. Yell.com serves at most 10 pages (250 businesses) for one search.

## `includeEmails` (type: `boolean`):

Off by default. Turn on to look for each business's email address: first the address the directory publishes, then the business's own website (homepage, then its contact and legal pages). You are charged the email price only for rows that come back with an email; a business where none is found costs nothing extra.

## `verifyEmailDomain` (type: `boolean`):

Only keep an email when its domain can receive mail (it has a mail server). Removes addresses of dead or misspelled domains, so you are not charged for them. Only used when Find emails is on.

## Actor input object example

```json
{
  "queries": [
    "plumbers"
  ],
  "locations": [
    "London"
  ],
  "maxResultsPerSearch": 30,
  "includeEmails": false,
  "verifyEmailDomain": true
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "queries": [
        "plumbers"
    ],
    "locations": [
        "London"
    ],
    "maxResultsPerSearch": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/yell-business-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 = {
    "queries": ["plumbers"],
    "locations": ["London"],
    "maxResultsPerSearch": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/yell-business-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 '{
  "queries": [
    "plumbers"
  ],
  "locations": [
    "London"
  ],
  "maxResultsPerSearch": 30
}' |
apify call themineworks/yell-business-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/yell-business-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/NIHfrYMrPvbi0IDXS/builds/1LLKnR9ZORluk8otE/openapi.json
