
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Extract public Google Maps reviews for a place URL or place ID, including the text, stars, date, owner reply, and the place itself.
Get every public Google Maps review for any place: text, translation, stars, dates, owner replies, photos and visit details, together with the place's name, address, rating and categories. Paste a place URL, a search URL or a place ID and get 10 newest reviews in a couple of seconds. No login, no API key, and $0.40 per 1,000 reviews.
1 day to catch new reviews for your locations.https://www.google.com/maps/search/pizza+near+times+square) or place IDs.0 for all reviews).| Field | What it does |
|---|---|
startUrls | Google Maps place URLs, search URLs (first page, up to 20 places) or ?cid= links |
placeIds | Google place IDs such as ChIJLU7jZClu5kcR4PcOOO6p3I0 |
maxReviews | Reviews per place, default 10; 0 means every review |
reviewsSort | newest, mostRelevant, highestRanking or lowestRanking |
reviewsStartDate | Only reviews on or after a date: 2024-05-03 or relative like 8 days, 3 months |
reviewsFilterString | Keep only reviews containing these words |
language | Language of labels, relative dates and translations (default en) |
personalData | Include reviewer name, ID, profile URL, photo and review link (default on) |
{
"startUrls": [
{ "url": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!3m1!4b1!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813" }
],
"maxReviews": 10,
"reviewsSort": "newest",
"language": "en",
"personalData": true
}
One row per review. The main fields:
| Field | Description |
|---|---|
text, textTranslated | Review text as written, and Google's translation into your language |
stars, rating | Star rating 1–5 (rating holds partner scales such as 4/10) |
publishedAtDate, publishAt | Exact ISO time and Google's relative time ("3 months ago") |
responseFromOwnerText, responseFromOwnerDate | Owner reply and its exact time |
reviewImageUrls | Photos attached to the review |
reviewContext, reviewDetailedRating | Visit details and aspect ratings |
name, reviewerId, reviewerUrl, reviewerPhotoUrl, reviewerNumberOfReviews, isLocalGuide | Reviewer details (when personalData is on) |
reviewId, reviewUrl, visitedIn, originalLanguage, translatedLanguage, likesCount | Review metadata |
title, address, location, categoryName, totalScore, reviewsCount, placeId, cid, fid, url … | The place the review belongs to |
Example row from a test run (reviewer details replaced with a fictional person):
{
"searchString": "place_id:ChIJHQQciMZRqEcR2X4b8-vf5Bk",
"reviewerId": "100000000000000000001",
"reviewerUrl": "https://www.google.com/maps/contrib/100000000000000000001?hl=en",
"name": "Jamie Rivers",
"reviewerNumberOfReviews": 61,
"isLocalGuide": true,
"text": "Great value for money. Services are great and the doormen were very helpful on arrival and departure.",
"textTranslated": null,
"publishAt": "3 months ago",
"publishedAtDate": "2026-07-04T13:42:27.323Z",
"likesCount": 3,
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2t3MVUzZHZNSFUyTlRodGNURkJjSHBSY0Zkd2FYYxAB",
"reviewOrigin": "Google",
"stars": 5,
"rating": null,
"responseFromOwnerDate": "2026-07-07T13:22:32.000Z",
"responseFromOwnerText": "Dear Jamie,\n\nMany thanks for sharing your positive feedback.",
"reviewImageUrls": [],
"reviewContext": { "Trip type": "Vacation" },
"reviewDetailedRating": { "Rooms": 5, "Service": 5, "Location": 5 },
"visitedIn": null,
"originalLanguage": "en",
"translatedLanguage": null,
"title": "Hotel Adlon Kempinski Berlin",
"placeId": "ChIJHQQciMZRqEcR2X4b8-vf5Bk",
"fid": "0x47a851c6881c041d:0x19e4dfebf31b7ed9",
"cid": "1865862350127202009",
"address": "Unter den Linden 77, 10117 Berlin, Germany",
"city": "Berlin",
"countryCode": "DE",
"location": { "lat": 52.5162669, "lng": 13.3801573 },
"categoryName": "Hotel",
"totalScore": 4.6,
"language": "en",
"scrapedAt": "2026-10-14T18:02:20.627Z"
}
You pay $0.40 per 1,000 reviews ($0.0004 per saved review, event review-scraped), plus the small platform usage of the run (compute and proxy traffic). For example, 1,000 newest reviews of one place cost about $0.40 in review fees plus well under one cent of usage. Places that cannot be resolved and filtered-out reviews are not charged. Set a maximum total charge on the run and the actor stops cleanly when it is reached.
Is it legal to scrape Google Maps reviews?
The actor only reads reviews that anyone can see without signing in. Personal data such as reviewer names is protected by laws like the GDPR, so only collect it when you have a legitimate reason, or switch personalData off.
Do I need a Google account, API key or proxy? No login and no API key. The default datacenter proxy works; switch to residential only if Google starts refusing requests.
How many reviews can I get?
As many as the place shows. Set maxReviews to 0 for all of them; large places with hundreds of thousands of reviews take a while, about 1,000 reviews per 25 seconds per place.
Why is a field empty? Google fills fields only when they exist: many reviews have stars but no text, no owner reply or no photos.
Can I schedule it or use it from code? Yes. Schedule runs in the console, or start them through the API and fetch the dataset as JSON, CSV or Excel.
I am moving from another Google Maps reviews tool. Do the inputs match?
startUrls, placeIds, maxReviews, reviewsSort, reviewsStartDate, reviewsFilterString, language and personalData use the same names and values, and each row uses the same field names.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalGoogle Maps place URLs
Google Maps place URLs, search URLs (the first page of up to 20 places) or links with a cid.
placeIdsarrayOptionalPlace IDs
Google place IDs, 27 characters starting with ChIJ or GhIJ.
maxReviewsintegerOptionaldefault 10Number of reviews
Maximum reviews to save for each place. Use 0 to get every review the place has.
Narrow which reviews are returned. Leave a filter blank to skip it.
reviewsSortenumOptionaldefault "newest"Sort reviews by
Order of reviews. A start date only stops early when this is Newest.
reviewsStartDatestringOptionalOnly reviews newer than
Only reviews published on or after this date: an absolute date such as 2024-05-03, or a relative one such as 8 days or 3 months. With Newest sorting the run stops paging as soon as it passes the date.
reviewsFilterStringstringOptionaldefault ""Filter reviews by keywords
Only keep reviews whose text (original or translated) contains all of these words. Leave blank to keep every review.
languageenumOptionaldefault "en"Language
Language for place details, relative dates, review context labels and translated review text.
personalDatabooleanOptionaldefault trueReviewer details
Include the reviewer's name, ID, profile URL, photo and the review link. Turn off to drop reviewer details; the review ID is always included.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxy works for this feed. Switch to residential if Google starts refusing requests.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| title | string | Place name |
| url | string | Google Maps link for the place |
| stars | number | null | Star rating from 1 to 5 |
| name | string | null | Reviewer name |
| reviewUrl | string | null | Link to the review |
| text | string | null | Review text in the original language |
| textTranslated | string | null | Review text translated into the requested language |
| publishAt | string | null | Relative publication time |
| publishedAtDate | string | null | Publication time in ISO 8601 |
| likesCount | number | null | Likes on the review (filled for the reviews Google shows first on the place) |
| reviewId | string | null | Review identifier |
| reviewOrigin | string | null | Where the review was posted |
| reviewerId | string | null | Reviewer identifier |
| reviewerUrl | string | null | Reviewer profile link |
| reviewerPhotoUrl | string | null | Reviewer photo |
| reviewerNumberOfReviews | number | null | How many reviews this person has written |
| isLocalGuide | boolean | Whether the reviewer is a Local Guide |
| responseFromOwnerText | string | null | Owner reply |
| responseFromOwnerDate | string | null | When the owner replied |
| reviewImageUrls | array | Photos attached to the review |
| reviewContext | object | Visit details such as wait time |
| reviewDetailedRating | object | Aspect ratings such as food or service |
| visitedIn | string | null | Month of the visit |
| originalLanguage | string | null | Language of the review text |
| translatedLanguage | string | null | Language of the translation |
| rating | string | null | Rating from a partner scale, such as 4/10 |
| placeId | string | null | Google place ID |
| fid | string | null | Feature ID |
| cid | string | null | Customer ID |
| address | string | null | Full address |
| street | string | null | Street |
| city | string | null | City |
| postalCode | string | null | Postal code |
| state | string | null | State or region |
| countryCode | string | null | Country code |
| neighborhood | string | null | Neighborhood |
| location | object | null | Latitude and longitude |
| categoryName | string | null | Primary category |
| categories | array | Categories |
| totalScore | number | null | Average place rating |
| reviewsCount | number | null | Total reviews on the place |
| permanentlyClosed | boolean | Place is permanently closed |
| temporarilyClosed | boolean | Place is temporarily closed |
| price | string | null | Price level |
| hotelStars | string | null | Hotel class |
| imageUrl | string | null | Place photo |
| kgmid | string | null | Knowledge Graph ID |
| businessProfileId | string | null | Business profile ID |
| isAdvertisement | boolean | Whether the place listing is an ad |
| searchString | string | Input URL or place ID that produced the row |
| language | string | Language requested for the run |
| scrapedAt | string | When the row was saved |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Review scraped | $0.0004 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/google-maps-reviews-scraper').call({
"startUrls": [
{
"url": "https://www.google.com/maps/place/Eiffel+Tower/@48.8583701,2.2944813,17z/data=!3m1!4b1!4m6!3m5!1s0x47e66e2964e34e2d:0x8ddca9ee380ef7e0!8m2!3d48.8583701!4d2.2944813"
}
],
"maxReviews": 10,
"reviewsSort": "newest",
"reviewsStartDate": "2024-01-01",
"language": "en",
"personalData": true,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/google-maps-reviews-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/google-maps-reviews-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Reviews of a place by its place ID.
Newest reviews of a place within a date window.
Lowest-rated reviews that mention a keyword.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.