{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper: Places, Leads, Emails",
    "description": "Extract data from thousands of Google Maps locations and businesses: names, addresses, phones, websites, categories, opening hours, images, ratings and review counts, plus contact info - emails and social profiles. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
    "version": "0.1",
    "x-build-id": "UbOgk7h2rGs0H1wsI"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~google-maps-places-scraper-leads-emails/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-google-maps-places-scraper-leads-emails",
        "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/snow_leo_data~google-maps-places-scraper-leads-emails/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-google-maps-places-scraper-leads-emails",
        "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/snow_leo_data~google-maps-places-scraper-leads-emails/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-google-maps-places-scraper-leads-emails",
        "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": {
          "searchTerms": {
            "title": "🔍 Search terms",
            "type": "array",
            "description": "What to look for on the map, one term per line: \"coffee\", \"dentist\", \"plumber near me\". Every term is searched across the whole area you set below.",
            "default": [
              "coffee"
            ],
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "A city, region or country: \"Austin, Texas\", \"Paris, France\", \"Bavaria\". Google Maps resolves it to the real administrative boundary and the Actor searches inside that boundary. Leave empty to use coordinates or a bounding box instead.",
            "default": "Austin, Texas"
          },
          "latitude": {
            "title": "Latitude",
            "type": "string",
            "description": "Centre of a circular search area. Used only when Location is empty."
          },
          "longitude": {
            "title": "Longitude",
            "type": "string",
            "description": "Centre of a circular search area. Used only when Location is empty."
          },
          "radiusKm": {
            "title": "Radius, km",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Radius around the point above. 0.2 to 500 km.",
            "default": 5
          },
          "boundingBox": {
            "title": "🛰 Bounding box",
            "type": "object",
            "description": "Exact rectangle: {\"south\": 30.1, \"west\": -97.9, \"north\": 30.5, \"east\": -97.6}. Wins over latitude/longitude when both are given."
          },
          "maxPlaces": {
            "title": "💯 Number of places",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "How many places to deliver in total. Counted on DELIVERED rows, not on crawled ones: a filter can never leave you with an empty dataset because the crawl stopped too early. 0 means no limit.",
            "default": 100
          },
          "maxPlacesPerTerm": {
            "title": "Quota per search term",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "Stops one popular term from eating the whole budget. 0 means no per-term quota.",
            "default": 0
          },
          "gridDepth": {
            "title": "🧩 Grid depth (ceiling bypass)",
            "minimum": 0,
            "maximum": 4,
            "type": "integer",
            "description": "Google answers at most about 150 places for one term in one map view. The Actor splits any area that hits that wall into four and searches each part. Depth 0 = no splitting, 1 = up to 4 parts, 2 = up to 16, 3 = up to 64, 4 = up to 256. Measured on coffee in Austin: 160 places at depth 0, 505 at depth 1, 766 at depth 2.",
            "default": 2
          },
          "placeDetails": {
            "title": "Place detail card",
            "enum": [
              "auto",
              "always",
              "never"
            ],
            "type": "string",
            "description": "Google's search answer is not always complete: the same place comes back with opening hours and a rating in one request and without them in the next. \"auto\" fetches the detail card only for rows that are missing something or that a filter needs. It is included in the price, not billed separately.",
            "default": "auto"
          },
          "language": {
            "title": "🌍 Language",
            "type": "string",
            "description": "Language of names, categories and opening hours, e.g. en, de, fr, es, ja.",
            "default": "en"
          },
          "countryCode": {
            "title": "🗺 Google country",
            "type": "string",
            "description": "Which Google front end to ask, e.g. us, de, fr. Affects ranking and address formatting, not the search area.",
            "default": "us"
          },
          "enrichFromWebsite": {
            "title": "📩 Add emails and social profiles from the place's website",
            "type": "boolean",
            "description": "Google Maps never carries an email address. Switch this on and the Actor opens the business website, reads its contact pages and returns emails, social profiles and the site platform. Included in the price - the reference Actors in this niche bill it as a separate add-on event.",
            "default": false
          },
          "websitePagesPerPlace": {
            "title": "Pages per website",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How deep to go on each business website. 1 is the home page only.",
            "default": 3
          },
          "categoryContains": {
            "title": "🎢 Category contains",
            "type": "array",
            "description": "Keep only places whose Google category matches one of these words, e.g. \"restaurant\", \"bar\". Empty means every category.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "⭐ Minimum rating",
            "type": "string",
            "description": "Keep only places rated at least this, e.g. 4.5. Empty means any rating."
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only places with at least this many reviews. 0 means any.",
            "default": 0
          },
          "maxReviews": {
            "title": "Maximum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Useful to find small or new businesses. 0 means any.",
            "default": 0
          },
          "websiteFilter": {
            "title": "🌐 Website",
            "enum": [
              "any",
              "with",
              "without"
            ],
            "type": "string",
            "description": "\"Without a website\" is the classic lead list: those businesses are the ones who buy one.",
            "default": "any"
          },
          "onlyWithPhone": {
            "title": "☎ Only places with a phone number",
            "type": "boolean",
            "description": "Drops places that publish no phone number. Measured on 160 live places: 89.4% had one.",
            "default": false
          },
          "onlyOpenNow": {
            "title": "Only places open right now",
            "type": "boolean",
            "description": "Keeps only places whose opening hours say they are open at the moment of the run.",
            "default": false
          },
          "skipPermanentlyClosed": {
            "title": "⏩ Skip permanently closed places",
            "type": "boolean",
            "description": "Google keeps closed businesses on the map. On by default, because a closed place is not a lead.",
            "default": true
          },
          "nameContains": {
            "title": "Name contains",
            "type": "array",
            "description": "Keep only places whose name contains one of these words.",
            "items": {
              "type": "string"
            }
          },
          "excludeContains": {
            "title": "Exclude when text contains",
            "type": "array",
            "description": "Drop places whose name, category, address or description contains one of these words.",
            "items": {
              "type": "string"
            }
          },
          "onlyCountries": {
            "title": "Only these countries",
            "type": "array",
            "description": "Two-letter country codes, e.g. us, de. Useful when a bounding box crosses a border.",
            "items": {
              "type": "string"
            }
          },
          "onlyWithEmail": {
            "title": "Only places with an email",
            "type": "boolean",
            "description": "Needs the website enrichment above - Google Maps itself has no email field.",
            "default": false
          },
          "onlyCorporateEmail": {
            "title": "Only places with a non-free email",
            "type": "boolean",
            "description": "Drops places whose only address is on gmail, yahoo, hotmail and the like.",
            "default": false
          },
          "placeIds": {
            "title": "🗃 Place IDs, CIDs, feature ids or Maps links",
            "type": "array",
            "description": "Look up exact places instead of searching. Accepts Google place ids (ChIJ...), numeric CIDs, feature ids (0x...:0x...) and plain Google Maps links. Works together with a search.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Google Maps URLs",
            "type": "array",
            "description": "Same as above, kept under the name other Actors use.",
            "items": {
              "type": "string"
            }
          },
          "onlyChanged": {
            "title": "🔁 Monitor mode: only new and changed places",
            "type": "boolean",
            "description": "Remembers what it delivered in earlier runs and returns only places that are new or whose rating, review count, phone, website, address or opening hours moved. Every row carries change_type = NEW / UPDATED / UNCHANGED.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Emit unchanged places too",
            "type": "boolean",
            "description": "Keeps the change_type column but delivers everything.",
            "default": false
          },
          "compactOutput": {
            "title": "Compact output",
            "type": "boolean",
            "description": "16 columns instead of 55 - name, where, contact, rating. Handy for AI agents and for CSV.",
            "default": false
          },
          "dropEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Leaves out every field that has no value in this row.",
            "default": false
          },
          "concurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "How many requests run at the same time. Higher is faster and heavier on the source.",
            "default": 6
          },
          "requestTimeoutSecs": {
            "title": "Request timeout, seconds",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for one request before giving up on it.",
            "default": 30
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}