Apple Maps Scraper - Phones, Ratings, Hours & Photos
Pricing
from $3.29 / 1,000 places
Apple Maps Scraper - Phones, Ratings, Hours & Photos
Extract place data from Apple Maps at scale. Get phone numbers, ratings, opening hours, amenities, photos, and full addresses for any business. Search by query + location, paste place URLs, or replay search URLs. 30+ fields per place. Parallel requests. No Apple account needed. $2.99/1,000 places.
Pricing
from $3.29 / 1,000 places
Rating
0.0
(0)
Developer
Zen Studio
Maintained by CommunityActor stats
2
Bookmarked
139
Total users
44
Monthly active users
5 days ago
Last modified
Categories
Share
Apple Maps Scraper Pro | Extract Place Data from Apple Maps (2026)
From Zen Studio, creators of Yandex Maps Scraper and 2GIS Scraper. One studio behind a suite of local-business data tools.
Why choose this actor?
313 ms average for single-place details. Get published phone numbers, websites and full addresses in a single run. Measured from actor start to completion for single-place runs; excludes Apify queue and container startup. Actual times vary.
Build a contact list, not just a list of names. Collect published phone numbers, websites and full addresses together, ready to export to your CRM.
Qualify businesses before reaching out. Use categories, ratings, opening hours and amenities to narrow your shortlist.
Search an area or bring your own places. Search by business type and location, or supply Apple Maps place URLs to collect their details in bulk.
Contact details and other fields are returned when Apple Maps publishes them. The hero shows an illustrative place card with a masked phone number.
Try your first search
Start with 20 dentists in Brooklyn. Change the business type and location to your target market.
{"searchQueries": [{"query": "dentists","location": "Brooklyn, New York"}],"maxResults": 20,"countryCode": "US","language": "en-US"}
Open the actor input, paste this example and start your search. Phone numbers need no additional input switch. A search covers the area around your location; this is not a complete city directory.
| Zen Studio · Maps & Local Leads | ||
You are here | Business leads & reviews | Phones, emails & reviews |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.
zen-studio/apple-maps-scraper-pro on Apify. Call: ApifyClient("TOKEN").actor("zen-studio/apple-maps-scraper-pro").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: query (array of search terms), location (string, city/area, applies to every query), startUrls (array, Apple Maps place/search/guide URLs), guideUrls (array, Apple Maps guide links; scrapes every place in the guide, billed per place), sortBy (string, "relevance"/"distance"/"rating"), includeNearbyPlaces (boolean, default false; also collects the matching places around the search area, ~80% more places per search, billed per place). Each place carries searchRank (position in the results), openNow (open at scrape time) and sourceGuide (the guide it came from). Optional filters, all off by default: openNow (boolean), minRating (string, one of "3"/"3.5"/"4"/"4.5", normalized across rating sources), hasPhone (boolean), hasWebsite (boolean); filtered-out places are neither stored nor billed. Full actor spec (input schema with all params/enums/defaults, output dataset fields, README): GET https://api.apify.com/v2/acts/zen-studio~apple-maps-scraper-pro/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Pricing: pay-per-event, $0.00399/place on the Regular plan, less on higher plans. Get token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
How to Scrape Apple Maps Places
Three input modes, use any combination:
Search by Query + Location
The most common way. Enter what you're looking for and where. The location is automatically converted to coordinates.
{"searchQueries": [{ "query": "coffee shops", "location": "Manhattan, New York" },{ "query": "dentist", "location": "Shibuya, Tokyo" },{ "query": "EV charging station", "location": "Berlin, Germany" }],"maxResults": 50}
Each query searches a ~5 km radius around the geocoded location. More specific locations give more accurate results -- "Soho, London" is better than "London".
Scrape Specific Places by URL
Paste Apple Maps place URLs directly. Supports place IDs, address URLs with a business name, and short share links from the Apple Maps app.
{"placeUrls": ["https://maps.apple.com/place?place-id=I918CB7E77B4C7910","https://maps.apple.com/place?auid=12345678901234567","https://maps.apple.com/?q=Lifeline+Urgent+Care&address=13410+Briar+Forest+Dr,+Houston,+TX+77077","https://maps.apple/p/g.uBeAYyG_6cdr"]}
Supported URL formats:
- Place ID URLs --
place?place-id=...orplace?auid=... - Address URLs --
?q=Business+Name&address=...(copied from the browser address bar) - Share URLs --
maps.apple/p/g.xxxshort links (from the share button in Apple Maps)
Replay a Search URL
Copy a search URL from your browser after searching on Apple Maps. The query, coordinates, and zoom level are preserved.
{"searchUrls": ["https://maps.apple.com/search?query=coffee+shops¢er=40.71,-74.00&span=0.05,0.05"]}
The span parameter controls the search radius. Smaller values = tighter area.
Scrape an Apple Maps Guide
Guides are the curated lists in Apple Maps, such as "Coolest Bars in Chicago" by OpenTable or "The Toughest Reservations In The US" by The Infatuation. Paste a guide link and every place in it is scraped with full details.
{"guideUrls": ["https://maps.apple.com/guides?curated=1694850223688040849"]}
Each place records the guide it came from in sourceGuide: the guide's title, publisher, description and cover image, the place's position in the guide, and what the guide writes about that place. A guideId from any place's featuredIn list works as input too.
{"name": "Kitty's Cosmopolitan Club","sourceGuide": {"guideId": "1694850223688040849","title": "Coolest Bars in Chicago","publisher": "OpenTable","placeCount": 11,"updatedAt": "2026-06-08T19:25:09.000Z","position": 1,"placeDescription": "A refined River North lounge devoted to classic cocktails and modern technique. Perched above Gus' Sip & Dip, Kitty's is a formal, considered space built for serious cocktail enthusiasts..."}}
Places from a guide are billed like any other place.
Country and Language Change Your Results
These aren't just formatting options. They affect which places Apple Maps returns and how it ranks them.
Country code sets the regional context. Searching "cafe" near Paris with US returns Cafe de Flore, but with FR returns Le Peloton Cafe. Set this to match where your target places are.
Language controls category names, address formatting, and result ranking. Searching near Berlin with de-DE vs en-US can return different first results and categories ("Kaffeehaus" vs "Coffee Shop").
{"searchQueries": [{ "query": "cafe", "location": "Paris, France" }],"countryCode": "FR","language": "fr-FR"}
Integrations and scheduling
Run the Apple Maps places scraper on a schedule in Apify Console, daily for new-listing alerts, weekly for market snapshots. Each run can call a webhook when it finishes, so n8n, Make and Zapier flows pick up new rows without polling. The Apify API and the Apify MCP server take the same input, for scripts and AI agents.
Pricing
Pay-per-event pricing. You pay per place successfully scraped.
| Plan | Per 1,000 places | Per place |
|---|---|---|
| Regular | $3.99 | $0.00399 |
| Bronze | $3.79 | $0.00379 |
| Silver | $3.49 | $0.00349 |
| Gold and above | $3.29 | $0.00329 |
Cost Examples (Regular Plan)
| Places | Cost |
|---|---|
| 100 | $0.40 |
| 500 | $2.00 |
| 1,000 | $3.99 |
Try it free -- new Apify users get $5 in platform credits. That's ~1,250 places at no cost.
Budget controls are built in. Set a maximum spend and the Actor stops automatically when the limit is reached.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQueries | array | -- | Search queries with location. Each entry has query, location, and optional maxResults. |
placeUrls | array | -- | Direct Apple Maps place URLs. |
searchUrls | array | -- | Apple Maps search URLs with embedded coordinates. |
openNow | boolean | false | Keep only places open at run time, in the place's local time. |
minRating | string | -- | Keep only places rated at or above this: "3", "3.5", "4" or "4.5", on a 0-5 scale. |
hasPhone | boolean | false | Keep only places with a published phone number. |
hasWebsite | boolean | false | Keep only places with a published website. |
countryCode | string | US | Affects result ranking and which places are returned. |
language | string | en-US | Affects category names, addresses, and result ranking. |
maxResults | integer | 50 | Max places per search query. The console form starts at 20. Apple typically ranks 20-30 places per search. |
includeNearbyPlaces | boolean | false | Also collect the matching places shown around the search area. Roughly 80% more places per search on dense queries. |
sortBy | string | best match | Order of each search: "relevance" (Apple's best match), "distance" (nearest first) or "rating" (highest rated first). |
guideUrls | array | -- | Apple Maps guide links. Every place in each guide is scraped. |
At least one of searchQueries, placeUrls, searchUrls, or guideUrls is required.
Output Example
Each place in the dataset looks like this:
{"placeId": "11204647164469319519","placeIdHex": "I9B7EE73B37C8175F","name": "The French Laundry","localName": null,"localNameLocale": null,"placeType": "BUSINESS","placeDisplayType": "BUSINESS","placeCategoryType": null,"capacity": null,"phone": "+17079442380","phoneFormatted": "+1 (707) 944-2380","altPhones": ["+17079477182"],"fax": null,"website": "https://www.thomaskeller.com/tfl","brandMuid": "7346229445065865844","globalBrandMuid": "2453048121273726974","categories": ["French Cuisine","Restaurant","Bar","European Cuisine","Fine Dining Restaurant","American Cuisine"],"categoryIds": ["french_cuisine","restaurant","bar","european_cuisine","fine_dining_restaurant","american_us_cuisine","wine_bar","signature_restaurant","new_american_us_cuisine"],"categoryTaxonomy": "dining.restaurant.european_cuisine.french_cuisine","categoryGroup": "fooddrinks","displayCategory": "French Cuisine","displayLocation": "Yountville","mapsCategoryId": "dining.restaurant.european_cuisine.french_cuisine","mapsAltCategoryId": ["dining.restaurant.fine_dining_restaurant.signature_restaurant","dining.restaurant.american_us_cuisine.new_american_us_cuisine","dining.bar.wine_bar"],"mapsAltCategoryMuid": ["1152921504606870749","1152921504606870718","1152921504606870597"],"address": {"full": "6640 Washington St, Yountville, CA 94599, United States","short": "6640 Washington St, Yountville","cityAndAbove": "Yountville, CA United States","displayLocality": "Yountville","countryName": "United States","street": "6640 Washington St","subThoroughfare": "6640","thoroughfare": "Washington St","subPremise": [],"subLocality": null,"city": "Yountville","subAdministrativeArea": "Napa County","state": "California","stateCode": "CA","postalCode": "94599","country": "United States","countryCode": "US","subdivisionCode": null,"adminRegionCode": "06055","neighborhood": [],"areaOfInterest": []},"containedIn": "French Cuisine · Yountville, CA","parentPlace": {"placeId": "6254911099258597695","name": "Yountville, CA"},"location": {"lat": 38.4044062,"lng": -122.364977},"enhancedCenter": null,"timezone": "America/Los_Angeles","timezoneOffset": -25200,"bounds": {"region": {"southLat": 38.40350788471588,"westLng": -122.36612332837127,"northLat": 38.405304515284115,"eastLng": -122.36383067162872},"displayRegion": {"southLat": 38.3999095,"westLng": -122.370715,"northLat": 38.4089028,"eastLng": -122.3592389},"minZoom": 14.000001907348633,"maxZoom": null},"roadAccess": [{"lat": 38.4043477,"lng": -122.3651097,"significance": null,"source": "ACCESS_POINT_SERVICE_CURATED","type": "walking","direction": "ENTRY_EXIT"}],"lookAroundAvailable": false,"lookAround": null,"rating": {"provider": "Apple","ratingType": "APPLE_RATING","score": 85,"maxScore": 100,"reviewCount": 54,"reviewCountFormatted": "54","categoryRatings": [{"category": "Atmosphere","score": 86,"maxScore": 100,"reviewCount": 50},{"category": "Customer Service","score": 85,"maxScore": 100,"reviewCount": 48},{"category": "Food & Drink","score": 85,"maxScore": 100,"reviewCount": 48}]},"priceLevel": null,"reviews": [],"tips": [],"reviewsUrl": null,"addReviewUrl": null,"description": null,"editorial": [{"provider": "MICHELIN Guide","title": "Michelin","text": "Thomas Keller’s legendary destination still doesn’t miss a beat. In fact this may be known as the greatest cooking space in America, as every aspect is carefully determined: from the counter height to the flowing lines of the ceiling. Chef Keller continues to pair classic French techniques with wildly fresh ingredients in a setting that is a perfect storm of restaurant greatness. We should all be so lucky to score a reservation here. The cornet filled with crème fraîche and topped with Atlantic salmon tartare is an impressive start before moving on to dishes like Atlantic pompano amandine, sweet butter-poached spiny lobster, and the perfectly cooked herb-roasted Elysian Fields Farm lamb. The finale presents a series of desserts from a cheese course to a decadent chocolate gâteau.","url": "https://guide.michelin.com/r/122806"}],"accolades": [{"provider": "MICHELIN Guide","text": "Three Stars"}],"featuredIn": [{"guideId": "5313904882904543969","title": "The Toughest Reservations In The US","description": "Our thoughts on some of the busiest restaurants in the country and advice on how to get in.","placeDescription": "The Yountville fine dining institution is as synonymous with Wine Country as the actual wine. But the question of whether this meal is worth the price and effort to get a table is the big one. Reservations open the first of the month at 10am PST. Prepaid, of course, starting at $425 per person in the dining room. But be aware: they’re nearly impossible to score and diners have resorted to buying them through social media groups or resale sites.","publisher": "The Infatuation","publisherId": "3291963553709838958","publisherSubtitle": "Your restaurant decider.","url": "https://www.theinfatuation.com/all/guides/toughest-restaurant-reservations-in-america?utm_campaign=applemaps&utm_medium=affiliate&utm_source=applemaps&utm_audience=all&utm_campaigntype=organic","image": "https://is1-ssl.mzstatic.com/image/thumb/oBS1S3LcULD0nuGGN1GynQ/1564x1172.jpg","placeCount": 17,"updatedAt": "2025-06-05T17:29:39+00:00"}],"factoids": [],"partnerEnrichment": null,"relatedPlaces": [],"venue": null,"messaging": null,"hours": {"weekly": [{"days": ["SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"],"open": "16:00","close": "20:00"}],"open24Hours": false,"hoursType": "NORMAL"},"openNow": false,"serviceHours": [],"amenities": [{"name": "Accepts Apple Pay","amenityId": "crossbusiness.payments.applepay","available": true,"source": ""},{"name": "Accepts Contactless Payments","amenityId": "crossbusiness.payments.contactless_pay","available": true,"source": ""},{"name": "Wheelchair Accessible","amenityId": "crossbusiness.accessibility_features.wheelchair_accessible","available": true,"source": "com.apple.abr"}],"evCharger": null,"transit": null,"trails": [],"photos": [{"url": "https://is1-ssl.mzstatic.com/image/thumb/amsUuRMbE80gPTF2kuKCjw/1000x1000bb.jpg","width": 1000,"height": 1000,"category": "Food & Drink","categoryPhotosAvailable": 44,"caption": null,"author": "David Escalante/The French Laundry","provider": "MICHELIN Guide","photoId": "restaurant-asset-1-6021216","addedAt": "2026-08-20T14:01:31+00:00","sourceUrl": null},{"url": "https://ir.4sqi.net/img/general/450x600/32425184_gl6ROBS6OtOu-Z6kaYbh-9EuUgOBiFkVGeWm6Fvx07g.jpg","width": 308,"height": 308,"category": "Food & Drink","categoryPhotosAvailable": 44,"caption": null,"author": null,"provider": "Foursquare","photoId": "624a38e468bbe4378e98ef7c","addedAt": null,"sourceUrl": "https://foursquare.com/mapaction?id=453774dcf964a520bd3b1fe3&component=photo&cid=624a38e468bbe4378e98ef7c&action=view&language=en-US"}],"coverPhoto": {"url": "https://is1-ssl.mzstatic.com/image/thumb/5udgz93sewB-E8Rx6Ze6bg/1600x1040bb.png","width": 1600,"height": 1040},"brandIcon": {"url": "https://is2-ssl.mzstatic.com/image/thumb/iStOUfXrYx3jVArG97P6yg/258x258.png","width": 258,"height": 258,"iconType": "ICON_TYPE_AVATAR"},"quickLinks": [{"title": "Reserve","url": "https://guide.michelin.com/r/122806","linkType": "LINK_TYPE_QUICK_LINK","relationship": null,"appStoreId": "1541129177","appBundleId": null,"symbol": "calendar.badge.clock"},{"title": "Menu","url": "https://www.yelp.com/menu/the-french-laundry-yountville-7?utm_campaign=action_link_view_menu&utm_medium=feed_v2&utm_source=apple","linkType": "LINK_TYPE_QUICK_LINK","relationship": null,"appStoreId": "284910350","appBundleId": null,"symbol": "menucard.fill"}],"actionData": [{"titles": ["Reserve"],"links": [{"linkType": "LINK_TYPE_QUICK_LINK","url": "https://guide.michelin.com/r/122806","title": ""}],"categoryId": "quicklinks.restaurant_reservation","symbol": "calendar.badge.clock","appStoreId": null}],"appStoreId": null,"claimUrl": "https://business.apple.com/?claimId=11204647164469319519","isClaimable": null,"claimBrandIds": ["1534293116948250624"],"buildingId": "360850920180673950","mapsCategoryMuid": "1152921504606870660","appleUrl": "https://maps.apple.com/place?auid=11204647164469319519","scrapedAt": "2026-09-25T09:41:18.204915+00:00","searchQuery": "The French Laundry","searchLocation": "Yountville, CA","matchedLocation": "Yountville","searchRank": 1,"sourceGuide": null}
Fields That Depend on the Place
The example above is a restaurant. Other kinds of place return their own detail, and the fields below come from real results.
Ratings, price and reviews
Ratings keep the scale and the source they came from, so a 4.6 out of 5 is never reported as 92 out of 100. Places outside your language also carry their local name.
{"name": "Tachikui Sushi Sushikawa","localName": "立食い鮨 鮨川","localNameLocale": "ja","rating": {"provider": "Tabelog","ratingType": "USER_RATING","score": 3.55,"maxScore": 5,"reviewCount": 203,"reviewCountFormatted": "203"},"priceLevel": {"score": 3,"maxScore": 4,"currencySymbol": "¥"},"reviews": [{"provider": "Tabelog","reviewId": "241545967","text": "休日の昼に訪れました。事前に予約してコースを注文。15貫コースに1品追加しました。立ち食いのスタイルとなりますが、寿司は本格的。少しシャリは小さめで赤酢となり、スイスイいけます。追加したつぶ貝もキモの苦味とうまくマッチしており満足でした。全てモバイルオーダーというスタイルなので、会話が苦手な人...","time": "2026-08-31T00:00:00+00:00","rating": {"score": 3.8,"maxScore": 5},"reviewer": {"name": "chelseamasa","image": ""},"url": "https://tabelog.com/apple_maps_action?id=13274605&component=review&cid=241545967&action=view&language=en-US"}],"accolades": [{"provider": "MICHELIN Guide","text": "Bib Gourmand"}]}
Visitor tips
Short notes left by visitors, separate from full reviews.
{"name": "Le Bernardin","tips": [{"provider": "Foursquare","tipId": "66e2e665a281e372b1464353","text": "Came here for the lunch course. phenomenal experience from the food to the service. We also had the veggie option that u could choose from the main course. The dessert was another level of gastronomy!","time": "2024-09-12T13:02:29+00:00","author": {"name": "Elvis R","image": "https://irs3.4sqi.net/img/user/32x32/6843683_kXkz5idd_JNkk6_vKGQhn5va3eCwklzdnfqOT91u5CYhf_nxh0Xy6IEpdK6ru3LPMdU4vuxM1.jpg"}}]}
Charging stations
Connectors, charging speed, power and how many are free right now.
{"name": "Tesla Destination","categoryTaxonomy": "transportation.ev_charging_station","evCharger": {"connectors": [{"connectorType": "CONNECTOR_TYPE_TESLA","connectorName": "Tesla","chargingSpeed": "Slow","powerWatts": 8100,"available": null,"total": 1,"status": "NO_STATUS"}],"available": 0,"total": 1,"status": "NO_STATUS"}}
Transit stops
The lines that serve the stop, upcoming departures, the operators and any service alerts.
{"name": "Alexanderplatz Bhf","localName": "Alexanderplatz Bahnhof","transit": {"lines": [{"lineId": "11808568026067274535","name": "S-Bahn Berlin S3","color": "0E67ABFF","transitType": 109},{"lineId": "8670455241662138367","name": "S-Bahn Berlin S47","color": "AE844AFF","transitType": 109}],"departures": [{"lineId": "11808568026067274535","line": "S-Bahn Berlin S3","headsign": "Berlin-Spandau","origin": "Alexanderplatz","stopId": "12106889440044151307","times": ["2026-09-25T10:13:12+00:00","2026-09-25T10:33:12+00:00","2026-09-25T10:53:12+00:00"],"statuses": ["ON_TIME","ON_TIME","SCHEDULED"],"frequencySeconds": {"min": null,"max": null}}],"operators": ["Berliner Verkehrsbetriebe","DB Fernverkehr AG","DB Regio AG"],"incidents": [{"incidentId": "13473518722864388845","title": "Station skipped","summary": "Senefelderplatz skipped on U2","description": "Due to construction work, the Senefelderplatz stop on line U2 towards S+U Pankow is not being served from the 3rd November 2025 to 12th March 2027. http://www.bvg.de","type": "ICON_CONSTRUCTION","blocking": false,"startsAt": "2025-11-03T14:23:15+00:00","endsAt": "2027-03-12T22:59:00+00:00","updatedAt": "2026-09-18T15:56:09+00:00"}]}}
Trailheads
The trails you can reach from the trailhead, with their length.
{"name": "Bear Lake Trailhead","placeCategoryType": "PLACE_CATEGORY_TYPE_TRAIL_HEAD","trails": [{"placeId": "387857515193945776","name": "Bear Lake Loop Trail","categories": ["Trail"],"length": {"title": "Length","value": 1.05632,"unit": "UNIT_TYPE_KILOMETERS"}},{"placeId": "9715574396814979124","name": "Bear Lake-Dream/Haiyaha Junction Trail","categories": ["Trail"],"length": {"title": "Length","value": 1.56894,"unit": "UNIT_TYPE_KILOMETERS"}}]}
Venues and landmarks
Capacity, the place that contains it, and whether Look Around imagery exists.
{"name": "Wembley Stadium","capacity": 90000,"categoryTaxonomy": "travel_and_leisure.stadiums_and_arenas","parentPlace": {"placeId": "687401138473154815","name": "Brent, London"},"lookAround": {"available": true,"imageryCapturedAt": "2021-02-20T03:43:40+00:00"},"appStoreId": "1624453575"}
Guides
Guides the place appears in, including what the guide wrote about this place specifically.
{"name": "Beatnik On The River","featuredIn": [{"guideId": "7822146356569191667","title": "The Best Brunch Spots in Chicago","description": "Stop wasting time debating where to go to brunch. This is the best spot for French toast, Bloody Marys, and Benedicts in your Chicago neighborhood.","placeDescription": "Kick back and soak up the BoHo vibes at this loungey greenery-strewn eatery where updated takes on global fixtures and sweeping waterfront views woo boisterous brunch crowds on the regular. Expect colorful shareables like roasted butternut squash and Beluga lentil soup studded with Spanish pimentó, delicate hamachi ceviche in coconut Leche De Tigre, steamy shakshuka served in a Berber tagine, and mezze platters stocked with avocado shatta, harissa carrot hummus, & Aleppo pepper-spiked tzatziki.","publisher": "Thrillist","publisherId": "13177910477245453268","publisherSubtitle": "Thrillist means fun","url": null,"image": "https://is1-ssl.mzstatic.com/image/thumb/69HAPpQzKPDyX-Cd73SlEQ/1536x1024.jpg","placeCount": 11,"updatedAt": "2021-11-29T22:41:04+00:00"}]}
What Each Place Includes
| Group | Fields |
|---|---|
| Identity | Name, local-language name, place type, category list, category path (dining.bar.cocktail_bar), category group, venue capacity |
| Contact | Phone, formatted phone, alternate phones, fax, website, quick links, business messaging |
| Location | Full and structured address, suite/unit, neighborhood, coordinates, entrances, timezone and UTC offset, ISO 3166 subdivision, parent place |
| Reputation | Rating with its source and native scale, category ratings, price level, reviews, visitor tips, awards |
| Editorial | Description, editorial write-ups with their source, guides the place appears in, and what each guide says about it |
| Hours | Weekly hours, closed days, 24-hour flag, service-specific hours (delivery, takeout), and whether the place was open when it was scraped |
| Media | Photos with caption, author, source and added date, owner cover photo, brand icon |
| Provenance | Which query and location found the place, the location Apple matched that to, the place's rank in the results for that search, and the guide it came from (empty for places given by URL) |
| Category-specific | EV charging connectors with power and availability, transit lines, departures, operators and service alerts, trails at a trailhead with their length |
Fields are returned when Apple Maps publishes them for that place.
A location is matched loosely, so a search always lands somewhere. searchLocation and matchedLocation record what you asked for and what it was matched to, which is how you catch a location that was understood differently than you meant it.
searchRank is the place's position in Apple Maps results for your search, 1 being the first result. Run the same search on a schedule to track how a business ranks over time. It is empty for places given by URL and for places added by Include Nearby Matches, which Apple shows on the map but does not rank.
API Integration
Python
from apify_client import ApifyClientclient = ApifyClient("your_token")run = client.actor("zen-studio~apple-maps-scraper-pro").call(run_input={"searchQueries": [{"query": "coffee shops", "location": "Manhattan, New York"}],"countryCode": "US","language": "en-US","maxResults": 50,})for place in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{place['name']}, {place['phone']}, {place['address']['full']}")
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'your_token' });const run = await client.actor('zen-studio~apple-maps-scraper-pro').call({searchQueries: [{ query: 'coffee shops', location: 'Manhattan, New York' },],countryCode: 'US',language: 'en-US',maxResults: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map(p => `${p.name}, ${p.phone}`));
Advanced Usage
Multi-City Search
Search the same category across multiple cities in one run:
{"searchQueries": [{ "query": "coworking space", "location": "San Francisco, CA" },{ "query": "coworking space", "location": "Austin, TX" },{ "query": "coworking space", "location": "Miami, FL" },{ "query": "coworking space", "location": "Seattle, WA" }],"countryCode": "US","maxResults": 100}
All searches run in parallel.
Per-Query Result Limits
Override the global maxResults for individual queries:
{"searchQueries": [{ "query": "restaurant", "location": "Manhattan, New York", "maxResults": 30 },{ "query": "bar", "location": "Manhattan, New York", "maxResults": 10 }],"maxResults": 20}
Collect More Places per Search
A search returns the places Apple ranks for your query. Turning on Include Nearby Matches (includeNearbyPlaces) also collects the matching places shown around your search area, which is usually around 80% more for a dense query such as bars, parking or trailheads. A search for one named landmark is unaffected.
{"searchQueries": [{ "query": "cocktail bar", "location": "River North, Chicago" }],"maxResults": 100,"includeNearbyPlaces": true}
Each extra place is a place you pay for, so it is off by default. Max Results per Query still caps the total.
Sort by Distance or Rating
Searches come back in Apple's best-match order. Pick another order and Apple ranks the places that way instead:
{"searchQueries": [{ "query": "dentist", "location": "Brooklyn, New York" }],"sortBy": "rating"}
"rating": highest rated first, within the search area. For 25 cocktail bars in River North, Chicago, the first five averaged 4.7 stars against 4.2 in the default order."distance": nearest to the search point first. Apple returns fewer, closer places: the same search returned 23 bars, all within 300 m.
searchRank follows the order you pick. Sorting applies to search queries with a location and to search URLs.
Filter the Results
Narrow the output to the places you actually want. Filters are optional; leave them off and every place found is returned.
{"searchQueries": [{ "query": "dentist", "location": "Brooklyn, New York" }],"maxResults": 100,"hasPhone": true,"hasWebsite": true,"minRating": "4.5"}
Filtered-out places are not stored and not billed. Ratings arrive on different scales depending on the source and are converted to 0-5 before comparison, so minRating: "4.5" means four and a half stars everywhere. Places that publish no rating, no phone or no opening hours cannot satisfy the matching filter, so they are left out.
Mixed Input Modes
Combine all three input modes in a single run:
{"searchQueries": [{ "query": "pharmacy", "location": "Brooklyn, New York" }],"placeUrls": ["https://maps.apple.com/place?auid=5283835567047557515"],"searchUrls": ["https://maps.apple.com/search?query=gym¢er=40.68,-73.94&span=0.03,0.03"],"maxResults": 30}
Results are deduplicated automatically.
Localized Data Extraction
Extract place data in the local language for international markets:
{"searchQueries": [{ "query": "ramen", "location": "Shinjuku, Tokyo" }],"countryCode": "JP","language": "ja-JP","maxResults": 50}
Category names, addresses, and ranking will reflect the Japanese market.
Data Export
Export results from the Apify Console in:
- JSON -- programmatic analysis, database import
- CSV -- spreadsheets, quick analysis
- Excel -- reporting, pivot tables
- XML -- legacy system integration
Nested fields (address, rating, hours) are flattened automatically in tabular formats.
FAQ
How many places can I scrape per search? Apple Maps typically returns 20-30 places per search query. Use multiple queries with different locations to cover larger areas.
Do I need an Apple account? No. No login, no cookies, no authentication required.
How fresh is the data? Data is fetched in real time from Apple Maps. You get whatever Apple Maps currently shows.
What's the rating scale? Apple Maps uses a 0-100 score (not 5-star). A score of 82 roughly corresponds to 4.1 stars. Per-category ratings (food, service, ambiance) are included when available.
Can I scrape places in non-English languages?
Yes. Set language to any locale (e.g., de-DE, ja-JP, fr-FR). Category names and addresses will be localized. This also affects which places are returned.
What phone number formats are included?
Three fields: phone (raw, e.g., +12125551234), phoneFormatted (human-readable, e.g., +1 (212) 555-1234), and altPhones (array of alternate numbers).
Is there a free trial? New Apify users get $5 in platform credits, enough for ~1,200 places at no cost.
What happens when I hit my budget limit? The Actor stops gracefully and keeps all data scraped so far. Nothing is lost.
More Zen Studio scrapers for maps & local data
- Apple Maps Directions & Route API
- Baidu Maps Scraper
- Google Maps Scraper
- Google Maps Directions & Routes API
- Yandex Maps Scraper
Also from the same studio (name, then account/slug for the URL https://apify.com/account/slug):
- Yandex Maps Reviews Scraper (
zen-studio/yandex-maps-reviews-scraper) - 2GIS Places Scraper (
zen-studio/2gis-places-scraper-api) - 2GIS Reviews Scraper (
zen-studio/2gis-reviews-scraper) - Naver Map & Place Scraper (
zen-studio/naver-place-scraper) - Bing Maps Scraper (
zen-studio/bing-maps-scraper)
Full directory: Zen Studio on Apify
Disclaimer
Data is collected from publicly available sources and provided "as is" for informational purposes. Users are responsible for compliance with Apple's terms of service and applicable regulations in their jurisdiction.
