Yelp Reviews Scraper API
for the full text of every review, not an excerpt
Pull the whole review feed for any Yelp place as JSON. Text, rating, date, the reviewer behind it, photos and the owner's reply, plus the reviews Yelp keeps out of the main feed.
of requests succeed
median response
95% finish faster
per 1k scrapes at volume
Yelp reviews move with every release. Your parser shouldn't care.
- A crawler to build and keep running
- A feed Yelp's recommendation software thins out
- Offsets that shift as new reviews land
- Owner replies nested inside the review
- Star and language counts only on the page
One GET Request. That's the whole integration.
Start with just a query. Add more parameters when your use case needs them.
curl -G 'https://api.hasdata.com/scrape/yelp/reviews' \
--data-urlencode 'placeId=-4ofMtrD7pSpZIX5pnDkig' \
--data-urlencode 'rating=5,4' \
--data-urlencode 'languageCode=en' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json'placeId * Place IDquery Search QuerysortBy Sort Byrating RatinglanguageCode LanguagenotRecommended Not Recommendeddomain Domainstart Result Offsetnum Number of ResultsThe feed, the totals, and the cursor
One call answers with the reviews themselves, the place they belong to with its star breakdown, and the offset to ask for the next page.
// Up to 49 per call, sorted by relevance unless you ask otherwise.
[
{
"position": 3,
"id": "evLdvQSpWVen90DxUhwCmQ",
"link": "https://www.yelp.com/biz/mozarts-coffee-roasters-austin?hr…",
"rating": 5,
"date": "2026-06-13T14:06:40-05:00",
"user": {
"name": "Daisy P.",
"userId": "lEhBWqmr7aw2WGmSd0ye7Q",
"link": "https://www.yelp.com/user_details?userid=lEhBWqmr7aw2WGmSd…",
"thumbnail": "https://s3-media0.fl.yelpcdn.com/photo/QsVUw-jxzspimbJE6KA…",
"address": "Houston, TX",
"reviews": 323,
"friends": 46,
"photos": 1746,
"eliteYear": "26",
"isEliteAllStar": true
},
"comment": {
"text": "Mozart's is a stole in Austin, it is a must to stop by whe…",
"language": "en"
},
"reactions": [
{
"type": "HELPFUL",
"label": "Helpful",
"count": 0
},
{
"type": "THANKS",
"label": "Thanks",
"count": 0
},
{
"type": "LOVE_THIS",
"label": "Love this",
"count": 0
},
{
"type": "OH_NO",
"label": "Oh no",
"count": 0
}
],
"photos": [
{
"link": "https://s3-media0.fl.yelpcdn.com/bphoto/jPTEvEGGSXCiuV6TF1…",
"width": 1500,
"height": 2000
},
{
"link": "https://s3-media0.fl.yelpcdn.com/bphoto/6uNWxi-8lyLFsLX_lY…",
"caption": "Menu",
"width": 1709,
"height": 2000
},
{
"link": "https://s3-media0.fl.yelpcdn.com/bphoto/n2ROCPPnjmJFq7LiQo…",
"width": 1500,
"height": 2000
}
],
"ownerReply": {
"owner": {
"name": "Christine K.",
"role": "MANAGER",
"thumbnail": "https://s3-media0.fl.yelpcdn.com/buphoto/L0mg7YATAPxwFdyZL…"
},
"comment": "Thank you for visiting the cafe and taking time to share a…",
"date": "2026-06-15T07:32:26-05:00"
}
}
]rating numberStars the reviewer gave, 1 to 5
comment.text stringFull review text, not an excerpt
comment.language stringTwo-letter language of the text
date stringWhen it was posted, ISO 8601 with the place's offset
user objectname, userId, link, thumbnail, address, and the reviewer's own review, friend and photo counts. Elite reviewers also carry eliteYear as a two-digit string and isEliteAllStar
reactions object[]Helpful, Thanks, Love this and Oh no, each with its count
ownerReply objectThe business reply, when the owner left one
photos object[]Photos attached to the review
videos / tags object[], string[]Video clips attached to the review and Yelp's own labels on it, on the reviews that carry them
previousReviews object[]Earlier versions, when the reviewer edited
isNotRecommended booleanSet on reviews from the filtered feed
link stringPermalink to the review on Yelp
id / position string, numberReview id and its place in this page
// The place the feed belongs to, with the counts Yelp shows on the page.
{
"placeId": "-4ofMtrD7pSpZIX5pnDkig",
"business": "Mozart's Coffee Roasters",
"businessAlias": "mozarts-coffee-roasters-austin",
"businessUrl": "https://www.yelp.com/biz/mozarts-coffee-roasters-austin",
"totalResults": 2147,
"rating": 4,
"reviewCountsByRating": [
132,
152,
238,
711,
919
],
"reviewCountsByLanguage": [
{
"language": "en",
"count": 2147
},
{
"language": "es",
"count": 5
}
]
}business / businessAlias stringPlace name and its Yelp slug
businessUrl stringPlace page on Yelp
totalResults numberHow many reviews match the language filter, which defaults to English, so this is the whole feed only when you widen it
rating numberOverall star rating
reviewCountsByRating number[]Counts from one star to five, so the distribution comes for free
reviewCountsByLanguage object[]How many reviews sit in each language
placeId stringThe id you passed in, echoed back
// Ask for the next page with nextPageOffset, or stop when hasNextPage turns false.
{
"currentOffset": 0,
"perPage": 49,
"hasNextPage": true,
"nextPageOffset": 49,
"nextPageToken": "eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoib2Zmc2V0Iiwib2Zmc2V0Ijo0OX0"
}currentOffset numberWhere this page starts
perPage numberRequested page size, up to 49. Count the array to see how many actually came back
hasNextPage booleanWhether another page exists
nextPageOffset numberPass it as start to continue
nextPageToken stringOpaque cursor for the same position
The hard parts already happened
JS rendering, the filtered feed, and residential proxy rotation run on our side. Your code sends one GET and reads fields.
Discover similar
scrapers and APIs
to expand your projects.
Yelp Search Scraper API
Local Business Data • $0.75 / 1k Request
Google Maps Reviews API
Sentiment Analysis • $0.37 / 1k Request
Fits right into your stack.
Works with the tools you already use.
View Documentation ->Teams that deleted their scraper
Now it's the part of the pipeline they don't think about
HasData delivers exactly what we need: speed and comprehensive search features. It's the fastest API we've used in this space. Plus, their customer support is fantastic.
We rely on HasData for search performance data and broader scraping needs. Their APIs deliver highly structured data that integrates directly into our platforms.
Great web scraping API which is incredibly easy to use. It requires minimal effort to get up and running, and the documentation is very clear and helpful.
I needed to scrape some information they didn't already support, and they wrote the code for me right away, which was super nice of them.
We were particularly impressed with how easily we could integrate HasData into our existing workflow.
Plans that get cheaper at scale
Fixed price, fixed volume, no surprises at the end of the month. Upgrade when you need more.
Free
Startup
Business
RecommendedGrowth
Monthly scrape volume
Custom price based on required volume
Past 100M credits a month, or terms the self-serve plans do not cover. We shape the contract around your workload. Past 100M credits a month, or need terms the self-serve plans do not cover? We shape the contract, concurrency, and support around your workload.
HasData accesses publicly available data only. Yelp's terms may restrict automated access; you are responsible for compliance. Where data includes personal information, ensure a lawful basis under GDPR/CCPA.
Questions, answered
Per successful request. The number of reviews that come back does not change the price, and a failed request costs nothing.
Yes, a one-time trial of 100 scrapes with every field included. No credit card required.
Paid plans start at $49 per month billed monthly for 20,000 scrapes and scale to 10 million a month. The unit price drops with volume, from $2.45 down to $0.75 per 1,000 scrapes.
From the Yelp Search Scraper API. Search by keyword and location, and every business comes back with its placeId, ready to pass here. The id also sits in the Yelp URL after /biz/.
As many as the place has. The response returns the total and the offset for the next page, so you keep asking until it reports no next page.
Yes, with notRecommended set to true. Yelp's recommendation software keeps part of the feed out of the main list, and those reviews come back with isNotRecommended on them. They arrive without photos, reactions or permalinks, so the objects are thinner than the ones in the main feed.
Yes. Sort by date, rating, relevance, or by Yelp Elite reviewers first. Filter by star rating, by language, or search the review text with a keyword. One quirk to know: Yelp ignores the rating filter when a keyword is set, so a text search returns matching reviews of every rating.
Yes, when the business left one. The reply comes back on the review it answers, so you do not need a second pass to match them up.
Yes. Pass the domain, and the endpoint reads that country's site. All 41 Yelp domains are supported, from yelp.co.uk to yelp.co.jp.
No. Requests run on HasData's infrastructure, so there's nothing to provision or maintain. You're responsible for using the results in line with each target site's terms and applicable law.
Your first Yelp review feed
is minutes away
100 scrapes free · no credit card