# Yellow Pages Canada Scraper: Business Phones & Emails (`themineworks/yellowpages-ca-business-email-scraper`) Actor

Scrape Yellow Pages Canada (yellowpages.ca, or pagesjaunes.ca in French) by business type and city: name, phone, address, coordinates, website, rating and categories. Turn on emails to find each business's own website address, charged only when found. Pay per business.

- **URL**: https://apify.com/themineworks/yellowpages-ca-business-email-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Lead generation, Business, 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

## Yellow Pages Canada Scraper: Business Phones & Emails

[![20 Toronto plumbers, 10 emails, 13 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/yellowpages-ca-business-email-scraper-hero.png)](https://console.apify.com/actors/0gfEj1Rqh5iN1KZVN/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 business type and a Canadian city, for example `plumber` in `Toronto ON`, and get one row per business that Yellow Pages Canada (yellowpages.ca) lists: name, every phone in international format, address with province and postal code, coordinates, website, rating, categories and description. Search in French on Pages Jaunes Canada (pagesjaunes.ca) with the same input. Turn on **Find emails** and the actor reads each business's own website for an email address, because Yellow Pages Canada publishes none. 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 (plumber in Toronto ON, 28 Sep 2026) **10 of 20 businesses came back with an email**, all read from the websites the listings link to. The other 10 were delivered and charged as businesses only: 5 had no website on Yellow Pages, 2 sites showed no usable address, 2 refused the request and 1 could not be reached.
- **No businesses from the wrong town.** Yellow Pages Canada matches a place against every place name in the country, so `Toronto BC` quietly becomes a health centre in Squamish. The actor reads which place the site really searched and, when it is not what you typed, returns nothing for that search and names the place in the run summary instead of billing you for the wrong city.
- **English or French, one input.** Set `language` to `fr` to search Pages Jaunes Canada, the same directory and businesses in French (`plombier` in `Montreal QC` found 657 on 1 Oct 2026). No 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/0gfEj1Rqh5iN1KZVN/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 Yellow Pages Canada lists for Toronto, without emails, in a few seconds:

```json
{
  "queries": ["plumber"],
  "locations": ["Toronto ON"],
  "maxResultsPerSearch": 10
}
```

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

- **Queries and locations** (`queries`, `locations`): business types as you would type them on the site, such as `plumber`, `dentist`, `auto repair` or a brand such as `Domino's Pizza`, and a city with its province (`Toronto ON`, `Calgary AB`), a city alone (`Toronto`), a province (`Ontario`) or a postal code (`M5V 2T6`, or its first three characters). Every query is searched in every location. A location is required.
- **Search pages** (`startUrls`): a results page copied from your browser, such as `https://www.yellowpages.ca/search/si/1/plumber/Toronto+ON/` or its twin on pagesjaunes.ca. Business pages (`/bus/...`) and the query string search form (`/search/?stype=si&what=...`) 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, `maxResults` or `maxItems` for the limit, `sort` for `sortBy`, `open` for `openNow` and `siteLanguage` for `language`.

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), or about 290 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/yellowpages-ca-business-email-scraper on Apify. Searches Yellow Pages Canada (yellowpages.ca, or pagesjaunes.ca in French) by business type and Canadian city, province or postal code, and returns one row per business with name, phones, address, province, postal code, coordinates, website, rating, categories and description, plus an optional email read from the business's own website and, with business pages on, opening hours and services. Call ApifyClient("TOKEN").actor("themineworks/yellowpages-ca-business-email-scraper").call(run_input={"queries": ["plumber"], "locations": ["Toronto ON"], "maxResultsPerSearch": 50, "includeEmails": true}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (such as "plumber") and locations (such as "Toronto ON"), or startUrls (yellowpages.ca or pagesjaunes.ca search pages). Optional: maxResultsPerSearch (integer 1 to 1000, default 30; the site serves at most 2,100 per search), includeEmails (default false), includeDetails (default false), sortBy (relevance, closest, rating, mostReviewed, alphabetical or recentlyReviewed; default relevance), openNow (default false), language (en or fr; default en), verifyEmailDomain (default true), allowUnblockerFallback (default true). Rows with _type "info" are run notes, never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~yellowpages-ca-business-email-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
```

### Key features

- **Up to 1,000 businesses per search, up to 300 searches per run.** Yellow Pages Canada shows 35 businesses a page and stops at page 60 (2,100 businesses) whatever count it claims; the actor reads up to 1,000 per search. Each run takes up to 50 queries times 50 locations, capped at 300 searches. The run summary repeats the count the site reports (1,774 plumbers for Toronto and 7,533 for Ontario on 1 Oct 2026).
- **28 fields per business**: listing id and Yellow Pages link, name, up to two categories, every phone including toll free numbers, the address split into street, city, province and postal code, coordinates, website, rating and review count, description, opening hours and services from the business page, the email and where it was found, and the search that found the row.
- **The place you typed, checked.** Every search page names the place the site actually searched. When it does not match yours (a wrong province, a made up town), the search returns nothing and the run summary says which place the site picked: `Xyzville ON` became Perugia, Italy, in our test.
- **Emails read the way a person would look for them.** The website on the listing, homepage first, then the contact and about pages it links to, then common paths such as `/contact-us`, `/about-us`, `/contactez-nous` and `/nous-joindre`, at most 5 pages and 20 seconds per site, 6 sites at a time. Addresses are kept only on the business's own domain or an ordinary provider such as gmail.com, outlook.com, bell.net or videotron.ca, and each one passes a mail server check. Up to 5 addresses per row, best first.
- **The site's own sort and filter.** `sortBy` takes the site's six orders (best match, closest, highest rated, most reviewed, alphabetical, recently reviewed), and `openNow` keeps only businesses the site marks as open at the moment of the run.
- **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 count the site reports, pages read and refused, connection attempts, and how many emails were found.

### How to use it

#### Basic: one business type in one city

```json
{
  "queries": ["dentist"],
  "locations": ["Vancouver BC"],
  "maxResultsPerSearch": 105
}
```

Yellow Pages Canada reported 1,218 dentists for Vancouver on 1 Oct 2026; 105 businesses take 3 pages. A city search covers its surrounding area: our Toronto proof run returned businesses in North York, Scarborough, Etobicoke, Markham, Mississauga and as far as Lindsay. Filter on `city` if you need the city proper.

#### Several business types in several cities

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

```json
{
  "queries": ["electrician", "plumber", "roofing contractor"],
  "locations": ["Calgary AB", "Edmonton AB"],
  "maxResultsPerSearch": 300
}
```

A business found by two of the searches under the same Yellow Pages id is delivered once and charged once. Two searches run at a time.

#### French: Quebec businesses on Pages Jaunes

```json
{
  "queries": ["plombier", "électricien"],
  "locations": ["Montreal QC", "Quebec QC"],
  "language": "fr",
  "maxResultsPerSearch": 200
}
```

Pages Jaunes is the same directory as Yellow Pages Canada, searched with French words; `source_site` reads `pagesjaunes.ca`. It is not pagesjaunes.fr, the unrelated French site.

#### Cold email list with opening hours and services

```json
{
  "queries": ["dentist"],
  "locations": ["Vancouver BC"],
  "maxResultsPerSearch": 20,
  "includeEmails": true,
  "includeDetails": true
}
```

This is the input of our 1 Oct 2026 run: 20 businesses and 20 business pages in 33 seconds, 8 emails from the dentists' websites, services for 16, opening hours for 13 and a full description for 14. Business pages cost nothing extra but do not help find emails, because the website is already on the results page.

#### Best rated first, or open right now

```json
{
  "queries": ["auto repair"],
  "locations": ["Calgary AB"],
  "maxResultsPerSearch": 35,
  "sortBy": "rating"
}
```

`sortBy` changes which businesses land on the first pages, so with a small limit it changes which ones you get. Add `"openNow": true` to keep only businesses the site marks as open when the run starts.

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

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `queries` | array of strings | none (prefilled with `plumber`) | Business types to search, one per line. Up to 50. Needed unless you give `startUrls`. |
| `locations` | array of strings | none (prefilled with `Toronto ON`) | Cities with their province, cities, provinces or postal codes, one per line. Every query is searched in every location. Required with `queries`: with no location the site quietly searched Toronto in every test, so the actor asks for one. Up to 50. |
| `startUrls` | array | empty | yellowpages.ca or pagesjaunes.ca search result pages, read instead of or as well as the queries. |
| `maxResultsPerSearch` | integer | `30` | Most businesses per query and location, 1 to 1,000. The site shows 35 per page and serves at most 60 pages (2,100 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. |
| `includeDetails` | boolean | `false` | Also open each business's own page, for opening hours, the services it lists and the full description. No extra charge, slower. |
| `sortBy` | string | `relevance` | `relevance` (the site's best match), `closest`, `rating`, `mostReviewed`, `alphabetical` or `recentlyReviewed`. |
| `openNow` | boolean | `false` | Keep only businesses the site marks as open at the time of the run. |
| `language` | string | `en` | `en` searches yellowpages.ca, `fr` searches pagesjaunes.ca (same directory, French words). |
| `verifyEmailDomain` | boolean | `true` | Keep an email only when its domain can receive mail. Only used with `includeEmails` on. |
| `allowUnblockerFallback` | boolean | `true` | When a search page is refused several times over the fast connection, retry it through Apify's unblocking proxy. Included in the price. Turn off to report such pages as refused instead. |

Give at least one query with a location, 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` (Yellow Pages' number, such as `101902936`), `listing_url`, `name`, `categories` (one or two, such as `Plumbers & Plumbing Contractors`), `description` (the card's text, or the full text from the business page with `includeDetails` on), `rating` and `review_count` (when there are ratings), `opening_hours` and `services` (from the business page)

**Contact**

- `phone` (the first number) and `phones` (all of them, toll free numbers included), in international format such as `+1 647 362 2109`; `website`, with `utm_`, `fbclid`, `gclid` and `mc_` tracking parameters removed

**Address and map**

- `address` (one line), `street`, `city`, `region` (the province code, such as `ON`), `postal_code` (such as `M3J 1Y8`), `country` (always `CA`), `latitude`, `longitude`

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

- `email` (the best address), `emails` (up to 5, best first), `email_source` (always `website` here, since the directory publishes no emails) and `email_source_url` (the page it was read from)

**Search context**

- `source_site` (`yellowpages.ca` or `pagesjaunes.ca`), `search_query`, `search_location`, `scraped_at`

A few things to know about the fields:

- **Coordinates come from the results page** for most rows (16 of 20 in the proof run); the business page fills in the rest (20 of 20 with `includeDetails` on in our Vancouver run).
- **Some listings publish no address at all**: 2 of the 20 proof rows, whose Yellow Pages link names only the province.
- **One business can appear under two Yellow Pages ids** (our Vancouver run returned both `Lo George C Y Dr Inc` and `Dr George C Y Lo Inc`). Results are de-duplicated by id, so filter on phone or address if that matters to you.
- **Pages Jaunes business pages in six provinces are skipped.** For businesses in British Columbia, Nova Scotia, New Brunswick, Prince Edward Island, Newfoundland and Labrador and the Northwest Territories, the French site's business page sits under a path its robots.txt disallows, so with `language` `fr` those rows come from the results page alone.

Fill rates in the proof run (20 businesses, emails on, no business pages): phone 20, address 18, coordinates 16, website 15, description 15, email 10, rating 8.

#### Stable fields for automations

These fields were present in every one of 53 business rows across the proof run, our 1 Oct 2026 Vancouver run and the result cards saved for our tests (including French and capped searches), and their names will not change:

| Field | What it holds |
|---|---|
| `listing_id` | Yellow Pages' id for the business, the same on both language sites |
| `listing_url` | Link to the business's page on yellowpages.ca or pagesjaunes.ca |
| `name` | Business name as listed |
| `categories` | One or two Yellow Pages headings, as a list |
| `phone` | The first phone number, in international format |
| `phones` | Every phone number, toll free numbers included |
| `country` | Always `CA` |
| `source_site` | `yellowpages.ca` or `pagesjaunes.ca` |
| `search_query` | The query or pasted search that found the row |
| `search_location` | The location of the search |
| `scraped_at` | When the row was read (ISO 8601) |

`address`, `city`, `region` and `postal_code` were in 18 of the 20 proof rows and in every saved card, so test for them before you rely on them.

#### Output examples

Real rows, trimmed where marked. From the proof run on 28 Sep 2026 (`plumber` in `Toronto ON`, emails on), a business with an email read from its website (complete row):

```json
{
  "listing_id": "101902936",
  "listing_url": "https://www.yellowpages.ca/bus/Ontario/North-York/Drain-King-Plumbers/101902936.html",
  "name": "Drain King Plumbers",
  "categories": ["Plumbers & Plumbing Contractors"],
  "phone": "+1 647 362 2109",
  "phones": ["+1 647 362 2109"],
  "address": "100 Saint Regis Crescent, North York, ON M3J 1Y8",
  "street": "100 Saint Regis Crescent",
  "postal_code": "M3J 1Y8",
  "city": "North York",
  "region": "ON",
  "country": "CA",
  "latitude": 43.7550621,
  "longitude": -79.4822464,
  "website": "http://www.drainkingplumbers.ca",
  "email": "info@drainkingplumbers.ca",
  "emails": ["info@drainkingplumbers.ca"],
  "email_source": "website",
  "email_source_url": "https://www.drainkingplumbers.ca/",
  "rating": 5,
  "review_count": 8,
  "description": "Drain King Plumbers is a locally-owned, 24/7 full-service plumbing and drain company, serving all of Toronto and the Greater Toronto Area.",
  "source_site": "yellowpages.ca",
  "search_query": "plumber",
  "search_location": "Toronto ON",
  "scraped_at": "2026-09-28T12:46:44.297Z"
}
```

From the same run, two phones, two categories and two addresses found on the website (trimmed):

```json
{
  "listing_id": "619627",
  "name": "Fia Plumbing And Heating",
  "categories": ["Plumbers & Plumbing Contractors", "Heating Contractors"],
  "phone": "+1 416 237 1544",
  "phones": ["+1 416 237 1544", "+1 416 237 1545"],
  "address": "30 Titan Rd, Etobicoke, ON M8Z 5Y2",
  "website": "http://www.fiaphd.com",
  "email": "bid@fiaphd.com",
  "emails": ["bid@fiaphd.com", "info@fiaphd.com"],
  "email_source": "website"
}
```

From the same run, a listing with no address and no email found on its website, charged as a business only (complete row):

```json
{
  "listing_id": "105301442",
  "listing_url": "https://www.yellowpages.ca/bus/Ontario/A-Smith-Plumbing-Drain-And-Heating/105301442.html",
  "name": "A Smith Plumbing, Drain And Heating",
  "categories": ["Plumbers & Plumbing Contractors"],
  "phone": "+1 647 348 9900",
  "phones": ["+1 647 348 9900"],
  "country": "CA",
  "website": "https://asmithplumbing.ca",
  "description": "Reliable plumbing, drain, and heating services you can trust. Fast response times, quality workmanship, and honest pricing from A Smith Plumbing, Drain And Heating.",
  "source_site": "yellowpages.ca",
  "search_query": "plumber",
  "search_location": "Toronto ON",
  "scraped_at": "2026-09-28T12:46:44.297Z"
}
```

From our 1 Oct 2026 run with business pages on (`dentist` in `Vancouver BC`), opening hours and services (trimmed):

```json
{
  "listing_id": "2191607",
  "name": "Coast Dental Centre",
  "categories": ["Dentists", "Teeth Whitening Services"],
  "phone": "+1 604 433 9565",
  "address": "7120 Kerr St, Vancouver, BC V5S 4W2",
  "latitude": 49.2189502,
  "longitude": -123.0413481,
  "website": "https://www.coastdental.ca",
  "email": "info@coastdental.ca",
  "email_source": "website",
  "opening_hours": ["Mo 08:00-19:00", "Tu 09:00-19:00", "We 09:00-19:00", "Th 08:00-19:00", "Fr 09:00-17:00", "Sa 09:00-17:00"],
  "services": ["Invisalign", "Teeth Whitening", "Periodontal Maintenance & Treatment", "Dental exams and cleaning", "Crowns and bridges", "Root canals"]
}
```

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:46:46.590Z"
}
```

### 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 fast connection and the unblocking proxy fallback are 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 rates of our two runs (10 of 20 and 8 of 20), 1,000 businesses bring about 450 emails: about $13.50 more on Free and $6.75 more on Business. Turn emails on only for the searches where you need them; business pages cost nothing extra.

Never charged:

- search pages the site refused, and the retries through the unblocking proxy;
- a business already delivered by another search in the same run, under the same Yellow Pages id;
- a search whose place the site could not match (nothing is delivered);
- business pages and 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 Yellow Pages Canada?

Canada's yellow pages, run by Yellow Pages Limited, in English at yellowpages.ca and in French at pagesjaunes.ca. It lists tradespeople, shops, restaurants, clinics, professionals and companies across Canada, with phone, address, website and ratings. It does not publish email addresses.

#### How many businesses can I get?

Up to 1,000 per search (the site itself stops at page 60, 2,100 businesses, even for Restaurants in Toronto with 10,663 claimed results) and up to 300 searches per run. For a big city, add more specific business types, more locations or a different `sortBy` to reach other businesses. 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.

#### What do I type into Locations?

A city with its province (`Toronto ON`, `Calgary AB`, `Montreal QC`), a city alone (`Toronto`), a province (`Ontario`) or a postal code (`M5V 2T6`, or `M5V`). A location is required. A city with the wrong province, or a place the site cannot find, returns nothing with a note naming the place the site picked instead (`Toronto BC` became a health centre in Squamish BC); try the city with its correct province.

#### Why are some businesses outside the city I searched?

The site's city search covers the surrounding area and some advertisers from farther away: our Toronto search returned businesses from North York to Lindsay. Each row has its real `city`, so filter on it if you need the city proper.

#### How fresh is the data?

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

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

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

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

No. The actor uses a fast connection that looks like a normal Chrome browser, through Apify's datacenter proxies, and Yellow Pages Canada answered every search and business page that way in our 1 Oct 2026 run. A refused search page is retried through Apify's unblocking proxy, included in the price; refused pages are listed in the run summary and never charged.

#### Will every business have an email?

No. Yellow Pages Canada publishes no emails, so an email can only come from the business's own website: 10 of 20 Toronto plumbers and 8 of 20 Vancouver dentists had one. A business with no website, or only a Facebook page, cannot give an email this way. The actor never guesses an address from a name, and you pay nothing extra for a row without one.

#### Which pages does it read?

Search pages (`/search/si/<page>/<what>/<where>/`, with the site's own sort and open now options) and, with `includeDetails` on, business pages (`/bus/...`). The robots.txt of yellowpages.ca and pagesjaunes.ca, read again on 1 Oct 2026 and identical on both, allows all of these for every crawler, except French business pages under six province names, which the actor skips.

#### Does it also read Canada411?

No. Canada411 is a separate, mostly residential phone book. This actor stays on Yellow Pages Canada, the business directory.

#### 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/yellowpages-ca-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 yellowpages-ca-business-email-scraper "https://mcp.apify.com/?tools=themineworks/yellowpages-ca-business-email-scraper"`.

#### Is it legal to scrape Yellow Pages Canada?

The actor collects only publicly visible business listings and never signs in. How you use the data is your responsibility. In Canada the main rules are PIPEDA (or the provincial privacy law) for how you store and use personal information, which includes a sole trader's name and phone number; CASL for commercial emails, texts and other electronic messages to Canadian addresses, which needs consent and allows an address published in a business role only in narrow cases; and the Unsolicited Telecommunications Rules and the National Do Not Call List for telemarketing calls. Follow the site's terms too. This is general information, not legal advice, so check the rules with a lawyer before a campaign. The actor is an independent tool, not affiliated with or endorsed by Yellow Pages Limited.

### 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)
- [LandWatch Scraper](https://apify.com/themineworks/landwatch-land-for-sale-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.

*Yellow Pages Canada Scraper turns a business type and a Canadian place into rows of businesses with phone, address, coordinates and rating, in English or French, 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 plumber. 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.yellowpages.ca, for example Toronto ON. Leave empty to search the whole country. Up to 50 per run.

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

Optional. Paste search result pages from www.yellowpages.ca or www.pagesjaunes.ca 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 35 per page, so 100 businesses take about 3 pages. Yellow Pages Canada serves at most 60 pages (2100 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.

## `includeDetails` (type: `boolean`):

Also open each business's own page on the directory for the extra fields it holds, such as coordinates, opening hours, categories and registration numbers. Slower, and no extra charge. With Find emails on, the business page is opened anyway when the search result has no email.

## `sortBy` (type: `string`):

Order of the results, the same choices the site offers. Changes which businesses are on the first pages, not just their order, so it also changes which ones a limited Businesses per search keeps.

## `openNow` (type: `boolean`):

Keep only businesses the site marks as open right now (the site's own Open now filter). Off by default.

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

Yellow Pages Canada (English) or its French twin Pages Jaunes Canada (same directory, same businesses). Not pagesjaunes.fr, the unrelated French site.

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

## `allowUnblockerFallback` (type: `boolean`):

Search pages are read over a fast connection first. If the site refuses a page several times, try it through Apify's unblocking proxy, which is slower. Included in the price. Turn off to report such pages as refused instead.

## Actor input object example

```json
{
  "queries": [
    "plumber"
  ],
  "locations": [
    "Toronto ON"
  ],
  "maxResultsPerSearch": 30,
  "includeEmails": false,
  "includeDetails": false,
  "sortBy": "relevance",
  "openNow": false,
  "language": "en",
  "verifyEmailDomain": true,
  "allowUnblockerFallback": 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": [
        "plumber"
    ],
    "locations": [
        "Toronto ON"
    ],
    "maxResultsPerSearch": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/yellowpages-ca-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": ["plumber"],
    "locations": ["Toronto ON"],
    "maxResultsPerSearch": 30,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/yellowpages-ca-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/0gfEj1Rqh5iN1KZVN/builds/hfkedAkRGwWV0jfum/openapi.json
