# Google Maps Place ID & Business Contact API (`johnvc/google-maps-place-id-contact-api`) Actor

Resolve any Google Maps place ID to a full business profile: contact email, social profiles, accessibility and amenity attributes, closure status, structured address, and plus code. Place ID lookup plus contact enrichment in one call. Pay per record, MCP ready.

- **URL**: https://apify.com/johnvc/google-maps-place-id-contact-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Lead generation, Developer tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Place ID & Business Contact API

Turn a Google Maps place ID into a complete business record. Give this Actor a place ID, a ChIJ feature ID, or a Google Maps URL, and it returns the business email, social profiles, accessibility and amenity attributes, closure status, structured address, and plus code as clean JSON.

This is a place ID lookup and a contact enrichment step in one call. It is built to run after a search, on the place IDs you already have.

### What it returns

Google publishes some of this and hides the rest. The contact details are not in Google's place data at all, so this Actor reads the business website to resolve them.

| Field | What you get | Where it comes from |
|---|---|---|
| `email` | Best contact address for the business | Business website |
| `emails` | Every valid address found | Business website |
| `socialLinks` | Facebook, Instagram, LinkedIn, YouTube, TikTok, X, Pinterest, Yelp, TripAdvisor profiles | Business website |
| `socialProfiles` | The same platforms as a plain comma-separated list, for spreadsheets and tables | Business website |
| `about` | Accessibility, service options, payments, planning attributes, each with a true or false flag | Google Maps |
| `businessStatus` | `OPERATIONAL`, `CLOSED_TEMPORARILY`, or `CLOSED_PERMANENTLY` | Google Maps |
| `plusCode` | Open Location Code, a global address that works without street addressing | Google Maps |
| `addressComponents` | Address split into parts | Google Maps |
| `categories`, `primaryType` | Every Google category for the business | Google Maps |
| `phone`, `fax`, `website` | Listed contact numbers and site | Google Maps |
| `menu`, `hotelClass` | Menu sections and lodging star rating where published | Google Maps |

Social profiles and email are the two fields most often missing from business data sets, because neither appears in Google's place listing. Reading the website is the only way to get them, and this Actor does it in the same pass.

Fields with no value are left out of the record rather than returned empty, so the fill percentage shown on the Output tab is the real hit rate rather than a column of blanks.

### How to get started

1. Open the [Google Maps Place ID & Business Contact API](https://apify.com/johnvc/google-maps-place-id-contact-api?fpr=9n7kx3) on Apify Store.
2. Paste one or more place IDs, feature IDs, or Google Maps URLs into **Place IDs**.
3. Leave **Resolve contact details** on to get email and social profiles.
4. Run it. One record comes back per place.

Input accepts all three of these, so you rarely need to convert anything:

```
0x54ae55e377fa4a87:0x91e7fe3019801009
ChIJrTLr-GyuEmsRBfy61i59si0
https://www.google.com/maps/place/Northwest+Dental+Center/@43.62,-116.28,17z/data=!4m2!3m1!1s0x54ae55e377fa4a87:0x91e7fe3019801009
```

### Example output

```json
{
  "result_type": "place",
  "placeId": "0x54ae55e377fa4a87:0x91e7fe3019801009",
  "name": "Northwest Dental Center",
  "email": "office@nwdentalcenter.com",
  "emails": ["office@nwdentalcenter.com"],
  "socialLinks": [
    { "platform": "facebook", "url": "https://www.facebook.com/nwdentalcenter" },
    { "platform": "instagram", "url": "https://www.instagram.com/nwdentalcenter" }
  ],
  "businessStatus": "OPERATIONAL",
  "plusCode": "85M5JPG7+QX",
  "address": "8300 W Northview St, Boise, ID 83704",
  "addressComponents": ["8300 W Northview St", "Boise, ID 83704"],
  "categories": ["Dentist", "Cosmetic dentist", "Dental clinic"],
  "primaryType": "Dentist",
  "phone": "(208) 314-4416",
  "website": "https://www.nwdentalcenter.com/",
  "about": [
    {
      "group": "Accessibility",
      "attributes": [
        { "label": "Wheelchair accessible entrance", "present": true },
        { "label": "Wheelchair accessible parking lot", "present": true }
      ]
    }
  ],
  "socialProfiles": "facebook, instagram",
  "contactPagesCrawled": 1
}
```

### How to find a Google place ID

A place ID is the stable identifier Google gives every location. It does not change when a business is renamed or moves its listing, which makes it the right key to store in your own database.

Three ways to get one:

- Open the place on Google Maps and copy the URL. The `!1s` segment holds the ID, and this Actor accepts the whole URL, so no editing is needed.
- Use Google's own Place ID Finder.
- Run the [Google Maps Places API](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3\&fp_sid=readme_integrations) to search an area, then feed the resulting IDs into this Actor.

### Applications

- **Lead lists with reachable contacts.** Search a category and location, then resolve the results here to attach an email and social profiles to every business.
- **Keeping a directory honest.** Re-run monthly and watch `businessStatus` to catch places that closed permanently, so you stop showing listings that no longer exist.
- **Accessibility and amenity filtering.** The `about` groups carry wheelchair access, payment methods, and service options as explicit true or false flags, which is what you need to filter a directory by accessibility.
- **Global addressing.** `plusCode` gives a precise location where street addressing is unreliable or missing.
- **Enriching a CRM.** Store the place ID once, then re-resolve on a schedule to keep contact details current.

### Integrations: chain it with the rest of the toolkit

#### Search, then resolve

Run the [Google Maps Places API](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3\&fp_sid=readme_integrations) to find businesses by keyword and location, then pass each `placeId` into this Actor. The search step is cheap per place and gives you the listing. This step adds the contact details and attributes the listing does not carry. You only pay for enrichment on the places you actually want.

#### Related Actors

- [Google Maps Places API](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3\&fp_sid=readme_related) to find places by keyword and location.
- [Google Maps Photos API](https://apify.com/johnvc/google-maps-photos-api?fpr=9n7kx3\&fp_sid=readme_related) for the full image gallery of a place.
- [Google Maps Contributor Reviews API](https://apify.com/johnvc/google-maps-contributor-reviews-api?fpr=9n7kx3\&fp_sid=readme_related) for a reviewer's history.
- [Google Local API](https://apify.com/johnvc/google-local-api?fpr=9n7kx3\&fp_sid=readme_related) for the local pack inside Google Search.

#### Tasks and schedules

Save a run configuration as a Task, then attach a schedule to re-resolve a list of place IDs weekly or monthly. Contact details and closure status both drift, so a recurring run is how a directory stays accurate.

### 🔌 Use this API from Claude (MCP)

This Actor is compatible with the Model Context Protocol (MCP), so AI agents can call it as a tool. Add it through the hosted Apify MCP server using this Actor-specific URL:

https://mcp.apify.com/?tools=actors,docs,johnvc/google-maps-place-id-contact-api

If you run agents from [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) or [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), add the Apify MCP server and ask it to "resolve this Google Maps link and tell me the contact email and whether the place is still open."

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The Google Maps Place ID & Business Contact API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/google-maps-place-id-contact-api) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3\&fp_sid=readme_x402) for details.

### Pricing

You pay per record, not per run and not per month. Two events:

- **Place resolved**, charged once for each business record returned.
- **Contacts resolved**, charged once per record when the business website is successfully read. It is not charged when contact resolution is turned off, when the place has no website, or when the website could not be reached, so a site that is down costs you nothing.

Turning off **Resolve contact details** means you are only charged the first event, which is the cheaper way to pull attributes and closure status in bulk.

### FAQ

**How do I find a Google place ID?**
Open the place on Google Maps and copy the URL. This Actor accepts the full URL, so you do not need to extract the ID yourself. You can also get IDs in bulk from the [Google Maps Places API](https://apify.com/johnvc/google-maps-places-api?fpr=9n7kx3\&fp_sid=readme_faq).

**How do I get a place ID for my own business?**
Search for your business on Google Maps, open its listing, and copy the URL from the address bar. Paste that URL straight into this Actor.

**Does a place ID change?**
It is stable in normal use, which is why it is a good key to store. Google can retire an ID when listings are merged, so re-resolving on a schedule is worthwhile for a long-lived database.

**Why is the email not always found?**
The address is read from the business website, so it can only be found if the business publishes one. Some businesses use a contact form instead of an address, and some have no website. When the homepage has no address, this Actor follows likely contact pages before giving up, which finds a large share of the addresses a homepage-only read would miss.

**Where do the social profiles come from?**
The business website. Google's place data does not contain social profile links at all, so there is no way to read them from the listing itself. Share buttons and platform homepages are filtered out, so what comes back are the business's own profiles.

**Can I get place attributes without reading the website?**
Yes. Turn off **Resolve contact details**. You still get amenity attributes, closure status, address, plus code, and categories, and you are not charged the contact event.

**How do I find permanently closed businesses?**
Check `businessStatus` on each record. Google flags only closed places, so anything unflagged is reported as `OPERATIONAL`.

**Does this return reviews or photos?**
No. Reviews and photos are handled by separate Actors so you are not charged for data you did not ask for. See [Google Maps Photos API](https://apify.com/johnvc/google-maps-photos-api?fpr=9n7kx3\&fp_sid=readme_faq) for imagery.

**Can AI agents call this directly?**
Yes. It is MCP compatible, and it can be paid for in USDC via x402 with no Apify account. See the MCP and x402 sections above.

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/google-maps-place-id-contact-api/issues/open?fpr=9n7kx3\&fp_sid=readme_support).

Last Updated: 2026.08.23

# Actor input Schema

## `placeIds` (type: `array`):

The Google Maps places to resolve. Each entry can be a hex place ID (0x54ae55e377fa4a87:0x91e7fe3019801009), a ChIJ feature ID, or a full Google Maps place URL that contains either. One record is returned per place. Entries with no recognisable place ID are skipped and reported in the run log.

## `includeContacts` (type: `boolean`):

When true, the business website is read to find a contact email address and social media profiles. Google does not publish either of these in its own place data, so this step is the only way to obtain them. Turn it off to return place attributes only, which is faster and costs less.

## `maxContactPages` (type: `integer`):

How many pages of a business website to read while looking for a contact address. The homepage is always read first; extra pages are only fetched when the homepage has no address, and likely contact pages are tried in priority order. Raising this improves the hit rate on sites that hide the address behind a contact page.

## `language` (type: `string`):

Two-letter language code used for the place data, such as en, de, or es. Affects the language of category names and amenity labels.

## `country` (type: `string`):

Two-letter country code used for the place lookup, such as us, gb, or nl. Affects regional formatting of the returned place data.

## `proxyConfiguration` (type: `object`):

Proxy used for the place lookup. Residential is the default and is strongly recommended, because the place data source blocks datacenter address space. Business websites are always fetched over the cheaper shared proxy regardless of this setting, which keeps cost down without affecting reliability.

## Actor input object example

```json
{
  "placeIds": [
    "0x54ae55e377fa4a87:0x91e7fe3019801009"
  ],
  "includeContacts": true,
  "maxContactPages": 3,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every record returned by the run, including any error rows.

## `overview` (type: `string`):

A table of resolved businesses with their contact details.

# 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 = {
    "placeIds": [
        "0x54ae55e377fa4a87:0x91e7fe3019801009"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/google-maps-place-id-contact-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 = { "placeIds": ["0x54ae55e377fa4a87:0x91e7fe3019801009"] }

# Run the Actor and wait for it to finish
run = client.actor("johnvc/google-maps-place-id-contact-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 '{
  "placeIds": [
    "0x54ae55e377fa4a87:0x91e7fe3019801009"
  ]
}' |
apify call johnvc/google-maps-place-id-contact-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/google-maps-place-id-contact-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/uEwfN1pgO878LIKts/builds/wVtQwbFcrMntuFBwj/openapi.json
