
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape Apple Maps places by search term and location, place links, search links or guides. Phones, websites, full addresses, coordinates, ratings, reviews, hours, amenities, photos and categories. No login needed.
Turn Apple Maps into a clean list of places: phone numbers, websites, full addresses, coordinates, ratings, review snippets, opening hours, amenities, photos and categories for every business it finds. Search any term in any city, paste place links, replay a search from your browser or pull every place from an Apple Maps guide. No login, no browser, and you only pay for the places you get.
coffee shops) and a location (Manhattan, New York, an address, or lat,lng).| Field | What it does |
|---|---|
searchTerms + location | Terms searched near one location (city, neighborhood, address or lat,lng) |
maxResults | Max places per search, search link or guide (0 = as many as possible) |
placeUrls | Place links (place?auid=, place?place-id=), share links (maps.apple/p/...), name + address links, or bare IDs |
searchUrls | Search links with their own query and map area |
guideUrls | Apple Maps guide links (guides?curated=...) |
searchQueries | Searches that each have their own location and limit |
openNow, minRating, hasPhone, hasWebsite | Filters (places that don't match are not charged) |
sortBy | Best match, distance from the center, or rating |
searchRadiusKm | Search a square of this radius around the location instead of its own area |
includeNearbyPlaces | Also save the matching places shown as dots around the ranked list |
countryCode, language | Ranking country (default: the location's country) and output language |
{
"searchTerms": ["dentist", "orthodontist"],
"location": "Brooklyn, New York",
"maxResults": 100,
"minRating": "4",
"hasPhone": true,
"placeUrls": ["https://maps.apple.com/place?auid=15009391639296819895"],
"guideUrls": ["https://maps.apple.com/guides?curated=1694850223688040849"]
}
| Field | Example |
|---|---|
name, category, categories | Frame Coffee, Coffee Shop, ["Coffee Shop", "Cafe", ...] |
phone, phoneFormatted, website | +19293924196, +1 (929) 392-4196, https://framecoffeenyc.com/ |
address | full line plus street, house number, neighborhoods, city, county, state, postal code, country |
location, timezone | {"lat": 40.78, "lng": -73.98}, America/New_York |
rating | provider, score, scale, review count, category ratings, score5 (0-5) |
priceLevel, reviews, tips | price level and currency, review snippets, visitor tips |
hours, openNow | weekly hours, closed days, open-24-hours flag, open at run time |
amenities, photos, coverPhoto | amenities, photos with source, author and date |
editorial, accolades, featuredIn | write-ups, awards, guides the place appears in |
evCharger, transit, trails | category-specific detail when it applies |
actionLinks, quickLinks, claimUrl | order, reserve and menu links, the Business Connect claim link |
searchQuery, matchedLocation, searchRank, sourceGuide | where each place came from and its position |
placeId, placeIdHex, url | Apple Maps IDs and link |
A real row from a test run (shortened, reviewer replaced with a fictional name):
{
"placeId": "15009391639296819895",
"placeIdHex": "ID04C122C3B0142B7",
"name": "Frame Coffee",
"category": "Coffee Shop",
"categories": ["Coffee Shop", "Cafe", "Restaurant", "Breakfast and Brunch Restaurant"],
"categoryTaxonomy": "dining.cafe.coffee_shop",
"phone": "+19293924196",
"phoneFormatted": "+1 (929) 392-4196",
"website": "https://framecoffeenyc.com/",
"address": {
"full": "305 Amsterdam Ave, New York, NY 10023, United States",
"street": "305 Amsterdam Ave",
"neighborhoods": ["North Hudson", "Upper West Side", "Uptown", "West Side"],
"city": "New York",
"state": "New York",
"stateCode": "NY",
"postalCode": "10023",
"countryCode": "US"
},
"location": { "lat": 40.7800427, "lng": -73.9802671 },
"timezone": "America/New_York",
"rating": { "provider": "Yelp", "score": 4.3, "maxScore": 5, "reviewCount": 69, "score5": 4.3 },
"reviews": [
{
"provider": "Yelp",
"text": "I needed an afternoon pick me up so found this place on Maps...",
"time": "2026-10-12T17:37:24+00:00",
"rating": { "score": 4, "maxScore": 5 },
"reviewer": { "name": "Jamie R.", "image": null }
}
],
"hours": {
"weekly": [{ "days": ["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"], "open": "07:00", "close": "17:00" }],
"closedDays": [],
"open24Hours": false
},
"amenities": [{ "name": "Accepts Apple Pay", "amenityId": "crossbusiness.payments.applepay", "available": true }],
"photos": [{ "url": "https://is1-ssl.mzstatic.com/image/thumb/W_7ahdOyEUDII-Ud4W4EcA/1000x750bb.jpg", "width": 1000, "height": 750, "caption": "Truffle eggs Benedict", "provider": "Yelp" }],
"claimUrl": "https://business.apple.com/?claimId=15009391639296819895",
"url": "https://maps.apple.com/place?auid=15009391639296819895",
"searchQuery": "coffee shops",
"searchLocation": "Manhattan, New York",
"matchedLocation": "Manhattan",
"searchRank": 1
}
The dataset has two ready-made tables: Places (name, category, rating, phone, website, address, coordinates, rank) and Contacts (name, phones, website, address parts, claim link).
You pay $3.00 per 1,000 places ($0.003 per place saved). There is no start fee. Places removed by your filters are not charged.
Platform usage (compute and datacenter proxy traffic) is billed on top and is small: about $0.001 for a 20-place run and about $0.03 for 1,000 places in our tests. So 1,000 places ≈ $3.03 in total.
Set a maximum charge for a run and the scraper stops cleanly when it is reached, keeping everything saved so far.
Is it legal to scrape Apple Maps? The scraper only reads public place pages that anyone can open on maps.apple.com without an account. Check that your use of the data follows the laws that apply to you (for example on contacting businesses) and Apple's terms.
Do I need an Apple account or a proxy? No account. A proxy is included: datacenter proxies work and are the default. If Apple Maps refuses them, the scraper switches to US residential proxies by itself.
How many places can I get per search?
As many as Apple Maps has in the area. Each map view shows about 25 places; the scraper splits the area into smaller views until it reaches your limit or finds no new places. For a whole metro area, add a searchRadiusKm, or run several neighborhoods.
Why is a field empty?
Apple Maps only shows what it has for each place. A park has no phone, many places have no price level, and reviews come from partners like Yelp or Tripadvisor only where they cover the place. Empty fields are null or [].
Can I schedule it or use the API? Yes. Save your input as a task and schedule it daily or weekly (for example to track ratings or new businesses), or start runs and read the dataset through the API.
Does it remove duplicates? Yes. A place found by several searches or map views is saved and charged once per run.
openNow and timezoneOffset are computed at run time from the published hours and time zone.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchTermsarrayOptionalSearch terms
What to look for, like in the Apple Maps search bar: coffee shops, dentist, EV charging station, or a business name. Each term is searched near the Location below.
locationstringOptionalLocation
Where to search: a city, neighborhood, address or lat,lng coordinates, e.g. Manhattan, New York, Shibuya, Tokyo, 48.8566,2.3522. The search covers the area of that location (a city or borough), or about 5 x 5 km around an address or a point.
maxResultsintegerOptionaldefault 20Max places per search
How many places to save for each search term, search link or guide. Apple Maps shows about 25 places per map view; above that the scraper splits the area into smaller views and keeps going until it has enough. 0 = as many as it can find.
Scrape specific places, replay a search from your browser, or take every place from an Apple Maps guide.
placeUrlsarrayOptionalPlace links or IDs
Apple Maps place links, share links or place IDs. Accepted: maps.apple.com/place?auid=..., maps.apple.com/place?place-id=I..., short share links maps.apple/p/..., links with a business name and address (?q=Name&address=...), and bare IDs.
searchUrlsarrayOptionalSearch links
Apple Maps search links copied from your browser, e.g. https://maps.apple.com/search?query=coffee+shops¢er=40.71,-74.00&span=0.05,0.05. The query and the map area in the link are used.
guideUrlsarrayOptionalGuide links
Apple Maps guides (curated lists such as "Coolest Bars in Chicago"), e.g. https://maps.apple.com/guides?curated=1694850223688040849. Every place in the guide is saved with its position and the guide's note about it.
searchQueriesarrayOptionalSearches with their own location
Optional: searches that each have their own location and limit, as JSON, e.g. [{"query": "dentist", "location": "Brooklyn, New York", "maxResults": 30}].
Optional. Places that don't match are skipped and not charged.
openNowbooleanOptionaldefault falseOpen now
Keep only places that are open at the time of the run, in the place's own time zone. Places without published hours are left out.
minRatingenumOptionalMinimum rating
Keep only places rated at or above this on a 0-5 scale. Ratings from Apple (0-100), Yelp, Tripadvisor and others are converted to 0-5 first. Places without a rating are left out.
hasPhonebooleanOptionaldefault falseHas phone number
Keep only places with a phone number.
hasWebsitebooleanOptionaldefault falseHas website
Keep only places with a website.
sortByenumOptionaldefault "relevance"Sort by
Order of the places in each search: Apple's best match, nearest to the center of the location, or highest rated.
searchRadiusKmnumberOptionalSearch radius (km)
Optional. Search a square of this radius around the location's center instead of the location's own area. Useful to cover a whole metro area (e.g. 30) or just a few streets (e.g. 1).
includeNearbyPlacesbooleanOptionaldefault falseInclude nearby matches
Also save the matching places Apple Maps shows as dots around the ranked list. Usually adds many more places per map view for busy searches (bars, restaurants, parking). These have no search rank.
countryCodestringOptionalCountry
Two-letter country code that Apple Maps uses to rank results (e.g. US, FR, JP). Leave empty to use the country of each location.
languageenumOptionaldefault "en-US"Language
Language of names, categories and addresses, e.g. en-US, de-DE, fr-FR, ja-JP.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for Apple Maps and are the cheapest. If Apple Maps refuses them, the scraper switches to US residential proxies by itself.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| placeId | string | null | Apple Maps place ID (auid) |
| placeIdHex | string | null | Place ID as used in place-id links |
| name | string | null | Place name |
| localName | string | null | Name in the local language, when different |
| localNameLocale | string | null | Locale of the local name |
| placeType | string | null | BUSINESS, ADDRESS, ... |
| placeDisplayType | string | null | How Apple Maps shows the place (BUSINESS, TRANSIT, ...) |
| category | string | null | Main category |
| categories | array | null | All categories |
| categoryIds | array | null | Category IDs |
| categoryGroup | string | null | Top-level category group |
| categoryTaxonomy | string | null | Category path, e.g. dining.cafe.coffee_shop |
| altCategoryTaxonomies | array | null | Other category paths |
| walletCategory | string | null | Spending category |
| phone | string | null | Phone number in international format |
| phoneFormatted | string | null | Phone as displayed |
| altPhones | array | null | Other phone numbers |
| website | string | null | Website |
| capacity | number | null | Venue capacity |
| brandId | string | null | Brand ID (chains) |
| globalBrandId | string | null | Global brand ID |
| buildingId | string | null | Building ID |
| address | object | null | Full and structured address |
| containedIn | string | null | Category and area line |
| parentPlace | object | null | Area or venue the place belongs to |
| insidePlace | object | null | Place it is located inside (mall, parking) |
| location | object | null | Coordinates {lat, lng} |
| timezone | string | null | Time zone |
| timezoneOffset | number | null | UTC offset in seconds at run time |
| bounds | object | null | Map region of the place |
| roadAccess | array | null | Entrances and access points |
| lookAroundAvailable | boolean | null | Street-level imagery of the storefront exists |
| lookAroundCapturedAt | string | null | When that imagery was captured |
| rating | object | null | Rating with its source and scale, review count, category ratings and score5 (0-5) |
| priceLevel | object | null | Price level (e.g. 2 of 4) and currency symbol |
| reviews | array | null | Review snippets |
| reviewsUrl | string | null | Link to all reviews at the source |
| addReviewUrl | string | null | Link to write a review |
| tips | array | null | Visitor tips |
| description | string | null | Description |
| editorial | array | null | Editorial write-ups (Michelin, Wikipedia, ...) |
| accolades | array | null | Awards (e.g. Michelin stars) |
| featuredIn | array | null | Apple Maps guides that list the place |
| factoids | array | null | Facts such as number of charging ports |
| hours | object | null | Weekly opening hours |
| openNow | boolean | null | Open at the time of the run |
| amenities | array | null | Amenities |
| evCharger | object | null | EV connectors and availability |
| transit | object | null | Transit lines, departures, operators and alerts |
| trails | array | null | Trails reachable from a trailhead |
| relatedPlaces | array | null | Places inside or related to this place |
| photos | array | null | Photos with source, author and date |
| coverPhoto | object | null | Owner cover photo |
| brandIcon | object | null | Brand icon |
| actionLinks | array | null | Actions (order, reserve, menu) with their links |
| quickLinks | array | null | All action links, flat |
| appStoreId | string | null | Associated App Store app ID |
| claimUrl | string | null | Apple Business Connect claim link |
| isoSubdivision | string | null | ISO 3166 subdivision code |
| url | string | null | Apple Maps link |
| searchQuery | string | null | Search term that found the place |
| searchLocation | string | null | Location you asked for |
| matchedLocation | string | null | Location Apple Maps matched it to |
| searchRank | number | null | Position in the search results (1 = first) |
| sourceGuide | object | null | Guide the place came from, with its position and note |
| input | string | null | Input that produced the row |
| scrapedAt | string | null | When the place was scraped (UTC) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Place | One place saved with its contact details, address, rating, hours and the rest of its data | $0.003 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/apple-maps-scraper').call({
"searchTerms": [
"coffee shops"
],
"location": "Manhattan, New York",
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/apple-maps-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/apple-maps-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.