YellowPages Canada Leads Scraper — Phone, Address, Website avatar

YellowPages Canada Leads Scraper — Phone, Address, Website

Pricing

$3.00 / 1,000 lead scrapeds

Go to Apify Store
YellowPages Canada Leads Scraper — Phone, Address, Website

YellowPages Canada Leads Scraper — Phone, Address, Website

Scrape Canadian business leads from YellowPages.ca by what + where: name, phone, full postal address with postcode, website, category, rating and geo. Every result page walked contiguously — 100% of a 1,749-result search returned. No login. Export JSON/CSV/Excel.

Pricing

$3.00 / 1,000 lead scrapeds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

🇨🇦 YellowPages Canada Leads Scraper — Phone, Address, Website

Turn yellowpages.ca — Yellow Pages Canada / YP.ca — into a clean Canadian B2B lead list. Search any business type in any Canadian city or postal code and get one row per business: name, phone (E.164 + as displayed), full postal address with postcode, website, YP category, star rating, review count, geo coordinates and, optionally, opening hours, services, payment methods, languages and brands carried.

At $3 per 1,000 leads with no per-run start fee, this is the cheapest way to pull YellowPages.ca leads on Apify. No login, no API key. Paste a what and a where and run.

{
"what": "plumber",
"where": "Toronto ON",
"maxItems": 20,
"maxPages": 1,
"includeCompanyDetails": false,
"requestConcurrency": 5
}

That block is literally the input this Actor ships with. Click Try for freeStart. A run on those shipped defaults returned 20 rows in 5.6 seconds — phone 100%, address 85%, postal code 80%, category 100%, website 75% — and cost $0.06 (20 leads × $0.003, billed exactly 20 events).


🧩 The wedge: this one actually paginates

YellowPages.ca is easy to fetch and hard to enumerate, and it is the enumeration that scrapers on this site keep getting wrong. Here is the trap, stated plainly:

Every YP.ca result page embeds a JSON blob ending in "nextPage" : "N+1". That field never terminates. A search with 50 pages of results still reports a nextPage on page 52, 53, 54 … forever. Anything that paginates by following nextPage runs until it is killed, burning your compute on empty pages.

The real stop signal is a page that renders zero result cards while still returning HTTP 200. This Actor paginates on the path segment (/search/si/<page>/<what>/<where>), dedupes on YP's own merchant id, and stops on the first empty page.

Measured, on the live site, through the Apify proxy, on 2026-08-15:

Contiguous walk of plumber / Toronto ONpages 1 → 51, 51/51 HTTP 200 (100%)
Cards returned across those pages1,749
Results YellowPages.ca itself reports for that search1,749 — an exact match, nothing skipped
Unique merchant ids1,747 → 0.11% duplicate rate
What those 2 duplicates weresponsored cards on page 1 repeating an organic card on page 1 — both removed by id dedupe before anything is billed
Where it stoppedpage 51 rendered 0 cards; the result counter flipped to (0 Result)
Merchant detail pages33/33 HTTP 200 (100%)

The run also asserts uniqueness in-process: if the number of rows pushed ever exceeds the number of distinct merchant ids pushed, the run throws instead of handing you a dirty dataset you paid for.

⚠️ How deep YellowPages.ca will actually let you go

Measured 2026-08-18: YP.ca serves at most ~60 result pages (~2,100 businesses) per search, no matter how large a total it prints at the top of the page. A contiguous walk of restaurants / Ontario — a search the site labels 25,633 results — returned 2,071 unique businesses across 61 pages, and page 61 rendered zero cards. plumber / Toronto ON (1,751 results) fits under that ceiling and came back complete: 1,748 unique businesses, page 51 empty.

So: any search whose total is under ~2,100 comes back complete. To pull a market bigger than that, split the query — by city instead of province, or by a narrower category (

italian restaurant
, sushi, pizza rather than restaurants) — and merge the datasets. The Actor logs the site's own reported total (Site reported N total results) on every run, so a 1-page probe tells you in advance whether one query will cover your market.

📤 What you get — one row per business

FieldDescription
merchant_idYP.ca's own listing id — the stable key this Actor dedupes on
nameBusiness name
phonePrimary phone in E.164, e.g. +14166998623
phone_displayPhone as YP.ca shows it, e.g. 416-699-8623
phonesEvery number on the listing (main line, toll-free, second location)
addressFull postal address as displayed
street / city / province / postal_codeThe address, split
countryAlways CA
categoryPrimary YP category, e.g. Plumbers & Plumbing Contractors
categoriesEvery category the business is listed under
servicesServices the business advertises
descriptionThe business's own blurb
websiteBusiness website, decoded out of YP's /gourl/ redirect (no extra request)
rating / review_countYP star rating (whole stars, as the site displays) and review count
open_statusOpen now / Closed now / Open 24 hours at scrape time
latitude / longitudeGeo coordinates
is_adtrue when YP.ca served the card as a paid placement
detail_urlThe YellowPages.ca listing URL
scraped_atISO timestamp
With includeCompanyDetails onopening_hours (per weekday), payment_methods, languages, brands, exact geo, the full services and category lists

Rows without a name and without at least a phone or an address are dropped, so you never pay for an empty lead.

📊 Measured field fill — read this before you buy

These are counted on real rows, not estimated. Sorted descending; sparse fields in bold.

Shipped default run (plumber / Toronto ON, page 1, 20 rows):

FieldFill
phone100%
category100%
address85%
postal_code80%
website75%
services60%
latitude / longitude35% (→ 97% with includeCompanyDetails on)
rating / review_count35%

Full audit, 2026-08-18 — every field counted on two whole datasets, includeCompanyDetails ON. Left column: a storefront vertical (restaurants / Ontario, 500 rows). Right column: a service-area trade (plumber / Toronto ON, 100 rows). Same parser, same code path, both runs.

Fieldrestaurants / Ontario (n=500)plumber / Toronto ON (n=100)
merchant_id · name · country · category · is_ad · detail_url100%99–100%
phone / phone_display / phones99.4%100%
address99.4%59%
street / city99.4%52% / 57%
province100%100%
postal_code99.2%55%
open_status95.6%43%
latitude / longitude95.6%52%
website87.4%51%
description85.8%28%
opening_hours84.2%43%
payment_methods83.0%36%
languages81.6%35%
rating / review_count70.6%18%
services66.8%49%
brands3.6%8%

Without includeCompanyDetails, the detail-page fields (opening_hours, payment_methods, languages, brands) are null/[] by design, and latitude/longitude drop to ~34% (the result page's map data covers only about a quarter of its own cards). Everything else is unchanged.

This split is real and you should plan around it. YellowPages.ca is a phone-first directory. Storefront categories (restaurants, salons, dentists, retail) publish a full street address on essentially every listing, at any depth. Service-area trades (plumbers, electricians, movers, junk removal) very often publish only a phone number and a province — no street address anywhere, not on the result card and not on the detail page either. That was verified directly: a free "Cheap Junk Removal" listing on page 4 carries +12262340782 and a detail-page JSON-LD address of exactly {"addressRegion":"ON","addressCountry":"CA"}. Nothing is being missed by the parser; the merchant simply did not publish it.

Re-verified three ways on 2026-08-18, because "the source doesn't have it" is the kind of claim that deserves proof:

  1. Same 100 businesses, run twice — once list-only, once with includeCompanyDetails on. address fill was 59.0% both times: opening every detail page added exactly zero addresses.
  2. Raw bytes of an address-less listing (A Smith Plumbing, Drain And Heating, 320 KB of HTML): the strings streetAddress, addressLocality and coordinates occur 0 times on the page. Its JSON-LD carries a phone, hours, 20 services, payment methods and a language — and no address.
  3. The same parser on a storefront vertical returns address 99.4% and geo 95.6% (table above). A parser bug cannot be vertical-selective.

Address fill also thins with depth inside one search, because paid advertiser listings are ranked first and free listings fill the tail.

⚠️ There are no email addresses on YellowPages.ca

Measured: 0 published email addresses across 40 merchant detail pages. YP.ca routes contact through an on-site message form, not a mailbox. This Actor therefore ships no email column at all, rather than a column that is silently always empty. If you need emails, run the website column returned here through an email-finder / website-contact scraper as a second step — that is a different job on a different source, and pretending otherwise would just be selling you nulls.

⚙️ Input

InputWhat it does
whatBusiness type, category or business name — the site's what box. plumber, restaurants, dentists, auto repair
whereThe site's where box. All three forms verified working: a city (Toronto), a city + province (Toronto ON, Vancouver BC), or a postal code (M5V 2T6).
maxItemsStop after this many leads. 0 = everything, up to the safety cap.
maxPagesHow many result pages to walk (35 businesses per page). The Actor stops by itself on the first empty page, so you can set this high without wasting requests.
includeCompanyDetailsOff by default. Opens each business's YP page for hours, exact geo, full services, payment methods, languages and brands. Costs one extra request per lead. Does not add an email — there isn't one.
proxyConfigurationApify proxy (datacenter) by default — measured clean, see below.
requestConcurrencyParallel detail-page requests. Only matters when details are on.

Sizing a run

35 businesses per page. plumber / Toronto ON is 1,748 reachable businesses = 51 pages = $5.24 for the complete list. restaurants / Vancouver BC is 3,365 reported — of which the site will serve you the first ~2,100. The Actor logs the site's own reported total (Site reported N total results) on every run, so a cheap 1-page run tells you both what the full pull will cost and whether your query is over the ~2,100 ceiling and needs splitting.

Run time. The Actor reads the run's own timeout and stops starting new requests before it, pushes everything it has collected, and finishes Succeeded with a status message saying how far it got — it never gets killed mid-run. Verified: three unbounded plumber / Toronto ON runs with detail fetching on, given a 120-second limit, stopped themselves at ~61 s and delivered 768 / 1,153 / 1,468 leads. The default run timeout is 1 hour, which is far more than any single search needs.

🌐 Proxies and anti-bot

YellowPages.ca has no JavaScript wall in front of its result pages. Apify datacenter proxies are enough: the 51-page contiguous walk above was 51/51 HTTP 200 and the 30 detail pages were 33/33, all through groups-auto. Residential is not required and is not the default — you should not pay residential rates for this site. If you ever do see repeated challenges, switch the Proxy input to RESIDENTIAL, country CA.

Two site-side quirks the Actor handles for you:

  • Dead listings that redirect to themselves. A small number of YP.ca merchant pages serve an infinite 301 → same URL loop. Those are skipped, logged, and never billed.
  • Unrecognised locations return 0 results, not an error. A typo'd city produces an empty result page rather than an HTTP failure. The Actor tells you so in the run status message — quoting the site's own reported result count and the exact transport counters — instead of finishing silently with an empty dataset. It does not fail the run, and 0 rows means $0 charged.

💵 Pricing

$0.003 per lead — $3 per 1,000 — charged once per row actually delivered. One event, no actor-start fee, no per-run minimum. Rows are charged as they are pushed, after deduplication, so a maxItems cap is a real spend cap. The competing YellowPages.ca actors on the Store sit at the same $0.003 per business plus an actor-start fee on top, or at $0.005.

Your "Maximum cost per run" is a hard stop, and you only pay for leads you actually receive. Before each page is delivered the Actor asks the platform how many leads your remaining budget can still pay for, ships exactly that many complete leads, and then stops — with a status message saying how many it delivered. It never bills a row it did not deliver, never delivers a row it did not bill, and never hands you a half-filled lead. Measured on run RQcewFVt5Odpb4cL0 with a $0.05 cap: 16 leads delivered, 16 leads charged ($0.048), dataset item count 16, run SUCCEEDED in 4.4 s. If the cap is smaller than the price of a single lead, the run scrapes nothing and charges $0.00.

🤖 Sibling Actors — same input shape, same price

This is one of a family of national Yellow-Pages-style directory scrapers that all take the same what / where / maxItems / maxPages inputs and all bill $3 per 1,000 leads:

  • PagesJaunes France Leads Scraper — pagesjaunes.fr, with SIRET / SIREN / NAF
  • PagineGialle Italy Leads Scraper — paginegialle.it, with P.IVA / codice fiscale

This Actor reads public directory pages — the same HTML YellowPages.ca serves to Google.

robots.txt (fetched from https://www.yellowpages.ca/robots.txt on 2026-08-15): the two paths this Actor uses — /search/si/<page>/<what>/<where> and /bus/<Province>/<City>/<Name>/<id>.html — are not disallowed for User-agent: *. The file does disallow the site's machine-readable routes, in its own words: Disallow: /search?fmt=JSON* and Disallow: /ajax/*. This Actor does not touch either of them; it reads the crawlable HTML pages only. There is no Crawl-delay for User-agent: * (the only one in the file is User-agent: Slurp / Crawl-delay: 8).

You are responsible for complying with YellowPages.ca's Terms of Service and, because some listings are sole traders, with PIPEDA and CASL when you contact anyone in the output. Scraped business phone numbers are not consent to send commercial electronic messages.