Operated by Sourcelane✓ verified
A Google Maps reviews scraping connector that extracts full review data for businesses by accepting place URLs, Place IDs, or search queries and crawling Google Maps without requiring an API key or a browser. Produces one record per review containing a review identifier and source URL, numeric rating, full review text and language, relative and exact timestamps, attached photos, owner reply text and reply timestamp, reviewer metadata (display name, profile link, avatar, user identifier, reviewer review count, local guide flag), and place-level metadata (place identifiers, name, address, category, aggregate rating, total review count, place link). Implements newest-first pagination and a resumeable pagination cursor for deep scraping across tens of thousands of reviews; supports searching niches and fetching reviews for top search results.
Verified Sep 28, 3:55 AM
$0.0006
per review
Up to 100 per call. Only pay for results returned; failed calls are refunded.
| Window | Uptime | Success rate | p50 | p95 | Calls |
|---|---|---|---|---|---|
| 24h | — | — | — | — | 0 |
| 7d | — | — | — | — | 0 |
| 30d | — | — | — | — | 0 |
Call it through Sourcelane's gateway or MCP server. We run the connector, apply your agent's spend guardrails, and bill only the results returned.
Call it via Sourcelane
curl -X POST https://api.usesourcelane.com/v1/call \
-H "Authorization: Bearer sl_live_your_agent_key" \
-H "Content-Type: application/json" \
-d '{"listing":"google-maps-reviews-scraper","params":{"placeUrls":["https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"],"maxPlacesPerQuery":5},"maxResults":10}'Request params
| Field | Type | Required | Description |
|---|---|---|---|
placeUrls | array | optional | Places to fetch reviews for. Accepts full Google Maps place URLs, maps.app.goo.gl short links, ?cid= links, Google Place IDs (ChIJ…), or hex IDs (0x…:0x…). |
searchQueries | array | optional | Alternatively search Google Maps and fetch reviews for the top results — e.g. "dentists in Austin TX". Use Max places per query to control how many places are taken from each search. |
maxPlacesPerQuery | integer | optional | How many places to take from each search query (only used with Search queries). Capped at 100 per call. |
maxReviewsPerPlace | integer | optional | Reviews to fetch per place, newest first. Set 0 for all reviews (large places can have tens of thousands — the run stops safely before the timeout and writes a resume cursor). |
language | string | optional | Language code for the interface strings and place names, e.g. en, de, fr, es, pt-BR. Review text is always returned in its original language. |
country | string | optional | Two-letter country code that biases search results, e.g. us, gb, de, au. |
pageId | string | optional | Paste NEXT_PAGE_ID from the previous run's Key-value store to continue fetching more reviews for the same places. |
Each result contains
| Field | Type | Description |
|---|---|---|
reviewId | string | Review Id |
reviewUrl | string | Review Url |
reviewerName | string | Reviewer Name |
reviewerProfileUrl | string | Reviewer Profile Url |
reviewerAvatarUrl | string | Reviewer Avatar Url |
reviewerUserId | string | Reviewer User Id |
reviewerReviewCount | integer | Reviewer Review Count |
reviewerIsLocalGuide | boolean | Reviewer Is Local Guide |
rating | integer | Rating |
text | string | Text |
dateText | string | Date Text |
publishedAt | string | Published At |
updatedAt | string | — |
language | string | — |
photos | array | — |
ownerReply | string | — |
ownerReplyDate | string | — |
placeId | string | — |
googlePlaceId | string | — |
placeName | string | — |
placeAddress | string | — |
placeCategory | string | — |
placeRating | number | — |
placeReviewCount | integer | — |
placeUrl | string | — |
searchQuery | null | — |
scrapedAt | string | — |
Pick your tool and connect in under a minute. Then just ask — for example: “List 40 dentists in Austin TX with phone, website and rating above 4.5.”
Connect Claude
Web, desktop and mobile. Paste one URL.
Adds the Sourcelane MCP server with your key as a header.
claude mcp add --transport http sourcelane https://api.usesourcelane.com/mcp \
--header "Authorization: Bearer sl_live_your_agent_key"Alternative to the connector URL: add to claude_desktop_config.json, then restart Claude.
{
"mcpServers": {
"sourcelane": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.usesourcelane.com/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer sl_live_your_agent_key"
}
}
}
}Add to ~/.cursor/mcp.json (or Windsurf's mcp_config.json).
{
"mcpServers": {
"sourcelane": {
"url": "https://api.usesourcelane.com/mcp",
"headers": {
"Authorization": "Bearer sl_live_your_agent_key"
}
}
}
}Save as .vscode/mcp.json. VS Code prompts for your key once.
{
"servers": {
"sourcelane": {
"type": "http",
"url": "https://api.usesourcelane.com/mcp",
"headers": {
"Authorization": "Bearer ${input:sourcelane-key}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "sourcelane-key",
"description": "Sourcelane agent key",
"password": true
}
]
}Create a GPT → Actions → Import from URL, then Authentication: API Key, Bearer.
https://usesourcelane.com/openapi.jsonOne POST. Pass maxResults to cap cost.
curl -X POST https://api.usesourcelane.com/v1/call \
-H "Authorization: Bearer sl_live_your_agent_key" \
-H "Content-Type: application/json" \
-d '{"listing":"google-maps-reviews-scraper","params":{"placeUrls":["https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"],"maxPlacesPerQuery":5},"maxResults":10}'Wrap the REST call as a tool, or point an MCP client at the endpoint.
import requests
res = requests.post(
"https://api.usesourcelane.com/v1/call",
headers={"Authorization": "Bearer sl_live_your_agent_key"},
json={
"listing": "google-maps-reviews-scraper",
"params": {"placeUrls":["https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea"],"maxPlacesPerQuery":5},
"maxResults": 10,
},
timeout=300,
)
body = res.json()
print(body["receipt"]["chargedMicros"], "micro-USD for", body["receipt"]["results"], "results")
print(body["data"])—
0 reviews
Leave a review
Loading reviews…