# Google Maps All In One Api (`romy/google-maps-all-in-one-api`) Actor

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.

- **URL**: https://apify.com/romy/google-maps-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Travel, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.80 / 1,000 searches

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 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](https://docs.apify.com/platform/actors/running/standby) —
call it like any REST API, no run/wait-for-finish cycle needed:

```bash
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

```bash
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>'
```

```json
{
  "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](#known-limitations) for how these
work under the hood).

#### `GET /place/:featureId` — full place detail

```bash
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

```bash
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>'
```

```json
{
  "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

```bash
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

```bash
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

```bash
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>'
```

```json
{
  "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

```bash
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>'
```

```json
{
  "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

```bash
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

```bash
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>'
```

```json
{ "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

```bash
curl 'https://romy--google-maps-all-in-one-api.apify.actor/ev/connector-types?token=<YOUR_APIFY_TOKEN>'
```

```json
{
  "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

```bash
curl 'https://romy--google-maps-all-in-one-api.apify.actor/ev/payment-networks?token=<YOUR_APIFY_TOKEN>'
```

```json
{
  "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

```bash
curl 'https://romy--google-maps-all-in-one-api.apify.actor/categories?token=<YOUR_APIFY_TOKEN>'
```

```json
{
  "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.

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `api` (type: `string`):

This Actor doesn't write to a dataset — every response is returned directly over HTTP by its Standby web server. See the README / web server OpenAPI schema (webServerSchema) for the full endpoint list and response shapes (GET /search, /place/:featureId, /reviews/:featureId, /directions, /traffic, /suggest, /geocode, /photos, /share, /ev/connector-types, /ev/payment-networks, /categories).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/google-maps-all-in-one-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/google-maps-all-in-one-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call romy/google-maps-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/google-maps-all-in-one-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2YEoKFEeaMNncWqtn/builds/8K69lFdoSXNDLwDjZ/openapi.json
