Yelp Reviews Scraper — UK & Czech Pages avatar

Yelp Reviews Scraper — UK & Czech Pages

Pricing

from $0.24 / 1,000 review rows

Go to Apify Store
Yelp Reviews Scraper — UK & Czech Pages

Yelp Reviews Scraper — UK & Czech Pages

Export full public Yelp reviews with stars, dates, public authors, photos and owner replies. Supports accessible UK/Czech business pages, pagination and language/date filters, with explicit regional limits and source diagnostics. Independent tool.

Pricing

from $0.24 / 1,000 review rows

Rating

0.0

(0)

Developer

tingyou333 zhuang

tingyou333 zhuang

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share

Yelp Reviews Scraper — UK Pages

Export full public Yelp review text, star ratings, dates, public reviewer fields, photos and owner replies. Supply business-page URLs and receive one structured dataset row per review, with language/date filters and pagination.

This is an independent tool, not an official Yelp product. Regional access is limited: dated public UK and Czech page samples worked; original US and Canadian domains returned HTTP 403. A September 30 local direct check again accepted one UK hotel review with an owner reply; the original US/Canadian URLs and the historical Czech default URL returned HTTP 403 in that check. Current access depends on the exact URL and route. A successful URL does not establish access to every business on that domain.

What you can use it for

Build location-level feedback reports, export reviews for analysis, or refresh a reputation dashboard for businesses whose public pages are accessible. Tested local targets include restaurants, hotels, a museum and a car dealership accessed through an explicit UK-domain URL. The Actor preserves source text and public fields; optional translations are returned by Yelp itself. Original review text and source language stay unchanged.

Quick start

  1. Enter direct Yelp business URLs in Start URLs. Start with the verified UK default below.
  2. Choose a review limit, language and sort. Use a small limit before requesting a larger export.
  3. Run the Actor, inspect SUMMARY for completeness, then export the dataset. Error pages are never review rows.

The default form and automatic-test input requests five English reviews from this cloud-verified UK page:

{
"startUrls": [
{
"url": "https://www.yelp.co.uk/biz/dishoom-london"
}
],
"maxReviewsPerUrl": 5,
"language": "en"
}

On September 30, 2026 (UTC), a cloud validation run using this input returned 5 English reviews over 1 feed page at 256MB, newest first, with unique review IDs and no recorded errors. It validates this particular sample. Larger runs, every domain and complete histories are not established by that result. The configured run timeout is 120 seconds.

Copy the complete input above and inspect the actual example row below. Latest acceptance sample records the cloud observation and counts. Review IDs, dates and counts can change on later runs.

Supported inputs

FieldType and defaultBehavior
startUrlsRequired array of URL objectsUse {"url":"https://www.yelp.co.uk/biz/dishoom-london"}. 1–100 direct HTTPS business URLs. Optional method accepts only GET; optional object userData is ignored. Search pages, business-ID-only input and remote URL-list files are unsupported.
reviewSourceString; recommendedSelect the original recommended feed or the explicit not-recommended UK archive. Archive requires empty language and lowest-rating sort; see Optional not-recommended archive.
maxReviewsPerUrlInteger; no runtime count cap if omitted1–1,000,000 accepted rows per business, subject to page/time/budget limits. The form prefill is 5.
languageString; ""The form prefill is en; in recommended mode, omitted or empty means all source-reported language groups. Archive requires an explicitly empty value. Explicit codes include en, cs, de, fr and the other choices in the input form. Availability depends on the business. These are source languages, not translations.
dateFrom, dateToOptional YYYY-MM-DD stringsInclusive bounds on normalized UTC review dates. Invalid dates or reversed ranges fail validation.
sortString; newestnewest, oldest, highest_rating, lowest_rating, or recommended. Sorting is per business. Recommended requires one explicit language.
ratingsInteger array; []Filter stars 1–5. Empty includes every rating.
keywordString; ""Case-insensitive literal substring in full review text; maximum 200 characters.
includePersonalDataBoolean; trueSet false to null reviewer name, profile URL, location and reviewer review count. No private profiles are fetched.
reviews_translateOptional language code; ""Request Yelp-provided translation in translatedText. Original text, source language, filters, ordering and row charges remain unchanged. Missing translations are null.
includePreviousReviewsBoolean; falseInclude source-attached older versions nested in each accepted parent row. No additional row charges; no complete-chain guarantee. See Optional source-attached previous versions for nullability and strict error handling.
maxPagesPerBusinessInteger; 1001–1,000 pages; reaching a safety bound is reported as incomplete.
maxConcurrencyInteger; 21–4 businesses processed concurrently. Rows from different businesses can interleave.
requestTimeoutSecs, maxRetriesIntegers; 15, 1Request timeout 3–20 seconds; 0–2 retries for eligible transient failures.
runTimeoutSecsInteger; 100Internal deadline 10–105 seconds. It leaves time to save diagnostics within the 120-second default Actor timeout.
dnsResolverString; systemgoogle-doh is an explicit alternative when local DNS returns synthetic/private addresses. Public-IP and TLS checks stay enabled.
useProxyBoolean; falseEnable only when supplying your own proxy configuration.
proxyConfigurationOptional objectApify proxy configuration or custom proxy URLs; requires useProxy=true. Configuration failures are explicit. Paid proxy operation is unverified and may incur additional charges.

The Supported inputs table lists the accepted controls and limits; the Actor input form also validates those fields. Unknown fields are rejected. Matching URLs/aliases and repeated review IDs share a per-run deduplication budget. All-language chronological/rating streams are merged before applying the per-business limit; no global recommended ranking is invented.

What each row contains

FieldsTypeMeaning
id, businessIdStringSource review and business identifiers. Deduplicate downstream by (businessId, id).
businessName, businessUrlStringBusiness name and validated input URL, with tracking/fragment normalization. Domains are not silently changed.
businessAddressString or nullPublic business address.
overallRating, reviewCountNumber or null; integer or nullBusiness-level rating/count, separate from the individual review and exported row count.
date, rating, textISO timestamp; number 1–5; stringReview date, review stars and full source-provided review body.
languageString or nullSource-reported review language.
reactionHelpfulCount, reactionThanksCount, reactionLove_thisCount, reactionOh_noCountInteger or nullSource reaction counts; unknown values remain null.
reviewerName, reviewerUrl, reviewerLocationString or nullPublic reviewer fields, or null when privacy suppression is enabled.
reviewerReviewCountInteger or nullThe reviewer's public review count.
photoUrlsArray of stringsPublic review-photo URLs, not downloaded images.
ownerResponse, ownerResponseDateString or nullPublic reply text and normalized reply timestamp, when available.
businessCategoriesArray of objectsSource category title and alias; either member may be null.
sourceHash, scrapedAt, sourceModeStringResponse SHA-256, retrieval time and collection mode.
previousReviews, previousReviewsSourceStatus, previousReviewsCompleteOptional array or null; string; falsePresent only with includePreviousReviews=true. Source-attached versions, source-field availability and an explicitly incomplete chain; details below.

Reviews is the compact dataset view; All fields exposes the complete row. Unknown optional values are null rather than invented zeros. Here is one unmodified row from the cloud sample:

{
"id": "n_9hZHVgXyqz_5Qf5udw4A",
"businessId": "oK_SLmmAVQg3meguh7LrIA",
"businessName": "Dishoom",
"businessUrl": "https://www.yelp.co.uk/biz/dishoom-london",
"businessAddress": "12 Upper Saint Martin's Lane\nLondon WC2H 9FB",
"overallRating": 4.5,
"reviewCount": 3066,
"date": "2026-09-27T20:29:42Z",
"rating": 4,
"text": "Great if you like spicy food. Even the samosa was too spicy for my friend. Our servers were friendly and informative. Before we even sat down, while waiting in line, they gave us fortified wine and tea. Unfortunately, they don't do special orders and the only things my friend could enjoy were the cauliflower, white rice, and naan. The atmosphere is young, lively and loud. They make good cocktails too.",
"language": "en",
"reactionHelpfulCount": 0,
"reactionThanksCount": 0,
"reactionLove_thisCount": 0,
"reactionOh_noCount": 0,
"reviewerName": "Holly R.",
"reviewerUrl": "https://www.yelp.co.uk/user_details?userid=eDk38AVNzCvOxhwQEfrZ9Q",
"reviewerReviewCount": 461,
"reviewerLocation": "Boynton Beach, United States",
"photoUrls": [],
"ownerResponse": null,
"ownerResponseDate": null,
"businessCategories": [
{
"title": "Indian",
"alias": "restaurants"
}
],
"sourceHash": "848cc3c142a724bcac32daca40b3dfd0dbb4a84ba9e020ffb48274fe2f854f67",
"scrapedAt": "2026-09-30T12:27:10.476018+00:00",
"sourceMode": "public-review-feed"
}

Owner replies are present only when the source provides them. A separate local hotel check observed a public reply; the five-review default sample does not establish reply coverage across businesses. Do not expect replies on every review.

Completeness and limits

Read the KVS SUMMARY alongside the dataset. The following feed and reply-coverage semantics apply to the default recommended mode; archive scope is described below. SUMMARY records accepted counts, page counts, stop reasons, source HTTP/DNS observations, response hashes, errors, complete and requestSatisfied. complete=true means the requested filtered review-feed scope was exhausted with verified cursor/count and reply coverage. REVIEW_LIMIT has complete=false and requestSatisfied=true when the requested row cap is met with valid observed fields. A capped export can finish successfully without claiming complete coverage. sourceFeedComplete is true only after actual source exhaustion for every selected language. Per-language streams distinguish source exhaustion from an ordered date cutoff; they do not prove the not-recommended archive or every historical review was retrieved. Missing reply fields and missing reply dates are reported in ownerReplyCoverage, independently from explicit null replies. Reply coverage counters describe unique reviews inspected on acquired pages, including reviews outside the output cap or filters. They do not count additional billable rows. An explicit source null is absence; a missing field is unavailable, and a present reply without a usable date retains its text with a null date and incomplete coverage. A real exhausted/filtered feed can be empty; HTTP 403/404, DNS failures and missing core data are errors. Partial valid rows may remain when a run fails or reaches a limit.

  • Regional coverage is bounded. The current UK and historical CZ samples are dated evidence for those URLs, not a worldwide reliability promise; the former CZ default is currently blocked. The tested original .com and .ca URLs were blocked. The Actor does not retry through another country domain automatically.
  • Some modes are unavailable. Search/discovery, business-ID input, cross-run resume, private profiles, login-only content and a full-history guarantee are unavailable. Source-provided translation is optional in recommended mode; the separate not-recommended archive has the explicit limitations below. All-language recommended sorting remains rejected.
  • Source changes can break extraction. The public review query may change. Incomplete/challenge pages stop the target; no CAPTCHA solving, personal cookies or paywall bypass is used.
  • Proxy support is implemented but only mock-tested. No paid-proxy success or cost claim is made.
  • Migration is partial. Core names follow tri_angle/yelp-review-scraper, with documented nullability and URL-normalization differences. This is not a full replacement for either that Actor or the complete web_wanderer search/translation contract. Review the Supported inputs and What each row contains tables before migrating; preserve nullable fields and the source domain.

Pricing

The paid unit is one valid review row saved in the default dataset. Each separately saved record is another row. Inline arrays do not create extra row events. Failed requests, duplicate rows and diagnostic records do not create result events. A valid source record may have nullable optional fields; a row charge does not guarantee every field.

Apify planUSD per rowUSD per 1,000 rows
FREE0.00030.30
BRONZE0.000280.28
SILVER0.000260.26
GOLD0.000240.24
PLATINUM0.000240.24
DIAMOND0.000240.24

There is no startup event fee. FREE names the Apify subscription tier; it does not mean results are free. The Pricing tab shows the active rate before a run.

Apify platform compute, storage and transfer are charged separately, including for failed or empty runs. An explicitly enabled proxy can add provider fees. A row limit is not an all-inclusive dollar cap. Use small inputs first and inspect actual run usage. Historical owner test runs are not customer revenue or cost forecasts.

API example

Use an API token supplied through your environment, with access to this Actor:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("CnB7nTz9HF8euEGJt").call(
run_input={
"startUrls": [{"url": "https://www.yelp.co.uk/biz/dishoom-london"}],
"maxReviewsPerUrl": 5,
"language": "en",
},
memory_mbytes=256,
timeout_secs=120,
)
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("SUMMARY")
print(summary["value"]["complete"])
print(summary["value"].get("requestSatisfied"))
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["id"], review["rating"], review["text"])

For recurring exports, check each run's status and SUMMARY, then deduplicate records in your own destination. There is no cross-run checkpoint or exactly-once guarantee.

FAQ

Why did my URL return zero rows? Inspect SUMMARY. A genuine empty/filter result differs from an inaccessible page, timeout or invalid input. An error page is not a review.

Can I request every review? Omitting the review count cap still leaves page, time and budget limits. Complete historical coverage has not been demonstrated.

Will every row have photos or an owner reply? No. Empty photo arrays and null reply fields are normal when the source does not supply them.

Is this affiliated with Yelp? No. The original native-resolution Yelp icon identifies the data source; it does not imply endorsement. This is an independent tool.

Latest acceptance sample

The UK default was verified in Apify Cloud on September 30, 2026 (UTC; run finished at 2026-09-30T12:32:52.436Z, published build 0.2.3). It saved five real English reviews from Dishoom, London over one feed page, with unique source IDs, newest-first order and no recorded errors. The inline example is an unmodified row from an earlier same-day UK cloud observation, finished at 2026-09-30T12:27:11.123Z, as recorded in its provenance. These dated samples establish bounded acquisition on that UK URL.

Those cloud observations used the earlier runtime: the saved SUMMARY reported REVIEW_LIMIT with legacy complete=true and an unconfigured-default billing string. They do not establish the enhanced completion and effective-pricing diagnostics described above; a cap is not full-history coverage, and actual charges follow effective run pricing. The default sample has null owner replies and proves no reply coverage. A separate dated anonymous direct hotel observation below contains a real reply.

The earlier Czech sample is retained as historical. The Czech target returned HTTP 403 in the September 30 platform TEST and repeated cloud reproductions. Those failures emitted no review rows. It is not the current quickstart or a working-default claim.

Dated anonymous direct observation

On September 30, 2026 (UTC), an anonymous direct check of https://www.yelp.co.uk/biz/the-rubens-at-the-palace-london with English language and a one-review cap saved one genuine review with non-null owner reply text and a UTC-normalized reply date. The acquired feed page contained ten reviews and reported 136 total reviews with another page available. Its stop reason was REVIEW_LIMIT, with complete=false and requestSatisfied=true. This is a bounded direct-source observation, not an Apify Cloud acceptance result or proof of full-history coverage.

In the same dated check, the original .com automotive URL, .ca French-language business URL and historical Czech default URL returned HTTP 403 and emitted no rows. The check used the explicit dnsResolver=google-doh option, retaining public-IP, TLS certificate and hostname verification. The local system-DNS failure happened before source HTTP and was recorded separately as an environmental DNS error. A resolver change does not establish access to a route that returns an actual 403.

Optional source-attached previous versions

Set includePreviousReviews=true to include the older versions Yelp attaches to each accepted parent review. The default is false; the existing row fields and default output shape stay the same. Date, language, rating and keyword filters, sorting and the review cap apply to parent reviews. Returned versions keep source order and may fall outside the parent's date filter. They remain nested inside the parent row and do not create additional dataset rows or review charges.

When enabled, three optional fields are added:

FieldSource and nullable semantics
previousReviewsSource previousReviews[], with each version's id, UTC date, rating, full original text and language. Missing optional source values remain null. Each version includes its parent businessId, parentReviewId and the actual containing response sourceHash; reviewer profiles are not copied into versions. The existing privacy switch still nulls the parent's four public reviewer fields.
previousReviewsSourceStatusunavailable when the source field is missing; explicit_null when the source sends null; returned for an actual array, including []. The first two statuses retain previousReviews=null.
previousReviewsCompleteAlways false: these are only attached versions returned by the current response, with no guarantee of a complete version chain or archive.

Identical repeated version IDs are deduplicated in source order. A version cannot use its parent's ID; a source-declared business.encid must equal the parent business ID, including rejection of a declared null ID. Conflicting copies of an ID, malformed history and truncated version text fail the affected target when this option is enabled. The acquired page is validated before its rows are written, even for parents outside the output filter or cap. Malformed history creates no extra rows or charges. Valid parent rows persisted from earlier pages retain normal row billing. With the option disabled, history does not affect parent validation.

SUMMARY.previousReviewsCoverage is present only when enabled. It counts emitted parents and nested versions separately, distinguishes unavailable and explicitly null source fields, and reports complete=false with scope source-attached-versions-only. Its version count is not a billing event count.

Run summary fields

FieldSource and meaningNullable or incomplete semantics
complete, requestSatisfiedDerived from validated target stop reasons. Completion describes the requested filtered feed scope; satisfaction also permits a validated review cap.A cap leaves complete=false. Source, page, budget or time failures leave the affected scope unsatisfied.
targets[].streamsPer-language feed page counts, source totalCount, unique review counts and stop reasons.Empty when acquisition fails before stream initialization. Counts may be unknown before the first feed; changes or mismatches are explicit errors.
targets[].ownerReplyCoverageInspected source reply fields; counts of present, explicitly absent, unavailable and missing-date replies.Missing fields never prove reply absence. Present reply text can retain a null date; incomplete coverage is reported.
billingDetailsEffective pricing model, event rates and charge limit from the run's SDK charging manager; persisted row count from successful dataset writes.Unknown event rates have no fabricated estimate. An unlimited charge limit is null. Non-PPE or local collection has no PPE fee estimate. Row-event estimates exclude platform/proxy fees and are not verified invoices.
requests, dnsResponse status/hash and resolver observations from actual requests.Pre-source failures have no HTTP status or response hash; they are environmental diagnostics, not error-page review data.

Optional source translations

Set reviews_translate to a target language code, such as en. Each parent review keeps its original text and language, and adds translatedText, requested translationLanguage, and translationSourceStatus (returned, explicit_null, or unavailable). No extra review rows or charges are created. Keyword and language filters continue to apply to original text and source language. Source-attached previous versions retain their original fields. Missing translations remain null, and malformed present translations fail the affected target. With the default empty target these additional fields are absent.

October 1 local source validation read two native French-review pages from the UK Dishoom business: 18 unique reviews, source total 18, final cursor exhausted, with source-provided English translations. This does not establish every target language or original-domain access. The native languageCode=all relevance query returned only the English count; global all-language recommended rank remains unverified.

{"startUrls":[{"url":"https://www.yelp.co.uk/biz/dishoom-london"}],"language":"fr","reviews_translate":"en","maxReviewsPerUrl":2,"maxPagesPerBusiness":2,"maxRetries":0}

Set reviewSource to not-recommended to export the separate public not-recommended review archive. The default recommended source keeps the existing review feed, translations, previous versions and output unchanged. Archive collection currently supports explicit www.yelp.co.uk/biz/... URLs through the same UK archive domain. It does not switch US, Canadian or Czech URLs to UK.

{
"startUrls": [{"url": "https://www.yelp.co.uk/biz/dishoom-london"}],
"reviewSource": "not-recommended",
"language": "",
"sort": "lowest_rating",
"maxReviewsPerUrl": 11,
"maxPagesPerBusiness": 2,
"includePersonalData": false,
"includePreviousReviews": false,
"maxConcurrency": 1,
"maxRetries": 0,
"requestTimeoutSecs": 15,
"runTimeoutSecs": 100,
"dnsResolver": "google-doh",
"useProxy": false
}

Archive requires an empty language and sort="lowest_rating", the observed native RATING_ASC order. Explicit language filters, other sorts, translation, previous versions and proxy use fail input validation in this mode. Date, star and keyword filters apply to original source text and UTC dates while pagination continues in native rating order; there is no chronological early stop. Both values of includePersonalData suppress the four reviewer fields in archive mode. Owner reply text and its date are exported only when returned; reply author/profile fields are suppressed.

Archive rows retain the ordinary review field names and add:

FieldMeaning
sourceModepublic-not-recommended-archive-ssr.
sourcePopulationnot-recommended; kept separate from recommended and admin-removed counts.
sourceUrl, sourcePathActual same-domain archive page URL and Apollo edge/reference path binding the review to its business.
languageSourceStatusunavailable for a missing source field, explicit_null for source null, or returned for a source string. Missing language remains null; country, locale and text are never used to infer it.
ownerResponseSourceStatusThe same availability states for the source public reply field. A returned reply may lack a date, which remains null.
archiveUnavailableFieldsNames of business rating/address/count, reaction, photo and category fields unavailable in this archive contract. Their values, including photoUrls and businessCategories, are null in archive rows.

The ordinary reviewCount remains null because the archive count is a separate population. SUMMARY.targets[].sourceTotal records the not-recommended count; removedSourceTotal records the separate admin-removed count. Admin-removed nodes with null text are diagnostic observations and produce no review row or row charge. Duplicates likewise produce no additional charge. Each successfully persisted full-text archive row uses the existing dataset row billing event; source parsing itself adds no billable events.

An anonymous direct observation on September 30, 2026 (UTC) returned the Dishoom archive's native second page with HTTP 200. A replay of that response and the saved first page verified 20 unique full-text reviews, cursor offsets 9→19, a not-recommended count of 769, and a separate removed count of 179. All 20 observed review language fields were missing. These are bounded direct-source and offline observations; they do not establish cloud acceptance or a complete archive export.

SUMMARY records page URLs/hashes, cursors, unique observations and the next URL. A requested 11-row cap after two acquired pages reports REVIEW_LIMIT, complete=false, requestSatisfied=true, and sourceFeedComplete=false. Page, time, source refusal and charge limits remain incomplete. Malformed/truncated content, conflicting review identities, business/cursor/count mismatches or reversed native rating order fail explicitly; an entire acquired page is validated before its rows are persisted, even if a smaller cap would hide a bad later node. Already persisted earlier pages remain available with incomplete diagnostics. Archive requests have no retries, redirects or GraphQL fallback; public-IP, hostname and TLS validation remain enabled.