# Apple Maps Scraper - Places, Phones, Hours, Ratings & Photos (`topapi/apple-maps-scraper`) Actor

Scrape Apple Maps places by search term and area or by link: phone, website, address, coordinates, category, rating, hours, amenities, photos, reviews. Covers whole cities past the 25-place limit; guides, website emails, monitor mode. $3.10 per 1,000 places, no start fee, no Apple account.

- **URL**: https://apify.com/topapi/apple-maps-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Lead generation, Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.10 / 1,000 places

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

### What does Apple Maps Scraper do?

**Apple Maps Scraper** extracts business and place data from [Apple Maps](https://maps.apple.com) and turns a search term plus an area, or a list of Apple Maps links, into one structured row per place: name, phone, website, full address, coordinates, category, rating, opening hours, amenities, photos and review snippets. Built for lead-generation teams, local-SEO agencies and market researchers who need Apple Maps listings without copying them by hand.

Apple Maps scraper · Apple Maps API alternative · Apple Maps business extractor · Apple Maps leads

<a href="https://console.apify.com/actors/fsR0gGxgAaivGAZMc"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/apple-maps-scraper-source.png" alt="Apple Maps search results for dentists in Austin that Apple Maps Scraper turns into rows" style="width:70%"></a>

- **Full place record:** phone (plus other phones and fax), website, structured address, coordinates, category tree, rating with its source and scale, weekly hours, amenities, photos, review snippets, Apple Maps link.
- **Whole areas, not just one result list:** Apple shows 25-55 places per search; when you ask for more, the area is split and searched again until your limit is reached.
- **Search or paste links:** terms + a city, address, coordinates or bounding box, or Apple Maps place, search and guide links.
- **Lead flags:** unclaimed listing, no website, missing fields and a completeness score on every row, plus optional emails and social profiles from the place's website.
- **No Apple account, cookies or MapKit token:** you give a search or a link, nothing else.
- **Monitor mode:** run on a schedule and get only places that are new or changed since the last run.
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets, the Apify API and MCP.

### What data can you get from Apple Maps?

<table>
<tr>
<td>🏷️ Name and local-language name</td>
<td>☎️ Phone, formatted phone, other phones, fax</td>
<td>🌐 Website and website type</td>
</tr>
<tr>
<td>📍 Full address, street, city, state, postcode, country</td>
<td>🧭 Latitude, longitude, time zone</td>
<td>🗂️ Category, category list and Apple category path</td>
</tr>
<tr>
<td>⭐ Rating with source and scale (`rating`), 0-5 value (`ratingOutOf5`)</td>
<td>💬 Review count and up to 3 review snippets</td>
<td>💲 Price level</td>
</tr>
<tr>
<td>🕒 Weekly hours, open now, service hours</td>
<td>♿ Amenities (Apple Pay, wheelchair access, Wi-Fi…)</td>
<td>📷 Photos with caption, author and source</td>
</tr>
<tr>
<td>🔗 Quick links (order, book, menu)</td>
<td>🏢 Claim link and unclaimed flag</td>
<td>📰 Editorial notes, awards, guides it appears in</td>
</tr>
<tr>
<td>⚡ EV charger connectors and power</td>
<td>🚉 Transit lines, departures and service alerts</td>
<td>🥾 Trails at a trailhead with their length</td>
</tr>
<tr>
<td>📧 Emails and social profiles (optional add-on)</td>
<td>🚩 Lead tags and listing completeness score</td>
<td>🔎 Search term, area and rank that found the place</td>
</tr>
</table>

On two 25-place test runs (dentists in Austin) every row had a phone, a website, a rating, review snippets and opening hours, 96% had amenities and photos, and 64-72% were listings the business has not claimed on Apple Business Connect.

### How to scrape Apple Maps with Apple Maps Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) — $5 of monthly credit, no card needed.
2. Open [Apple Maps Scraper](https://apify.com/TopApi/apple-maps-scraper) and click **Try for free**.
3. Type what you are looking for into **Search terms** (e.g. `dentists`) and where into **Location** (e.g. `Austin, TX`), or paste Apple Maps links.
4. Set **Max places per search** and click **Start**. Places stream into the dataset as they are found.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel, or let a schedule run it for you.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `searchQueries` | List | What to look for, e.g. `dentists`, `coffee shop`, `EV charging station`. A term can carry its own place (`dentists austin tx`). API callers may also pass `{"query": "…", "location": "…", "maxResults": 30}` objects. |
| `location` / `locations` | Text / List | City, neighborhood, postcode, address, state or country, e.g. `Austin, TX`, `Shibuya, Tokyo`, `78701`. |
| `latitude`, `longitude`, `radiusKm` | Number | Search around an exact point; radius default 5 km. |
| `boundingBox` | JSON | An exact area: `{"northLat": 30.37, "eastLng": -97.64, "southLat": 30.17, "westLng": -97.84}`. |
| `startUrls`, `placeUrls`, `searchUrls`, `guideUrls` | List | Apple Maps place links (`?place-id=I…`, `?auid=…`), bare place ids, search links (`/search?query=…&center=…&span=…`), guide links (`/guides?curated=…`), address links and `maps.apple` short links. |
| **🎯 Filters** (applied by Apple Maps) | | |
| `countryCode` | Text | Country Apple ranks for. Default `US`. |
| `language` | Text | Names, categories and addresses in this language. Default `en-US`. |
| `sortBy` | Select | `relevance` (default), `distance` or `rating`. |
| `openNow` | Boolean | Only places open at run time, in their own time zone. |
| `toggles` | List | Apple's own filter bar, e.g. `ACCEPTS_APPLE_PAY`, `WHEELCHAIR_ACCESSIBLE`. |
| **✂️ Refine results** | | |
| `minRating` | Select | 3, 3.5, 4 or 4.5 stars (Apple's 0-100 scores are converted). |
| `hasPhone`, `hasWebsite`, `hasEmail` | Boolean | Keep only places with a phone, a website or an email. |
| `skipClosedPlaces`, `categoryFilterWords`, `openAt` | Boolean / List / Text | Leave out closed places, keep only some categories, keep places open at a given time. |
| **➕ Extra data** | | |
| `includeNearbyPlaces` | Boolean | Also collect the matching places Apple shows as dots around each search. |
| `includeGuides` | Boolean | Also return the Apple Maps guides each search shows — **guide** event. |
| `maxPhotos` | Integer | Photos per place. Default 5. |
| `enrichContacts`, `maxWebsitePages` | Boolean / Integer | Read each place's website for emails and social profiles — **contact-details** event. |
| **🔁 Monitoring** | | |
| `monitorMode`, `monitorChanges`, `monitorStoreName` | Boolean / Text | Only places not delivered before, plus changed ones with their previous rating, review count, hours, phone and website and the list of what changed. |
| **📦 Output** | | |
| `maxResults` | Integer | Places per search term per area. Default 50; `0` = everything the area gives. |
| `maxItems`, `maxRunSeconds`, `compact` | Integer / Boolean | Total cap, time limit, core fields only for AI agents. |
| **🗺️ Area coverage** | | |
| `adaptiveGrid`, `cellSizeMeters`, `minCellSizeMeters`, `saturationThreshold`, `maxGridDepth`, `maxCells` | | How a big area is split once Apple's answer is full. |
| `queryExpansions` | JSON | Extra spellings searched with a term, e.g. `{"cafe": ["coffee shop"]}`; places are de-duplicated across variants. |
| **⚙️ Advanced** | | |
| `proxyConfiguration`, `maxConcurrency` | | Direct requests by default; the run moves to the Apify proxy if Apple refuses or answers very slowly, then to RESIDENTIAL if the proxy keeps failing. |

#### Input JSON

```json
{
  "searchQueries": ["dentists", "orthodontist"],
  "location": "Austin, TX",
  "maxResults": 200,
  "hasPhone": true,
  "minRating": "4"
}
```

#### Put only the business type in the search term

**Do:** `searchQueries: ["coffee shop"]` with `location: "Brooklyn, NY"`. **Don't:** a one-word term in another language on its own — Apple Maps sometimes reads it as a place name (on a test, `ramen` with a Japanese locale matched a village called Ramen). Use the term buyers would type in that country (`ラーメン`) or add a category word; places Apple returns far outside your area are dropped and never charged.

#### Ask for more than 55 when you want the whole area

One Apple Maps answer holds 25 places for a neighborhood-sized view and 55 for a city-sized one. Set `maxResults` higher (or `0`) and Apple Maps Scraper keeps splitting the area into quarters while the answers are full. Split by city or neighborhood with `locations` when you want the rows grouped by area.

### ⬆️ Output

Every place becomes one dataset item. Here is the table view of a run for `dentists` in `Austin, TX`:

<a href="https://console.apify.com/actors/fsR0gGxgAaivGAZMc"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/apple-maps-scraper-output.png" alt="Apple Maps Scraper output table with Apple Maps places" style="width:70%"></a>

The first row of that run, shortened:

```json
{
  "placeId": "17417784224305572481",
  "placeIdHex": "IF1B86677F822EA81",
  "name": "Forest Family Dentistry - Burnet",
  "displayCategory": "General Dentist",
  "categories": ["General Dentist", "Dentistry", "Dental Clinic", "Dentist", "Orthodontist", "Cosmetic Dentist"],
  "phone": "+15128989036",
  "phoneFormatted": "+1 (512) 898-9036",
  "website": "https://www.forestfamily.com/locations/burnet",
  "address": { "full": "5531 Burnet Rd, Austin, TX  78756, United States", "street": "5531 Burnet Rd", "city": "Austin", "stateCode": "TX", "postalCode": "78756", "countryCode": "US" },
  "latitude": 30.3315041,
  "longitude": -97.7398574,
  "timezone": "America/Chicago",
  "rating": { "provider": "Yelp", "ratingType": "USER_RATING", "score": 4.7, "maxScore": 5, "reviewCount": 33 },
  "ratingOutOf5": 4.7,
  "openingHoursText": "Sun Closed; Mon 08:30-17:30; Tue-Thu 07:30-19:30; Fri 08:30-17:30; Sat 09:00-14:00",
  "isClaimable": true,
  "opportunityTags": ["unclaimed-listing"],
  "listingCompletenessScore": 86,
  "appleUrl": "https://maps.apple.com/place?auid=17417784224305572481",
  "searchQuery": "dentists",
  "searchLocation": "Austin, TX",
  "searchRank": 1
}
```

#### Fields

| Field | Type | What it is | Fill on the 25-place tests |
|---|---|---|---|
| `placeId` / `placeIdHex` | string | Apple's place id (muid) and its `I…` form | 100% |
| `name`, `displayCategory`, `categories` | string / array | Name and Apple's categories | 100% |
| `phone`, `phoneFormatted`, `altPhones` | string / array | E.164 phone, display phone, other numbers | 100% / 100% / 40-52% |
| `website`, `websiteType` | string | Website and whether it is the business's own | 100% |
| `address` | object | Full and structured address | 100% |
| `latitude`, `longitude`, `location`, `timezone` | number / string | Coordinates and time zone | 100% |
| `rating`, `ratingOutOf5`, `reviewCount` | object / number | Rating with source and scale, 0-5 value, count | 100% |
| `reviews` | array | Up to 3 review snippets (text, rating, date, source link) | 100% |
| `hours`, `openNow`, `openingHoursText` | object / boolean / string | Weekly hours, open at run time | 100% |
| `amenities` | array | Amenities Apple lists | 96% |
| `photos`, `coverPhoto` | array / object | Photo URLs with caption, author, source, date | 96% / 12-16% |
| `description`, `editorial`, `accolades`, `featuredIn` | string / array | About text, editorial notes, awards, guides | 12% / where Apple has them |
| `quickLinks`, `actionData` | array | Order, book, menu links | 4% |
| `claimUrl`, `isClaimable` | string / boolean | Claim link; `true` = not claimed yet | 100% / 64-72% true |
| `hasPhone`, `hasWebsite`, `missingFields`, `listingCompletenessScore`, `opportunityTags` | | Lead flags computed from the row | 100% |
| `evCharger`, `transit`, `trails`, `venue`, `capacity`, `localName` | | Category-specific detail (chargers, stations, trailheads, malls, stadiums, non-English names) | where the place has it |
| `emails`, `primaryBusinessEmail`, `emailEvidence`, `socials` | | Website contacts (add-on) | where found |
| `searchQuery`, `searchLocation`, `matchedLocation`, `searchRank`, `sourceGuide` | | What found the place and where it ranked | 100% for searches |
| `monitorStatus`, `previousStats` | string / object | Monitor mode: `new` or `changed`; a changed place gets its previous rating, review count, hours status, opening hours, phone and website, and `changedFields` | monitor runs |

Guide rows (with **Include guides**) carry `type: "guide"`, `guideId`, `title`, `publisher`, `placeCount`, `url` and `appleUrl`.

### How can I use Apple Maps data?

- 🎯 **Sales and lead-generation teams** — build call lists of local businesses with a phone, a website and a rating, filtered by category and area.
- 🏢 **Local-SEO and listing agencies** — find businesses whose Apple Maps listing is unclaimed, has no website or misses hours and photos (`opportunityTags`, `listingCompletenessScore`).
- 📊 **Market researchers** — count and map competitors per neighborhood with categories, ratings and price levels.
- 🗺️ **Data and GIS teams** — coordinates, structured addresses and time zones for every place in a city.
- 🔁 **Monitoring** — run weekly to catch new businesses in an area and changes to ratings, hours, phones and websites.
- 🤖 **AI agents** — call it over MCP with `compact: true` to answer "find 20 vegan restaurants in Lisbon open now".

### How much does it cost to scrape Apple Maps?

Apple Maps Scraper is pay-per-result: **$3.10 per 1,000 places** ($0.0031 per place), no start fee.

| Places | Cost |
|---:|---:|
| 10 | $0.031 |
| 100 | $0.31 |
| 1,000 | $3.10 |
| 10,000 | $31.00 |

Optional add-ons: **website contacts** $0.0014 per place where the website gave at least one email or social profile (nothing when none is found); **guide rows** $0.0028 per guide. Photos, review snippets, hours and amenities are included in the place price. Filtered-out places are not stored and not billed. Set a maximum spend on the run and it stops when the limit is reached; the places delivered so far are kept.

There is nothing else to pay: Apify platform usage is included in these prices. On the default 1,024 MB a 25-place search took 3-4 seconds on two test runs; larger searches take one more Apple answer for each split area.

### Integrations, API, scheduling & MCP

- **Schedules:** run Apple Maps Scraper daily or weekly from the **Schedules** tab; with `monitorMode` each run returns only new or changed places.
- **Webhooks:** call a URL when a run finishes to push places to your CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable and Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** start runs and read datasets from Node.js or Python with `apify-client` — code on the [API tab](https://apify.com/TopApi/apple-maps-scraper/api/python).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/TopApi/apple-maps-scraper/api/mcp).

### More local-business scrapers

<table>
<tr>
<td>⭐ <a href="https://apify.com/TopApi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a></td>
<td>💬 <a href="https://apify.com/TopApi/yelp-reviews-scraper">Yelp Reviews Scraper</a></td>
<td>📍 <a href="https://apify.com/TopApi/google-geocoding-scraper">Google Geocoding Scraper</a></td>
</tr>
<tr>
<td>📧 <a href="https://apify.com/TopApi/instagram-contact-scraper">Instagram Email Scraper</a></td>
<td>🌐 <a href="https://apify.com/TopApi/website-content-crawler">Website Content Crawler</a></td>
<td>📈 <a href="https://apify.com/TopApi/similarweb-scraper">SimilarWeb Scraper</a></td>
</tr>
<tr>
<td>📰 <a href="https://apify.com/TopApi/facebook-page-posts-scraper">Facebook Page Posts Scraper</a></td>
<td>🏨 <a href="https://apify.com/TopApi/booking-hotels-scraper">Booking.com Hotels Scraper</a></td>
<td>🧭 <a href="https://apify.com/TopApi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per answer:** Apple Maps returns 25 places for a neighborhood-sized view and 55 for a city-sized one; larger `maxResults` values split the area into quarters and search each again (more answers, a longer run).
- **Reviews:** Apple shows up to 3 review snippets per place to visitors; full review histories are not available.
- **Ratings:** US places mostly carry Yelp ratings on a 0-5 scale; elsewhere Apple's own 0-100 scores are common. `ratingOutOf5` puts both on one scale.
- **Links:** a share link that points to a street address with no business on it, and personal guides, are reported in `RUN_SUMMARY` and not charged.
- **Empty dataset:** no matching places in the area, a filter that removed everything, or a term Apple read as a place name. `RUN_SUMMARY` says which. Nothing is charged.

### FAQ

#### How many places can Apple Maps Scraper collect in one run?

As many as the area has. One Apple Maps answer holds 25-55 places; Apple Maps Scraper splits the area until `maxResults` is reached.

#### Can I run Apple Maps Scraper on a schedule to get new places automatically?

Yes. Save your input as a task, open **Schedules**, pick the cadence and turn on `monitorMode`. Each run returns only places not delivered before, plus places whose rating, review count, opening hours, phone or website changed. A changed place carries `previousStats`: the previous rating, review count, hours status, opening hours, phone and website, plus `changedFields` naming what changed.

#### Can I integrate Apple Maps Scraper with other apps?

Yes — Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or [webhooks](https://docs.apify.com/integrations/webhooks) when a run finishes.

#### Can I use Apple Maps Scraper with the Apify API?

Yes. Use `apify-client` for [Node.js](https://apify.com/TopApi/apple-maps-scraper/api/javascript) or [Python](https://apify.com/TopApi/apple-maps-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Apple Maps Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/TopApi/apple-maps-scraper/api/mcp), connect your MCP client and ask for Apple Maps places in plain language. Turn on `compact` for shorter rows.

#### Do I need an Apple account, cookies or a MapKit token for Apple Maps Scraper?

No. No login, no cookies, no token. You give search terms and an area, or Apple Maps links.

#### Does Apple Maps Scraper return emails?

Apple Maps lists phones and websites but no emails. Turn on **Website contacts** and Apple Maps Scraper reads each place's website for emails and social profiles, with the page each email was found on. On four small test runs (dentists, plumbers, bakeries and florists in Austin), 11 of the 14 places with their own website gave a social profile or an email, 6 of them an email.

#### Can Apple Maps Scraper scrape places outside the US?

Yes. Set `countryCode` and `language` (for example `DE` and `de-DE`); names, categories and addresses come back in that language and Apple ranks results for that country.

#### Why did my Apple Maps Scraper run return no results?

The area had no matching places, a filter removed them, or Apple read the term as a place name. `RUN_SUMMARY` lists each search with its reason. Nothing is charged for an empty run.

#### Is it legal to scrape Apple Maps?

Apple Maps Scraper collects data Apple Maps shows publicly to any visitor and does not log in. You are responsible for complying with Apple's terms and the rules that apply where you work.

#### Your feedback

We keep improving Apple Maps Scraper. Missing a field or found a bug? Open an issue on the [Issues tab](https://apify.com/TopApi/apple-maps-scraper/issues/open).

# Actor input Schema

## `searchQueries` (type: `array`):

What to look for, as typed into Apple Maps, e.g. "dentists", "coffee shop", "EV charging station". A term can carry its own place ("dentists austin tx"). Searched in every area below.

## `location` (type: `string`):

City, neighborhood, postcode, address, state or country to search in, e.g. "Austin, TX", "Shibuya, Tokyo", "78701". Apple Maps turns it into an area.

## `locations` (type: `array`):

Optional. More areas, one per line, e.g. "Dallas, TX" and "Houston, TX". Every search term is searched in each.

## `latitude` (type: `number`):

Optional. Search around an exact point instead of a named location, e.g. 30.2672. Use with Longitude.

## `longitude` (type: `number`):

Optional. e.g. -97.7431. Use with Latitude.

## `radiusKm` (type: `number`):

Used with Latitude/Longitude: half-width of the square area to cover. Default 5.

## `boundingBox` (type: `object`):

Optional exact area, e.g. {"northLat": 30.37, "eastLng": -97.64, "southLat": 30.17, "westLng": -97.84}. Searched as a whole and split into sub-areas while Apple's answers are full.

## `startUrls` (type: `array`):

Any Apple Maps link: a place (…/place?place-id=I… or ?auid=…), a search (…/search?query=…\&center=…\&span=…), a guide (…/guides?curated=…), an address link or a maps.apple short link.

## `placeUrls` (type: `array`):

Apple Maps place links or bare ids, e.g. https://maps.apple.com/place?auid=11204647164469319519, I718D842327530072. Full details of each place.

## `searchUrls` (type: `array`):

Apple Maps search links with the term and map position in them, e.g. https://maps.apple.com/search?query=gym\&center=40.68,-73.94\&span=0.03,0.03.

## `guideUrls` (type: `array`):

Apple Maps guides (curated lists), e.g. https://maps.apple.com/guides?curated=1694850223688040849. Every place in the guide, with the guide's note on it.

## `countryCode` (type: `string`):

Two-letter country Apple ranks results for (changes which places come back), e.g. US, GB, DE, JP. Default US.

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

Language of names, categories and addresses, e.g. en-US, de-DE, ja-JP. Also changes Apple's ranking. Default en-US.

## `sortBy` (type: `string`):

The order Apple Maps ranks each search in. Distance = nearest to the centre of each area first.

## `openNow` (type: `boolean`):

Only places open when the run happens, in their own local time. Places that publish no hours are left out.

## `toggles` (type: `array`):

Apple Maps' own filter bar, e.g. ACCEPTS_APPLE_PAY, WHEELCHAIR_ACCESSIBLE, ACCEPTS_CREDIT_CARDS, ACCEPTS_CONTACTLESS_PAY. The keys Apple offers per search are listed in RUN_SUMMARY.

## `minRating` (type: `string`):

Keep places rated at or above this on a 0-5 scale (Apple's 0-100 ratings are converted). Unrated places are left out.

## `hasPhone` (type: `boolean`):

Keep only places with a published phone number.

## `hasWebsite` (type: `boolean`):

Keep only places with a published website.

## `hasEmail` (type: `boolean`):

Keep only places whose website shows an email address (turns on Website contacts).

## `skipClosedPlaces` (type: `boolean`):

Leave out places Apple marks permanently or temporarily closed.

## `categoryFilterWords` (type: `array`):

Keep a place only if one of its categories contains one of these words, e.g. "dentist", "orthodont". Case-insensitive.

## `openAt` (type: `string`):

Keep places open at this moment, in their local time: an ISO date-time (2026-10-10T18:30:00Z) or Unix seconds.

## `includeNearbyPlaces` (type: `boolean`):

Also collect the matching places Apple shows as dots around each search (often 20-50 more per search). Billed per place like any other.

## `includeGuides` (type: `boolean`):

Also return the Apple Maps guides each search shows (title, publisher, place count, link), one row each. $0.0028 per guide row.

## `maxPhotos` (type: `integer`):

Photo URLs per place, with caption, author, source and date. Apple sends up to ~20 per category. 0 = none.

## `enrichContacts` (type: `boolean`):

Visit each place's website for emails and social profiles. $0.0014 per place where at least one is found; nothing when none is.

## `maxWebsitePages` (type: `integer`):

Pages read per website for contacts, home page included (contact and about pages next). Default 3.

## `monitorMode` (type: `boolean`):

Return only places not delivered by earlier monitor runs (plus changed ones, below). Pairs with a daily or weekly schedule.

## `monitorChanges` (type: `boolean`):

In monitor mode, also return known places whose rating, review count, opening hours, phone or website changed. Each one carries previousStats (the previous rating, review count, hours status, opening hours, phone and website) and changedFields.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers delivered places. Use one name per watch list.

## `maxResults` (type: `integer`):

Places per search term per area. One Apple answer holds 25-55; above that the area is split until this is reached. 0 = all the area gives.

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

Stop the whole run after this many places. 0 = no total limit.

## `maxRunSeconds` (type: `integer`):

Stop starting new requests after this many seconds and finish cleanly. Empty = no limit.

## `compact` (type: `boolean`):

Core fields only (name, category, phone, website, address, coordinates, rating, link) - sized for AI agents and MCP.

## `adaptiveGrid` (type: `boolean`):

When Apple's answer for an area is full, split it into four and search each, until Max places is reached. Off = one Apple answer per area.

## `cellSizeMeters` (type: `integer`):

Optional. Start from a grid of cells this size instead of the whole area, e.g. 2000. Empty = start from the whole area.

## `minCellSizeMeters` (type: `integer`):

Areas are not split below this size. Default 250.

## `saturationThreshold` (type: `integer`):

An area whose answer has at least this many places inside it is split. Default 20.

## `maxGridDepth` (type: `integer`):

How many times an area can be split in four. Default 8.

## `maxCells` (type: `integer`):

Hard cap on Apple answers per search term per area, splits included. Default 200.

## `queryExpansions` (type: `object`):

Optional extra spellings searched with a term, e.g. {"cafe": \["coffee shop", "kahve"]}. Places are de-duplicated across variants.

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

Direct requests by default; the run moves to the Apify proxy if Apple refuses or answers very slowly, then to RESIDENTIAL if the proxy keeps failing.

## `maxConcurrency` (type: `integer`):

Apple Maps requests in flight at once. Default 4.

## Actor input object example

```json
{
  "searchQueries": [
    "dentists"
  ],
  "location": "Austin, TX",
  "countryCode": "US",
  "language": "en-US",
  "sortBy": "relevance",
  "openNow": false,
  "hasPhone": false,
  "hasWebsite": false,
  "hasEmail": false,
  "skipClosedPlaces": false,
  "includeNearbyPlaces": false,
  "includeGuides": false,
  "maxPhotos": 5,
  "enrichContacts": false,
  "maxWebsitePages": 3,
  "monitorMode": false,
  "monitorChanges": true,
  "monitorStoreName": "apple-maps-monitor",
  "maxResults": 25,
  "compact": false,
  "adaptiveGrid": true,
  "minCellSizeMeters": 250,
  "saturationThreshold": 20,
  "maxGridDepth": 8,
  "maxCells": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

One item per Apple Maps place: contact details, address, coordinates, category, rating, hours, amenities, photos, review snippets, lead flags.

## `summary` (type: `string`):

Per-search counts, filters Apple offered, places skipped (duplicates, filtered, outside the area), requests and egress used.

# 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 = {
    "searchQueries": [
        "dentists"
    ],
    "location": "Austin, TX",
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/apple-maps-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 = {
    "searchQueries": ["dentists"],
    "location": "Austin, TX",
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/apple-maps-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 '{
  "searchQueries": [
    "dentists"
  ],
  "location": "Austin, TX",
  "maxResults": 25
}' |
apify call topapi/apple-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/apple-maps-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/fsR0gGxgAaivGAZMc/builds/s0iKaWY9xDD72bdXt/openapi.json
