{
  "openapi": "3.0.1",
  "info": {
    "title": "Apple Maps Scraper - Places, Phones, Hours, Ratings & Photos",
    "description": "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.",
    "version": "0.1",
    "x-build-id": "s0iKaWY9xDD72bdXt"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/topapi~apple-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-topapi-apple-maps-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/topapi~apple-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-topapi-apple-maps-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/topapi~apple-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-topapi-apple-maps-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchQueries": {
            "title": "🔍 Search terms",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "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": {
            "title": "More locations",
            "type": "array",
            "description": "Optional. More areas, one per line, e.g. \"Dallas, TX\" and \"Houston, TX\". Every search term is searched in each.",
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "title": "Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Optional. Search around an exact point instead of a named location, e.g. 30.2672. Use with Longitude."
          },
          "longitude": {
            "title": "Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Optional. e.g. -97.7431. Use with Latitude."
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 0.1,
            "maximum": 500,
            "type": "number",
            "description": "Used with Latitude/Longitude: half-width of the square area to cover. Default 5."
          },
          "boundingBox": {
            "title": "Bounding box",
            "type": "object",
            "description": "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": {
            "title": "Apple Maps links",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "placeUrls": {
            "title": "Place links or ids",
            "type": "array",
            "description": "Apple Maps place links or bare ids, e.g. https://maps.apple.com/place?auid=11204647164469319519, I718D842327530072. Full details of each place.",
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "Search links",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "guideUrls": {
            "title": "Guide links",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country Apple ranks results for (changes which places come back), e.g. US, GB, DE, JP. Default US.",
            "default": "US"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of names, categories and addresses, e.g. en-US, de-DE, ja-JP. Also changes Apple's ranking. Default en-US.",
            "default": "en-US"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "distance",
              "rating"
            ],
            "type": "string",
            "description": "The order Apple Maps ranks each search in. Distance = nearest to the centre of each area first.",
            "default": "relevance"
          },
          "openNow": {
            "title": "Open now",
            "type": "boolean",
            "description": "Only places open when the run happens, in their own local time. Places that publish no hours are left out.",
            "default": false
          },
          "toggles": {
            "title": "Apple filter keys",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Minimum rating",
            "enum": [
              "3",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "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": {
            "title": "With phone only",
            "type": "boolean",
            "description": "Keep only places with a published phone number.",
            "default": false
          },
          "hasWebsite": {
            "title": "With website only",
            "type": "boolean",
            "description": "Keep only places with a published website.",
            "default": false
          },
          "hasEmail": {
            "title": "With email only",
            "type": "boolean",
            "description": "Keep only places whose website shows an email address (turns on Website contacts).",
            "default": false
          },
          "skipClosedPlaces": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Leave out places Apple marks permanently or temporarily closed.",
            "default": false
          },
          "categoryFilterWords": {
            "title": "Category must contain",
            "type": "array",
            "description": "Keep a place only if one of its categories contains one of these words, e.g. \"dentist\", \"orthodont\". Case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "openAt": {
            "title": "Open at (date and time)",
            "type": "string",
            "description": "Keep places open at this moment, in their local time: an ISO date-time (2026-10-10T18:30:00Z) or Unix seconds."
          },
          "includeNearbyPlaces": {
            "title": "Include nearby matches",
            "type": "boolean",
            "description": "Also collect the matching places Apple shows as dots around each search (often 20-50 more per search). Billed per place like any other.",
            "default": false
          },
          "includeGuides": {
            "title": "Include guides",
            "type": "boolean",
            "description": "Also return the Apple Maps guides each search shows (title, publisher, place count, link), one row each. $0.0028 per guide row.",
            "default": false
          },
          "maxPhotos": {
            "title": "Photos per place",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Photo URLs per place, with caption, author, source and date. Apple sends up to ~20 per category. 0 = none.",
            "default": 5
          },
          "enrichContacts": {
            "title": "Website contacts (emails + socials)",
            "type": "boolean",
            "description": "Visit each place's website for emails and social profiles. $0.0014 per place where at least one is found; nothing when none is.",
            "default": false
          },
          "maxWebsitePages": {
            "title": "Website pages per place",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "Pages read per website for contacts, home page included (contact and about pages next). Default 3.",
            "default": 3
          },
          "monitorMode": {
            "title": "Monitor mode (new places only)",
            "type": "boolean",
            "description": "Return only places not delivered by earlier monitor runs (plus changed ones, below). Pairs with a daily or weekly schedule.",
            "default": false
          },
          "monitorChanges": {
            "title": "Also return changed places",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that remembers delivered places. Use one name per watch list.",
            "default": "apple-maps-monitor"
          },
          "maxResults": {
            "title": "Max places per search",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "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.",
            "default": 50
          },
          "maxItems": {
            "title": "Max places in total",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop the whole run after this many places. 0 = no total limit."
          },
          "maxRunSeconds": {
            "title": "Time limit (seconds)",
            "minimum": 30,
            "maximum": 86400,
            "type": "integer",
            "description": "Stop starting new requests after this many seconds and finish cleanly. Empty = no limit."
          },
          "compact": {
            "title": "Compact rows",
            "type": "boolean",
            "description": "Core fields only (name, category, phone, website, address, coordinates, rating, link) - sized for AI agents and MCP.",
            "default": false
          },
          "adaptiveGrid": {
            "title": "Split full areas",
            "type": "boolean",
            "description": "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.",
            "default": true
          },
          "cellSizeMeters": {
            "title": "Start cell size (m)",
            "minimum": 100,
            "maximum": 200000,
            "type": "integer",
            "description": "Optional. Start from a grid of cells this size instead of the whole area, e.g. 2000. Empty = start from the whole area."
          },
          "minCellSizeMeters": {
            "title": "Smallest cell (m)",
            "minimum": 50,
            "maximum": 50000,
            "type": "integer",
            "description": "Areas are not split below this size. Default 250.",
            "default": 250
          },
          "saturationThreshold": {
            "title": "Split when an answer has",
            "minimum": 5,
            "maximum": 55,
            "type": "integer",
            "description": "An area whose answer has at least this many places inside it is split. Default 20.",
            "default": 20
          },
          "maxGridDepth": {
            "title": "Max split depth",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "How many times an area can be split in four. Default 8.",
            "default": 8
          },
          "maxCells": {
            "title": "Max areas per search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on Apple answers per search term per area, splits included. Default 200.",
            "default": 200
          },
          "queryExpansions": {
            "title": "Term variants",
            "type": "object",
            "description": "Optional extra spellings searched with a term, e.g. {\"cafe\": [\"coffee shop\", \"kahve\"]}. Places are de-duplicated across variants."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "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.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Apple Maps requests in flight at once. Default 4.",
            "default": 4
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}