NewLaunching String Web Access APIRead the manifesto →

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

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

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.

The problem

Why does local business scraping break?

  • Directories block scrapers. In our September 2026 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.

Directories and review sites

StringOne API
FetchSearch SitemapsBrowser
Your business database

The solution

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

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

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.

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)

{
  "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 with a search term and a location, and it returns 10 organic results a page as JSON.

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.

Request a free sample business data
What a sample looks like
DirectoryBusinessRatingReviews
Yellow PagesClarke Kent Plumbing2.8715
GoogleClarke Kent Plumbing4.5619
Yellow PagesRadiant Plumbing4.215
GoogleRadiant Plumbing4.818,000
YelpJuan & Only Plumber4.642
GoogleJuan & Only Plumber4.9483

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

How do I scrape Yelp business data?

Use the Yelp integration. 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. 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?

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

© 2026 StringEU and UK GDPR Article 27 representative — appointment verified by EuverifyBuilt in New York City 🗽 🍎