Yellow Pages US Scraper - Business Listings & Phones avatar

Yellow Pages US Scraper - Business Listings & Phones

Pricing

from $0.60 / 1,000 business scrapeds

Go to Apify Store
Yellow Pages US Scraper - Business Listings & Phones

Yellow Pages US Scraper - Business Listings & Phones

Search US Yellow Pages by trade and city or ZIP. You get one row per business: name, phone, street address, city, state and ZIP. Each row also has the website and categories. Plus years in business and the listing id. Ratings come back on about a third of listings. $0.60 per 1,000.

Pricing

from $0.60 / 1,000 business scrapeds

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Yellow Pages US Scraper: business names, phones and addresses by trade and city

Type a trade and a US city or ZIP, and you get one row per business. Name, phone, street address, city, state, ZIP, the categories the directory files it under, the website when one is listed, and how long it has been trading.

Ratings are the thin part. Yellow Pages shows one on roughly a third of listings, so plan around the phone and the address rather than the stars.

InputSearch terms plus US cities or ZIPs, or Yellow Pages search URLs
OutputOne row per business
Ceiling3,000 businesses per run
Account neededNone
Price$0.60 per 1,000 businesses, flat on every plan

๐Ÿ” What Yellow Pages US Scraper does

Every search term is run against every location, so three trades and two cities is six searches. The row budget is then split evenly between them, which keeps a big city from eating the whole run while the small ones return nothing.

Sponsored placements are off by default, so you are only charged for ordinary directory results. Turn them on and they arrive marked with isAd: true. A business that shows up both as an ad and as an ordinary result is returned once, not twice, and the same goes for one that matches two of your search terms.

Phone numbers come through on essentially every listing, because that is what the directory is for. Street addresses come through on most; some businesses publish a service area instead of an address, and those land in serviceArea with street left null.

๐Ÿ“ฅ What you give it

{
"searchTerms": ["plumber", "electrician"],
"locations": ["Austin, TX", "78704"],
"maxItems": 400,
"includeAds": false
}
FieldDefaultWhat it is
searchTermsnone, the box starts with plumberA trade, a category or a business name, the way you would type it into the search box. Up to 20.
locationsnone, the box starts with Austin, TXCity, ST or a five-digit ZIP. Up to 20, and 30 searches per run in total.
maxItems30Total rows across every search, 1 to 3,000. Split evenly between the searches.
includeAdsoffAlso return the sponsored placements at the top of the page, marked isAd: true.
searchUrlsnonePaste yellowpages.com search or category URLs instead of terms and locations. Anything that is not a Yellow Pages URL is skipped with a free diagnostic row.
proxyUrlsnoneOptional. Servers you already pay for, one per line as http://user:pass@host:port. Leave it empty for a normal run.

The budget split is not redistributed. A search that runs dry does not hand its share to the others, so six searches with 300 rows gives you at most 50 from each, and fewer if one city only has 20 plumbers.

One search reaches about 3,000 results. The directory pages 30 at a time and stops after 100 pages. Splitting by ZIP rather than by city is the way to go deeper into a metro area.

๐Ÿ“ค What you get back

A real row from a recent run:

{
"ok": true,
"charged": true,
"recordType": "business",
"name": "ARS Rescue Rooter",
"phone": "(833) 947-9225",
"street": null,
"city": "Austin",
"state": "TX",
"zip": "78754",
"serviceArea": null,
"website": null,
"categories": ["Plumbers", "Furnaces-Heating", "Plumbing-Drain & Sewer Cleaning"],
"rating": null,
"ratingIsApprox": null,
"reviewCount": null,
"yearsInBusiness": null,
"openStatus": "open 24 hours",
"listingUrl": "https://www.yellowpages.com/austin-tx/mip/ars-rescue-rooter-473194899",
"ypid": "473194899",
"isAd": false,
"rank": 1,
"searchTerm": "plumber",
"location": "Austin, TX",
"page": 1,
"totalResults": 491,
"searchUrl": "https://www.yellowpages.com/search?search_terms=plumber&geo_location_terms=Austin%2C+TX",
"scrapedAt": "2026-09-14T05:48:19.430Z"
}
FieldWhat it is
ypidThe directory's own listing id. Stable, so use it to dedupe across runs.
street, serviceAreaA business either publishes an address or says which area it serves. You get whichever it published, and null for the other.
websiteThe business's own site. Links back into the directory are dropped rather than passed off as a website, so this is null more often than you might expect.
rating, ratingIsApproxratingIsApprox: true means only the half-star graphic was available, so the number is rounded. Check it before you sort on rating.
categoriesEvery category the directory files the business under, not just the one you searched.
yearsInBusinessOnly when the business published it. null otherwise, never guessed.
openStatusThe directory's own wording, like open 24 hours.
isAd, rankWhether it was a sponsored placement, and its position on the page it came from.
totalResultsHow many the directory says exist for that search, which is usually far more than your cap.

๐Ÿงพ Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itCharged
A businesscharged: true and a ypidyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

Filter on _sample and _diagnostic being absent, not on recordType. The free sample row also carries recordType: "business", so a filter on that alone keeps it. Run the actor with nothing filled in and you get that sample row on its own.

The errorCode on a diagnostic row names what went wrong:

CodeWhat it means
INVALID_TARGETThat location or URL was not recognised. Use City, ST or a five-digit ZIP.
NO_RESULTSThe search ran and the directory had nothing for it.
BLOCKEDThe directory would not serve more pages for that search. Whatever arrived first is complete.
NETWORKThe directory was unreachable or answered badly. Re-run it.
TIME_BUDGETThe run ran out of time before reaching that search. Everything delivered is complete.
PROXY_INPUT_ADJUSTEDA network setting in your input was not usable, so the run used its own.
CHARGE_ERRORA row could not be billed. It is logged rather than quietly delivered.
UNEXPECTED_ERRORAnything else. Send the run ID and it gets looked at.

One bad search never stops the others, and a diagnostic row never fails the run.

โ–ถ๏ธ How to run it

  1. Open Yellow Pages US Scraper and click Try for free.
  2. Type trades into Search terms, one per line.
  3. Type cities or ZIPs into US locations. Every term runs against every location.
  4. Set Maximum businesses. Start around 30 to see the output shape, then click Start.
  5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

๐Ÿ’ฐ How much does it cost?

$0.60 per 1,000 businesses. Flat on every Apify plan, no volume tiers.

You pay per business row delivered. The sample row and diagnostic rows carry no business charge, duplicates across searches are counted once, and a search that finds nothing produces no charged rows. Sponsored placements are off unless you ask for them, so you do not pay for ads by accident.

๐Ÿ’ก What people use it for

  • Building a call list for one trade across a handful of ZIPs, with the phone number already in a column.
  • Finding which local businesses have no website listed, which is a useful shape of lead on its own.
  • Comparing how many plumbers or dentists a directory holds per ZIP, using totalResults.
  • Enriching an existing address list by matching on ypid and picking up the categories.

๐Ÿšง What it does not do

  • No email addresses. The directory does not publish them, so neither does this. Run the websites through the contact scraper linked below if you need addresses.
  • US only. There is no other country to point it at.
  • Ratings on about a third of listings. Everything else is null, and where the number came from the star graphic rather than the page data, ratingIsApprox says so.
  • No review text, no photos, no opening-hours table. openStatus is the one-line summary and that is the lot.
  • About 3,000 results per search and 30 searches per run. Split by ZIP to go deeper.
  • The per-search share is fixed. A search with fewer results than its share returns fewer rows, and the leftover is not handed to the others.
  • Rows are a snapshot. Businesses close and phone numbers change, and scrapedAt records when the row was read.

๐Ÿงญ Which business directory scraper do you need?

If you wantUse
US businesses by trade and city, with phonesThis one
Places worldwide, with hours and coordinatesGoogle Maps Scraper
Yelp businesses and their reviewsYelp Scraper
Emails and socials from a list of websitesContact Details Scraper
Agencies and service providers with client reviewsClutch Agencies Scraper

โ“ Questions people ask

Can I search by ZIP? Yes. A five-digit ZIP in US locations works exactly like a city, and is the better choice when you want depth in a big metro.

Do I get email addresses? No. The directory does not carry them. Take the website column into the contact scraper linked above.

Why is website empty so often? Plenty of listings only link back into the directory itself. Those are dropped rather than returned as if they were the business's own site.

Can I skip the ads? They are already skipped. Turn Include sponsored listings on if you want them, and they arrive flagged.

Why did I get fewer rows than I asked for? Either a search had fewer results than its share of the budget, or you hit the roughly 3,000-result depth on one search.

Is scraping a business directory legal? These are public business listings on public pages. Some of the data is personal, which GDPR and similar laws cover, so have a reason for collecting it and mind the rules on cold contact where you are. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

๐Ÿ†˜ If something breaks

Open the Issues tab on the actor page. Send the search term and location you used and the run ID. The errorCode on the diagnostic row usually names the problem on its own.