Google Maps All In One Api
Pricing
from $7.80 / 1,000 searches
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
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:
| Endpoint | Event | Price |
|---|---|---|
GET /search | search | $0.01 |
GET /place/:featureId | place | $0.012 |
GET /reviews/:featureId | reviews | $0.008 |
GET /directions | directions | $0.012 |
GET /traffic | traffic | $0.015 |
GET /suggest | suggest | $0.002 |
GET /geocode | geocode | $0.006 |
GET /photos | photos | $0.006 |
GET /share | share | $0.002 |
GET /ev/connector-types | evConnectorTypes | $0.001 |
GET /ev/payment-networks | evPaymentNetworks | $0.001 |
GET /categories | categories | $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).
GET /share — generate a shareable link
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
/searchresults can be biased toward the US (Ashburn/Sterling, VA) regardless of thelat/lngyou 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 separategoogle-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 AWSus-east-1(Ashburn, VA). Fixing this would require routing requests through a geographic (Indonesia-region) proxy, which isn't currently implemented./search'sopenNow/minRating/categoryfilters 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 thanmaxResultsunder the hood so filtering still returns a full page, but very narrow filters on a sparse area can still come back with fewer thanmaxResults.- 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
/categoriesuses (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./categoriesonly replays the one specific capture confirmed to reliably return the category catalog.