# Google Maps Scraper

Free business discovery through REST, MCP and Python or TypeScript SDKs.

Canonical page: https://gtmfree.com/tools/google-maps-scraper/

## Targeting

- `parameters.query`: a business search phrase, passed to Google Maps unchanged.
- `parameters.region`: country name, alias or ISO alpha-2/alpha-3 code, or a structured administrative selection from discovery. Use custom GeoJSON for your own areas. A custom boundary does not override the source country filter.
- `parameters.geodata.boundary`: GeoJSON FeatureCollection with Polygon or MultiPolygon geometry. Interior rings (holes) omit generated grid points. Separate polygons let you cover disconnected territories.
- `parameters.geodata.seed_cities`: GeoJSON FeatureCollection of Point features, replacing default city search points. Seeds are added independently of the boundary and its holes. Supply your own seeds, or an empty `features` array, if default seeds would undermine omissions.
- GeoJSON positions use WGS84 longitude, latitude order. Result coordinates use latitude, longitude order.

Boundaries govern search origins, not a strict filter on returned businesses. Google Maps can return places outside them; post-filter result coordinates when strict geographic inclusion or exclusion is necessary. Complete coverage is not guaranteed. Dedicated chain-exclusion and negative-keyword fields are not provided.

## Prospecting examples

- **Patient-acquisition agency:** search `dental implant clinic` in `United Kingdom`, covering Manchester, Stockport and Altrincham with a custom boundary. Omit the central area you already prospected and replace city seeds with an empty list. Research the returned contact details and review counts.
- **Commercial solar distributor:** search `commercial solar installer` in `Australia`. Use a MultiPolygon for target areas around Melbourne and Geelong, omitting an existing reseller territory. Use Google place IDs to help match the export against your CRM.
- **Hospitality software company:** search `boutique hotel` in `Portugal`, with custom coastal areas around Lagos, Portimão and Tavira, keeping search origins out of Faro. Sort or filter returned records by review count, website or phone presence in your own workflow.

Review, website and phone filters happen after retrieval; they are not additional API search fields.

### Complete Manchester request

POST `/api/v1/tools/google-maps-scraper/jobs` with your REST API key. The boundary is an approximate rectangle around Manchester, not an official administrative boundary. Its second ring omits central grid points. Empty seed features remove default city points.

```json
{
  "parameters": {
    "query": "dental implant clinic",
    "region": "United Kingdom",
    "geodata": {
      "boundary": {
        "type": "FeatureCollection",
        "features": [
          {
            "type": "Feature",
            "properties": {},
            "geometry": {
              "type": "Polygon",
              "coordinates": [
                [
                  [-2.55, 53.3],
                  [-1.95, 53.3],
                  [-1.95, 53.7],
                  [-2.55, 53.7],
                  [-2.55, 53.3]
                ],
                [
                  [-2.27, 53.46],
                  [-2.27, 53.5],
                  [-2.21, 53.5],
                  [-2.21, 53.46],
                  [-2.27, 53.46]
                ]
              ]
            }
          }
        ]
      },
      "seed_cities": {
        "type": "FeatureCollection",
        "features": []
      }
    },
    "cache": {
      "mode": "refresh"
    }
  },
  "exports": [
    "csv",
    "xlsx"
  ]
}
```

## Cache, results and exports

`parameters.cache.mode` is `resume` by default: complete query results may be reused for 24 hours from completion; hits do not extend expiry. `refresh` ignores old checkpoints and saves fresh results; `disabled` neither reads nor writes run data. Caches are isolated by account.

Records can contain a business name, Google place ID, website URL, phone, address, coordinates, category IDs, review count and average rating. Missing fields can be absent or null. Duplicate Google place IDs are consolidated. Google Maps determines which records are available.

Typed JSON result pages are available even without requested exports. Request `exports: ["json", "csv", "xlsx"]` at submission for downloadable files. JSON preserves structured data; CSV and XLSX flatten nested columns.

REST exposes result pages and binary downloads. MCP exposes `getJobResults` pages and `getJobExport` base64 chunks without a REST API key. Closing your client does not cancel an accepted job. Failed jobs may retain explicitly marked partial results.

Retrieve up to **100,000 businesses per job**. Follow every `next_cursor` for records, or download a complete JSON, CSV or XLSX export as a stream. REST exports support single byte ranges for resuming interrupted downloads. MCP export chunks use `next_offset`; append decoded bytes in order. Full result sets are held on disk, rather than collected in gateway RAM. All reads still require your account and share request, download and connection allowances; see [limits](https://gtmfree.com/docs/limits.md).

## Access and limits

Verify your email at https://gtmfree.com/account/. Use a personal API key for REST and SDKs, or OAuth login for MCP. All interfaces share jobs and allowances. The service is free, with request, work and download budgets, regional restrictions and no guarantee of coverage or availability.

- [API and MCP access](https://gtmfree.com/docs/)
- [Authoritative request schemas](https://gtmfree.com/openapi.json)
- [Limits and allowance metadata](https://gtmfree.com/docs/limits.md)
- [Terms of Use](https://gtmfree.com/terms/)

### Real results · Stockport

Query: `dental implant clinic` in `United Kingdom`. 3 selected records from 88 returned. Sample captured on 20 October 2026 near Stockport; this is not a run of the full territory plan.

| Business | City | Phone | Website | Rating / reviews |
| --- | --- | --- | --- | --- |
| Pearldent Dental Practice | Stockport | +44 161 483 3408 | [pearldent.co.uk](http://pearldent.co.uk/) | 4.8 / 5; 244 reviews |
| Hazel Grove Dental & Implant Clinic | Stockport | +44 161 483 2099 | [hazelgrovedental.co.uk](http://www.hazelgrovedental.co.uk/) | 4.2 / 5; 5 reviews |
| Stockport Implant Centre | Stockport | +44 7985 987374 | [stockportimplantcentre.com](https://www.stockportimplantcentre.com/) | 4.9 / 5; 37 reviews |

### Real results · Melbourne

Query: `commercial solar installer` in `Australia`. 3 selected records from 109 returned. Sample captured on 20 October 2026 near Melbourne; this is not a run of the full territory plan.

| Business | City | Phone | Website | Rating / reviews |
| --- | --- | --- | --- | --- |
| Enervest | South Yarra | +61 1300 164 211 | [enervest.com.au](https://www.enervest.com.au/?utm_source=google&utm_medium=organic&utm_campaign=Google+My+Business+Page) | 4.8 / 5; 21 reviews |
| SunOpt Solar | Clayton South | +61 466 778 667 | [sunopt.com.au](http://sunopt.com.au/) | 4.5 / 5; 26 reviews |
| Lumenaus Commercial Solar | South Morang | +61 407 888 531 | [lumenaus.com.au](https://lumenaus.com.au/) | Not provided; Review count not provided |

### Real results · Lagos

Query: `boutique hotel` in `Portugal`. 3 selected records from 44 returned. Sample captured on 20 October 2026 near Lagos; this is not a run of the full territory plan.

| Business | City | Phone | Website | Rating / reviews |
| --- | --- | --- | --- | --- |
| The MN56 Hotel | Lagos | +351 282 244 390 | [mn56hotel.com](http://www.mn56hotel.com/) | 4.9 / 5; 99 reviews |
| Villa Zawaia | Lagos | +351 282 012 030 | [villazawaia.com](http://www.villazawaia.com/) | 4.9 / 5; 164 reviews |
| Casa Margô | Lagos | +351 960 236 550 | [casamargo.pt](http://www.casamargo.pt/) | 4.9 / 5; 472 reviews |

## Worldwide administrative selection

Use REST `GET /api/v1/regions` or MCP `discoverRegions` to inspect countries and their available subdivision levels, then search a country/level. `load=false` never downloads a new boundary layer. `load=true` explicitly indexes a supported country/level; cold loading can return `503 region_loading` with `Retry-After: 5`. Retry the same lookup after the delay. An unloaded layer has `complete=false`; global searches cover only previously loaded subdivisions (`scope=loaded`, `complete=false`).

Submit `parameters.region` as `{"country":"DEU","level":1,"name":"Bavaria"}` or `{"id":"<exact opaque ID from discovery>"}`. Structured selections cannot also supply `geodata`. Ambiguous names return choices; never automatically choose the first. Read `supported_levels` dynamically rather than assuming universal levels or types. Whole-country strings/custom GeoJSON continue to work; French department code strings require migration.

Administrative boundaries: [geoBoundaries gbOpen](https://www.geoboundaries.org/), [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Preserve its attribution and original layer/source/license notices in `region` metadata. Display `label` or `display_name`, preserve local names, and retain uncertain `parent_status` values. Coverage depends on available provider layers. See [discovery instructions](https://gtmfree.com/docs/index.md#discover-countries-and-subdivisions) and [limits](https://gtmfree.com/docs/limits.md#region-discovery).
