Tools / Google Maps / API
Skip Selenium and Playwright. From Python, one requests.post to https://api.routergrowth.com/v1/run with capability local.places, a query and a City,State,Country location returns the Google Maps listings as JSON: name, category, address, website, rating, review count and place ID, ready for pandas.
Ask your agent
Write a Python script that scrapes bike shops in Portland, Seattle and Vancouver from Google Maps and saves a CSV.
Connect RouterGrowth once, then ask in plain words. New workspaces start with $1 of credit. Get a key or read the setup guide.
A real run
One call to local.places (google maps places), run through RouterGrowth on October 19, 2026. These are the first rows it returned; fields that name a person are masked.
| name | category | address | rating | reviews_count |
|---|---|---|---|---|
| River City Bicycles | Bicycle Shop | 706 SE Martin Luther King Jr Blvd, Portland, OR 97214 | 4.7 | 591 |
| Cyclepath PDX | Bicycle Shop | 2436 NE Martin Luther King Jr Blvd, Portland, OR 97212 | 4.9 | 216 |
| Splendid Cycles | Electric bicycle store | 407 SE Ivon St, Portland, OR 97202 | 4.9 | 110 |
Bike shops in Portland, Oregon: 20 listings came back, shops mixed with rentals and bike share stations that the script can filter on category.
Step by step
Put ROUTERGROWTH_API_KEY in the environment and send it as Authorization: Bearer.
requests.post to /v1/run with capability local.places and input query, location and limit. Add routing.max_cost as a ceiling.
pandas.DataFrame(response.json()['result']['places']) gives one row per listing with every field as a column.
Run the same query for each city in a list and drop duplicates on place_id.
Price
List prices on this call, read from the catalog when this page was built. The exact figure is quoted before every run, and a monthly plan lowers it.
In practice
You describe the job; the agent picks the calls, shows the price and runs them.
Write a Python script that scrapes bike shops in Portland, Seattle and Vancouver from Google Maps and saves a CSV.
Extend it: for each shop with a website, look up a work email for the owner from the domain.
Connect
One MCP server for Claude, ChatGPT, Claude Code, Codex and Cursor, or the same call over the CLI and REST with the input above.
claude mcp add --transport http routergrowth https://api.routergrowth.com/mcp
npm install -g routergrowth && routergrowth setup
routergrowth run -c local.places -i '{"query": "bike shop", "location": "Portland,Oregon,United States", "limit": 10}'curl -X POST https://api.routergrowth.com/v1/run \
-H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \
-d '{"capability": "local.places", "input": {"query": "bike shop", "location": "Portland,Oregon,United States", "limit": 10}}'Worth knowing
There is no headless Chrome, no scrolling the results panel and no selectors that break.
The search returns related places too: in this run bike share stations and a city office. Keep the categories you want.
The place object keeps the same keys whichever provider answered, so the script does not branch.
FAQ
No. The HTTP call returns the listings; the fetching runs on RouterGrowth's providers.
Not required. requests or httpx is enough, and the CLI covers shell scripts.
Run more specific searches (neighbourhoods, nearby cities) and merge on place_id.
Yes. Post reviews.search with the place_id from each listing.
More on Google Maps
Reading this as an agent? This page as markdown: /tools/google-maps/scraper-python.md
Connect your agent once. The first calls run on the $1 that comes with signup.