{
  "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, category, opening 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": "bUvRNjAoYZu2huWFv"
  },
  "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": "integer",
            "description": "Explicit search-center latitude. Overrides the geocoded location. Use with longitude (and optionally zoom)."
          },
          "longitude": {
            "title": "Center longitude (optional)",
            "type": "integer",
            "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 a popular-times flag to each place. These are only available from Google's rendered place page, so this opens each place in a real browser — slower and billed per place (placeDetails event). Leave off for the fast, cheapest run; turn on when you need review counts and full hours.",
            "default": false
          },
          "detailConcurrency": {
            "title": "Place-details concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many place pages to render in parallel when 'Scrape place details' is on. Higher = faster but heavier; 3–5 is a good balance. Run with ≥4 GB memory for details mode.",
            "default": 4
          },
          "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
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}