{
  "data": {
    "id": "JH65XCXfaCu7jh0t2",
    "actId": "SScmkjFpc4NuTczgt",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-21T05:52:03.872Z",
    "finishedAt": "2026-10-21T05:52:10.346Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 6320,
      "runTimeSecs": 6.32,
      "computeUnits": 0.007022222222222222,
      "imageSizeBytes": 356001280
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Maps Review & Contributor Activity Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What do you want to collect?\",\n      \"type\": \"string\",\n      \"description\": \"Reviews of places you list, reviews of places found by a search, or everything specific Google reviewers have published.\",\n      \"enum\": [\n        \"place\",\n        \"search\",\n        \"author\"\n      ],\n      \"enumTitles\": [\n        \"Reviews of specific places (links or IDs)\",\n        \"Find places by search, then collect their reviews\",\n        \"Everything specific reviewers have written\"\n      ],\n      \"default\": \"place\",\n      \"prefill\": \"place\",\n      \"editor\": \"select\"\n    },\n    \"placeUrls\": {\n      \"title\": \"Places\",\n      \"type\": \"array\",\n      \"description\": \"Google Maps place links or IDs, one per line. Accepted: place links (also shared maps.app.goo.gl, goo.gl, g.page and share.google links, ?cid= links and review links), Place IDs starting with ChIJ, feature IDs like 0x89c259ab3c1ef289:0x3b67a41175949f55 and numeric CIDs. Used when collecting reviews of specific places.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"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!16zL20vMDJqODE\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Searches\",\n      \"type\": \"array\",\n      \"description\": \"Google Maps searches such as \\\"dentists in Austin, TX\\\" or \\\"ramen Shibuya Tokyo\\\". Include a city or area in each search. Used when finding places by search.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxPlacesPerQuery\": {\n      \"title\": \"Places per search\",\n      \"type\": \"integer\",\n      \"description\": \"How many places to take from each search. One Google search lists about 120 to 360 places; when you ask for more, the actor also searches sub-areas of the same region to reach them.\",\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"default\": 20\n    },\n    \"contributorUrls\": {\n      \"title\": \"Reviewers\",\n      \"type\": \"array\",\n      \"description\": \"Google Maps reviewer profile links (for example https://www.google.com/maps/contrib/108763873723673205857, or a shared maps.app.goo.gl profile link) or numeric reviewer IDs. Used when collecting everything specific reviewers have written.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxReviews\": {\n      \"title\": \"Maximum reviews per place or reviewer\",\n      \"type\": \"integer\",\n      \"description\": \"Upper limit of reviews collected for each place, or for each reviewer. Google publishes up to 200 contributions per reviewer.\",\n      \"minimum\": 1,\n      \"maximum\": 200000,\n      \"default\": 50,\n      \"prefill\": 5\n    },\n    \"sortBy\": {\n      \"title\": \"Sort reviews by\",\n      \"type\": \"string\",\n      \"description\": \"Order of a place's reviews. Newest first and most relevant reach a place's complete review history; Google lists at most 188 reviews per star level in rating order.\",\n      \"enum\": [\n        \"newest\",\n        \"relevant\",\n        \"highest_rating\",\n        \"lowest_rating\"\n      ],\n      \"enumTitles\": [\n        \"Newest first\",\n        \"Most relevant\",\n        \"Highest rating first\",\n        \"Lowest rating first\"\n      ],\n      \"default\": \"newest\",\n      \"editor\": \"select\"\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language of Google Maps labels such as \\\"2 weeks ago\\\". Reviews written in another language also come with Google's translation into this language.\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"pt-BR\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"zh-TW\",\n        \"ar\",\n        \"ru\",\n        \"hi\",\n        \"tr\",\n        \"nl\",\n        \"pl\",\n        \"id\",\n        \"th\",\n        \"vi\",\n        \"he\",\n        \"sv\",\n        \"uk\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Portuguese (Brazil)\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese (Simplified)\",\n        \"Chinese (Traditional)\",\n        \"Arabic\",\n        \"Russian\",\n        \"Hindi\",\n        \"Turkish\",\n        \"Dutch\",\n        \"Polish\",\n        \"Indonesian\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Hebrew\",\n        \"Swedish\",\n        \"Ukrainian\"\n      ],\n      \"default\": \"en\",\n      \"editor\": \"select\"\n    },\n    \"reviewsNewerThan\": {\n      \"title\": \"Only reviews from\",\n      \"type\": \"string\",\n      \"description\": \"Keep reviews dated on or after this day, for example 2026-01-01, or a period such as 30 days. Reviews are then read newest first.\",\n      \"editor\": \"datepicker\",\n      \"dateType\": \"absoluteOrRelative\",\n      \"sectionCaption\": \"Filters\"\n    },\n    \"reviewsOlderThan\": {\n      \"title\": \"Only reviews until\",\n      \"type\": \"string\",\n      \"description\": \"Keep reviews dated on or before this day. Combine with \\\"Only reviews from\\\" for a date range.\",\n      \"editor\": \"datepicker\",\n      \"dateType\": \"absoluteOrRelative\"\n    },\n    \"keyword\": {\n      \"title\": \"Only reviews mentioning\",\n      \"type\": \"string\",\n      \"description\": \"Words a review must mention, for example \\\"parking\\\" or \\\"long wait\\\". For places this uses Google's own review search, which also matches close word forms.\",\n      \"editor\": \"textfield\"\n    },\n    \"starRatings\": {\n      \"title\": \"Star ratings\",\n      \"type\": \"array\",\n      \"description\": \"Keep only reviews with these star ratings. Leave empty for all ratings.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\"\n        ],\n        \"enumTitles\": [\n          \"1 star\",\n          \"2 stars\",\n          \"3 stars\",\n          \"4 stars\",\n          \"5 stars\"\n        ]\n      }\n    },\n    \"onlyWithText\": {\n      \"title\": \"Only reviews with written text\",\n      \"type\": \"boolean\",\n      \"description\": \"Skip star-only reviews that have no written text.\",\n      \"default\": false\n    },\n    \"ownerReplyFilter\": {\n      \"title\": \"Owner reply\",\n      \"type\": \"string\",\n      \"description\": \"Keep all reviews, only reviews the business replied to, or only reviews still without a reply.\",\n      \"enum\": [\n        \"any\",\n        \"withReply\",\n        \"withoutReply\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Only reviews with an owner reply\",\n        \"Only reviews without an owner reply\"\n      ],\n      \"default\": \"any\",\n      \"editor\": \"select\"\n    },\n    \"onlyWithPhotos\": {\n      \"title\": \"Only reviews with photos or videos\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only reviews that include photos or videos.\",\n      \"default\": false\n    },\n    \"reviewLanguages\": {\n      \"title\": \"Review languages\",\n      \"type\": \"array\",\n      \"description\": \"Keep only reviews written in these languages, as two-letter codes such as en, es, ko. Leave empty for all languages.\",\n      \"editor\": \"stringList\"\n    },\n    \"monitoringKey\": {\n      \"title\": \"Only new reviews since the last run (monitoring name)\",\n      \"type\": \"string\",\n      \"description\": \"Give scheduled runs the same name, for example my-restaurants. Each run then returns only reviews added or edited since the previous run with that name.\",\n      \"editor\": \"textfield\",\n      \"sectionCaption\": \"Output options\"\n    },\n    \"includePlaceSummary\": {\n      \"title\": \"Add a place summary record\",\n      \"type\": \"boolean\",\n      \"description\": \"Adds one record per place with its rating breakdown by stars, review topics, location, contact details and how many reviews were collected. These records have recordType \\\"place\\\".\",\n      \"default\": false\n    },\n    \"includeContributorSummary\": {\n      \"title\": \"Add a reviewer summary record\",\n      \"type\": \"boolean\",\n      \"description\": \"Adds one record per reviewer with their Local Guide level, points and lifetime contribution counts. These records have recordType \\\"contributor\\\".\",\n      \"default\": false\n    },\n    \"includeReviewerDetails\": {\n      \"title\": \"Include reviewer names and profiles\",\n      \"type\": \"boolean\",\n      \"description\": \"Turn off to leave out reviewer names, profile pictures, profile links and reviewer IDs from place reviews.\",\n      \"default\": true\n    },\n    \"enrichReviewerProfiles\": {\n      \"title\": \"Add likes, edit dates and Local Guide levels (slower)\",\n      \"type\": \"boolean\",\n      \"description\": \"For place reviews, also open each reviewer's public profile to add likes, first-published and edited dates, view counts, owner-reply dates and the reviewer's Local Guide level. Adds one request per reviewer. Reviews by private profiles, or older than a reviewer's 200 most recent contributions, keep the standard fields.\",\n      \"default\": false\n    },\n    \"includePartnerReviews\": {\n      \"title\": \"Add hotel reviews from partner sites (Tripadvisor, Trip.com, …)\",\n      \"type\": \"boolean\",\n      \"description\": \"Hotels on Google Maps also show reviews from partner sites such as Tripadvisor, Trip.com or Priceline. Turn on to add those reviews as separate records (recordType partnerReview), up to Max reviews per partner site, newest first. Places without partner reviews are not affected.\",\n      \"default\": false\n    },\n    \"includePhotoDetails\": {\n      \"title\": \"Add photo details (size and upload date, slower)\",\n      \"type\": \"boolean\",\n      \"description\": \"For place reviews with photos or videos, add the width, height and upload date of each one. Adds one request per photo.\",\n      \"default\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Google Maps Review & Contributor Activity Scraper\r\n\r\nTurn Google Maps reviews into a clean spreadsheet. Paste a list of places, describe the places you want with a search such as *\"dentists in Austin, TX\"*, or point at Google reviewers' profiles. You get every review's stars, full text with Google's translation, exact date, owner reply, photos and videos, food/service/atmosphere sub-ratings and visit details. No Google account, API key or cookies are needed.\r\n\r\n## What this actor does\r\n\r\n- **Whole review histories, not a sample.** Newest-first and most-relevant orders go all the way back to a place's first review (a place with 27,335 reviews returned all 27,335).\r\n- **Every way of choosing places.** Mix place links, Place IDs (`ChIJ…`), feature IDs (`0x…:0x…`), CIDs, shared `maps.app.goo.gl` / `share.google` / `g.page` links and review links; search like a local (\"dentists in Austin, TX\") and expand into sub-areas to reach around 1,000 places; or collect up to 200 recent contributions per reviewer profile.\r\n- **Filters, order and monitoring.** Date range, keywords, stars, written text, owner replies, photos/videos and review language; newest, most relevant, highest or lowest rating; scheduled runs with `monitoringKey` return only reviews added or edited since the previous one.\r\n- **Rich, honest records.** Full text with Google's translation, exact dates, owner replies, photos and videos, sub-ratings, visit context, reviewer identity, place facts, rating histogram and topic chips. Every row says whether the requested order was confirmed, and place summaries say why collection stopped.\r\n- **Empty fields are omitted.** Fields Google doesn't show for a record are left out instead of being empty; links to places that no longer exist are reported, never swapped for a lookalike business.\r\n\r\n\r\n| Mode | You provide | You get |\r\n|---|---|---|\r\n| Reviews of specific places | Links or IDs of places | Reviews of each place, plus optional place summaries |\r\n| Find places by search | Searches such as \"ramen Shibuya Tokyo\" | The places Google ranks for each search, their reviews, and the search and rank they came from |\r\n| Everything specific reviewers have written | Reviewer profile links or numeric IDs | Each reviewer's reviews and star-only ratings across all places, plus optional reviewer summaries |\r\n\r\n## Output per record\r\n\r\nEvery record has a `recordType`: `review` (a place review), `authorReview` (a reviewer's contribution), and, when enabled, `place` and `contributor` summary records. Fields that Google does not show for a record are left out instead of being empty.\r\n\r\n### Place review (`review`)\r\n\r\n```json\r\n{\r\n  \"recordType\": \"review\",\r\n  \"reviewId\": \"Ci9DQUlRQUNvZENodHljRjlvT2twcVJsbFlkVUV0WjBGcldrNHdVRFpxWjBoc01YYxAB\",\r\n  \"rating\": 5,\r\n  \"reviewText\": \"Absolutely stunning at night, the sparkle every hour is magical.\",\r\n  \"reviewLanguage\": \"en\",\r\n  \"reviewDate\": \"2026-10-19T09:31:51.751+00:00\",\r\n  \"reviewDateOriginal\": \"8 minutes ago\",\r\n  \"reviewUrl\": \"https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlR…\",\r\n  \"reviewerName\": \"Ajay C.\",\r\n  \"reviewerId\": \"113024036179217636785\",\r\n  \"reviewerProfileUrl\": \"https://www.google.com/maps/contrib/113024036179217636785/reviews\",\r\n  \"reviewerTotalReviews\": 3,\r\n  \"reviewerPhotoCount\": 3,\r\n  \"reviewerIsLocalGuide\": false,\r\n  \"subRatings\": { \"Food\": 5, \"Service\": 4, \"Atmosphere\": 5 },\r\n  \"reviewContext\": { \"Meal type\": \"Dinner\", \"Price per person\": \"$20 to $30\" },\r\n  \"visitDate\": \"Visited in October\",\r\n  \"businessName\": \"Eiffel Tower\",\r\n  \"businessRating\": 4.7,\r\n  \"businessTotalReviews\": 498339,\r\n  \"businessCategory\": \"Historical landmark\",\r\n  \"businessAddress\": \"Av. Gustave Eiffel, 75007 Paris, France\",\r\n  \"businessLatitude\": 48.8583701,\r\n  \"businessLongitude\": 2.2944813,\r\n  \"placeId\": \"ChIJLU7jZClu5kcR4PcOOO6p3I0\",\r\n  \"featureId\": \"0x47e66e2964e34e2d:0x8ddca9ee380ef7e0\",\r\n  \"cid\": \"10222232094831998944\",\r\n  \"placeUrl\": \"https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0\",\r\n  \"order\": 1,\r\n  \"sortBy\": \"newest\",\r\n  \"sortConfirmed\": true,\r\n  \"sortStatus\": \"confirmed\",\r\n  \"scrapedAt\": \"2026-10-19T09:39:52+00:00\"\r\n}\r\n```\r\n\r\nOther review fields when Google shows them: `reviewTextTranslated` + `translatedLanguage` + `originalReviewLanguage` (reviews in another language), `photosInReview`, `reviewPhotoCount`, `reviewVideoUrls`, `videosInReview`, `ownerResponseText`, `ownerResponseDateOriginal`, `ownerResponseTextTranslated`, `contextLabels`, `reviewReportUrl`, `businessCategories`, `searchQuery` and `searchRank` (search mode). `reviewerSubtitle` (the line Google prints under the reviewer's name, such as \"Local Guide · 37 reviews · 5 photos\", in the chosen language). With `enrichReviewerProfiles` on: `reviewerLocalGuideLevel`, `likesCount`, `isEdited`, `reviewCreatedAt`, `reviewViewCount` and `ownerResponseDate`. With `includePhotoDetails` on: `photoDetails`, one entry per photo or video with `url`, `width`, `height`, `uploadDate` and, for videos, `durationSeconds`.\r\n\r\n### Reviewer contribution (`authorReview`)\r\n\r\nReviewer fields (`contributorId`, `contributorName`, `contributorAvatarUrl`, `contributorProfileUrl`, `contributorLocalGuideLevel`, `contributorPoints`, `contributorTotalReviews`), the review (`reviewId`, `rating`, `reviewText`, `reviewLanguage`, `reviewDate` = last update, `reviewCreatedAt` = first published, `isEdited`, `reviewDateOriginal`, `likesCount`, `reviewViewCount`, `isRatingOnly`, `reviewUrl`, `reviewPhotoUrls`, `reviewPhotoCount`, `subRatings`, `reviewContext`, `contextLabels`, `ownerResponseText`, `ownerResponseDate`, `ownerResponseDateOriginal`), and the reviewed place (`placeName`, `placeAddress`, `placeId`, `featureId`, `placeUrl`, `placeLatitude`, `placeLongitude`, `placeCategory`, `placeRating`, `placeTotalReviews`, `placePriceRange`), plus `position` (rank in the reviewer's list), `sourceUrl` and `scrapedAt`.\r\n\r\n### Place summary (`place`, optional)\r\n\r\nName, address, all categories, coordinates, phone, website, time zone, country, description, rating, total reviews, **`ratingHistogram`** (reviews per star), **`reviewTopics`** (Google's topic chips with how many reviews mention each), **`openingHours`** (per weekday), **`partnerReviews`** (hotels and some restaurants: rating, scale, review count, link and a sample review from sites such as Tripadvisor or Booking.com), **`reviewsRemovedNotice`** (Google's notice that reviews were removed after legal complaints, shown for some places in Germany), Place ID / feature ID / CID / Knowledge Graph ID, and collection results: `reviewsDelivered`, `partnerReviewsDelivered` (with `includePartnerReviews`), `reviewsScanned`, `stopReason` (for example `requestedCountReached`, `allReviewsCollected`, `dateCutoffReached`, `noNewReviewsSinceLastRun`), `status` (`ok`, `noReviews`, `notFound`, `invalid`, `partial`) and `statusReason`.\r\n\r\n### Partner-site review (`partnerReview`, optional)\r\n\r\nWith `includePartnerReviews`, hotels also get one record per review Google shows from a partner site: `partnerSource` (for example `Tripadvisor`), `partnerReviewId`, `rating` with `ratingScale` (some sites rate out of 10), `reviewText`, `reviewDateOriginal` (Google shows partner reviews with a relative date such as \"2 weeks ago\"), `reviewerName`, `reviewUrl` (the review on the partner site), `ownerResponseText` when the hotel replied, the place fields (`businessName`, `placeId`, `featureId`, …) and `order`. Partner sites are read newest first.\r\n\r\n### Reviewer summary (`contributor`, optional)\r\n\r\nName, Local Guide level and points, points needed for the next level, bio, **`contributions`** (lifetime counts of reviews, ratings, photos, videos, answers, edits, places added and more), `status` (`public`, `private`, `notFound`) and `reviewsDelivered`.\r\n\r\n### Likes, edit dates and Local Guide levels\r\n\r\nGoogle shows likes, first-published and edit dates, view counts, owner-reply dates and exact Local Guide levels only on reviewer profiles. Reviewer mode always has them. In place and search modes, turn on `enrichReviewerProfiles` and the actor looks up each reviewer once and adds them to the matching reviews. In practice this fills about 8 in 10 reviews; the rest were written by reviewers with private profiles, or are older than the reviewer's 200 most recent contributions. `reviewerLocalGuideLevel` is added for every reviewer with a public level, including private profiles. View counts are Google's running counters and can differ slightly between two lookups. Without the option, `reviewerIsLocalGuide` is `true` for reviewers Google labels \"Local Guide\" on the review. `reviewerSubtitle` is filled when the actor knows Google's exact wording for that language and those counts; otherwise it is left out and the counts are still in `reviewerTotalReviews` and `reviewerPhotoCount`. `reviewerEmoji` and `isVerified` are not published by Google and stay in the schema for older integrations; the dishes a reviewer recommends (the old `mentionedItems`) are in `reviewContext`.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | select | `place` | `place` = reviews of the places you list; `search` = find places by search, then their reviews; `author` = everything specific reviewers wrote |\r\n| `placeUrls` | list | – | Place links or IDs, one per line: place links, shared `maps.app.goo.gl` / `share.google` / `g.page` links, `?cid=` links, review links, `ChIJ…` Place IDs, `0x…:0x…` feature IDs, numeric CIDs |\r\n| `searchQueries` | list | – | Searches like \"dentists in Austin, TX\"; include a city or area |\r\n| `maxPlacesPerQuery` | integer | `20` | Places taken from each search (1–2,000), in Google's ranking; above about 120 places the actor also searches sub-areas |\r\n| `contributorUrls` | list | – | Reviewer profile links (`https://www.google.com/maps/contrib/<id>`, or a shared `maps.app.goo.gl` profile link) or numeric reviewer IDs |\r\n| `maxReviews` | integer | `50` | Maximum reviews **per place or per reviewer** (1–200,000; reviewers publish at most 200) |\r\n| `sortBy` | select | `newest` | `newest`, `relevant`, `highest_rating`, `lowest_rating` |\r\n| `language` | select | `en` | Language of labels such as \"2 weeks ago\"; foreign-language reviews also get Google's translation into it. 23 languages |\r\n| `reviewsNewerThan` | date | – | Keep reviews from this day on, e.g. `2026-01-01` or `30 days` |\r\n| `reviewsOlderThan` | date | – | Keep reviews up to this day (use both for a range) |\r\n| `keyword` | text | – | Only reviews mentioning these words |\r\n| `starRatings` | multi-select | – | Only these star ratings, e.g. `[\"1\", \"2\"]` |\r\n| `onlyWithText` | boolean | `false` | Skip star-only reviews without written text |\r\n| `ownerReplyFilter` | select | `any` | `any`, `withReply`, `withoutReply` |\r\n| `onlyWithPhotos` | boolean | `false` | Only reviews with photos or videos |\r\n| `reviewLanguages` | list | – | Only reviews written in these languages, e.g. `ko`, `es` |\r\n| `monitoringKey` | text | – | Same name on scheduled runs → only reviews added or edited since the last run with that name |\r\n| `includePlaceSummary` | boolean | `false` | Add one summary record per place |\r\n| `includeContributorSummary` | boolean | `false` | Add one summary record per reviewer |\r\n| `includeReviewerDetails` | boolean | `true` | Turn off to leave reviewer names, pictures, profile links and IDs out of place reviews |\r\n| `enrichReviewerProfiles` | boolean | `false` | Place and search modes: also look up each reviewer's public profile to add likes, first-published and edit dates, view counts, owner-reply dates and the exact Local Guide level. Slower |\r\n| `includePartnerReviews` | boolean | `false` | Hotels: also collect the reviews Google shows from partner sites such as Tripadvisor, Trip.com or Priceline, as `partnerReview` records. `maxReviews` applies to each partner site, the same way it applies to each place |\r\n| `includePhotoDetails` | boolean | `false` | Add width, height and upload date (and video length) for every photo and video in place reviews. One extra request per photo |\r\n\r\nInputs saved for earlier versions keep working. A single `placeUrl` or `placeId`, a single `contributorUrl` and old proxy settings are all accepted. **Change in this version:** in reviewer mode, `maxReviews` now applies to each reviewer separately (it used to be a total for the whole run).\r\n\r\n### Example: newest reviews of two places\r\n\r\n```json\r\n{\r\n  \"placeUrls\": [\r\n    \"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\",\r\n    \"ChIJifIePKtZwokRVZ-UdRGkZzs\"\r\n  ],\r\n  \"maxReviews\": 200\r\n}\r\n```\r\n\r\n### Example: one- and two-star reviews for a city's top dentists\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQueries\": [\"dentists in Boise, Idaho\"],\r\n  \"maxPlacesPerQuery\": 30,\r\n  \"starRatings\": [\"1\", \"2\"],\r\n  \"reviewsNewerThan\": \"90 days\",\r\n  \"maxReviews\": 500,\r\n  \"includePlaceSummary\": true\r\n}\r\n```\r\n\r\n### Example: everything two reviewers wrote\r\n\r\n```json\r\n{\r\n  \"mode\": \"author\",\r\n  \"contributorUrls\": [\"https://www.google.com/maps/contrib/108763873723673205857\", \"100413133939170473725\"],\r\n  \"maxReviews\": 200,\r\n  \"includeContributorSummary\": true\r\n}\r\n```\r\n\r\n### Example: daily monitoring returns only new reviews\r\n\r\n```json\r\n{ \"placeUrls\": [\"ChIJifIePKtZwokRVZ-UdRGkZzs\"], \"monitoringKey\": \"my-pizzerias\", \"maxReviews\": 1000 }\r\n```\r\n\r\n## Use cases\r\n\r\n- **Reputation tracking for branches and franchises:** schedule a monitoring run over every location and get only the new reviews each morning.\r\n- **Competitor and market research:** run a search for a category and city, then compare rating breakdowns, topics and complaints.\r\n- **Customer-experience analytics:** feed full texts, translations and sub-ratings into sentiment or topic models.\r\n- **Lead generation for agencies:** find businesses with recent low ratings or without owner replies.\r\n- **Trust and safety:** review a reviewer's whole activity, spot unusual patterns, and see which places they reviewed and when.\r\n\r\n## FAQ\r\n\r\n**Do I need a Google account, API key or cookies?** No. The actor reads what Google Maps shows to anyone who is not signed in.\r\n\r\n**Do I need to set up a proxy?** No. The actor chooses its connection itself and switches automatically if Google slows it down. There are no proxy settings to configure.\r\n\r\n**Why does a place give fewer reviews than its total?** Google's total also counts reviews it no longer displays. On a full newest-first collection the actor reads everything Google still lists, and the place summary shows exactly how many reviews were read and why collection stopped.\r\n\r\n**Can I get only new reviews every day?** Yes. Set `monitoringKey` to any name and schedule the run. Set `maxReviews` high enough to cover the reviews expected between two runs.\r\n\r\n**Is the requested order trustworthy?** Every place review carries `sortConfirmed`. It is `true` only when the row continues the requested order.\r\n\r\n**What happens with a link to a closed or removed place?** It is skipped with a clear reason, and with place summaries enabled you get a `notFound` record. The actor never collects reviews from a different business with a similar name. A shared link that opens something other than a place (a reviewer profile, a photo, a video) is skipped with a reason saying what it opens.\r\n\r\n**Can I get likes or Local Guide levels for place reviews?** Yes, turn on `enrichReviewerProfiles`. It makes one extra request per reviewer, so runs take longer. The status message says how many reviews were filled.\r\n\r\n**Do I get the reviews hotels show from Tripadvisor or Booking.com?** Yes. Turn on `includePartnerReviews` and every review Google shows from those sites is added as a `partnerReview` record, up to `maxReviews` per site. The place summary also lists each partner site's rating and review count in `partnerReviews`.\r\n\r\n**Can I collect reviews in another language?** Choose a language and Google's labels plus translations come in that language. Each review's original text and language are kept as well.\r\n\r\n**Is this an official Google product?** No. It is an independent tool that collects publicly visible Google Maps data.\r\n\r\n## How many reviews can I get?\r\n\r\n- **Newest first or most relevant:** the complete history of a place, down to its first review.\r\n- **Highest or lowest rating first:** Google lists at most 188 reviews per star level in these orders. When you also pick star ratings, the actor collects the rest of those stars newest first and marks those rows with `sortConfirmed: false`.\r\n- **Reviewers:** up to 200 of each reviewer's most recently updated reviews and ratings. That is the full history of most reviewers.\r\n- **Searches:** one Google search lists about 120 to 360 places. Ask for more with `maxPlacesPerQuery` and the actor also searches up to about 80 sub-areas around them, small ones in dense city centres and larger ones where places are spread out: \"restaurants in Istanbul\" went from 200 to 1,200 places. Places far outside the searched area are left out, and small markets simply end when there are no more places (for example about 90 dentists in Bozeman, Montana).\r\n- Speed: long newest-first histories (places with 1,000+ reviews) are read in several date ranges at once and merged back into exact newest-first order, which shortens big collections; how much it saves depends on how quickly Google serves the parallel ranges (a 25,000-review walk took about 15 minutes on Apify's cloud). Several places are collected in parallel.\r\n- Filters (stars, written text, owner reply, photos, review language) are applied while reviews are read. When few reviews match, for example an owner-reply filter on a place that never replies, the actor keeps reading back through the history. Add a date range to keep such runs short; the status message and place summary show how many reviews were read.\r\n\r\n## Limitations\r\n\r\n- **Likes and edit dates in place mode** come from reviewer profiles, so reviews by private profiles, or older than a reviewer's 200 most recent contributions, can't get them. Workaround: run reviewer mode on the reviewers you care about.\r\n- **Rating-ordered collection** stops at 188 reviews per star level in Google's own order. Workaround: pick the star ratings you want; the rest of those stars are collected newest first (`sortConfirmed: false`).\r\n- **Reviewer mode** returns at most the 200 most recently updated contributions per profile; Google does not page further. Private profiles return no reviews and are reported as `private`.\r\n- **Partner-site reviews** are the ones Google shows on the hotel page, which can be far fewer than the partner site itself has (one hotel: 176 Tripadvisor reviews on Google, 7,499 on Tripadvisor), and they carry a relative date only.\r\n- **Single reviews by link:** a review link is read as its place, and that place's reviews are collected. Use `keyword` or a date range to find one review quickly.\r\n- **Price level** is not part of Google's public data for signed-out visitors. **Photo locations** are not published: Google returns the place's position for every photo, so it is not output.\r\n- **Very large places take time:** a full 500,000-review history is still a long collection even when read in parallel. Use date filters or `maxReviews` for faster runs; a date range now starts reading at its end date instead of at today.\r\n\r\nPlease use the data responsibly and in line with Google's terms and applicable privacy laws. Turn off `includeReviewerDetails` when you don't need reviewer identities.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-maps-review-and-contributor-activity",
      "title": "Google Maps Review & Contributor Activity Scraper",
      "description": "Collect Google Maps reviews for any list of places or for every place a search finds, or everything specific reviewers have published. Ratings, full text with translations, dates, owner replies, photos and sub-ratings; no login.",
      "version": "1.1",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Google Maps Review & Contributor Activity Scraper\r\n\r\nTurn Google Maps reviews into a clean spreadsheet. Paste a list of places, describe the places you want with a search such as *\"dentists in Austin, TX\"*, or point at Google reviewers' profiles. You get every review's stars, full text with Google's translation, exact date, owner reply, photos and videos, food/service/atmosphere sub-ratings and visit details. No Google account, API key or cookies are needed.\r\n\r\n## What this actor does\r\n\r\n- **Whole review histories, not a sample.** Newest-first and most-relevant orders go all the way back to a place's first review (a place with 27,335 reviews returned all 27,335).\r\n- **Every way of choosing places.** Mix place links, Place IDs (`ChIJ…`), feature IDs (`0x…:0x…`), CIDs, shared `maps.app.goo.gl` / `share.google` / `g.page` links and review links; search like a local (\"dentists in Austin, TX\") and expand into sub-areas to reach around 1,000 places; or collect up to 200 recent contributions per reviewer profile.\r\n- **Filters, order and monitoring.** Date range, keywords, stars, written text, owner replies, photos/videos and review language; newest, most relevant, highest or lowest rating; scheduled runs with `monitoringKey` return only reviews added or edited since the previous one.\r\n- **Rich, honest records.** Full text with Google's translation, exact dates, owner replies, photos and videos, sub-ratings, visit context, reviewer identity, place facts, rating histogram and topic chips. Every row says whether the requested order was confirmed, and place summaries say why collection stopped.\r\n- **Empty fields are omitted.** Fields Google doesn't show for a record are left out instead of being empty; links to places that no longer exist are reported, never swapped for a lookalike business.\r\n\r\n\r\n| Mode | You provide | You get |\r\n|---|---|---|\r\n| Reviews of specific places | Links or IDs of places | Reviews of each place, plus optional place summaries |\r\n| Find places by search | Searches such as \"ramen Shibuya Tokyo\" | The places Google ranks for each search, their reviews, and the search and rank they came from |\r\n| Everything specific reviewers have written | Reviewer profile links or numeric IDs | Each reviewer's reviews and star-only ratings across all places, plus optional reviewer summaries |\r\n\r\n## Output per record\r\n\r\nEvery record has a `recordType`: `review` (a place review), `authorReview` (a reviewer's contribution), and, when enabled, `place` and `contributor` summary records. Fields that Google does not show for a record are left out instead of being empty.\r\n\r\n### Place review (`review`)\r\n\r\n```json\r\n{\r\n  \"recordType\": \"review\",\r\n  \"reviewId\": \"Ci9DQUlRQUNvZENodHljRjlvT2twcVJsbFlkVUV0WjBGcldrNHdVRFpxWjBoc01YYxAB\",\r\n  \"rating\": 5,\r\n  \"reviewText\": \"Absolutely stunning at night, the sparkle every hour is magical.\",\r\n  \"reviewLanguage\": \"en\",\r\n  \"reviewDate\": \"2026-10-19T09:31:51.751+00:00\",\r\n  \"reviewDateOriginal\": \"8 minutes ago\",\r\n  \"reviewUrl\": \"https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlR…\",\r\n  \"reviewerName\": \"Ajay C.\",\r\n  \"reviewerId\": \"113024036179217636785\",\r\n  \"reviewerProfileUrl\": \"https://www.google.com/maps/contrib/113024036179217636785/reviews\",\r\n  \"reviewerTotalReviews\": 3,\r\n  \"reviewerPhotoCount\": 3,\r\n  \"reviewerIsLocalGuide\": false,\r\n  \"subRatings\": { \"Food\": 5, \"Service\": 4, \"Atmosphere\": 5 },\r\n  \"reviewContext\": { \"Meal type\": \"Dinner\", \"Price per person\": \"$20 to $30\" },\r\n  \"visitDate\": \"Visited in October\",\r\n  \"businessName\": \"Eiffel Tower\",\r\n  \"businessRating\": 4.7,\r\n  \"businessTotalReviews\": 498339,\r\n  \"businessCategory\": \"Historical landmark\",\r\n  \"businessAddress\": \"Av. Gustave Eiffel, 75007 Paris, France\",\r\n  \"businessLatitude\": 48.8583701,\r\n  \"businessLongitude\": 2.2944813,\r\n  \"placeId\": \"ChIJLU7jZClu5kcR4PcOOO6p3I0\",\r\n  \"featureId\": \"0x47e66e2964e34e2d:0x8ddca9ee380ef7e0\",\r\n  \"cid\": \"10222232094831998944\",\r\n  \"placeUrl\": \"https://www.google.com/maps/place/?q=place_id:ChIJLU7jZClu5kcR4PcOOO6p3I0\",\r\n  \"order\": 1,\r\n  \"sortBy\": \"newest\",\r\n  \"sortConfirmed\": true,\r\n  \"sortStatus\": \"confirmed\",\r\n  \"scrapedAt\": \"2026-10-19T09:39:52+00:00\"\r\n}\r\n```\r\n\r\nOther review fields when Google shows them: `reviewTextTranslated` + `translatedLanguage` + `originalReviewLanguage` (reviews in another language), `photosInReview`, `reviewPhotoCount`, `reviewVideoUrls`, `videosInReview`, `ownerResponseText`, `ownerResponseDateOriginal`, `ownerResponseTextTranslated`, `contextLabels`, `reviewReportUrl`, `businessCategories`, `searchQuery` and `searchRank` (search mode). `reviewerSubtitle` (the line Google prints under the reviewer's name, such as \"Local Guide · 37 reviews · 5 photos\", in the chosen language). With `enrichReviewerProfiles` on: `reviewerLocalGuideLevel`, `likesCount`, `isEdited`, `reviewCreatedAt`, `reviewViewCount` and `ownerResponseDate`. With `includePhotoDetails` on: `photoDetails`, one entry per photo or video with `url`, `width`, `height`, `uploadDate` and, for videos, `durationSeconds`.\r\n\r\n### Reviewer contribution (`authorReview`)\r\n\r\nReviewer fields (`contributorId`, `contributorName`, `contributorAvatarUrl`, `contributorProfileUrl`, `contributorLocalGuideLevel`, `contributorPoints`, `contributorTotalReviews`), the review (`reviewId`, `rating`, `reviewText`, `reviewLanguage`, `reviewDate` = last update, `reviewCreatedAt` = first published, `isEdited`, `reviewDateOriginal`, `likesCount`, `reviewViewCount`, `isRatingOnly`, `reviewUrl`, `reviewPhotoUrls`, `reviewPhotoCount`, `subRatings`, `reviewContext`, `contextLabels`, `ownerResponseText`, `ownerResponseDate`, `ownerResponseDateOriginal`), and the reviewed place (`placeName`, `placeAddress`, `placeId`, `featureId`, `placeUrl`, `placeLatitude`, `placeLongitude`, `placeCategory`, `placeRating`, `placeTotalReviews`, `placePriceRange`), plus `position` (rank in the reviewer's list), `sourceUrl` and `scrapedAt`.\r\n\r\n### Place summary (`place`, optional)\r\n\r\nName, address, all categories, coordinates, phone, website, time zone, country, description, rating, total reviews, **`ratingHistogram`** (reviews per star), **`reviewTopics`** (Google's topic chips with how many reviews mention each), **`openingHours`** (per weekday), **`partnerReviews`** (hotels and some restaurants: rating, scale, review count, link and a sample review from sites such as Tripadvisor or Booking.com), **`reviewsRemovedNotice`** (Google's notice that reviews were removed after legal complaints, shown for some places in Germany), Place ID / feature ID / CID / Knowledge Graph ID, and collection results: `reviewsDelivered`, `partnerReviewsDelivered` (with `includePartnerReviews`), `reviewsScanned`, `stopReason` (for example `requestedCountReached`, `allReviewsCollected`, `dateCutoffReached`, `noNewReviewsSinceLastRun`), `status` (`ok`, `noReviews`, `notFound`, `invalid`, `partial`) and `statusReason`.\r\n\r\n### Partner-site review (`partnerReview`, optional)\r\n\r\nWith `includePartnerReviews`, hotels also get one record per review Google shows from a partner site: `partnerSource` (for example `Tripadvisor`), `partnerReviewId`, `rating` with `ratingScale` (some sites rate out of 10), `reviewText`, `reviewDateOriginal` (Google shows partner reviews with a relative date such as \"2 weeks ago\"), `reviewerName`, `reviewUrl` (the review on the partner site), `ownerResponseText` when the hotel replied, the place fields (`businessName`, `placeId`, `featureId`, …) and `order`. Partner sites are read newest first.\r\n\r\n### Reviewer summary (`contributor`, optional)\r\n\r\nName, Local Guide level and points, points needed for the next level, bio, **`contributions`** (lifetime counts of reviews, ratings, photos, videos, answers, edits, places added and more), `status` (`public`, `private`, `notFound`) and `reviewsDelivered`.\r\n\r\n### Likes, edit dates and Local Guide levels\r\n\r\nGoogle shows likes, first-published and edit dates, view counts, owner-reply dates and exact Local Guide levels only on reviewer profiles. Reviewer mode always has them. In place and search modes, turn on `enrichReviewerProfiles` and the actor looks up each reviewer once and adds them to the matching reviews. In practice this fills about 8 in 10 reviews; the rest were written by reviewers with private profiles, or are older than the reviewer's 200 most recent contributions. `reviewerLocalGuideLevel` is added for every reviewer with a public level, including private profiles. View counts are Google's running counters and can differ slightly between two lookups. Without the option, `reviewerIsLocalGuide` is `true` for reviewers Google labels \"Local Guide\" on the review. `reviewerSubtitle` is filled when the actor knows Google's exact wording for that language and those counts; otherwise it is left out and the counts are still in `reviewerTotalReviews` and `reviewerPhotoCount`. `reviewerEmoji` and `isVerified` are not published by Google and stay in the schema for older integrations; the dishes a reviewer recommends (the old `mentionedItems`) are in `reviewContext`.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | select | `place` | `place` = reviews of the places you list; `search` = find places by search, then their reviews; `author` = everything specific reviewers wrote |\r\n| `placeUrls` | list | – | Place links or IDs, one per line: place links, shared `maps.app.goo.gl` / `share.google` / `g.page` links, `?cid=` links, review links, `ChIJ…` Place IDs, `0x…:0x…` feature IDs, numeric CIDs |\r\n| `searchQueries` | list | – | Searches like \"dentists in Austin, TX\"; include a city or area |\r\n| `maxPlacesPerQuery` | integer | `20` | Places taken from each search (1–2,000), in Google's ranking; above about 120 places the actor also searches sub-areas |\r\n| `contributorUrls` | list | – | Reviewer profile links (`https://www.google.com/maps/contrib/<id>`, or a shared `maps.app.goo.gl` profile link) or numeric reviewer IDs |\r\n| `maxReviews` | integer | `50` | Maximum reviews **per place or per reviewer** (1–200,000; reviewers publish at most 200) |\r\n| `sortBy` | select | `newest` | `newest`, `relevant`, `highest_rating`, `lowest_rating` |\r\n| `language` | select | `en` | Language of labels such as \"2 weeks ago\"; foreign-language reviews also get Google's translation into it. 23 languages |\r\n| `reviewsNewerThan` | date | – | Keep reviews from this day on, e.g. `2026-01-01` or `30 days` |\r\n| `reviewsOlderThan` | date | – | Keep reviews up to this day (use both for a range) |\r\n| `keyword` | text | – | Only reviews mentioning these words |\r\n| `starRatings` | multi-select | – | Only these star ratings, e.g. `[\"1\", \"2\"]` |\r\n| `onlyWithText` | boolean | `false` | Skip star-only reviews without written text |\r\n| `ownerReplyFilter` | select | `any` | `any`, `withReply`, `withoutReply` |\r\n| `onlyWithPhotos` | boolean | `false` | Only reviews with photos or videos |\r\n| `reviewLanguages` | list | – | Only reviews written in these languages, e.g. `ko`, `es` |\r\n| `monitoringKey` | text | – | Same name on scheduled runs → only reviews added or edited since the last run with that name |\r\n| `includePlaceSummary` | boolean | `false` | Add one summary record per place |\r\n| `includeContributorSummary` | boolean | `false` | Add one summary record per reviewer |\r\n| `includeReviewerDetails` | boolean | `true` | Turn off to leave reviewer names, pictures, profile links and IDs out of place reviews |\r\n| `enrichReviewerProfiles` | boolean | `false` | Place and search modes: also look up each reviewer's public profile to add likes, first-published and edit dates, view counts, owner-reply dates and the exact Local Guide level. Slower |\r\n| `includePartnerReviews` | boolean | `false` | Hotels: also collect the reviews Google shows from partner sites such as Tripadvisor, Trip.com or Priceline, as `partnerReview` records. `maxReviews` applies to each partner site, the same way it applies to each place |\r\n| `includePhotoDetails` | boolean | `false` | Add width, height and upload date (and video length) for every photo and video in place reviews. One extra request per photo |\r\n\r\nInputs saved for earlier versions keep working. A single `placeUrl` or `placeId`, a single `contributorUrl` and old proxy settings are all accepted. **Change in this version:** in reviewer mode, `maxReviews` now applies to each reviewer separately (it used to be a total for the whole run).\r\n\r\n### Example: newest reviews of two places\r\n\r\n```json\r\n{\r\n  \"placeUrls\": [\r\n    \"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\",\r\n    \"ChIJifIePKtZwokRVZ-UdRGkZzs\"\r\n  ],\r\n  \"maxReviews\": 200\r\n}\r\n```\r\n\r\n### Example: one- and two-star reviews for a city's top dentists\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQueries\": [\"dentists in Boise, Idaho\"],\r\n  \"maxPlacesPerQuery\": 30,\r\n  \"starRatings\": [\"1\", \"2\"],\r\n  \"reviewsNewerThan\": \"90 days\",\r\n  \"maxReviews\": 500,\r\n  \"includePlaceSummary\": true\r\n}\r\n```\r\n\r\n### Example: everything two reviewers wrote\r\n\r\n```json\r\n{\r\n  \"mode\": \"author\",\r\n  \"contributorUrls\": [\"https://www.google.com/maps/contrib/108763873723673205857\", \"100413133939170473725\"],\r\n  \"maxReviews\": 200,\r\n  \"includeContributorSummary\": true\r\n}\r\n```\r\n\r\n### Example: daily monitoring returns only new reviews\r\n\r\n```json\r\n{ \"placeUrls\": [\"ChIJifIePKtZwokRVZ-UdRGkZzs\"], \"monitoringKey\": \"my-pizzerias\", \"maxReviews\": 1000 }\r\n```\r\n\r\n## Use cases\r\n\r\n- **Reputation tracking for branches and franchises:** schedule a monitoring run over every location and get only the new reviews each morning.\r\n- **Competitor and market research:** run a search for a category and city, then compare rating breakdowns, topics and complaints.\r\n- **Customer-experience analytics:** feed full texts, translations and sub-ratings into sentiment or topic models.\r\n- **Lead generation for agencies:** find businesses with recent low ratings or without owner replies.\r\n- **Trust and safety:** review a reviewer's whole activity, spot unusual patterns, and see which places they reviewed and when.\r\n\r\n## FAQ\r\n\r\n**Do I need a Google account, API key or cookies?** No. The actor reads what Google Maps shows to anyone who is not signed in.\r\n\r\n**Do I need to set up a proxy?** No. The actor chooses its connection itself and switches automatically if Google slows it down. There are no proxy settings to configure.\r\n\r\n**Why does a place give fewer reviews than its total?** Google's total also counts reviews it no longer displays. On a full newest-first collection the actor reads everything Google still lists, and the place summary shows exactly how many reviews were read and why collection stopped.\r\n\r\n**Can I get only new reviews every day?** Yes. Set `monitoringKey` to any name and schedule the run. Set `maxReviews` high enough to cover the reviews expected between two runs.\r\n\r\n**Is the requested order trustworthy?** Every place review carries `sortConfirmed`. It is `true` only when the row continues the requested order.\r\n\r\n**What happens with a link to a closed or removed place?** It is skipped with a clear reason, and with place summaries enabled you get a `notFound` record. The actor never collects reviews from a different business with a similar name. A shared link that opens something other than a place (a reviewer profile, a photo, a video) is skipped with a reason saying what it opens.\r\n\r\n**Can I get likes or Local Guide levels for place reviews?** Yes, turn on `enrichReviewerProfiles`. It makes one extra request per reviewer, so runs take longer. The status message says how many reviews were filled.\r\n\r\n**Do I get the reviews hotels show from Tripadvisor or Booking.com?** Yes. Turn on `includePartnerReviews` and every review Google shows from those sites is added as a `partnerReview` record, up to `maxReviews` per site. The place summary also lists each partner site's rating and review count in `partnerReviews`.\r\n\r\n**Can I collect reviews in another language?** Choose a language and Google's labels plus translations come in that language. Each review's original text and language are kept as well.\r\n\r\n**Is this an official Google product?** No. It is an independent tool that collects publicly visible Google Maps data.\r\n\r\n## How many reviews can I get?\r\n\r\n- **Newest first or most relevant:** the complete history of a place, down to its first review.\r\n- **Highest or lowest rating first:** Google lists at most 188 reviews per star level in these orders. When you also pick star ratings, the actor collects the rest of those stars newest first and marks those rows with `sortConfirmed: false`.\r\n- **Reviewers:** up to 200 of each reviewer's most recently updated reviews and ratings. That is the full history of most reviewers.\r\n- **Searches:** one Google search lists about 120 to 360 places. Ask for more with `maxPlacesPerQuery` and the actor also searches up to about 80 sub-areas around them, small ones in dense city centres and larger ones where places are spread out: \"restaurants in Istanbul\" went from 200 to 1,200 places. Places far outside the searched area are left out, and small markets simply end when there are no more places (for example about 90 dentists in Bozeman, Montana).\r\n- Speed: long newest-first histories (places with 1,000+ reviews) are read in several date ranges at once and merged back into exact newest-first order, which shortens big collections; how much it saves depends on how quickly Google serves the parallel ranges (a 25,000-review walk took about 15 minutes on Apify's cloud). Several places are collected in parallel.\r\n- Filters (stars, written text, owner reply, photos, review language) are applied while reviews are read. When few reviews match, for example an owner-reply filter on a place that never replies, the actor keeps reading back through the history. Add a date range to keep such runs short; the status message and place summary show how many reviews were read.\r\n\r\n## Limitations\r\n\r\n- **Likes and edit dates in place mode** come from reviewer profiles, so reviews by private profiles, or older than a reviewer's 200 most recent contributions, can't get them. Workaround: run reviewer mode on the reviewers you care about.\r\n- **Rating-ordered collection** stops at 188 reviews per star level in Google's own order. Workaround: pick the star ratings you want; the rest of those stars are collected newest first (`sortConfirmed: false`).\r\n- **Reviewer mode** returns at most the 200 most recently updated contributions per profile; Google does not page further. Private profiles return no reviews and are reported as `private`.\r\n- **Partner-site reviews** are the ones Google shows on the hotel page, which can be far fewer than the partner site itself has (one hotel: 176 Tripadvisor reviews on Google, 7,499 on Tripadvisor), and they carry a relative date only.\r\n- **Single reviews by link:** a review link is read as its place, and that place's reviews are collected. Use `keyword` or a date range to find one review quickly.\r\n- **Price level** is not part of Google's public data for signed-out visitors. **Photo locations** are not published: Google returns the place's position for every photo, so it is not output.\r\n- **Very large places take time:** a full 500,000-review history is still a long collection even when read in parallel. Use date filters or `maxReviews` for faster runs; a date range now starts reading at its end date instead of at today.\r\n\r\nPlease use the data responsibly and in line with Google's terms and applicable privacy laws. Turn off `includeReviewerDetails` when you don't need reviewer identities.\r\n",
      "input": {
        "title": "Google Maps Review & Contributor Activity Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What do you want to collect?",
            "type": "string",
            "description": "Reviews of places you list, reviews of places found by a search, or everything specific Google reviewers have published.",
            "enum": [
              "place",
              "search",
              "author"
            ],
            "enumTitles": [
              "Reviews of specific places (links or IDs)",
              "Find places by search, then collect their reviews",
              "Everything specific reviewers have written"
            ],
            "default": "place",
            "prefill": "place",
            "editor": "select"
          },
          "placeUrls": {
            "title": "Places",
            "type": "array",
            "description": "Google Maps place links or IDs, one per line. Accepted: place links (also shared maps.app.goo.gl, goo.gl, g.page and share.google links, ?cid= links and review links), Place IDs starting with ChIJ, feature IDs like 0x89c259ab3c1ef289:0x3b67a41175949f55 and numeric CIDs. Used when collecting reviews of specific places.",
            "editor": "stringList",
            "prefill": [
              "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!16zL20vMDJqODE"
            ]
          },
          "searchQueries": {
            "title": "Searches",
            "type": "array",
            "description": "Google Maps searches such as \"dentists in Austin, TX\" or \"ramen Shibuya Tokyo\". Include a city or area in each search. Used when finding places by search.",
            "editor": "stringList"
          },
          "maxPlacesPerQuery": {
            "title": "Places per search",
            "type": "integer",
            "description": "How many places to take from each search. One Google search lists about 120 to 360 places; when you ask for more, the actor also searches sub-areas of the same region to reach them.",
            "minimum": 1,
            "maximum": 2000,
            "default": 20
          },
          "contributorUrls": {
            "title": "Reviewers",
            "type": "array",
            "description": "Google Maps reviewer profile links (for example https://www.google.com/maps/contrib/108763873723673205857, or a shared maps.app.goo.gl profile link) or numeric reviewer IDs. Used when collecting everything specific reviewers have written.",
            "editor": "stringList"
          },
          "maxReviews": {
            "title": "Maximum reviews per place or reviewer",
            "type": "integer",
            "description": "Upper limit of reviews collected for each place, or for each reviewer. Google publishes up to 200 contributions per reviewer.",
            "minimum": 1,
            "maximum": 200000,
            "default": 50,
            "prefill": 5
          },
          "sortBy": {
            "title": "Sort reviews by",
            "type": "string",
            "description": "Order of a place's reviews. Newest first and most relevant reach a place's complete review history; Google lists at most 188 reviews per star level in rating order.",
            "enum": [
              "newest",
              "relevant",
              "highest_rating",
              "lowest_rating"
            ],
            "enumTitles": [
              "Newest first",
              "Most relevant",
              "Highest rating first",
              "Lowest rating first"
            ],
            "default": "newest",
            "editor": "select"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of Google Maps labels such as \"2 weeks ago\". Reviews written in another language also come with Google's translation into this language.",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "pt-BR",
              "ja",
              "ko",
              "zh",
              "zh-TW",
              "ar",
              "ru",
              "hi",
              "tr",
              "nl",
              "pl",
              "id",
              "th",
              "vi",
              "he",
              "sv",
              "uk"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Portuguese (Brazil)",
              "Japanese",
              "Korean",
              "Chinese (Simplified)",
              "Chinese (Traditional)",
              "Arabic",
              "Russian",
              "Hindi",
              "Turkish",
              "Dutch",
              "Polish",
              "Indonesian",
              "Thai",
              "Vietnamese",
              "Hebrew",
              "Swedish",
              "Ukrainian"
            ],
            "default": "en",
            "editor": "select"
          },
          "reviewsNewerThan": {
            "title": "Only reviews from",
            "type": "string",
            "description": "Keep reviews dated on or after this day, for example 2026-01-01, or a period such as 30 days. Reviews are then read newest first.",
            "editor": "datepicker",
            "dateType": "absoluteOrRelative",
            "sectionCaption": "Filters"
          },
          "reviewsOlderThan": {
            "title": "Only reviews until",
            "type": "string",
            "description": "Keep reviews dated on or before this day. Combine with \"Only reviews from\" for a date range.",
            "editor": "datepicker",
            "dateType": "absoluteOrRelative"
          },
          "keyword": {
            "title": "Only reviews mentioning",
            "type": "string",
            "description": "Words a review must mention, for example \"parking\" or \"long wait\". For places this uses Google's own review search, which also matches close word forms.",
            "editor": "textfield"
          },
          "starRatings": {
            "title": "Star ratings",
            "type": "array",
            "description": "Keep only reviews with these star ratings. Leave empty for all ratings.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            }
          },
          "onlyWithText": {
            "title": "Only reviews with written text",
            "type": "boolean",
            "description": "Skip star-only reviews that have no written text.",
            "default": false
          },
          "ownerReplyFilter": {
            "title": "Owner reply",
            "type": "string",
            "description": "Keep all reviews, only reviews the business replied to, or only reviews still without a reply.",
            "enum": [
              "any",
              "withReply",
              "withoutReply"
            ],
            "enumTitles": [
              "Any",
              "Only reviews with an owner reply",
              "Only reviews without an owner reply"
            ],
            "default": "any",
            "editor": "select"
          },
          "onlyWithPhotos": {
            "title": "Only reviews with photos or videos",
            "type": "boolean",
            "description": "Keep only reviews that include photos or videos.",
            "default": false
          },
          "reviewLanguages": {
            "title": "Review languages",
            "type": "array",
            "description": "Keep only reviews written in these languages, as two-letter codes such as en, es, ko. Leave empty for all languages.",
            "editor": "stringList"
          },
          "monitoringKey": {
            "title": "Only new reviews since the last run (monitoring name)",
            "type": "string",
            "description": "Give scheduled runs the same name, for example my-restaurants. Each run then returns only reviews added or edited since the previous run with that name.",
            "editor": "textfield",
            "sectionCaption": "Output options"
          },
          "includePlaceSummary": {
            "title": "Add a place summary record",
            "type": "boolean",
            "description": "Adds one record per place with its rating breakdown by stars, review topics, location, contact details and how many reviews were collected. These records have recordType \"place\".",
            "default": false
          },
          "includeContributorSummary": {
            "title": "Add a reviewer summary record",
            "type": "boolean",
            "description": "Adds one record per reviewer with their Local Guide level, points and lifetime contribution counts. These records have recordType \"contributor\".",
            "default": false
          },
          "includeReviewerDetails": {
            "title": "Include reviewer names and profiles",
            "type": "boolean",
            "description": "Turn off to leave out reviewer names, profile pictures, profile links and reviewer IDs from place reviews.",
            "default": true
          },
          "enrichReviewerProfiles": {
            "title": "Add likes, edit dates and Local Guide levels (slower)",
            "type": "boolean",
            "description": "For place reviews, also open each reviewer's public profile to add likes, first-published and edited dates, view counts, owner-reply dates and the reviewer's Local Guide level. Adds one request per reviewer. Reviews by private profiles, or older than a reviewer's 200 most recent contributions, keep the standard fields.",
            "default": false
          },
          "includePartnerReviews": {
            "title": "Add hotel reviews from partner sites (Tripadvisor, Trip.com, …)",
            "type": "boolean",
            "description": "Hotels on Google Maps also show reviews from partner sites such as Tripadvisor, Trip.com or Priceline. Turn on to add those reviews as separate records (recordType partnerReview), up to Max reviews per partner site, newest first. Places without partner reviews are not affected.",
            "default": false
          },
          "includePhotoDetails": {
            "title": "Add photo details (size and upload date, slower)",
            "type": "boolean",
            "description": "For place reviews with photos or videos, add the width, height and upload date of each one. Adds one request per photo.",
            "default": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Maps Review & Contributor Activity Scraper Output",
        "description": "One record per Google Maps review (place and search modes), per reviewer contribution (reviewer mode) or per partner-site review on hotels, with ratings, full text, translations, dates, owner replies, photos and place context. Optional place and reviewer summary records.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Reviews",
            "description": "All records in the default dataset",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "detailed": {
            "type": "string",
            "title": "Reviews (all fields)",
            "description": "Every review field, including translations, sub-ratings, visit details, media details and partner-site fields",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=detailed"
          },
          "placeSummaries": {
            "type": "string",
            "title": "Place summaries",
            "description": "Per-place records (when the place summary option is on): reviews per star, topics, partner sites, location, opening hours and collection status",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=places"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Google Maps Reviews",
          "views": {
            "overview": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "reviewerName",
                  "rating",
                  "reviewText",
                  "reviewDate",
                  "likesCount",
                  "businessName",
                  "sortBy",
                  "sortConfirmed",
                  "sourceUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "reviewerName": {
                    "label": "Reviewer",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewText": {
                    "label": "Review",
                    "format": "text"
                  },
                  "reviewDate": {
                    "label": "Date",
                    "format": "text"
                  },
                  "likesCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "businessName": {
                    "label": "Business",
                    "format": "text"
                  },
                  "sortBy": {
                    "label": "Requested Sort",
                    "format": "text"
                  },
                  "sortConfirmed": {
                    "label": "Sort Confirmed",
                    "format": "boolean"
                  }
                }
              }
            },
            "detailed": {
              "title": "Detailed",
              "transformation": {
                "fields": [
                  "recordType",
                  "reviewId",
                  "reviewerName",
                  "reviewerAvatarUrl",
                  "reviewerProfileUrl",
                  "reviewerSubtitle",
                  "reviewerLocalGuideLevel",
                  "reviewerTotalReviews",
                  "reviewerPhotoCount",
                  "reviewerEmoji",
                  "contributorId",
                  "contributorName",
                  "contributorAvatarUrl",
                  "contributorProfileUrl",
                  "contributorPoints",
                  "rating",
                  "reviewText",
                  "reviewLanguage",
                  "originalReviewLanguage",
                  "reviewDate",
                  "reviewDateOriginal",
                  "isEdited",
                  "likesCount",
                  "photosInReview",
                  "reviewPhotoUrls",
                  "reviewPhotoCount",
                  "videosInReview",
                  "photoDetails",
                  "ownerResponseText",
                  "ownerResponseDate",
                  "ownerResponseDateOriginal",
                  "isVerified",
                  "visitDate",
                  "mentionedItems",
                  "contextLabels",
                  "businessName",
                  "businessRating",
                  "businessTotalReviews",
                  "businessCategory",
                  "businessAddress",
                  "placeName",
                  "placeAddress",
                  "placeId",
                  "featureId",
                  "placeUrl",
                  "sourceUrl",
                  "order",
                  "position",
                  "sortBy",
                  "sortConfirmed",
                  "sortStatus",
                  "scrapedAt",
                  "reviewUrl",
                  "reviewReportUrl",
                  "reviewTextTranslated",
                  "translatedLanguage",
                  "reviewerId",
                  "reviewerIsLocalGuide",
                  "reviewVideoUrls",
                  "ownerResponseTextTranslated",
                  "subRatings",
                  "reviewContext",
                  "reviewCreatedAt",
                  "reviewViewCount",
                  "isRatingOnly",
                  "businessCategories",
                  "businessLatitude",
                  "businessLongitude",
                  "cid",
                  "placeLatitude",
                  "placeLongitude",
                  "placeCategory",
                  "placeRating",
                  "placeTotalReviews",
                  "placePriceRange",
                  "searchQuery",
                  "searchRank",
                  "partnerSource",
                  "partnerReviewId",
                  "ratingScale"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "reviewerName": {
                    "label": "Reviewer",
                    "format": "text"
                  },
                  "reviewerAvatarUrl": {
                    "label": "Avatar",
                    "format": "link"
                  },
                  "reviewerProfileUrl": {
                    "label": "Profile URL",
                    "format": "link"
                  },
                  "reviewerSubtitle": {
                    "label": "Reviewer Subtitle",
                    "format": "text"
                  },
                  "reviewerLocalGuideLevel": {
                    "label": "Local Guide Level",
                    "format": "number"
                  },
                  "reviewerTotalReviews": {
                    "label": "Reviewer Total Reviews",
                    "format": "number"
                  },
                  "reviewerPhotoCount": {
                    "label": "Reviewer Photo Count",
                    "format": "number"
                  },
                  "reviewerEmoji": {
                    "label": "Reviewer Emoji",
                    "format": "text"
                  },
                  "contributorId": {
                    "label": "Contributor ID",
                    "format": "text"
                  },
                  "contributorName": {
                    "label": "Contributor",
                    "format": "text"
                  },
                  "contributorAvatarUrl": {
                    "label": "Contributor Avatar",
                    "format": "link"
                  },
                  "contributorProfileUrl": {
                    "label": "Contributor Profile URL",
                    "format": "link"
                  },
                  "contributorPoints": {
                    "label": "Contributor Points",
                    "format": "number"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewText": {
                    "label": "Review",
                    "format": "text"
                  },
                  "reviewLanguage": {
                    "label": "Language",
                    "format": "text"
                  },
                  "originalReviewLanguage": {
                    "label": "Original Language",
                    "format": "text"
                  },
                  "reviewDate": {
                    "label": "Date (ISO)",
                    "format": "text"
                  },
                  "reviewDateOriginal": {
                    "label": "Date (Original)",
                    "format": "text"
                  },
                  "likesCount": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "photosInReview": {
                    "label": "Photos",
                    "format": "array"
                  },
                  "reviewPhotoUrls": {
                    "label": "Contributor Review Photos",
                    "format": "array"
                  },
                  "reviewPhotoCount": {
                    "label": "Contributor Review Photo Count",
                    "format": "number"
                  },
                  "videosInReview": {
                    "label": "Videos In Review",
                    "format": "number"
                  },
                  "ownerResponseText": {
                    "label": "Owner Reply",
                    "format": "text"
                  },
                  "ownerResponseDate": {
                    "label": "Owner Reply Date",
                    "format": "text"
                  },
                  "isVerified": {
                    "label": "Verified",
                    "format": "boolean"
                  },
                  "visitDate": {
                    "label": "Visit Date",
                    "format": "text"
                  },
                  "mentionedItems": {
                    "label": "Mentioned Items",
                    "format": "array"
                  },
                  "contextLabels": {
                    "label": "Context Labels",
                    "format": "array"
                  },
                  "businessName": {
                    "label": "Business",
                    "format": "text"
                  },
                  "businessRating": {
                    "label": "Business Rating",
                    "format": "number"
                  },
                  "businessTotalReviews": {
                    "label": "Total Reviews",
                    "format": "number"
                  },
                  "businessCategory": {
                    "label": "Category",
                    "format": "text"
                  },
                  "businessAddress": {
                    "label": "Address",
                    "format": "text"
                  },
                  "placeName": {
                    "label": "Reviewed Place",
                    "format": "text"
                  },
                  "placeAddress": {
                    "label": "Reviewed Place Address",
                    "format": "text"
                  },
                  "placeId": {
                    "label": "Place ID",
                    "format": "text"
                  },
                  "featureId": {
                    "label": "Feature ID",
                    "format": "text"
                  },
                  "placeUrl": {
                    "label": "Place URL",
                    "format": "link"
                  },
                  "order": {
                    "label": "Order",
                    "format": "number"
                  },
                  "position": {
                    "label": "Position",
                    "format": "number"
                  },
                  "sortBy": {
                    "label": "Requested Sort",
                    "format": "text"
                  },
                  "sortConfirmed": {
                    "label": "Sort Confirmed",
                    "format": "boolean"
                  },
                  "sortStatus": {
                    "label": "Sort Status",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  },
                  "recordType": {
                    "label": "recordType",
                    "format": "text"
                  },
                  "isEdited": {
                    "label": "isEdited",
                    "format": "text"
                  },
                  "ownerResponseDateOriginal": {
                    "label": "ownerResponseDateOriginal",
                    "format": "text"
                  },
                  "sourceUrl": {
                    "label": "sourceUrl",
                    "format": "text"
                  },
                  "reviewUrl": {
                    "label": "Review link",
                    "format": "link"
                  },
                  "reviewReportUrl": {
                    "label": "Report link",
                    "format": "link"
                  },
                  "reviewTextTranslated": {
                    "label": "Translated review",
                    "format": "text"
                  },
                  "translatedLanguage": {
                    "label": "Translated into",
                    "format": "text"
                  },
                  "reviewerId": {
                    "label": "Reviewer ID",
                    "format": "text"
                  },
                  "reviewerIsLocalGuide": {
                    "label": "Local Guide",
                    "format": "boolean"
                  },
                  "reviewVideoUrls": {
                    "label": "Videos",
                    "format": "array"
                  },
                  "ownerResponseTextTranslated": {
                    "label": "Owner reply (translated)",
                    "format": "text"
                  },
                  "subRatings": {
                    "label": "Sub-ratings",
                    "format": "object"
                  },
                  "reviewContext": {
                    "label": "Visit details",
                    "format": "object"
                  },
                  "reviewCreatedAt": {
                    "label": "First published",
                    "format": "text"
                  },
                  "reviewViewCount": {
                    "label": "Views",
                    "format": "number"
                  },
                  "isRatingOnly": {
                    "label": "Stars only",
                    "format": "boolean"
                  },
                  "businessCategories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "businessLatitude": {
                    "label": "Latitude",
                    "format": "number"
                  },
                  "businessLongitude": {
                    "label": "Longitude",
                    "format": "number"
                  },
                  "cid": {
                    "label": "CID",
                    "format": "text"
                  },
                  "placeLatitude": {
                    "label": "Place latitude",
                    "format": "number"
                  },
                  "placeLongitude": {
                    "label": "Place longitude",
                    "format": "number"
                  },
                  "placeCategory": {
                    "label": "Place category",
                    "format": "text"
                  },
                  "placeRating": {
                    "label": "Place rating",
                    "format": "number"
                  },
                  "placeTotalReviews": {
                    "label": "Place reviews",
                    "format": "number"
                  },
                  "placePriceRange": {
                    "label": "Price range",
                    "format": "text"
                  },
                  "searchQuery": {
                    "label": "Search",
                    "format": "text"
                  },
                  "searchRank": {
                    "label": "Search rank",
                    "format": "number"
                  },
                  "photoDetails": {
                    "label": "Photo details",
                    "format": "array"
                  },
                  "partnerSource": {
                    "label": "Partner site",
                    "format": "text"
                  },
                  "partnerReviewId": {
                    "label": "Partner review ID",
                    "format": "text"
                  },
                  "ratingScale": {
                    "label": "Partner rating scale",
                    "format": "number"
                  }
                }
              }
            },
            "places": {
              "title": "Place summaries",
              "transformation": {
                "fields": [
                  "recordType",
                  "businessName",
                  "businessRating",
                  "businessTotalReviews",
                  "ratingHistogram",
                  "reviewTopics",
                  "businessCategory",
                  "businessCategories",
                  "businessAddress",
                  "businessLatitude",
                  "businessLongitude",
                  "phone",
                  "website",
                  "timezone",
                  "countryCode",
                  "description",
                  "reviewsRemovedNotice",
                  "partnerReviews",
                  "openingHours",
                  "placeId",
                  "featureId",
                  "cid",
                  "kgmid",
                  "placeUrl",
                  "sourceUrl",
                  "searchQuery",
                  "searchRank",
                  "status",
                  "statusReason",
                  "partnerReviewsDelivered",
                  "reviewsDelivered",
                  "reviewsScanned",
                  "stopReason",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "recordType",
                    "format": "text"
                  },
                  "businessName": {
                    "label": "Business",
                    "format": "text"
                  },
                  "businessRating": {
                    "label": "Business Rating",
                    "format": "number"
                  },
                  "businessTotalReviews": {
                    "label": "Total Reviews",
                    "format": "number"
                  },
                  "ratingHistogram": {
                    "label": "Reviews per star",
                    "format": "object"
                  },
                  "reviewTopics": {
                    "label": "Review topics",
                    "format": "array"
                  },
                  "businessCategory": {
                    "label": "Category",
                    "format": "text"
                  },
                  "businessCategories": {
                    "label": "Categories",
                    "format": "array"
                  },
                  "businessAddress": {
                    "label": "Address",
                    "format": "text"
                  },
                  "businessLatitude": {
                    "label": "Latitude",
                    "format": "number"
                  },
                  "businessLongitude": {
                    "label": "Longitude",
                    "format": "number"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "website": {
                    "label": "Website",
                    "format": "link"
                  },
                  "timezone": {
                    "label": "Time zone",
                    "format": "text"
                  },
                  "countryCode": {
                    "label": "Country",
                    "format": "text"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "placeId": {
                    "label": "Place ID",
                    "format": "text"
                  },
                  "featureId": {
                    "label": "Feature ID",
                    "format": "text"
                  },
                  "cid": {
                    "label": "CID",
                    "format": "text"
                  },
                  "kgmid": {
                    "label": "Knowledge Graph ID",
                    "format": "text"
                  },
                  "placeUrl": {
                    "label": "Place URL",
                    "format": "link"
                  },
                  "sourceUrl": {
                    "label": "sourceUrl",
                    "format": "text"
                  },
                  "searchQuery": {
                    "label": "Search",
                    "format": "text"
                  },
                  "searchRank": {
                    "label": "Search rank",
                    "format": "number"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "statusReason": {
                    "label": "Status details",
                    "format": "text"
                  },
                  "reviewsDelivered": {
                    "label": "Reviews collected",
                    "format": "number"
                  },
                  "reviewsScanned": {
                    "label": "Reviews read",
                    "format": "number"
                  },
                  "stopReason": {
                    "label": "Stopped because",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  },
                  "openingHours": {
                    "label": "Opening hours",
                    "format": "object"
                  },
                  "partnerReviews": {
                    "label": "Reviews on partner sites",
                    "format": "array"
                  },
                  "reviewsRemovedNotice": {
                    "label": "Removed-reviews notice",
                    "format": "text"
                  },
                  "partnerReviewsDelivered": {
                    "label": "Partner reviews delivered",
                    "format": "number"
                  }
                }
              }
            },
            "contributors": {
              "title": "Reviewer summaries",
              "transformation": {
                "fields": [
                  "recordType",
                  "contributorId",
                  "contributorName",
                  "contributorAvatarUrl",
                  "contributorProfileUrl",
                  "contributorIsLocalGuide",
                  "contributorLocalGuideLevel",
                  "contributorPoints",
                  "contributorNextLevelPoints",
                  "contributorTotalReviews",
                  "contributorBio",
                  "contributions",
                  "status",
                  "statusReason",
                  "reviewsDelivered",
                  "sourceUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "recordType",
                    "format": "text"
                  },
                  "contributorId": {
                    "label": "Contributor ID",
                    "format": "text"
                  },
                  "contributorName": {
                    "label": "Contributor",
                    "format": "text"
                  },
                  "contributorAvatarUrl": {
                    "label": "Contributor Avatar",
                    "format": "link"
                  },
                  "contributorProfileUrl": {
                    "label": "Contributor Profile URL",
                    "format": "link"
                  },
                  "contributorIsLocalGuide": {
                    "label": "Local Guide",
                    "format": "boolean"
                  },
                  "contributorLocalGuideLevel": {
                    "label": "contributorLocalGuideLevel",
                    "format": "text"
                  },
                  "contributorPoints": {
                    "label": "Contributor Points",
                    "format": "number"
                  },
                  "contributorNextLevelPoints": {
                    "label": "Points for next level",
                    "format": "number"
                  },
                  "contributorTotalReviews": {
                    "label": "contributorTotalReviews",
                    "format": "text"
                  },
                  "contributorBio": {
                    "label": "Bio",
                    "format": "text"
                  },
                  "contributions": {
                    "label": "Contribution counts",
                    "format": "object"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "statusReason": {
                    "label": "Status details",
                    "format": "text"
                  },
                  "reviewsDelivered": {
                    "label": "Reviews collected",
                    "format": "number"
                  },
                  "sourceUrl": {
                    "label": "sourceUrl",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "text"
                  }
                }
              }
            }
          },
          "fields": {
            "type": "object",
            "properties": {
              "recordType": {
                "type": "string",
                "nullable": true,
                "description": "review, authorReview, partnerReview, place or contributor."
              },
              "reviewId": {
                "type": "string",
                "nullable": true,
                "description": "Google's review ID (reviews and authorReview records)."
              },
              "reviewerName": {
                "type": "string",
                "nullable": true,
                "description": "Name of the reviewer (omitted with includeReviewerDetails off)."
              },
              "reviewerAvatarUrl": {
                "type": "string",
                "nullable": true,
                "description": "Reviewer avatar URL (omitted with includeReviewerDetails off)."
              },
              "reviewerProfileUrl": {
                "type": "string",
                "nullable": true,
                "description": "Reviewer profile URL (omitted with includeReviewerDetails off)."
              },
              "reviewerId": {
                "type": "string",
                "nullable": true,
                "description": "Reviewer profile ID (omitted with includeReviewerDetails off)."
              },
              "reviewerSubtitle": {
                "type": "string",
                "nullable": true,
                "description": "The status line Google prints under the reviewer's name, such as 'Local Guide · 53 reviews · 58 photos', in the chosen language. Left out when Google's exact wording for that language and those counts was not observed; the counts stay in reviewerTotalReviews and reviewerPhotoCount."
              },
              "reviewerTotalReviews": {
                "type": "integer",
                "nullable": true,
                "description": "How many reviews the reviewer has written, from Google's review feed."
              },
              "reviewerPhotoCount": {
                "type": "integer",
                "nullable": true,
                "description": "How many photos the reviewer has contributed, from Google's review feed."
              },
              "reviewerLocalGuideLevel": {
                "type": "integer",
                "nullable": true,
                "description": "Exact Local Guide level, filled only with enrichReviewerProfiles on."
              },
              "reviewerEmoji": {
                "type": "string",
                "nullable": true,
                "description": "Never filled: Google does not publish an emoji next to reviewer names. Kept in the schema for older integrations."
              },
              "reviewerIsLocalGuide": {
                "type": "boolean",
                "nullable": true,
                "description": "True when Google labels this reviewer 'Local Guide' on the review."
              },
              "contributorId": {
                "type": "string",
                "nullable": true,
                "description": "Contributor profile ID (reviewer mode)."
              },
              "contributorName": {
                "type": "string",
                "nullable": true,
                "description": "Contributor name (reviewer mode)."
              },
              "contributorAvatarUrl": {
                "type": "string",
                "nullable": true,
                "description": "Contributor avatar URL (reviewer mode)."
              },
              "contributorProfileUrl": {
                "type": "string",
                "nullable": true,
                "description": "Contributor profile URL (reviewer mode)."
              },
              "contributorLocalGuideLevel": {
                "type": "integer",
                "nullable": true,
                "description": "Contributor Local Guide level (reviewer mode)."
              },
              "contributorPoints": {
                "type": "integer",
                "nullable": true,
                "description": "Contributor points (reviewer mode)."
              },
              "contributorTotalReviews": {
                "type": "integer",
                "nullable": true,
                "description": "Reviews on the contributor's profile (reviewer mode)."
              },
              "rating": {
                "type": "number",
                "nullable": true,
                "description": "Rating on the review, and on partnerReview records on the partner's own scale."
              },
              "ratingScale": {
                "type": "number",
                "nullable": true,
                "description": "For partnerReview records: the scale of the partner rating, for example 5 or 10."
              },
              "reviewText": {
                "type": "string",
                "nullable": true,
                "description": "Review text, with Google's HTML removed."
              },
              "reviewTextTranslated": {
                "type": "string",
                "nullable": true,
                "description": "Google's translation of the review into the chosen language."
              },
              "translatedLanguage": {
                "type": "string",
                "nullable": true,
                "description": "Language of reviewTextTranslated (the chosen language)."
              },
              "reviewLanguage": {
                "type": "string",
                "nullable": true,
                "description": "Language Google detected for the review text."
              },
              "originalReviewLanguage": {
                "type": "string",
                "nullable": true,
                "description": "Original language when the review came with a translation."
              },
              "reviewDate": {
                "type": "string",
                "nullable": true,
                "description": "ISO 8601 date of the review's last update (Google's newest-order date)."
              },
              "reviewDateOriginal": {
                "type": "string",
                "nullable": true,
                "description": "The date as Google prints it (for example '2 weeks ago'). Partner reviews have only this relative date."
              },
              "reviewCreatedAt": {
                "type": "string",
                "nullable": true,
                "description": "ISO 8601 first-published date, filled only with enrichReviewerProfiles on."
              },
              "isEdited": {
                "type": "boolean",
                "nullable": true,
                "description": "True when the review was edited after publishing, filled only with enrichReviewerProfiles on."
              },
              "likesCount": {
                "type": "integer",
                "nullable": true,
                "description": "Review likes, filled only with enrichReviewerProfiles on."
              },
              "reviewViewCount": {
                "type": "integer",
                "nullable": true,
                "description": "Review view count, filled only with enrichReviewerProfiles on."
              },
              "isRatingOnly": {
                "type": "boolean",
                "nullable": true,
                "description": "True when the review has a rating and no text."
              },
              "photosInReview": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "Photo URLs attached to a review."
              },
              "reviewPhotoUrls": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "Alias of photosInReview kept for older integrations."
              },
              "reviewPhotoCount": {
                "type": "integer",
                "nullable": true,
                "description": "Number of photos attached to a review."
              },
              "photoDetails": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "nullable": true,
                "description": "With includePhotoDetails on: one entry per photo or video with url, width, height, uploadDate and, for videos, durationSeconds."
              },
              "videosInReview": {
                "type": "integer",
                "nullable": true,
                "description": "Number of videos attached to a review."
              },
              "reviewVideoUrls": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "Video URLs attached to a review."
              },
              "ownerResponseText": {
                "type": "string",
                "nullable": true,
                "description": "The owner's public reply, when there is one."
              },
              "ownerResponseDate": {
                "type": "string",
                "nullable": true,
                "description": "ISO 8601 owner-reply date; place mode needs enrichReviewerProfiles, reviewer mode always has it."
              },
              "ownerResponseDateOriginal": {
                "type": "string",
                "nullable": true,
                "description": "The owner-reply date as Google prints it."
              },
              "ownerResponseTextTranslated": {
                "type": "string",
                "nullable": true,
                "description": "Google's translation of the owner's reply."
              },
              "isVerified": {
                "type": "boolean",
                "nullable": true,
                "description": "Never filled: Google does not publish a verified flag on reviews. Kept in the schema for older integrations."
              },
              "visitDate": {
                "type": "string",
                "nullable": true,
                "description": "When the reviewer visited, when Google shows it."
              },
              "mentionedItems": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "Never filled as a separate field: the items a reviewer mentioned are in reviewContext (and contextLabels). Kept in the schema for older integrations."
              },
              "contextLabels": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "'Label: value' strings built from Google's structured review details."
              },
              "reviewContext": {
                "type": "object",
                "nullable": true,
                "description": "Google's structured review details (meal type, price per person, dishes or items mentioned, and so on)."
              },
              "subRatings": {
                "type": "object",
                "nullable": true,
                "description": "Google's numeric sub-ratings such as food or service, out of 5."
              },
              "businessName": {
                "type": "string",
                "nullable": true,
                "description": "Name of the place."
              },
              "businessRating": {
                "type": "number",
                "nullable": true,
                "description": "The place's average rating."
              },
              "businessTotalReviews": {
                "type": "integer",
                "nullable": true,
                "description": "How many reviews Google shows for the place."
              },
              "businessCategory": {
                "type": "string",
                "nullable": true,
                "description": "The place's main category."
              },
              "businessCategories": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "nullable": true,
                "description": "All of the place's categories."
              },
              "businessAddress": {
                "type": "string",
                "nullable": true,
                "description": "The place's address."
              },
              "businessLatitude": {
                "type": "number",
                "nullable": true,
                "description": "The place's latitude."
              },
              "businessLongitude": {
                "type": "number",
                "nullable": true,
                "description": "The place's longitude."
              },
              "placeName": {
                "type": "string",
                "nullable": true,
                "description": "Name of the reviewed place (reviewer mode)."
              },
              "placeAddress": {
                "type": "string",
                "nullable": true,
                "description": "Address of the reviewed place (reviewer mode)."
              },
              "placeLatitude": {
                "type": "number",
                "nullable": true,
                "description": "Latitude of the reviewed place (reviewer mode)."
              },
              "placeLongitude": {
                "type": "number",
                "nullable": true,
                "description": "Longitude of the reviewed place (reviewer mode)."
              },
              "placeCategory": {
                "type": "string",
                "nullable": true,
                "description": "Category of the reviewed place (reviewer mode)."
              },
              "placeRating": {
                "type": "number",
                "nullable": true,
                "description": "Rating of the reviewed place (reviewer mode)."
              },
              "placeTotalReviews": {
                "type": "integer",
                "nullable": true,
                "description": "Review count of the reviewed place (reviewer mode)."
              },
              "placePriceRange": {
                "type": "string",
                "nullable": true,
                "description": "Price range of the reviewed place (reviewer mode)."
              },
              "placeId": {
                "type": "string",
                "nullable": true,
                "description": "Google's Place ID (ChIJ...) when available."
              },
              "featureId": {
                "type": "string",
                "nullable": true,
                "description": "Google Maps feature ID (0x...:0x...)."
              },
              "cid": {
                "type": "string",
                "nullable": true,
                "description": "Google's customer ID (CID) for the place."
              },
              "kgmid": {
                "type": "string",
                "nullable": true,
                "description": "Google's Knowledge Graph ID for the place."
              },
              "placeUrl": {
                "type": "string",
                "nullable": true,
                "description": "Google Maps URL of the place."
              },
              "sourceUrl": {
                "type": "string",
                "nullable": true,
                "description": "The input that produced this record."
              },
              "order": {
                "type": "integer",
                "nullable": true,
                "description": "Position of the review in this place's collected output, starting at 1."
              },
              "position": {
                "type": "integer",
                "nullable": true,
                "description": "Position of the review in Google's list (reviewer mode)."
              },
              "sortBy": {
                "type": "string",
                "nullable": true,
                "description": "The sort order that was requested."
              },
              "sortConfirmed": {
                "type": "boolean",
                "nullable": true,
                "description": "True when the feed's order matched the requested sort. False means the actor delivered what Google returned (for example the 188-per-star rating window)."
              },
              "sortStatus": {
                "type": "string",
                "nullable": true,
                "description": "confirmed or unconfirmed."
              },
              "scrapedAt": {
                "type": "string",
                "nullable": true,
                "description": "ISO 8601 time when the run collected the record."
              },
              "reviewUrl": {
                "type": "string",
                "nullable": true,
                "description": "Google Maps URL of the review."
              },
              "reviewReportUrl": {
                "type": "string",
                "nullable": true,
                "description": "Google's report-this-review URL."
              },
              "searchQuery": {
                "type": "string",
                "nullable": true,
                "description": "The search query that found the place (search mode)."
              },
              "searchRank": {
                "type": "integer",
                "nullable": true,
                "description": "The place's rank in the search results (search mode)."
              },
              "partnerSource": {
                "type": "string",
                "nullable": true,
                "description": "For partnerReview records: the partner site Google syndicates the review from, such as Tripadvisor or Trip.com."
              },
              "partnerReviewId": {
                "type": "string",
                "nullable": true,
                "description": "For partnerReview records: the review's ID on the partner site."
              },
              "ratingHistogram": {
                "type": "object",
                "nullable": true,
                "description": "Place summary: how many reviews the place has for each star rating."
              },
              "reviewTopics": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "nullable": true,
                "description": "Place summary: Google's review topic chips and how many reviews mention each."
              },
              "phone": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: the place's phone number."
              },
              "website": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: the place's website."
              },
              "timezone": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: the place's time zone."
              },
              "countryCode": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: the place's country code."
              },
              "description": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: Google's description of the place."
              },
              "openingHours": {
                "type": "object",
                "nullable": true,
                "description": "Place summary: opening hours per weekday."
              },
              "partnerReviews": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "nullable": true,
                "description": "Place summary: partner sites Google lists for the place, with rating, scale, review count, link and a sample review."
              },
              "reviewsRemovedNotice": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: Google's notice that reviews were removed after legal complaints."
              },
              "status": {
                "type": "string",
                "nullable": true,
                "description": "Place or contributor summary: ok, noReviews, notFound, invalid or partial."
              },
              "statusReason": {
                "type": "string",
                "nullable": true,
                "description": "Place or contributor summary: plain-language explanation of the status."
              },
              "reviewsDelivered": {
                "type": "integer",
                "nullable": true,
                "description": "Place or contributor summary: how many reviews this run delivered."
              },
              "reviewsScanned": {
                "type": "integer",
                "nullable": true,
                "description": "Place summary: how many reviews the actor read before stopping."
              },
              "stopReason": {
                "type": "string",
                "nullable": true,
                "description": "Place summary: why collection stopped, such as requestedCountReached, allReviewsCollected, dateCutoffReached or sourceStoppedResponding."
              },
              "partnerReviewsDelivered": {
                "type": "integer",
                "nullable": true,
                "description": "Place summary: how many partner-site reviews this run delivered (with includePartnerReviews on)."
              }
            }
          }
        }
      },
      "minMemoryMbytes": 256,
      "maxMemoryMbytes": 2048,
      "defaultRunOptions": {
        "memoryMbytes": 512,
        "timeoutSecs": 3600
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.1.2",
    "imageDigest": "ba2b9d3d82fdf6401b8e0bdd38d8b0176450464f6be0146888f86dcbe89e0e55",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.007022222222222222
    }
  }
}