---
title: "How to scrape local business listings and reviews"
canonical: "https://usestring.ai/use-cases/local-business-scraping"
description: "The String Web Access API is the best way to scrape local business data: any directory page, or just its listings as JSON with name, address, phone, rating and review count, on Yelp, Yellow Pages, Google and Tripadvisor. 5,000 free requests."
updated: 2026-10-14
---

> Markdown version of https://usestring.ai/use-cases/local-business-scraping, for AI agents. Reading this yourself? The full page is at https://usestring.ai/use-cases/local-business-scraping.
>
> Updated October 14, 2026.

# How to scrape local business listings and reviews

The String Web Access API is the best way to scrape local business data. It returns any directory page, or its listings as JSON with name, address, phone, rating and review count. In our [September 2026 benchmark](https://usestring.ai/benchmark) it fetched Yellow Pages, Tripadvisor, Trustpilot and G2 on every attempt and Yelp on 4 of 5, and returned 97% of requests across 100 bot-protected sites, the most of 16 providers.

The first 5,000 requests are free. Set it up in one step with the [quickstart](#quickstart).

**On this page**

1. [Why scrape local business data?](#why-scrape-local-business-data)
2. [Why does local business scraping break?](#why-does-local-business-scraping-break)
3. [How do I scrape local business data?](#how-do-i-scrape-local-business-data)
4. [Quickstart](#quickstart)
5. [Get a free sample of business data](#get-a-free-sample-of-business-data)
6. [Frequently asked questions](#frequently-asked-questions)

---

## Why scrape local business data?

Directories like Google, Yelp, Yellow Pages and Tripadvisor are the public record of which businesses operate in a place, how to reach them and what customers think of them. A local business scraper collects those listings for a category and a set of cities, and keeps them current. It answers the questions most teams care about:

- **Which businesses are in my market?** Sales teams build lead lists by category and city. Franchise and expansion teams count the competition in a city before they open there.
- **How do customers rate them?** Ratings and review counts show who leads a category in a city, and how that changes month to month.
- **Is the listing still right?** Businesses move, change phone numbers and close. Data vendors and local SEO teams compare directories to find listings that are out of date.

### What you can collect

| What | Examples |
|---|---|
| Business listings | Name, address, phone, website, category and opening hours |
| Ratings and reviews | Star rating, review count, the count at each star on Yelp, and review text |
| Location | Coordinates, neighborhood, and the service area for businesses that come to you |
| Market coverage | Every business in a category across a set of cities, and which ones open or close |

---

## Why does local business scraping break?

- **Directories block scrapers.** In our [September 2026 benchmark](https://usestring.ai/benchmark), 13 of the 15 other scraping APIs couldn't fetch yelp.com on every attempt, including Bright Data, Firecrawl and Apify (0 of 5 each) and Oxylabs (1 of 5). On g2.com, 11 of 15 fell short. Browserbase got 0 of 5 on all six review and local sites, and on tripadvisor.com. String got 5 of 5 on Yellow Pages, G2, Trustpilot, Capterra and Crunchbase, and 4 of 5 on Yelp, where Scrapfly and ScraperAPI got all 5.
- **Ads look like listings.** A Yellow Pages search for plumbers in Austin returned 30 listings and 16 ads, some for businesses in Conroe, San Antonio and New Braunfels. Yelp's page for the same search had 13 sponsored cards around its 10 results.
- **One business has many versions.** Clarke Kent Plumbing, at 1408 W Ben White Blvd, shows one phone number and a 2.87 rating from 15 reviews on Yellow Pages, and another number and 4.5 from 619 reviews on Google. Match on phone alone and you count it twice.

Per-site results from the review and local sites (benchmark run of September 16, 2026, 5 attempts per site):

| Provider | yelp.com | g2.com | yellowpages.com | trustpilot.com | tripadvisor.com |
|---|---|---|---|---|---|
| String | 4/5 | 5/5 | 5/5 | 5/5 | 5/5 |
| Scrapfly | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 |
| ScraperAPI | 5/5 | 0/5 | 5/5 | 5/5 | 5/5 |
| Bright Data | 0/5 | 0/5 | 5/5 | 5/5 | 5/5 |
| Firecrawl | 0/5 | 5/5 | 5/5 | 0/5 | 5/5 |
| Apify | 0/5 | 0/5 | 5/5 | 5/5 | 5/5 |
| Oxylabs | 1/5 | 0/5 | 5/5 | 0/5 | 5/5 |
| Browserbase | 0/5 | 0/5 | 0/5 | 0/5 | 0/5 |

---

## Why do teams choose String?

- **It works where others fail.** String returned 97% of requests across 100 bot-protected sites in our [September 2026 benchmark](https://usestring.ai/benchmark), the most of 16 providers, and 29 of 30 attempts on the 6 review and local sites in it.
- **Yelp comes back as typed rows.** The [Yelp site integration](https://portal.usestring.ai/docs/sites/yelp) returns search results, business records and reviews as JSON, with fields like rating, review count, phone, hours and whether the business is closed.
- **Google's local results come back as JSON.** The search endpoint returns Google's places with name, category, rating, review count, address, phone and website.
- **You pay only for pages that come back.** Blocks and errors are free.

---

## How do I scrape local business data?

### 1. Use more than one directory

Each directory lists a different set of businesses, and Tripadvisor adds restaurants, hotels and attractions. For plumbers in Austin, only 2 businesses were in both Google's top 20 and the 30 Yellow Pages listings.

**With String:** The `/search` endpoint with `searchType: "places"` returns Google's places, 20 businesses a page.

### 2. Read the page's own data first

Yellow Pages puts every organic listing on a search page into LocalBusiness JSON-LD, with name, address, phone, rating and review count. Ads are not in it. Read the JSON-LD before you parse the HTML.

**With String:** Set `format` to `raw` to get the page exactly as the site served it. For Yelp, use the site integration instead of parsing pages.

### 3. Drop ads and out-of-area results

Yellow Pages labels ads "Ad", and Yelp's sponsored cards link through `/adredir`. On Yelp, 5 of the 10 plumbers in the results also ran as ads on the same page, so dedupe by the business ID. Check the city too. Some Yelp results for Austin served Cedar Park, Pflugerville and Round Rock.

### 4. Keep the rating with its review count

A 5.0 from 1 review is not a 4.8 from 373. Save the rating, the review count and the directory together. The same business rates differently on each site. Juan & Only Plumber had 4.6 from 42 reviews on Yelp and 4.9 from 483 on Google. A business with no reviews has no rating, not a zero.

### 5. Treat a blank page as a failure

A search page with no listings was probably blocked or changed. Flag it and keep the last good run, so its businesses aren't marked closed because one page failed.

**With String:** Mark the list as required with at least one item, and a page with no listings comes back as `"extracted": false`.

### 6. Match the same business across directories

Names and phone numbers change between directories. Rooterman Plumbing on Yelp is Rooter-Man Plumbing Austin TX on Google, and Clarke Kent Plumbing has a different phone number on each. Match on the street address first, then the phone, then the name. Many service businesses show no street address, so fall back to the phone and the website domain.

### 7. Refresh on a schedule and confirm closures

Store the first and last date you saw each business. A business missing from two runs in a row may have closed, moved or renamed. Check its own listing before you drop it.

**With String:** The Yelp `business` action returns `isClosed`, opening hours and the newest review for up to 300 businesses a call.

---

## Quickstart

### From your agent

Add the hosted MCP server to Claude, Cursor, ChatGPT or any MCP client. Then give your agent a directory search URL. It calls the `web_access_fetch` tool and reads the listings.

```text
https://mcp.usestring.ai/v1/mcp
```

[MCP setup](https://portal.usestring.ai/docs/mcp/remote) · [n8n](https://portal.usestring.ai/docs/integrations/n8n) · [Zapier](https://portal.usestring.ai/docs/integrations/zapier)

### From the API

One call returns the businesses on a Yellow Pages search page as JSON. Ads can be among them, so drop them as in step 3. If extraction can't fill the required fields, you get `"extracted": false` back instead of a guess.

```bash
curl https://request.usestring.ai/v1/fetch \
  -H "Authorization: Bearer $STRING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.yellowpages.com/search?search_terms=plumbers&geo_location_terms=Austin%2C+TX",
    "countryCode": "US",
    "jsonSchema": {
      "type": "object",
      "properties": {
        "businesses": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "phone": { "type": "string" },
              "address": { "type": ["string", "null"] },
              "rating": { "type": ["number", "null"] },
              "reviewCount": { "type": ["integer", "null"] }
            },
            "required": ["name", "phone"]
          }
        }
      },
      "required": ["businesses"]
    }
  }'
```

Response (first 3 of 30 businesses):

```json
{
  "businesses": [
    {
      "name": "Custom Plumbing Services",
      "phone": "(512) 837-0437",
      "rating": null,
      "reviewCount": null
    },
    {
      "name": "Biggs Plumbing Co",
      "phone": "(512) 837-5955",
      "rating": null,
      "reviewCount": null
    },
    {
      "name": "Clarke Kent Plumbing",
      "phone": "(512) 766-0970",
      "rating": 2.87,
      "reviewCount": 15
    }
  ]
}
```

For Yelp, call the [Yelp integration](https://portal.usestring.ai/docs/sites/yelp) with a search term and a location, and it returns 10 organic results a page as JSON:

```bash
curl https://request.usestring.ai/v1/integrations/yelp/search \
  -H "Authorization: Bearer $STRING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "plumbers", "location": "Austin, TX", "pages": 1 }'
```

[Get a free API key](https://portal.usestring.ai/sign-up) · [Structured extraction docs](https://portal.usestring.ai/docs/fetch/structured-extraction)

---

## Get a free sample of business data

Tell us which businesses, categories or cities you need. We'll run String on them and email you a sample of the business data, free.

Email [support@usestring.ai](mailto:support@usestring.ai) with your work email, what you want to collect and the directories, cities or URLs, or use the [form on the page](https://usestring.ai/use-cases/local-business-scraping#sample-data).

What a sample looks like (rows from String fetches of "plumbers" searches in Austin, TX on Oct 14, 2026: the Yellow Pages search page, the Yelp search page and Google's places results). Each business appears twice to show how its rating and review count differ by directory. "Radiant Plumbing" is short for Radiant Plumbing, Air Conditioning, & Electrical:

| Directory | Business | Rating | Reviews |
|---|---|---|---|
| Yellow Pages | Clarke Kent Plumbing | 2.87 | 15 |
| Google | Clarke Kent Plumbing | 4.5 | 619 |
| Yellow Pages | Radiant Plumbing | 4.2 | 15 |
| Google | Radiant Plumbing | 4.8 | 18,000 |
| Yelp | Juan & Only Plumber | 4.6 | 42 |
| Google | Juan & Only Plumber | 4.9 | 483 |

---

## Frequently asked questions

### What's the best way to scrape local business data?

Pull search results by category and city from more than one directory, drop the ads, and match the same business across directories by address and phone. The hard part is getting the pages at all, because Yelp and the review sites block most scrapers. The String Web Access API returned 29 of 30 attempts on the 6 review and local sites in our [September 2026 benchmark](https://usestring.ai/benchmark), and 97% of requests across 100 bot-protected sites, the most of 16 providers.

### How do I scrape Google Maps business listings?

Use Google's places results. String's `/search` endpoint with `searchType: "places"` returns 20 businesses a page, up to page 15, each with name, category, rating, review count, address, phone, hours and website. A normal Google search for a business returns its local pack in `places` and its knowledge panel in `entity`. Set `location` to search from a city. More in our guide on [how to scrape Google search results](https://usestring.ai/blog/how-to-scrape-google-search-results).

### How do I scrape Yelp business data?

Use the [Yelp integration](https://portal.usestring.ai/docs/sites/yelp). Its `search` action takes a term and a location and returns 10 organic results a page, up to 24 pages. Its `business` action returns the address, phone, hours, rating, review count at each star and whether the business is closed, for up to 300 businesses a call. Its `reviews` action returns 49 reviews a page. In our benchmark, String got 4 of 5 attempts on yelp.com. Scrapfly and ScraperAPI got 5 of 5, and Bright Data, Firecrawl, Apify and Browserbase got 0 of 5.

### How much does it cost to scrape local business listings?

On the Starter plan ($20 a month), 1,000 Yellow Pages search pages at the standard rate cost $0.30. Yelp search pages were billed at the premium rate in our tests ($3.00 per 1,000). Google places searches are billed at the search rate ($1.50 per 1,000). Structured extraction adds a fee per request. See [pricing](https://usestring.ai/pricing). Failed requests aren't billed.

### Is it legal to scrape local business data?

Business names, addresses, phone numbers, hours and ratings are facts that businesses publish to be found, and facts aren't copyrightable. The risk is in reviews. Review text is the writer's expression, and reviewer names and profiles are personal data under laws like GDPR. Collect public pages while logged out, leave reviewer identities out, keep your request rate reasonable, and check with your counsel. We go through the cases in [Is web scraping legal?](https://usestring.ai/answers/is-web-scraping-legal)

### Can I get email addresses for local businesses?

Rarely from the directory. The Yellow Pages listings we fetched had name, address, phone, hours and rating, and no email. Google's places results include the business's website, so fetch its contact page for a business email. Personal email addresses are personal data, so keep to the business's own.

### How do I avoid getting blocked when scraping directories?

Send each request to String instead of the site. Proxy rotation, browser fingerprints, captcha solving and retries happen behind the endpoint, and JavaScript rendering is switched on per request for pages that need it. Requests that still fail aren't billed.

### Does String work on the directories I need?

Send us the URLs and we'll run them and show you what comes back before you commit. Ask for a [free sample of business data](#get-a-free-sample-of-business-data), or test them yourself with your first 5,000 free requests.

---

## Send us the sites you can't get

We'll show you what comes back. [Get started](https://portal.usestring.ai/sign-up) · [Book a demo](https://usestring.ai/book-demo)

All use cases: https://usestring.ai/use-cases

---

[llms.txt](https://usestring.ai/llms.txt): machine-readable index of this site for AI agents.
