# Apple Maps Scraper: Places & Leads Data (`b2b_leads/apple-maps-real-time-data-scraper`) Actor

Extract live Apple Maps & Apple Business Connect places data at scale. Get business names, websites, phone numbers, verified emails, addresses, ratings, reviews, categories, and full opening hours with real-time JSON streaming.

- **URL**: https://apify.com/b2b_leads/apple-maps-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 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.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Apple Maps Real-Time Data

**Turn Apple Maps and Apple Business Connect into clean, structured local business intelligence.** Search keywords and locations in parallel, discover nearby places across categories, enrich every business with weekly opening hours, amenities, ratings, reviews, website, direct phone number, and contact emails, resolve direct Apple Maps place links, and stream structured data to your dataset — and your own systems — in real time.

Built for agencies, local SEO specialists, sales teams, directory publishers, researchers, data engineers, and AI workflows that need **dependable Apple Maps place data** at scale.

> **The downloaded dataset is structured JSON/CSV/Excel — no code required to get value from it.**
>
> **⚠️ This is a paid Actor.** Apify accounts on the **free plan receive a free sample of 2 places** and an upgrade reminder. Paying accounts receive the full, uncapped dataset. See [Plans & free tier](#plans--free-tier).

***

### Why teams choose this Actor

| | Apple Maps Real-Time Data | Typical alternatives |
|---|---|---|
| **Speed** | Fast streaming intelligence within seconds | Sluggish multi-minute delays |
| **Memory** | **512 MB** lightweight footprint | 2–4 GB+ |
| **Predictable runtime** | **No filtering** — every discovered place is exported with contactability tags (`hasPhone`, `hasWebsite`, `hasEmail`, `hasHours`) so you know exactly how long 1,000 businesses take | Inconsistent runtimes caused by aggressive server-side filters |
| **Reliability** | Transient network issues handled automatically | Runs fail mid-way |
| **Setup** | Intuitive input UI with sensible defaults — run in seconds | Complex configuration |
| **Cost** | Predictable pay-per-event pricing with spending limit safeguards | Unpredictable credit drain |
| **Output** | Flat, normalized records ready for CRM, Sheets, or AI agents | Nested dumps requiring post-processing |
| **Coverage** | Comprehensive Apple Business Connect listings and place cards | Fragmented or outdated directories |

***

### Quick start

1. **Add your search tasks.** In *Search terms & locations*, specify a keyword and location — e.g. `coffee shops` in `Austin, TX` or `pizza` in `Chicago, IL`.
2. **Enable lead details (optional).** Turn on *Enrich lead details* to discover website emails and social handles in place.
3. **Click Start.** Place records stream into the dataset as they are discovered.
4. **Download results.** Open the **Storage** tab → *Export*, and download as JSON, CSV, or Excel.

Minimal input example:

```json
{
  "searchTasks": [
    { "query": "coffee shops", "location": "Austin, TX", "placesPerQuery": 10 },
    { "query": "pizza", "location": "Chicago, IL", "placesPerQuery": 10 }
  ],
  "enableLeadDetails": true,
  "maxItems": 50
}
```

***

### What you get — 30+ data points per place

Every exported record is normalized and tagged with `featureType`, `hasPhone`, `hasWebsite`, `hasEmail`, and `hasHours`, ready for analytics, lead generation, and enrichment.

| Family | Fields |
|---|---|
| **Identity** | `placeId`, `name`, `category`, `categories[]`, `appleMapsUrl` |
| **Location** | `address`, `street`, `city`, `state`, `postalCode`, `country`, `countryCode`, `latitude`, `longitude`, `distanceMeters` |
| **Contact** | `phone`, `website`, `emails[]`, `socials[]` |
| **Contactability tags** | `hasPhone`, `hasWebsite`, `hasEmail`, `hasHours`, `detailsFetched`, `leadDetailsEnriched` |
| **Reputation** | `rating`, `ratingFormatted`, `reviewCount`, `ratingProvider`, `reviews[]` |
| **Operations** | `hours[]` (weekly schedule), `amenities[]`, `priceDescription`, `permanentlyClosed`, `about` |
| **Traceability** | `featureType`, `searchQuery`, `searchLocation` |

#### Sample record

```json
{
  "placeId": "18423067676444784090",
  "name": "Merit Coffee Co.",
  "category": "Cafe",
  "categories": ["Dining", "Coffee Shop", "Cafe"],
  "address": "222 West Ave, Unit 120, Austin, TX  78701, United States",
  "street": "222 West Ave, Unit 120",
  "city": "Austin",
  "state": "TX",
  "postalCode": "78701",
  "country": "United States",
  "countryCode": "US",
  "phone": "+1 (512) 906-0266",
  "website": "https://meritcoffee.com/pages/seaholm",
  "latitude": 30.2675363,
  "longitude": -97.752093,
  "rating": 82,
  "ratingFormatted": "34",
  "reviewCount": 34,
  "ratingProvider": "Apple",
  "hasPhone": true,
  "hasWebsite": true,
  "hasEmail": true,
  "hasHours": true,
  "detailsFetched": true,
  "leadDetailsEnriched": true,
  "emails": ["info@meritcoffee.com"],
  "socials": ["https://instagram.com/meritcoffee"],
  "hours": [
    { "day": "Monday", "open": "6:30 AM", "close": "7:00 PM" },
    { "day": "Tuesday", "open": "6:30 AM", "close": "7:00 PM" },
    { "day": "Wednesday", "open": "6:30 AM", "close": "7:00 PM" },
    { "day": "Thursday", "open": "6:30 AM", "close": "7:00 PM" },
    { "day": "Friday", "open": "6:30 AM", "close": "7:00 PM" },
    { "day": "Saturday", "open": "7:00 AM", "close": "7:00 PM" },
    { "day": "Sunday", "open": "7:00 AM", "close": "6:00 PM" }
  ],
  "amenities": [
    "Accepts Apple Pay",
    "Accepts Contactless Payments",
    "Wheelchair Accessible",
    "Parking Validated",
    "Pets Welcome",
    "Free Wi-Fi",
    "Accepts Credit Cards"
  ],
  "appleMapsUrl": "https://maps.apple.com/place?place-id=18423067676444784090",
  "featureType": "search",
  "searchQuery": "coffee shops",
  "searchLocation": "Austin, TX"
}
```

***

### Features & Capabilities

#### 🔎 Multi-market Keyword Search

Execute multiple search tasks concurrently. Target specific niches across cities, neighbourhoods, or postal codes. Each task supports custom result caps and radius limits.

#### 📡 Nearby Category Discovery

Explore local markets without manually entering terms. Select from popular categories (restaurants, cafes, hotels, gyms, dentists, bakeries, etc.) to evaluate local business density and presence.

#### 🔗 Scrape Direct Place URLs

Resolve specific Apple Maps links (e.g. `https://maps.apple.com/place?place-id=...`) directly into rich place records with full weekly hours and amenity breakdowns.

#### 📧 Lead Details & Contact Enrichment (Enable, Don't Filter)

Instead of dropping businesses that lack emails or websites, activate **Enrich lead details** to visit published websites and append direct emails and social profiles to the record.

- **Predictable runtime**: Every discovered business is exported to your dataset.
- **Predictable pricing**: Target 1,000 businesses and you receive exactly 1,000 businesses without unexpected search churn.
- **Filter downstream**: Use the `hasEmail` and `hasPhone` tags in Excel, Sheets, or your CRM to segment contactable leads.

#### ⚡ Real-Time Streaming & Webhooks

Every record is saved to the dataset and can be dispatched immediately to a webhook URL (CRM, Slack, Zapier, Make, n8n).

***

### Use Cases

1. **Local Lead Generation & Outreach**: Build phone and email outreach lists of local businesses categorized by metro area and trade.
2. **Competitive Intelligence**: Analyze business density, customer ratings, review distributions, and opening hours across target geographic markets.
3. **Local SEO & Map Audits**: Verify consistency of Apple Business Connect listings, phone numbers, websites, and opening times.
4. **CRM Enrichment**: Enrich existing customer and prospect accounts with verified addresses, opening hours, and direct URLs.
5. **AI Agents & Assistants**: Feed structured local business data into agentic workflows and LLMs for localized recommendations.

***

### Plans & Free Tier

This is a **paid Actor**.

| Plan | Behavior |
|---|---|
| **Free** | Generates a **free trial sample of 2 places** per run with full data fields, accompanied by an upgrade notice. |
| **Paid** (Bronze, Silver, Gold, Platinum, Diamond) | Full, uncapped output up to your requested `maxItems`. |

***

### Input Reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `enableSearch` | `boolean` | `true` | Search Apple Maps by keyword and location |
| `searchTasks` | `array` | Demo tasks | Array of `{ query, location, placesPerQuery, latitude, longitude, radiusMeters }` |
| `placesPerQuery` | `integer` | `10` | Default places per task |
| `enableNearby` | `boolean` | `false` | Enable automatic category exploration |
| `nearbyCategories` | `array` | `["cafes", ...]` | Categories for nearby discovery |
| `nearbyLocation` | `string` | `""` | Target city or area for nearby discovery |
| `placesPerCategory` | `integer` | `10` | Max places per category |
| `enableScrapeByUrl` | `boolean` | `false` | Resolve specific Apple Maps links |
| `scrapeUrls` | `array` | `[]` | List of Apple Maps place URLs |
| `enableLeadDetails` | `boolean` | `false` | Enrich places with website emails & socials in place (never filters) |
| `fetchPlaceDetails` | `boolean` | `true` | Enrich full weekly hours and amenities |
| `language` | `string` | `"en-US"` | Language code for names and categories |
| `country` | `string` | `"us"` | Two-letter country code |
| `maxItems` | `integer` | `10000` | Maximum total places across all tasks |
| `webhookUrl` | `string` | `""` | Webhook URL for real-time push |
| `webhookFormat` | `string` | `"json"` | `"json"` or `"slack"` |

***

### Webhooks

Set `webhookUrl` to receive real-time updates as each place record is saved.

#### JSON Payload

Dispatches the complete place record object as JSON.

#### Slack Payload

Select `slack` format to receive rich message blocks directly in a Slack channel:

```
📍 Merit Coffee Co.
Category: Cafe • Address: 222 West Ave, Unit 120, Austin, TX • Rating: 82 • <Website|https://meritcoffee.com>
<Open on Apple Maps|https://maps.apple.com/place?place-id=18423067676444784090>
```

***

### Using with AI Agents & MCP

Use the Apify MCP server to connect this Actor to Claude, ChatGPT, or Cursor:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.apify.com/?tools=actors,docs,DrunkCodes/apple-maps-real-time-data"]
    }
  }
}
```

***

### FAQ

**Why are records not filtered out if they lack an email?**\
Filtering records creates unpredictable runtimes and makes cost budgeting impossible (e.g. searching 5,000 businesses just to find 100 with emails). Instead, we enrich every business in place and tag them with `hasEmail`, `hasPhone`, and `hasWebsite`, ensuring predictable run times and pricing per 1,000 items.

**Do I need an Apple Developer account or API key?**\
No. This Actor collects live data directly using fast per-item collection.

**Are ratings on Apple Maps out of 5 or 100?**\
Apple Maps uses a percentage thumbs-up reputation score (0–100) alongside third-party provider scores (such as Yelp or Tripadvisor). Both the raw score and source provider are provided on each record.

# Actor input Schema

## `enableSearch` (type: `boolean`):

Search Apple Maps places by keyword and location. Enabled by default.

## `searchTasks` (type: `array`):

Add one row per search: a keyword plus a city or area. Free trial users receive 2 places per run; upgrade to a paid Apify plan for full uncapped output.

## `placesPerQuery` (type: `integer`):

Default maximum places per search task. Override per task in the list above.

## `enableNearby` (type: `boolean`):

Discover businesses by category around one location without typing custom queries.

## `nearbyCategories` (type: `array`):

Business categories to discover around the location below.

## `nearbyLocation` (type: `string`):

City or area for nearby discovery (e.g. "Austin, TX").

## `placesPerCategory` (type: `integer`):

Maximum places to collect for each selected category.

## `enableScrapeByUrl` (type: `boolean`):

Resolve specific Apple Maps place URLs into full structured records.

## `scrapeUrls` (type: `array`):

One link per place, e.g. https://maps.apple.com/place?place-id=I7E9063646CAF2C87

## `enableLeadDetails` (type: `boolean`):

Enrich places with contact emails and social media links mined from the business website. Every discovered business is exported to the dataset — no records are ever dropped or filtered.

## `fetchPlaceDetails` (type: `boolean`):

Enrich each record in place with full weekly opening hours, amenities, reviews, and provider attribution.

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

Language for business names and categories (e.g. en-US, es-ES, de-DE).

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

Two-letter country code for geocoding and proxy routing (e.g. us, gb, ca, au).

## `maxItems` (type: `integer`):

Global cap on total places collected across all tasks. Paid plans receive up to this limit; free plan accounts receive a 2-place sample.

## `webhookUrl` (type: `string`):

Optional webhook destination. Every place record is pushed in real time to your CRM, Slack, Zapier, or webhook service.

## `webhookFormat` (type: `string`):

json = full place record object; slack = formatted Slack message.

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

Apify residential proxy is recommended and enabled by default for high reliability.

## Actor input object example

```json
{
  "enableSearch": true,
  "searchTasks": [
    {
      "query": "coffee shops",
      "location": "Austin, TX",
      "placesPerQuery": 10
    },
    {
      "query": "pizza",
      "location": "Chicago, IL",
      "placesPerQuery": 10
    }
  ],
  "placesPerQuery": 10,
  "enableNearby": false,
  "nearbyCategories": [
    "cafes",
    "restaurants",
    "hotels",
    "gyms",
    "dentists"
  ],
  "nearbyLocation": "",
  "placesPerCategory": 10,
  "enableScrapeByUrl": false,
  "scrapeUrls": [
    "https://maps.apple.com/place?place-id=I7E9063646CAF2C87"
  ],
  "enableLeadDetails": false,
  "fetchPlaceDetails": true,
  "language": "en-US",
  "country": "us",
  "maxItems": 10000,
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Complete dataset with every place field collected in this run.

## `search` (type: `string`):

Places from keyword + location search tasks.

## `nearby` (type: `string`):

Places from nearby category discovery.

## `byUrl` (type: `string`):

Places resolved directly from Apple Maps links.

## `runSummary` (type: `string`):

Per-run execution metadata: features, tasks, place counts, enrichment metrics, webhook delivery stats, and the paywall object.

# 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 = {
    "enableSearch": true,
    "searchTasks": [
        {
            "query": "coffee shops",
            "location": "Austin, TX",
            "placesPerQuery": 10
        },
        {
            "query": "pizza",
            "location": "Chicago, IL",
            "placesPerQuery": 10
        }
    ],
    "placesPerQuery": 10,
    "enableLeadDetails": false,
    "fetchPlaceDetails": true,
    "language": "en-US",
    "country": "us",
    "maxItems": 10000,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/apple-maps-real-time-data-scraper").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 = {
    "enableSearch": True,
    "searchTasks": [
        {
            "query": "coffee shops",
            "location": "Austin, TX",
            "placesPerQuery": 10,
        },
        {
            "query": "pizza",
            "location": "Chicago, IL",
            "placesPerQuery": 10,
        },
    ],
    "placesPerQuery": 10,
    "enableLeadDetails": False,
    "fetchPlaceDetails": True,
    "language": "en-US",
    "country": "us",
    "maxItems": 10000,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/apple-maps-real-time-data-scraper").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 '{
  "enableSearch": true,
  "searchTasks": [
    {
      "query": "coffee shops",
      "location": "Austin, TX",
      "placesPerQuery": 10
    },
    {
      "query": "pizza",
      "location": "Chicago, IL",
      "placesPerQuery": 10
    }
  ],
  "placesPerQuery": 10,
  "enableLeadDetails": false,
  "fetchPlaceDetails": true,
  "language": "en-US",
  "country": "us",
  "maxItems": 10000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/apple-maps-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/apple-maps-real-time-data-scraper"
        }
    }
}
```

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/dMF8xYnB6oW6r1Jr5/builds/3BnZ3z3wuCDaDbJ2s/openapi.json
