{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper",
    "description": "Extract business data from Google Maps search results — names, addresses, phones, websites, ratings, reviews, opening hours, and 20+ fields. Covers any location or category. Grid search mode finds thousands of places per city.",
    "version": "1.0",
    "x-build-id": "lQuIHZD4P9RuNAwqU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automly~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automly-google-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/automly~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automly-google-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/automly~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automly-google-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": {
          "searchStringsArray": {
            "title": "Search Queries",
            "type": "array",
            "description": "What to search Google Maps for, one per line: a kind of place, e.g. restaurants or plumbers, plus a city (plumbers in Denver) or a location below. Each search term runs as its own search. Leave it empty to read only the links or place IDs below.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "Location",
            "type": "string",
            "description": "Where to search, e.g. Austin, TX or 10001 or Germany. Only places inside this area are kept, and the search terms need no city then. Turn on grid search below to cover a large area in full. Use one location per run; the fields below are another way to name it."
          },
          "maxCrawledPlacesPerSearch": {
            "title": "Max Places Per Search",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum number of places to scrape per search query. In simple mode, Google Maps returns up to ~220 results. Enable grid search to get more.",
            "default": 100
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code for Google Maps results (e.g., 'en', 'ar', 'fr').",
            "default": "en"
          },
          "countryCode": {
            "title": "Country Code",
            "type": "string",
            "description": "Country preference for Google Maps results (e.g., us, eg, ae). Include a city or region in each query; this preference does not restrict results to a country.",
            "default": "us"
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "City, e.g. Pittsburgh. Do not add the state or country here."
          },
          "county": {
            "title": "County",
            "type": "string",
            "description": "County, e.g. Travis County."
          },
          "state": {
            "title": "State",
            "type": "string",
            "description": "State or region, e.g. Texas."
          },
          "postalCode": {
            "title": "Postal code",
            "type": "string",
            "description": "One postal code, e.g. 10001. Use it on its own, without a city."
          },
          "customGeolocation": {
            "title": "Custom search area",
            "type": "object",
            "description": "Draw the exact area to search as GeoJSON, coordinates as [longitude, latitude]: a Polygon, a MultiPolygon, or a Point with radiusKm for a circle, e.g. {\"type\": \"Point\", \"coordinates\": [-73.9857, 40.7484], \"radiusKm\": 3}. Only places inside the area are kept. geojson.io draws one for you."
          },
          "startUrls": {
            "title": "Google Maps links",
            "type": "array",
            "description": "Google Maps links, e.g. https://www.google.com/maps/place/... , a short share link (maps.app.goo.gl/...), a ?cid= link, or a search link (https://www.google.com/maps/search/pizza/@40.75,-73.98,15z) which is read like a search term at that spot on the map.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "placeIds": {
            "title": "Place IDs",
            "type": "array",
            "description": "Google place IDs, one per line, e.g. ChIJCar0f49ZwokR6ozLV-dHNTE (the placeId field of any result).",
            "items": {
              "type": "string"
            }
          },
          "categoryFilterWords": {
            "title": "Only these categories",
            "type": "array",
            "description": "Keep places with one of these Google categories, e.g. dentist or italian restaurant. A category matches when it contains every word you give (restaurant matches Chinese restaurant). List all the names a category can have (divorce lawyer, divorce attorney).",
            "items": {
              "type": "string"
            }
          },
          "searchMatching": {
            "title": "Name must match the search term",
            "enum": [
              "all",
              "only_includes",
              "only_exact"
            ],
            "type": "string",
            "description": "Keep only places whose name contains, or is exactly, the search term, e.g. Starbucks. The part after \"in\" or \"near\" (the city) is not part of the name.",
            "default": "all"
          },
          "placeMinimumStars": {
            "title": "Minimum rating",
            "enum": [
              "",
              "two",
              "twoAndHalf",
              "three",
              "threeAndHalf",
              "four",
              "fourAndHalf"
            ],
            "type": "string",
            "description": "Keep places rated at least this many stars. Places with no rating are skipped too.",
            "default": ""
          },
          "placeMinimumReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep places with at least this many reviews, e.g. 50. 0 keeps every place.",
            "default": 0
          },
          "website": {
            "title": "Website",
            "enum": [
              "allPlaces",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "Keep only places that list a website, or only those that do not (handy for web design leads).",
            "default": "allPlaces"
          },
          "skipClosedPlaces": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Skip places marked as temporarily or permanently closed.",
            "default": false
          },
          "includeContacts": {
            "title": "Add emails and social profiles",
            "type": "boolean",
            "description": "Also visit each place's own website and add the emails, phone numbers and social media profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest) published there. Only the business's own public website is read. Costs extra for each place where contact details are found (see the Pricing tab); places without any are not charged for them. Runs take longer with this option.",
            "default": false
          },
          "scrapePlaceDetailPage": {
            "title": "Add place page details",
            "type": "boolean",
            "description": "Also add what each place's own page shows: popular times (each hour of the week and how busy it is now), review counts per star, the topics reviewers mention, people also search for, plus code, menu link and photo categories. Runs take longer with this option.",
            "default": false
          },
          "maxReviews": {
            "title": "Reviews per place",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "How many reviews to add to each place, e.g. 20 (0 adds none). Each review has its text, rating, date, likes, the owner's reply and the reviewer's name and profile.",
            "default": 0
          },
          "reviewsSort": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "mostRelevant",
              "highestRanking",
              "lowestRanking"
            ],
            "type": "string",
            "description": "Which reviews come first when a place has more than you ask for.",
            "default": "newest"
          },
          "reviewsStartDate": {
            "title": "Only reviews newer than",
            "type": "string",
            "description": "Add only reviews written after this date, e.g. 2025-01-01, or within a time span, e.g. 3 months. Works fastest with Sort reviews by: Newest."
          },
          "scrapeReviewsPersonalData": {
            "title": "Include reviewer details",
            "type": "boolean",
            "description": "Add each reviewer's profile link, photo, ID and review count. Turn off to keep only the review itself and the reviewer's name.",
            "default": true
          },
          "maxImages": {
            "title": "Photos per place",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many photo links to add to each place, e.g. 10 (0 adds none), with the date each was added. The main photo (imageUrl) is always included.",
            "default": 0
          },
          "enableGridSearch": {
            "title": "Enable Grid Search",
            "type": "boolean",
            "description": "Split the search area into a grid of smaller cells to find more results. Searches the area in smaller parts so one query can return thousands of places instead of about 200. Needs a known city in the query or custom bounds.",
            "default": false
          },
          "gridCellKm": {
            "title": "Grid Cell Size (km)",
            "minimum": 0.5,
            "maximum": 50,
            "type": "number",
            "description": "Size of each grid cell in kilometers. Smaller cells find more results but take longer. Recommended: 5 for quick scans, 2 for thorough scraping, 1 for exhaustive coverage. A grid may contain at most 50,000 cells; use a larger cell size or smaller bounds for larger areas.",
            "default": 5
          },
          "maxPagesPerCell": {
            "title": "Max Pages Per Grid Cell",
            "minimum": 1,
            "maximum": 11,
            "type": "integer",
            "description": "How deeply each grid cell is searched: higher finds more places in busy areas but takes longer. Only applies when grid search is enabled.",
            "default": 5
          },
          "proxyConfig": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings. The default works for most runs. If results come back empty, try a different proxy option.",
            "default": {
              "useApifyProxy": true
            }
          },
          "customBounds": {
            "title": "Custom Search Bounds",
            "type": "object",
            "description": "Custom bounding box for grid search as JSON: {\"south\": lat, \"west\": lng, \"north\": lat, \"east\": lng}. If not provided, auto-detects from known cities.",
            "properties": {
              "south": {
                "title": "South Latitude",
                "type": "number",
                "description": "South latitude of bounding box"
              },
              "west": {
                "title": "West Longitude",
                "type": "number",
                "description": "West longitude of bounding box"
              },
              "north": {
                "title": "North Latitude",
                "type": "number",
                "description": "North latitude of bounding box"
              },
              "east": {
                "title": "East Longitude",
                "type": "number",
                "description": "East longitude of bounding box"
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}