{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper - Places, Leads & Contacts",
    "description": "Scrape Google Maps businesses & places by keyword + location: name, address, phone, website, rating, review count, category, full weekly hours, coordinates, photos & attributes. Optional website email/social enrichment, lead scoring & monitor mode. No API key. Export to CSV/JSON/Excel.",
    "version": "0.1",
    "x-build-id": "0R7HcLP8wREYk9ncc"
  },
  "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\". It is geocoded automatically to center the search. Leave empty if you put the location inside the search term or use coordinates / start URLs."
          },
          "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 search URLs (…/maps/search/<term>/@lat,lng,zoomz). The term and viewport are read from each URL and scraped.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search",
            "minimum": 1,
            "type": "integer",
            "description": "How many places to collect per search term + location. Google Maps returns up to ~120 results per search area; split into multiple cities/terms for more coverage.",
            "default": 120
          },
          "maxResults": {
            "title": "Max results (total)",
            "minimum": 1,
            "type": "integer",
            "description": "Global cap on the number of place records output (after filtering & sorting).",
            "default": 1000
          },
          "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.",
            "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, 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 (capped) output.",
            "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). Great for watching a city/category for new businesses. Works independently of Apify Schedules — pair it with a 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}