Search Google Maps businesses by keyword and location

From Apify, through Joshu Data Bodega.

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, optional

    MB of run memory. treg's key requires 1024, which fixes the actor-start charge; your own key may set any size

  • timeoutinteger: 90, optional

    run 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, optional

    allPlaces | withWebsite | withoutWebsite — filter on whether the business has its own site. Filtered-out places are not charged

  • languagestring, optional

    result language, e.g. en|es|fr|de|ja|zh-CN|vi; default en

  • maxItemsinteger, optional

    optional 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, optional

    split 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, optional

    leave empty to use the residential proxy included in the run price; or pass your own gateway URLs (http://user:pass@host:port)

  • maxReviewsinteger, optional

    reviews to attach per business, 0-500; default 0 (none). A place page holds roughly the first 8

  • locationQuerystring, optional

    where 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, optional

    look 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, optional

    total businesses across all terms; 0 = no ceiling. You pay per business returned, so set this to cap the bill

  • skipClosedPlacesboolean, optional

    leave out permanently-closed businesses so you do not pay for dead leads. Default true

  • maxTotalChargeUsdnumber, optional

    the 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, optional

    keep only businesses rated at or above '1'|'2'|'3'|'4'|'4.5'; empty keeps all. Filtered-out places are not returned, not charged

  • searchStringsArraystring, required

    keywords to search, one per entry (dentist, plumber, coffee shop); each is searched inside locationQuery and every business becomes one row

  • scrapePlaceDetailPageboolean, optional

    also 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, optional

    max businesses per search term, 1-500, counted AFTER filters; default 100

Call it

Router call with a router API key
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
    }
  }'