Pull a Place's Google Maps Reviews Into a Sentiment Feed
A step-by-step recipe to scrape one place's Google Maps reviews, score them, and turn the result into a refreshable sentiment feed.

You can go from a single Google Maps place URL to a scored, refreshable review feed in about ten minutes, with no Google Places API key required. The recipe is short: inspect the scraper for free, run it once against your place URL with a small review cap, then pipe the text and ratings through a lightweight sentiment pass. Everything below uses real commands you can paste as-is.
Copy this line to your agent to build a Google Maps sentiment feed.
set up https://monid.ai/SKILL.md and use apify/compass/google-maps-reviews-scraper to pull the reviews for a place URL and score their sentiment
TL;DR
- Use the Apify
compass/google-maps-reviews-scraperactor through Monid. It takes a place URL and amaxReviewscap and returns per-review text, star rating, author, timestamp, and any owner responses. - No Google Places API key and no per-vendor signup.
inspectis free, and oneruncosts a fraction of a cent per review at the price shown on monid.ai/tools. - Google's own Place Details endpoint returns at most five reviews per place, so this scraper is the practical path when you want the full recent stream.
- Extract
textandstarswithjq, run a small sentiment pass, and you have a scored feed you can re-run on a cron.
Step 1: get the place URL
Open the business on Google Maps and copy the full URL from the address bar. It looks like https://www.google.com/maps/place/.../@lat,lng,z/data=.... That whole string is the placeUrl the actor expects. Keep the query string intact, since the trailing data= segment is what pins the request to one specific listing.
Step 2: set up Monid once
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More details in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add --label main --key <your-api-key>
More details in the CLI quickstart.
Step 3: inspect the endpoint (free)
Before spending anything, look at the exact input the actor wants:
monid inspect -p apify -e /compass/google-maps-reviews-scraper
This prints the schema for free. You are looking for two fields: placeUrl (the string from Step 1) and maxReviews (an integer cap). The output also lists the shape of each returned review, so you know which keys to pull later. The full field reference lives on the actor's Apify page.

Step 4: run it once with a small cap
Start tiny. A cap of 25 reviews is enough to confirm the shape and keep the run cheap. The -w flag waits inline and prints the result, and -o saves it to disk.
monid run -p apify -e /compass/google-maps-reviews-scraper \
-i '{"placeUrl":"https://www.google.com/maps/place/YOUR_PLACE","maxReviews":25}' \
-w -o reviews.json
run is the only paid step, billed pay-as-you-go at the price already shown during inspect. At a cap of 25 you are spending a fraction of a cent per review, so the whole pull lands well under a cent per dozen. See the live rate on monid.ai/tools. If a run takes a while and you did not wait inline, fetch it afterward with its run ID:
monid runs get -r <RunID> -o reviews.json
Step 5: extract text and rating with jq
The saved reviews.json holds an array of review objects. Pull the two fields sentiment scoring actually needs, the star rating and the review text, into a clean flat file with jq:
jq '[.[] | {stars: .stars, text: .text, author: .name, when: .publishedAtDate}]' \
reviews.json > reviews-clean.json
Now every record is one review with a numeric rating and its text. Empty-text reviews (a star rating with no words) are common on Maps, so filter them out before scoring:
jq '[.[] | select(.text != null and .text != "")]' \
reviews-clean.json > reviews-scored-input.json
Step 6: the sentiment pass
You have two lightweight options, and both are fine for a feed.
The zero-dependency version treats the star rating as a coarse sentiment label: 4 to 5 is positive, 3 is neutral, 1 to 2 is negative. This costs nothing and catches the broad mood instantly:
jq 'map(. + {mood: (if .stars >= 4 then "positive" elif .stars == 3 then "neutral" else "negative" end)})' \
reviews-scored-input.json > feed.json
The text-aware version scores the words, not just the stars, which matters when a reviewer leaves four stars but a paragraph of complaints. Hand reviews-scored-input.json to your agent (or any local sentiment model) and ask it to add a sentiment score from -1 to 1 per record. Because Monid ships as an MCP server, an agent can run Step 4 and this scoring pass in the same session without you copying files around. Either way you end up with feed.json: one row per review, carrying stars, text, author, timestamp, and a mood label.
A quick sanity check on the mix:
jq 'group_by(.mood) | map({mood: .[0].mood, count: length})' feed.json
Step 7: make it refreshable
A one-time pull is a snapshot. A feed re-runs on a schedule and shows you what changed. Drop Step 4 through Step 6 into a small shell script and put it on a timer (cron, a scheduled cloud job, or a CI schedule). Bump maxReviews a little and keep the newest window so each run picks up fresh reviews:
#!/bin/sh
monid run -p apify -e /compass/google-maps-reviews-scraper \
-i '{"placeUrl":"'"$PLACE_URL"'","maxReviews":50}' -w -o reviews.json
jq '[.[] | select(.text != null and .text != "") | {stars, text, author: .name, when: .publishedAtDate}]' \
reviews.json > reviews-scored-input.json
jq 'map(. + {mood: (if .stars >= 4 then "positive" elif .stars == 3 then "neutral" else "negative" end)})' \
reviews-scored-input.json > "feed-$(date +%F).json"
Run it daily and you have a dated series of scored feeds. Diff two days to catch a sudden run of negative reviews, or roll them up into a weekly mood trend. Since each run is billed only for what it pulls, a daily feed at a 50-review cap stays in single-digit cents per week.
Cost tally
discoverandinspect: free.- One
runat a 25 to 50 review cap: a fraction of a cent per review, so a few cents per pull. - A daily refresh for a month: single-digit dollars, depending on your cap.
Exact per-run pricing is always shown before you spend, both during inspect and on monid.ai/tools.
FAQ
Do I need a Google API key or a Cloud project? No. The Apify actor scrapes the public Maps listing from the place URL, so there is no Google Places API key, billing account, or quota to set up. Your only credential is a Monid API key from app.monid.ai.
Why not just use Google's Place Details API?
Place Details caps the reviews it returns at five per place, which is too thin for a sentiment feed. The scraper pulls the deeper recent stream up to your maxReviews cap.
What fields come back per review?
Each record includes the review text, star rating, author name, publish time, and any owner response. Run monid inspect -p apify -e /compass/google-maps-reviews-scraper to see the exact schema for free before you spend anything.
How much does a refresh cost?run is pay-as-you-go and priced per result, on the order of a fraction of a cent per review, so a modest daily feed lands in single-digit dollars a month. Check the current rate on monid.ai/tools.