Apple Maps API endpoint
Returns Apple Maps places matching a keyword, business name, category, or street address near a coordinate. Each place carries its Apple place ID (the value the place endpoint takes), name, category, coordinates, formatted and structured address, phone, website, rating and review count, price level, weekly opening hours, and a hero photo. Apple returns a bounded set per viewport (around 25 places for the default span) with no pagination; widen the span or move the center to cover more area. When nothing matches near the center Apple may relocate the search to a default region, reported by relocated=true and the region bounds. The response's filters block lists the refinement chips Apple offers for this query and area (open now, top rated, in guides, cuisines, price bands, amenities, accolades, sort); pass their keys back as filters and sort to refine the same search.
/apple-maps/searchEach result's place_id (or numeric id) is the value /apple-maps/place takes.
Query parameters:
query (required) — keyword, business name, category, or street address, e.g. coffee, Sightglass Coffee, 1 Infinite Loop Cupertino.latitude (required) — search center latitude, e.g. 37.7749.longitude (required) — search center longitude, e.g. -122.4194.span (optional) — search viewport size in degrees of latitude/longitude around the center. Defaults to 0.05 (roughly a 5km box); minimum 0.001, maximum 5. Apple returns a bounded set per viewport (around 25 places at the default span, around 55 at 2), so a larger span returns more, but not proportionally more, places.limit (optional) — max places returned. Defaults to 25, maximum 100.lang (optional) — display language as a BCP 47 tag, e.g. en-US, ja-JP, de-DE. Defaults to en-US. Names, categories, and addresses follow it.country (optional) — two-letter ISO 3166-1 code selecting Apple's regional catalog, e.g. US, JP. Defaults to US.filters (optional) — comma-separated filter keys to apply, e.g. OPEN_NOW,modern_pizza_restaurant. Keys come from the filters block of an unfiltered search for the same query and area (Apple's chip bar: OPEN_NOW, TOP_RATED, FEATURED_IN_GUIDES, price bands such as PRICE_RANGE_INEXPENSIVE/PRICE_RANGE_MODERATE/PRICE_RANGE_EXPENSIVE/PRICE_RANGE_VERY_EXPENSIVE, cuisine keys such as modern_pizza_restaurant, amenity keys such as ACCEPTS_CREDIT_CARDS, accolade keys such as ACCOLADES_MICHELIN_ONE_STAR). The available set depends on the query and area. An unknown key returns a 400 that lists the keys available for that search. At most 20 keys. Applying filters costs a second upstream search.sort (optional) — result order: best_match (default), distance, or ratings. Costs a second upstream search.There is no pagination: move the center or widen span to cover more area. total_found is the count Apple reports for the viewport; total_results is the number returned after limit.
When nothing matches near the center, Apple may relocate the search to a default region instead of returning an empty list. region is the bounding box the results actually came from and relocated is true when that box does not contain the requested center; treat such results as not local to the request.
A query Apple has no results for at all returns an empty places list, not an error.
type is the place kind: BUSINESS, AOI (area of interest, e.g. a neighborhood), ADDRESS, STREET, or another Apple entity type. hours_type is NORMAL, SPECIAL, TEMPORARY_CLOSURE, or PERMANENT_CLOSURE. hours[] lists one entry per weekday per opening interval, in the place's local time.
filters[] describes the refinement chips Apple offers for this search: each group has name, type (toggle, multi_select, or sort), match (any or all, multi-select groups only), and options[] with key (the value to pass in filters, or in sort for the sort group), name, and selected. Multi-select groups with match: any (cuisines, prices, accolades) return places matching any selected option; match: all groups (amenities) require every selected option.
When Apple Guides cover the query and area (e.g. a coffee guide alongside coffee shops), guides[] lists them with the same summary shape as /apple-maps/guides (id, url, title, description, photo_url, publisher); pass an id to /apple-maps/guides/guide.
Response includes query, total_found, total_results, region (south, west, north, east), relocated, filters[], places[], and guides[]. Each place has id, place_id, url, name, type, category, categories[] (id, name, level), latitude, longitude, address, address_info (street, neighborhood, city, county, state, state_code, postal_code, country, country_code), phone, alt_phones[], website, rating, rating_max, rating_count, price_level, price_max, price_symbol, hours_type, hours[] (day, open, close), and photo_url. Fields Apple has no value for are omitted.
| Field | Filled in, of 25 checked | Values in the sample |
|---|---|---|
| id | 25 | |
| place_id | 25 | |
| url | 25 | maps.apple.com |
| name | 25 | “Sightglass Coffee” and 22 other values |
| type | 25 | BUSINESS in all 25 |
| category | 25 | Coffee Shop (15), Coffee Roastery (3), Bakery (3) and 4 more |
| categories | 25 | median 5 entries |
| latitude | 25 | |
| longitude | 25 | |
| address | 25 | |
| address_info | 25 | |
| phone | 24 | |
| alt_phones | 10 | median 1 entry |
| website | 24 | sightglasscoffee.com and 20 other hosts |
| hours_type | 25 | NORMAL in all 25 |
| hours | 25 | median 7 entries |
| photo_url | 25 | ir.4sqi.net and 2 other hosts |
| rating | 12 | 3.3 to 4.63, median 4.1 |
| rating_max | 12 | 5 |
| rating_count | 12 | 18 to 2,258, median 88 |
| price_level | 4 | 1 to 2, median 2 |
| price_max | 4 | 4 |
| price_symbol | 4 | $ in all 4 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| query | string | Yes | Keyword, business name, category, or street address to search for | coffee | |
| latitude | number | Yes | Search center latitude | 37.7749 | |
| longitude | number | Yes | Search center longitude | -122.4194 | |
| span | number | No | 0 | Search viewport size in degrees of latitude/longitude around the center. Defaults to 0.05 (roughly a 5km box); minimum 0.001, maximum 5. | 0.05 |
| limit | integer | No | 25 | Max places returned. Defaults to 25, maximum 100. | 25 |
| lang | string | No | en-US | Display language as a BCP 47 tag, e.g. en-US, ja-JP, de-DE. Defaults to en-US. | en-US |
| country | string | No | US | Two-letter ISO 3166-1 country code selecting Apple's regional catalog. Defaults to US. | US |
| filters | string | No | Comma-separated filter keys from the filters block of an unfiltered search for the same query and area, e.g. OPEN_NOW, TOP_RATED, FEATURED_IN_GUIDES, PRICE_RANGE_MODERATE, modern_pizza_restaurant, ACCEPTS_CREDIT_CARDS. Unknown keys return 400 listing the available keys. Costs a second upstream search. | OPEN_NOW,modern_pizza_restaurant | |
| sort | string | No | Result order. Costs a second upstream search. Allowed values: best_match, distance, ratings. | ratings | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/apple-maps/search?query=coffee&latitude=37.7749&longitude=-122.4194&limit=10&lang=en&country=us&sort=best_match" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "coffee",
"total_found": 25,
"total_results": 1,
"region": {
"south": 37.7499,
"west": -122.4444,
"north": 37.7999,
"east": -122.3944
},
"relocated": false,
"filters": [
{
"name": "Open Now",
"type": "toggle",
"options": [
{
"key": "OPEN_NOW",
"name": "Open Now",
"selected": false
}
]
},
{
"name": "All Cuisines",
"type": "multi_select",
"match": "any",
"options": [
{
"key": "modern_pizza_restaurant",
"name": "Pizza",
"selected": false
}
]
},
{
"name": "Sort",
"type": "sort",
"options": [
{
"key": "best_match",
"name": "Best Match",
"selected": true
},
{
"key": "ratings",
"name": "Ratings",
"selected": false
}
]
}
],
"places": [
{
"id": "6435622567484707146",
"place_id": "I594FECA0B369D14A",
"url": "https://maps.apple.com/place?place-id=I594FECA0B369D14A",
"name": "Sightglass Coffee",
"type": "BUSINESS",
"category": "Coffee Roastery",
"categories": [
{
"id": "dining",
"name": "Dining",
"level": 1
},
{
"id": "coffee_roastery",
"name": "Coffee Roastery",
"level": 2
}
],
"latitude": 37.776974,
"longitude": -122.408529,
"address": "270 7th St, San Francisco, CA 94103, United States",
"address_info": {
"street": "270 7th St",
"neighborhood": "SOMA",
"city": "San Francisco",
"county": "San Francisco",
"state": "California",
"state_code": "CA",
"postal_code": "94103",
"country": "United States",
"country_code": "US"
},
"phone": "+14154631673",
"alt_phones": [
"+14158611313"
],
"website": "https://sightglasscoffee.com/blogs/shops/soma-district",
"rating": 4,
"rating_max": 5,
"rating_count": 2228,
"price_level": 2,
"price_max": 4,
"price_symbol": "$",
"hours_type": "NORMAL",
"hours": [
{
"day": "monday",
"open": "06:30",
"close": "17:00"
},
{
"day": "saturday",
"open": "07:00",
"close": "17:00"
}
],
"photo_url": "https://is1-ssl.mzstatic.com/image/thumb/bF51kpjYtm4-K_WMlD8Wkw/320x320bb.jpeg"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/applemaps.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | applemaps.SearchResponse | No | ||||
| data.filters | array | No | ||||
| data.filters[].match | string | No | ||||
| data.filters[].name | string | No | ||||
| data.filters[].options | array | No | ||||
| data.filters[].options[].key | string | No | ||||
| data.filters[].options[].name | string | No | ||||
| data.filters[].options[].selected | boolean | No | ||||
| data.filters[].type | string | No | ||||
| data.guides | array | No | ||||
| data.guides[].description | string | No | ||||
| data.guides[].id | string | No | ||||
| data.guides[].item_total | integer | No | ||||
| data.guides[].last_modified | string | No | ||||
| data.guides[].photo_url | string | No | ||||
| data.guides[].publisher | applemaps.PublisherSummary | No | ||||
| data.guides[].publisher.guide_count | integer | No | ||||
| data.guides[].publisher.id | string | No | ||||
| data.guides[].publisher.name | string | No | ||||
| data.guides[].publisher.subtitle | string | No | ||||
| data.guides[].publisher.url | string | No | ||||
| data.guides[].publisher.website | string | No | ||||
| data.guides[].source_url | string | No | ||||
| data.guides[].title | string | No | ||||
| data.guides[].url | string | No | ||||
| data.places | array | No | ||||
| data.places[].address | string | No | ||||
| data.places[].address_info | applemaps.Address | No | ||||
| data.places[].address_info.city | string | No | ||||
| data.places[].address_info.country | string | No | ||||
| data.places[].address_info.country_code | string | No | ||||
| data.places[].address_info.county | string | No | ||||
| data.places[].address_info.neighborhood | string | No | ||||
| data.places[].address_info.postal_code | string | No | ||||
| data.places[].address_info.state | string | No | ||||
| data.places[].address_info.state_code | string | No | ||||
| data.places[].address_info.street | string | No | ||||
| data.places[].alt_phones | array | No | ||||
| data.places[].categories | array | No | ||||
| data.places[].categories[].id | string | No | ||||
| data.places[].categories[].level | integer | No | ||||
| data.places[].categories[].name | string | No | ||||
| data.places[].category | string | No | ||||
| data.places[].hours | array | No | ||||
| data.places[].hours[].close | string | No | ||||
| data.places[].hours[].day | string | No | ||||
| data.places[].hours[].open | string | No | ||||
| data.places[].hours_type | string | No | ||||
| data.places[].id | string | No | ||||
| data.places[].latitude | number | No | ||||
| data.places[].longitude | number | No | ||||
| data.places[].name | string | No | ||||
| data.places[].phone | string | No | ||||
| data.places[].photo_url | string | No | ||||
| data.places[].place_id | string | No | ||||
| data.places[].price_level | integer | No | ||||
| data.places[].price_max | integer | No | ||||
| data.places[].price_symbol | string | No | ||||
| data.places[].rating | number | No | ||||
| data.places[].rating_count | integer | No | ||||
| data.places[].rating_max | integer | No | ||||
| data.places[].type | string | No | ||||
| data.places[].url | string | No | ||||
| data.places[].website | string | No | ||||
| data.query | string | No | ||||
| data.region | applemaps.Region | No | ||||
| data.region.east | number | No | ||||
| data.region.north | number | No | ||||
| data.region.south | number | No | ||||
| data.region.west | number | No | ||||
| data.relocated | boolean | No | ||||
| data.total_found | integer | No | ||||
| data.total_results | integer | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/apple-maps/search?query=coffee&latitude=37.7749&longitude=-122.4194&limit=10&lang=en&country=us&sort=best_match" \
-H "x-api-key: $CRAWLORA_API_KEY"