Apple Maps (Mapas) Scraper - Places, Ratings, Phone + Website
Pricing
$3.19 / 1,000 places
Apple Maps (Mapas) Scraper - Places, Ratings, Phone + Website
Search Apple Maps by keyword and city: public places with Apple place ID, name, category, address, coordinates, business phone and website, and aggregate rating with its source. No login, no cookies. Empty terms and status rows are free.
Pricing
$3.19 / 1,000 places
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Apple Maps (Mapas) Scraper — Places, Ratings, Phone + Website
A Lantern Lab Actor. Search Apple Maps by keyword and city and get the public place data back: Apple's own place ID, name, category path, full address, coordinates, the business's own published phone and website, and the aggregate rating with the source it comes from. No Apple ID, no login, no cookies, no account of your own.
Price: pay per result — USD 3.19 per 1,000 places, and no run-start fee. Empty search terms, per-term status rows and the run summary are free, so a term that found nothing and a term that was cut short cost you nothing. A place whose rating you asked for and whose own page did not come back is free too: it is written with partial: true and partialReason: "rating_unavailable", and is not charged.
What you get
{"recordType": "place","placeId": "1241241539567035924","name": "Café com Quintal","category": "Cafe","categories": ["Jantar","Compras","Café","Mercado de Comida","Loja de Suprimentos de Café e Chá"],"address": "Rua Eça de Queiroz, 122, Vila Mariana, São Paulo - SP, 04011-030, Brasil","addressLines": ["Rua Eça de Queiroz, 122","Vila Mariana","São Paulo - SP","04011-030","Brasil"],"locality": "São Paulo","subLocality": "Vila Mariana","administrativeArea": "São Paulo","postCode": "04011-030","country": "Brasil","countryCode": "BR","latitude": -23.5783492,"longitude": -46.6419572,"phone": "+5511998493602","additionalPhones": ["+5511985788356"],"website": "https://www.facebook.com/cafecomquintal","rating": 2.4,"ratingType": "USER_RATING","ratingScore": 2.4,"ratingMaxScore": 5,"reviewCount": 11,"ratingSource": "com.tripadvisor","ratingSourceName": "Tripadvisor","ratingSourceUrl": "http://www.tripadvisor.com/AppleMapsAction?id=23595545","timezone": "America/Sao_Paulo","url": "https://maps.apple.com/place?q=Caf%C3%A9%20com%20Quintal&auid=1241241539567035924…","searchQuery": "cafe","location": "São Paulo, Brazil","rank": 5,"searchPointLatitude": -23.5796404,"searchPointLongitude": -46.6550645,"detailStatus": "ok","publishedAt": null,"partial": false,"partialReason": null,"collectedAt": "2026-10-24T05:29:07.847Z"}
Input
{"searchQueries": ["cafe", "padaria"],"location": "São Paulo, Brazil","maxPlaces": 50,"includeRating": true,"language": "pt-BR"}
| Field | Default | What it does |
|---|---|---|
searchQueries | — | Search terms, one per line. Use the local language where you can: ร้านกาแฟ returns more Thai coffee shops than coffee shop. |
location | — | City, district or address to search in. Apple Maps resolves it first, and the run reports what it resolved to. |
maxPlaces | 50 | Upper bound on the places one term may produce, up to 300. |
includeRating | true | Read each place's own page for its rating and its fuller phone and website. One extra request per place. |
language | — | BCP 47 tag Apple should answer in, for example pt-BR, th-TH, id-ID, es-MX. |
maxUpstreamRequests | derived | Hard ceiling on requests to Apple Maps. Left empty, the Actor derives one from your input, so a run is never unbounded. |
proxyConfiguration | Apify residential | Where the requests come from. |
Output
Three row types in one dataset:
place— one per place, deduplicated across every search term in the run. The only charged row, and only when it is complete — a row withpartial: trueis free.input_status— one per search term: what it returned, how many of its place rows were charged (placesCharged), how many places an earlier term had already collected, how many search points were used, and whether it was cut short. Never charged.RUN_SUMMARY— the last row, and the same object under theRUN_SUMMARYkey in the run's key-value store.
Two rating scales, never mixed
Apple returns two different scales in the same field:
USER_RATINGis a third party's star rating —ratingScoreout ofratingMaxScore5, withratingSourcenaming the provider (Foursquare, Tripadvisor).APPLE_RATINGis Apple's own recommendation rate —ratingScoreout ofratingMaxScore100.
rating is filled only from a five-point scale. A place Apple scores 87 of 100 has rating: null, ratingScore: 87, ratingMaxScore: 100 — putting 87 into a star column would be fabricated data. Sort and filter on rating for stars, on ratingScore within one ratingType.
Empty is not the same as incomplete
A term Apple Maps answered with no place gets a status row with partial: false and a sentence saying it is an empty result. A term that was refused, failed, or stopped at a limit gets partial: true with a partialReason — blocked, upstream_error, upstream_request_cap, charge_limit_reached, unreadable_response, location_not_found or not_collected — and is never reported as zero results. Rows written before the stop are kept.
A place row is partial for one reason only: rating_unavailable. With includeRating: true, the rating comes from the place's own page, and when that page is refused, fails, comes back unreadable, or is never asked for because the run hit its request ceiling (detailStatus blocked, request_failed, unreadable_response or upstream_request_cap), the place is still written — with rating: null, partial: true, partialReason: "rating_unavailable" — and is not charged. Two cases that are not partial and are charged as usual: a page that was read and simply publishes no rating (detailStatus: "ok", rating: null), and includeRating: false, where no rating was ever asked for (detailStatus: "not_requested", same price).
Limits
Measured on real runs on 2026-10-24: 40 places in São Paulo (pt-BR), 11 in Bangkok (th-TH), plus an anonymous probe across Brazil, Mexico, Thailand, Malaysia, Indonesia and Vietnam.
- 10 places per search, no paging. Apple serves at most 10 places per search request and honours no page parameter, so a term is searched from several points spread across the location until it has your
maxPlaces. A row count belowmaxPlacesis what those points returned, not a count of everything Apple Maps holds — the status row says how many points were used. - Not every place has a rating. In the São Paulo run 24 of 40 places carried one, and 19 of those were on the five-point scale; in Bangkok 9 of 11. Coverage differs sharply by country: the probe found nearly every place rated in Mexico and Brazil, about two thirds in Thailand and Malaysia, and none at all in the Indonesian and Vietnamese samples. A place with no rating is complete with
rating: null; it is not marked partial. - Phone and website are not universal either. São Paulo run: 34 of 40 places published a phone, 22 a website.
- The location is matched loosely. Apple Maps resolves
locationto the nearest thing it can find rather than failing:Qqqzzxw Nowhereville 99999resolved to Hawlawji, Ghana, and the run searched there. Every status row and the run summary carryresolvedLocation— check it before trusting a city's rows. - Local-language coverage is thinner in South-East Asia than in Latin America. A Vietnamese-language term returned one place where a Portuguese one returned ten.
- Review text and reviewer names are not collected. Only the aggregate rating, with its source, which Apple requires to be shown alongside the score (
ratingSource,ratingSourceUrl). - A term that is itself a place name in the search language collapses to that one place.
restaurantewithlanguage: "es-MX"returns the single place named "Restaurante", whilerestaurantes,taquería, or the same term with nolanguagereturn ten POIs each. The run never rewrites your term - the status row shows 1 place from N search points, which is the signal to use a more specific or plural term. - A nonsense keyword returns one loose match, not nothing. Read
placesReturnedtogether with the status row's sentence, not the row count alone. - Some exits are served an Apple Maps page without the MapKit token in it. The run asks again from a fresh exit, up to three times, and only then reports the term as incomplete with
unreadable_response— one run in four hit that variant on 2026-10-24 before the retry existed. - A single place page is sometimes refused or times out. In the two runs 3 of 50 place pages did not come back (HTTP 403 once, a transport failure twice). Those places are still written, with
rating: nullanddetailStatussaying which happened —blocked,request_failed,not_foundorupstream_request_cap. You are not charged for them: withincludeRating: true, a place row whose page was refused, failed, was unreadable, or was never asked for at the request ceiling carriespartial: truewithpartialReason: "rating_unavailable"and is free. (not_found— Apple answers 404 for the place's own page — is charged: there is no rating to get rather than one we failed to get.) - Apple Maps publishes no creation time for a place, so
publishedAtis alwaysnull;collectedAtis our own observation time.
Development
npm installnpm test # offline, against real recorded responses
Tests run against fixtures recorded from real Apple Maps responses: the place pages are cut to the two components the Actor reads with their values verbatim, the two token values are redacted, and search_empty.json is a real response with its results array emptied.