{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper - Places, Leads, Emails & Contacts",
    "description": "Scrape Google Maps places by keyword + location in any country: name, category, full address with city and postal code, phone, website, rating, coordinates, photos, attributes. Optional: review counts + full weekly hours, website emails, socials and phones. Monitor mode, place-ID lookup, no API key.",
    "version": "0.1",
    "x-build-id": "S6iZecgLnOECks7lk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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": {
          "searchQueries": {
            "title": "Search terms",
            "type": "array",
            "description": "What to search for on Google Maps - categories, business types or names, e.g. \"coffee shops\", \"dentist\", \"plumbers\", \"law firms\". Each term is combined with the location below.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "Location",
            "type": "string",
            "description": "City / area to search in, e.g. \"Austin, TX\", \"New York, NY\", \"London, UK\", \"Berlin, Germany\". The map is centred on this place and places far outside it are left out (see Max distance). Add the region or country to ambiguous names (\"Portland, ME\", \"Paris, France\"). Leave empty if you put the location inside the search term (\"dentist in Houston, TX\") or use coordinates / Google Maps links."
          },
          "latitude": {
            "title": "Center latitude (optional)",
            "type": "number",
            "description": "Explicit search-center latitude. Overrides the geocoded location. Use with longitude (and optionally zoom)."
          },
          "longitude": {
            "title": "Center longitude (optional)",
            "type": "number",
            "description": "Explicit search-center longitude."
          },
          "zoom": {
            "title": "Zoom (1-20)",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Map zoom for the search viewport when using coordinates. Higher = tighter area, more local results. Typical city search: 12-14."
          },
          "startUrls": {
            "title": "Google Maps URLs (optional)",
            "type": "array",
            "description": "Paste Google Maps links: place links (…/maps/place/…, the app's \"Share\" links maps.app.goo.gl/…, and this actor's own `url` output …/maps/place/?q=place_id:…) are looked up as that one business; search links (…/maps/search/<term>/@lat,lng,zoomz) run as a search of that map area.",
            "items": {
              "type": "string"
            }
          },
          "placeIds": {
            "title": "Place IDs (optional)",
            "type": "array",
            "description": "Look up specific businesses by Google place ID (ChIJ…), feature ID (0x…:0x…) or place link, one per line - for example to refresh places you scraped before. Each one is fetched directly and billed as one place.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search",
            "minimum": 1,
            "type": "integer",
            "description": "How many places to collect per search term + location. One Google search shows about 120 places; set this higher (for example 500 or 2,000) and the actor scans the search area map tile by map tile to go past that limit (slower, more places). Max results still caps the whole run.",
            "default": 120
          },
          "maxResults": {
            "title": "Max results (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on the number of place records saved (after filtering). Rows are saved search by search as they are ready, so the dataset fills while the run is going and a stopped run keeps everything found so far.",
            "default": 1000
          },
          "maxDistanceKm": {
            "title": "Max distance from the location (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Leave places farther than this from the centre of the location (or of the given coordinates / map link) out of the results. 0 = automatic: a radius sized to the place you searched (at least 40 km, wider for big metros, states and countries). Places left out are not charged.",
            "default": 0
          },
          "enrichContacts": {
            "title": "Enrich contacts (emails, socials & phones from website)",
            "type": "boolean",
            "description": "For every place that has a website, crawl its home + contact/about page and extract publicly listed e-mail addresses, social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok) and phone numbers, turning each place into a ready-to-contact B2B lead. Google Maps never exposes emails; this is the only way to get them. A place is billed as an enriched lead only when its website gives an e-mail, a social profile or a phone number the listing does not already show; otherwise it is billed as a plain place.",
            "default": false
          },
          "scrapePlaceDetails": {
            "title": "Scrape place details (review count + full weekly hours)",
            "type": "boolean",
            "description": "Add the review count, the complete Monday–Sunday opening hours (in any language), a refined rating and (where Google shows one) a popular-times flag to each place. Fetched from Google Maps' own place data call over plain HTTP - about a second per place with up to 16 in parallel - and billed per place that actually got details (placeDetails event). Leave off for the cheapest run; turn on when you need review counts and full hours.",
            "default": false
          },
          "detailConcurrency": {
            "title": "Place-details concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many place-detail requests run in parallel when \"Scrape place details\" is on. Details are fetched over plain HTTP (no browser), so 8-16 is safe; lower it only if Google starts rate-limiting a very large run.",
            "default": 8
          },
          "minRating": {
            "title": "Minimum star rating",
            "enum": [
              "",
              "2",
              "2.5",
              "3",
              "3.5",
              "4",
              "4.5"
            ],
            "type": "string",
            "description": "Keep only places with at least this average rating (e.g. 4.0). Leave empty for all.",
            "default": ""
          },
          "categoryFilterWords": {
            "title": "Category filter words",
            "type": "array",
            "description": "Keep only places whose Google category contains any of these words (case-insensitive), e.g. \"restaurant\", \"bar\". Useful to narrow a broad search.",
            "items": {
              "type": "string"
            }
          },
          "websiteFilter": {
            "title": "Website filter",
            "enum": [
              "all",
              "with_website",
              "without_website"
            ],
            "type": "string",
            "description": "Keep all places, only those with a website, or only those without one (great for finding businesses that need a site).",
            "default": "all"
          },
          "skipClosedPlaces": {
            "title": "Skip permanently/temporarily closed",
            "type": "boolean",
            "description": "Drop places marked as permanently or temporarily closed.",
            "default": false
          },
          "withPhoneOnly": {
            "title": "Only places with a phone number",
            "type": "boolean",
            "description": "Keep only places that have a phone number.",
            "default": false
          },
          "withEmailOnly": {
            "title": "Only leads with an e-mail (requires enrichment)",
            "type": "boolean",
            "description": "Keep only places for which contact enrichment found at least one e-mail address. Turn on \"Enrich contacts\" too.",
            "default": false
          },
          "nameQuery": {
            "title": "Name contains",
            "type": "string",
            "description": "Keep only places whose name contains this text (case-insensitive)."
          },
          "language": {
            "title": "Language (hl)",
            "type": "string",
            "description": "Google language code for results, e.g. en, es, de, fr, pt.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country (gl)",
            "type": "string",
            "description": "Google country code biasing results, e.g. us, gb, de, au, br.",
            "default": "us"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "leadScore",
              "rating",
              "distance"
            ],
            "type": "string",
            "description": "Ordering of the rows within each saved batch (rows are saved search by search, in batches of up to 150 places; for one overall order, sort the exported file).",
            "default": "leadScore"
          },
          "includeRawFields": {
            "title": "Include raw source array",
            "type": "boolean",
            "description": "Attach Google's raw place array (sourceArray) to each record for full transparency / advanced parsing.",
            "default": false
          },
          "monitorMode": {
            "title": "Monitor mode (only new / changed)",
            "type": "boolean",
            "description": "Remember places across runs and emit only NEW or CHANGED ones (phone, website, rating or address change). The first run is the baseline: it saves up to Max results and remembers every other place it scanned, so later runs only deliver places that were never seen before (plus changes to delivered ones). Great for watching a city/category for new businesses. Pair it with an Apify Schedule to run on a cadence.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Namespace for monitor memory. Use a distinct key per saved search so their states don't collide.",
            "default": "default"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Google Maps responds cleanly from Apify Proxy. The default (automatic) proxy is recommended.",
            "default": {
              "useApifyProxy": true
            }
          },
          "urlsFromFile": {
            "title": "Import URLs from a file",
            "type": "string",
            "description": "Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}