
Search Google Maps businesses by keyword and location
From Apify, through Joshu Data Bodega.
Part of Google Keyword Data serp maps.
- Price
- $0.0099 per call$9.90 per 1,000 calls
No calls measured in the last 30 days.
Prices include the router's 10% markup and are paid from the usage wallet. Checked on November 11, 2026.
Inputs
memoryinteger: 1024, optionalMB of run memory. treg's key requires 1024, which fixes the actor-start charge; your own key may set any size
timeoutinteger: 90, optionalrun timeout in seconds. treg's key requires 90 so the run and its rows arrive before any wait gives up; a larger pull should use your own key and the async web.scrape.job.* pair above
websitestring, optionalallPlaces | withWebsite | withoutWebsite — filter on whether the business has its own site. Filtered-out places are not charged
languagestring, optionalresult language, e.g. en|es|fr|de|ja|zh-CN|vi; default en
maxItemsinteger, optionaloptional row cap; pay-per-event actors that take the row count from their own input ignore it, so maxTotalChargeUsd is the spend limit
geo_splitboolean, optionalsplit a wide area into a grid and search each cell to get past Google's ~120-per-view ceiling. Default false; turn on for anything wider than a city
proxyUrlsstring, optionalleave empty to use the residential proxy included in the run price; or pass your own gateway URLs (http://user:pass@host:port)
maxReviewsinteger, optionalreviews to attach per business, 0-500; default 0 (none). A place page holds roughly the first 8
locationQuerystring, optionalwhere to search, as typed into Google Maps: 'Austin, TX', 'London, UK', or a whole country. Omit to let each term carry its own location
scrapeContactsboolean, optionallook up each business site for emails and social links (emails, email_type, social_links). Default true — these fields are part of the result price, not an add-on
maxCrawledPlacesinteger, optionaltotal businesses across all terms; 0 = no ceiling. You pay per business returned, so set this to cap the bill
skipClosedPlacesboolean, optionalleave out permanently-closed businesses so you do not pay for dead leads. Default true
maxTotalChargeUsdnumber, optionalthe spend cap Apify enforces on every event this run bills, in dollars. treg's key requires it, above 0 and at most 1, and holds it for the call
placeMinimumStarsstring, optionalkeep only businesses rated at or above '1'|'2'|'3'|'4'|'4.5'; empty keeps all. Filtered-out places are not returned, not charged
searchStringsArraystring, requiredkeywords to search, one per entry (dentist, plumber, coffee shop); each is searched inside locationQuery and every business becomes one row
scrapePlaceDetailPageboolean, optionalalso open each place's Maps page for hours, price_level, popular_times and any missing phone/site. Default false; makes a run noticeably longer
maxCrawledPlacesPerSearchinteger, optionalmax businesses per search term, 1-500, counted AFTER filters; default 100
Call it
curl https://hello.joshu.me/api/router/call \
-H "Authorization: Bearer $JOSHU_ROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "apify.google.serp.maps",
"params": {
"memory": 1024,
"timeout": 90,
"maxItems": 1,
"maxReviews": 0,
"locationQuery": "Austin, TX",
"scrapeContacts": false,
"maxCrawledPlaces": 1,
"skipClosedPlaces": true,
"maxTotalChargeUsd": 0.08,
"searchStringsArray": [
"coffee shop"
],
"scrapePlaceDetailPage": false,
"maxCrawledPlacesPerSearch": 1
}
}'