Yelp Scraper avatar

Yelp Scraper

Pricing

$0.30 / 1,000 results

Go to Apify Store
Yelp Scraper

Yelp Scraper

Collect public Yelp business reviews with ratings, dates, text, reactions, business details, and optional reviewer details from business URLs or search pages.

Pricing

$0.30 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

Scrape Yelp business reviews from public business pages and export Yelp review data to CSV or JSON. This Yelp API alternative accepts business URLs, business identifiers, or search result URLs, and returns one structured record per review when the public source is reachable.

Validation status: The latest hosted test succeeded with 40 real reviews from a Swiss business page. Review ID, link, text, rating, date, and business URL were present in all 40 records. Yelp's United States business pages still returned HTTP 403 in the available network, so coverage is regional and should be checked for each target. Several optional fields and deeper pagination remain unverified.

What data can you extract from Yelp?

Each result is a review record with its business context attached. Field names are stable even when Yelp omits a value. Optional reviewer details are null unless enabled. The actor collects page-embedded review JSON from public mobile business pages; it does not access accounts or private reviews. The verified Swiss page contained normalized review records, business ratings, reaction counts, and review counts by language.

FieldDescriptionExample or shape
reviewIdPublic review identifier, if exposedText identifier
reviewUrlDirect review linkBusiness URL with hrid
reviewPositionPosition in the requested order1
textReview bodyText string
ratingReview star rating4
reviewDateDate supplied by the sourceDate string
languageLanguage code when supplieden
translatedTextSource-provided translation when presentText or null
helpfulCountHelpful reactions when supplied2
funnyCountFunny reactions when supplied0
coolCountCool reactions when supplied1
checkInCountCheck-ins associated with the review0
userSpecifiedTimeOfExperienceExperience time if the reviewer supplied oneDate or null
isFirstReviewerFirst-reviewer indicator when suppliedBoolean or null
reviewOfTheDaySource recognition detail when suppliedText or null
expertRecognitionOther expert recognition when suppliedText or null
hasPaidThroughYelpPayment indicator when suppliedBoolean or null
hasPurchasedDealDeal purchase indicator when suppliedBoolean or null
hasPlacedReservationReservation indicator when suppliedBoolean or null
reservationProviderReservation source when suppliedText or null
publicReplyPublic business responseText or null
photosReview image referencesArray
videosReview video referencesArray
feedbackOther reaction detailsArray
authorNamePublic display name, only when enabledText or null
authorProfileUrlPublic profile link, only when enabledURL or null
authorPhotoUrlPublic profile image, only when enabledURL or null
authorReviewCountPublic contribution count, only when enabledInteger or null
businessIdEncoded business identifier when presentText or null
businessAliasLast segment of the business URLText
businessNameBusiness display name when presentText or null
businessUrlCanonical business page linkURL
businessRatingOverall business rating when presentNumber or null
businessReviewCountPublic total review count when presentInteger or null
businessPhotoUrlPrimary business photo when presentURL or null
ratingDetailBusiness rating distribution when presentObject or null
reviewsCountByLanguageBusiness review totals by language when presentArray
scrapedAtUTC time the item was collectedTimestamp

The table is a field contract, not a claim that every field is available on every page. The source may offer a review without reactions, media, language, or business metadata. Nullable values remain null; absent arrays become empty arrays. Review text and rating are required to recognize a review record. The actor deduplicates by review identifier where available, then by review link and text when the identifier is missing.

How to scrape Yelp

  1. Paste one or more complete business URLs into businessUrls. A direct business URL is the clearest starting point because it does not require search result discovery. You may instead provide identifiers in businessIds or public search result URLs in searchUrls.
  2. Set reviewsLimit for the number of reviews requested from each business. Set maxItems if you need one cap across all businesses. A small limit reduces requests during initial checks.
  3. Choose reviewsSort, and optionally set a language, a keyword, or star ratings. These filters are applied to the reviews present in each fetched page. Sorting after retrieval does not guarantee a global newest or oldest order across the business's entire history.
  4. Run the actor and inspect its status. A successful run must contain review records. If all sources are blocked or empty, the run fails with a direct error instead of producing an apparently successful empty dataset.
  5. Open the dataset to download JSON or CSV. Keep the business URL and review URL columns when combining multiple runs so records remain traceable.

The verified example uses a Swiss business with hundreds of public reviews. If a target page responds with 403 or omits embedded review data, the actor records an error for that business. A run with no reviews fails.

Input

ParameterTypeDefaultDescription
businessUrlsList of stringsEmptyPublic business page URLs. Each URL keeps its regional domain.
businessIdsList of stringsEmptyBusiness aliases or encoded identifiers placed in a business URL on the chosen domain. Encoded identifier resolution is not verified.
searchUrlsList of stringsEmptySearch result pages from which business links are extracted. A Swiss search page loaded during discovery; end-to-end expansion has not been validated.
reviewsLimitInteger100Per-business review cap.
maxItemsInteger0Total output cap; zero means no total cap.
reviewsSortStringrecommendedRecommended, newest, oldest, highest rated, or lowest rated within fetched records.
ratingsList of integersEmptyKeep only selected star ratings from one through five.
languageStringEmptyKeep records with this language code. Empty keeps all languages.
keywordStringEmptyKeep fetched reviews containing this text.
includePersonalDataBooleanfalseInclude public reviewer name, profile, photo, and contribution count.
domainStringwww.yelp.comRegional domain used to construct URLs from identifiers.
proxyConfigurationObjectPublic proxy enabledConnection settings for public pages.

A realistic input for a business with many reviews is:

{
"businessUrls": [
"https://de.yelp.ch/biz/hiltl-z%C3%BCrich"
],
"reviewsLimit": 40,
"maxItems": 40,
"reviewsSort": "recommended",
"ratings": [],
"language": "",
"keyword": "",
"includePersonalData": false
}

At least one of the three start lists must lead to a business. Duplicated business URLs are visited once. The total cap can stop a run before every requested business has been processed. A per-business cap applies separately to each business. The verified page embedded forty complete recommended reviews in one response, so this example needed one business-page fetch.

Output example

This item comes from the successful hosted run. The review text and arrays are shortened for readability; the stored dataset contains the full values and all fields listed above.

{
"reviewId": "3xoC_lpjkFVtwaXipigF7Q",
"reviewUrl": "https://de.yelp.ch/biz/hiltl-z%C3%BCrich?hrid=3xoC_lpjkFVtwaXipigF7Q",
"reviewPosition": 1,
"text": "Single best vegetarian restaurant I've been to in my life...",
"rating": 5,
"reviewDate": "2026-09-03T16:23:24Z",
"language": "en",
"helpfulCount": 0,
"authorName": null,
"businessId": "KeNGoOn5jsAtsq-AXyDWzQ",
"businessAlias": "hiltl-zürich",
"businessName": "Hiltl",
"businessUrl": "https://de.yelp.ch/biz/hiltl-z%C3%BCrich",
"businessRating": 4.4,
"businessReviewCount": 380,
"ratingDetail": {
"1_star": 9,
"2_star": 14,
"3_star": 29,
"4_star": 110,
"5_star": 218
}
}

Use cases

  • A local operator can compare changes in public star ratings over time after a successful collection run.
  • A customer experience team can group review text by recurring service topics, keeping the review URL for context.
  • A multi-location business can attach each review to its branch through the business URL and alias fields.
  • A researcher can compare review language and date across public business pages, subject to the availability of those source fields.
  • A reporting workflow can identify reviews with public business replies and inspect response coverage.
  • A data export can join public ratings and review text with a separate business list using business URLs.

The successful Swiss run provides data for these uses. Other regions and businesses can still block access or expose different fields. The actor does not infer sentiment, verify reviewer identity, or retrieve reviews hidden behind a login. It returns source data, not a quality judgment about a business or a person.

How much does it cost to scrape Yelp?

The current private configuration is $0.30 per 1,000 dataset items, or $0.0003 for each stored review. At that rate, 1,000 delivered reviews would cost $0.30, 5,000 would cost $1.50, and 10,000 would cost $3.00. These are item charges, not a promise that those quantities are reachable for every business. The latest hosted test stored 40 items.

Request count depends on the number of businesses, the page limit, and how many reviews are embedded in each response. The verified 40-item run fetched one mobile business page. Additional retries can occur when a request is blocked. The fetch layer first tries a lower-cost proxy, then rotates a session and escalates after repeated blocks. Escalation uses paid residential traffic and may consume account resources even when no reviews are returned. Keep trial inputs small when testing a new region.

The item price can be checked in the actor listing before use. If an account has a spending ceiling, the output helper stops when the platform reports that the charge limit has been reached. maxItems provides an additional count-based stop. The two controls solve different problems: one concerns stored item count, while the other concerns the budget available to the run.

Tips for best results

Start with a complete business URL. It avoids dependence on search result parsing and makes it easier to see which page failed. Use a business with at least as many visible reviews as your requested reviewsLimit. For a small inspection run, request twenty to forty items rather than an unlimited crawl. The Swiss example returned forty complete records from its mobile page. If a run fails, inspect the log for the business URL and response status.

Keep ratings empty while checking connectivity. A rating filter can reduce the number of stored records, and a page with forty embedded records may contain fewer records with the selected stars. Likewise, a narrow keyword can produce few or no matches. Verify that an unfiltered run works before interpreting a zero-result filtered run as evidence that no matching reviews exist.

Use reviewsSort to order the reviews returned by each page. Recommended preserves the source connection order. Newest, oldest, highest, and lowest sort the fetched records locally. These choices do not fetch different source slices, so they cannot guarantee that the first result is the newest or lowest-rated review among all of a business's reviews.

Leave includePersonalData disabled unless your use case requires public reviewer details and you have a lawful basis to use them. The review record still contains text, rating, date, and business context when those values are available. Avoid storing extra person-related fields when the analysis concerns businesses rather than reviewers.

Limits

The verified source is page-embedded normalized JSON on a Swiss mobile business page when that page returns complete review data. The prior United States business and review-feed requests returned HTTP 403 through the available network. A direct review-feed path on the Swiss site returned 404. An official reviews endpoint required authorization, and a public RSS information page did not provide anonymous business feeds. These paths are not used to manufacture substitute rows.

Source fields can vary by business, region, review type, and page version. Translation appears only if the source supplies translated text; the actor does not perform translation. Business name, overall rating, review count, and photo can be null when page data is absent. Media arrays and reaction details can be empty. The verified Swiss records supplied timestamps, but other pages may display dates with less precision. The actor never invents missing values.

The current implementation requests up to fifty mobile pages per business when no per-business limit is supplied. The first page and its forty review records are verified; offsets beyond the first page have not been validated. It stops earlier when a page is short or adds no new reviews and deduplicates across pages. Encoded business IDs and search result expansion are implemented as input paths but have not passed an end-to-end hosted test.

A 403 response is an access refusal, not a signal that a business has no reviews. An empty dataset should not be used as evidence of zero public feedback. The actor fails on zero items so monitoring systems can distinguish a blocked collection from a successful empty result. It may still produce a partial dataset if one business works and another fails; inspect logs for per-business errors.

Automation

A scheduled workflow can provide the same business URLs on each run and compare returned review IDs to a previous dataset. Date comparisons can help identify recently published records within the returned slice. A second workflow can export rows with rating, text, date, and business URL for review by a human. In both cases, check run status before consuming the dataset.

FAQ

Is collecting public reviews permitted? Requirements vary by jurisdiction and intended use. Read Yelp's terms and applicable privacy rules before collecting or republishing review content. This actor accesses public pages only; it does not provide a license to reuse text or personal information.

Do I need to configure a proxy? The default input uses the available public proxy. The successful Swiss run needed no manual proxy setting. Some other business pages still block access after escalation.

How fast is a run? Speed depends on access and page count. The verified 40-item hosted run finished in about nine seconds. Blocked pages can take longer because the fetch layer retries and rotates sessions.

Can I schedule or monitor runs? Yes, run status and dataset item count can be monitored by the hosting platform. Treat zero items with a failed status as an error, not a valid empty review period.

Can I export to a spreadsheet? The dataset can be downloaded in JSON or CSV, then opened in a spreadsheet. Preserve review IDs and URLs if you plan to merge exports from repeated runs.

Why is a field empty? The public source may omit it, the review may not have that feature, or the business page may be unavailable. Reviewer fields are intentionally null while includePersonalData is false.

Can I request every review? A low reviewsLimit stops early, while a larger limit requests more mobile pages. Only the first forty-review slice has been verified. Deeper pagination, source restrictions, and access blocks can prevent complete coverage.

Integrations

A dataset can feed an internal reporting pipeline through the platform API, a webhook, or a scheduled export. CSV and JSON downloads can be imported into a database or spreadsheet. For reliable automation, require a successful run and a nonzero item count before updating downstream reports. The verified Swiss run meets that condition; test each additional region before relying on it.

Support

Open an issue on the Issues tab with the business URL, run ID, and relevant log lines. Current open issues include the HTTP 403 block on tested United States business pages, unverified deeper pagination, and unverified encoded-ID inputs. Include a reproducible public URL when requesting support for another region.