Google Maps All In One Api avatar

Google Maps All In One Api

Pricing

from $7.80 / 1,000 searches

Go to Apify Store
Google Maps All In One Api

Google Maps All In One Api

Real-time, unofficial Google Maps API (Android internal gRPC API) — place search, place details, reviews, directions, live traffic, autocomplete, reverse geocoding, photos, shareable links, EV charging reference data, and business category catalog. No API key, no scraping setup.

Pricing

from $7.80 / 1,000 searches

Rating

0.0

(0)

Developer

Romy

Romy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Google Maps API

Real-time, unofficial Google Maps data as a REST API — place search, place details, reviews, directions, live traffic, autocomplete, reverse geocoding, photos, shareable links, and EV charging reference data. No scraping, no HTML parsing: this talks directly to the same private API the official Google Maps Android app uses, and returns clean JSON.

Quick start

Once deployed on Apify, the actor runs in Standby mode — call it like any REST API, no run/wait-for-finish cycle needed:

$curl "https://romy--google-maps-all-in-one-api.apify.actor/search?q=coffee&lat=38.8977&lng=-77.0365&token=<YOUR_APIFY_TOKEN>"

(get your token from the Integrations tab in Apify Console — Authorization: Bearer <token> header works too, instead of ?token=)

Pricing

Pay-per-event — you're only charged for successful calls, once per request, regardless of how many results come back:

EndpointEventPrice
GET /searchsearch$0.01
GET /place/:featureIdplace$0.012
GET /reviews/:featureIdreviews$0.008
GET /directionsdirections$0.012
GET /traffictraffic$0.015
GET /suggestsuggest$0.002
GET /geocodegeocode$0.006
GET /photosphotos$0.006
GET /shareshare$0.002
GET /ev/connector-typesevConnectorTypes$0.001
GET /ev/payment-networksevPaymentNetworks$0.001
GET /categoriescategories$0.001

Endpoints

GET /search — search for places near a location

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/search' \
--data-urlencode 'q=coffee' \
--data-urlencode 'lat=38.8977' \
--data-urlencode 'lng=-77.0365' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"places": [
{
"placeId": "0x89b7b7bcdecbb1df:0x715969d86d0b76bf",
"name": "Compass Coffee",
"lat": 38.9012,
"lng": -77.0288,
"fullAddress": "1535 7th St NW, Washington, DC 20001, United States",
"rating": 4.6,
"reviewCount": 812,
"categories": ["Coffee shop"]
}
],
"count": 10
}

Optional filters — openNow=true, minRating=4.5, category=coffee — narrow the results (see Known limitations for how these work under the hood).

GET /place/:featureId — full place detail

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/place/0x89b7b7bcdecbb1df%3A0x715969d86d0b76bf' \
--data-urlencode 'name=White House' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'

Returns hours, popular times, photos, menu items, amenities, and more — see the OpenAPI schema (webServerSchema in .actor/actor.json) for the full shape. featureId comes from a /search, /suggest, or /geocode result — URL-encode the colon.

GET /reviews/:featureId — paginated reviews

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/reviews/0x89b7b7bcdecbb1df%3A0x715969d86d0b76bf' \
--data-urlencode 'pageSize=10' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"reviews": [
{ "rating": 5, "text": "Great spot!", "dateText": "3 months ago", "reviewerName": "Jane D." }
],
"count": 10,
"nextPageToken": "CAESB0NnZ0lDQmc="
}

Pass nextPageToken back as ?pageToken= for the next page.

GET /directions — routes to a destination

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/directions' \
--data-urlencode 'destName=The White House' \
--data-urlencode 'destFeatureId=0x89b7b7bcdecbb1df:0x715969d86d0b76bf' \
--data-urlencode 'destLat=38.8977' \
--data-urlencode 'destLng=-77.0365' \
--data-urlencode 'modes=DRIVE,WALK,TRANSIT' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'

Returns one or more Route objects per requested mode (DRIVE, WALK, TRANSIT, MOTORCYCLE), each with duration, distance, tolls/advisories, and — for DRIVE/WALK/MOTORCYCLE — a linestring of [lng, lat] points; TRANSIT routes instead return per-leg detail (line, stops, schedule).

GET /traffic — live traffic as GeoJSON

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/traffic' \
--data-urlencode 'lat=38.8977' \
--data-urlencode 'lng=-77.0365' \
--data-urlencode 'zoom=15' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'

Returns a raw GeoJSON FeatureCollection (no {success, ...} envelope) — drop it straight into any GeoJSON viewer. Each feature is a road segment with a speedLabel (fast/moderate/slow/heavy) and color. radius controls how many tiles around the center point are fetched (more tiles = more coverage, more cost in upstream calls).

GET /suggest — search-as-you-type autocomplete

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/suggest' \
--data-urlencode 'q=White House' \
--data-urlencode 'lat=38.9' \
--data-urlencode 'lng=-77.03' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"suggestions": [
{
"fullText": "White House, Pennsylvania Avenue Northwest, Washington, DC, USA",
"primaryText": "White House",
"placeId": "0x89b7b7bcdecbb1df:0x715969d86d0b76bf",
"lat": 38.8976763,
"lng": -77.0365298
}
],
"count": 10
}

GET /geocode — reverse geocode a point

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/geocode' \
--data-urlencode 'lat=38.8960382' \
--data-urlencode 'lng=-77.0365611' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"location": {
"kgId": "/g/11v5rw0dxd",
"gcid": "gcid:park",
"lat": 38.8960382,
"lng": -77.0365611,
"parents": [
{ "kgId": "/g/11b8txhk9w", "gcid": "gcid:compound_grounds", "lat": 38.8949128, "lng": -77.037736 },
{ "kgId": "/m/0fznt6", "gcid": "gcid:palace", "lat": 38.8975862, "lng": -77.0366871 }
]
}
}

Only returns a hierarchy when Google's data has one for that exact point (campus/park/compound-style areas) — plain addresses and standalone landmarks correctly return "location": null.

GET /photos — photos near a point

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/photos' \
--data-urlencode 'lat=38.8960382' \
--data-urlencode 'lng=-77.0365611' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'

No place id needed — just coordinates and an optional radius (meters).

curl --get 'https://romy--google-maps-all-in-one-api.apify.actor/share' \
--data-urlencode 'placeId=0x89b7b7bcdecbb1df:0x715969d86d0b76bf' \
--data-urlencode 'address=White House, Pennsylvania Avenue Northwest, Washington, DC, USA' \
--data-urlencode 'lat=38.8976763' \
--data-urlencode 'lng=-77.0365298' \
--data-urlencode 'token=<YOUR_APIFY_TOKEN>'
{ "success": true, "url": "https://maps.app.goo.gl/VRP3mQSMQksCVY7U8" }

The same short link the app's "Share" button produces.

GET /ev/connector-types — reference list of EV connector types

$curl 'https://romy--google-maps-all-in-one-api.apify.actor/ev/connector-types?token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"connectors": [
{ "id": 2, "name": "J1772", "iconUrl": "https://www.gstatic.com/maps/ev/connectors/EV_Connectors_J1772.png" },
{ "id": 5, "name": "CCS (Combo 1)", "iconUrl": "https://www.gstatic.com/maps/ev/connectors/EV_Connectors_CCS_1.png" }
],
"compat": [{ "vehicleConnectorId": 1, "adapterConnectorId": 2 }]
}

No parameters — a static catalog, useful for populating a connector-type picker. compat lists which connectors can reach which other connectors' stations via an adapter.

GET /ev/payment-networks — reference list of EV charging networks

$curl 'https://romy--google-maps-all-in-one-api.apify.actor/ev/payment-networks?token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"networks": [
{ "kgId": "/g/11jfs6xw8_", "name": "ChargePoint", "slugs": ["chargepoint"], "popular": true }
],
"country": "United States"
}

No parameters — the network list and country are inferred server-side from the request's origin.

GET /categories — business/place category catalog

$curl 'https://romy--google-maps-all-in-one-api.apify.actor/categories?token=<YOUR_APIFY_TOKEN>'
{
"success": true,
"groups": [
{
"label": "Food & Drink",
"iconUrl": "https://ssl.gstatic.com/local/dining/restaurants.png",
"items": [
{ "label": "Coffee", "iconUrl": "https://ssl.gstatic.com/local/dining/coffee.png", "queryText": "Coffee" }
]
}
]
}

No parameters — the same "More Categories" browser (Food & Drink, Things to do, Shopping, Services) shown on the app's Explore tab. Feed an item's queryText straight into /search's q param.

Known limitations

  • /search results can be biased toward the US (Ashburn/Sterling, VA) regardless of the lat/lng you pass. Confirmed via a live A/B test: the real Google Maps Android app, run from a phone physically in Jakarta, correctly returns Jakarta-area results for the same query — but the identical request (down to a byte-for-byte header/body replay, including trying the device/session context headers other endpoints use) sent from Apify's infrastructure returns US results instead. This reproduces on two independently-built actors (this one, and the separate google-maps-place-scraper) and two different execution models (Standby and a regular Actor run), so it isn't a bug in either actor's request-building code — Google's backend appears to weight the caller's IP geolocation over the request's explicit coordinates for unauthenticated requests, and Apify's compute runs in AWS us-east-1 (Ashburn, VA). Fixing this would require routing requests through a geographic (Indonesia-region) proxy, which isn't currently implemented.
  • /search's openNow/minRating/category filters are applied client-side, not passed through to Google's servers. The app's own "Open now" filter chip turned out, after diffing a live capture of the request with it checked against the same request unchecked, to send byte-for-byte identical content (aside from opaque per-request tracking tokens) — the filtering happens against fields the server already returns (hours, rating, category), not a request-side flag. Practical effect: filtered requests fetch more raw results than maxResults under the hood so filtering still returns a full page, but very narrow filters on a sparse area can still come back with fewer than maxResults.
  • Directions always starts from a fixed stub location baked into the request template — only the destination is configurable. A proper origin parameter would need a wider capture of the request shape.
  • EV charging station connector/port data (available in Google's data model — connector type, power, live availability) requires what appears to be a freshly-minted session token from a real app search session rather than a replayable static value; not currently exposed.
  • /place's hours, amenities, menu, and description are extracted via heuristic text scanning of a mixed text/binary response section rather than a fully mapped schema — reliable in testing, but a very unusual business listing could occasionally miss a field.
  • Promoted/sponsored map pin ads are not exposed. The underlying endpoint exists and returns real ad data (advertiser, headline, CTA, click-through URL) when called from the real app, but requires a signed-in Google account's session cookies — device-only auth (which is all the rest of this API needs) gets an endless cookie-bootstrap loop instead of ad data. Out of scope without real account credentials.
  • "Trending on Maps" place carousel and the weather/air-quality summary card are not exposed, even though both come back from the same endpoint /categories uses (MobileMapsPassiveAssistService/GetContent). Near-identical-looking requests returned different content bundles (categories vs. weather vs. trending places) in a way that wasn't reliably reproducible in the time spent, and the response itself is a very large, deeply-nested tree dominated by internal experiment/feature- flag data that makes isolating the real content path error-prone. /categories only replays the one specific capture confirmed to reliably return the category catalog.