{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper & API: Whole-City Leads with Emails",
    "description": "Every business in a city or neighbourhood from Google Maps, with emails and social links, free lead scores and a coverage report that shows the list is complete. No login. $3 per 1,000 places, less on paid plans; filtered-out places cost a fraction.",
    "version": "0.1",
    "x-build-id": "LnQ1kQYgWrxB7VDwb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brainfoods_studio~google-maps-places-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brainfoods_studio-google-maps-places-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/brainfoods_studio~google-maps-places-scraper/runs": {
      "post": {
        "operationId": "runs-sync-brainfoods_studio-google-maps-places-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/brainfoods_studio~google-maps-places-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-brainfoods_studio-google-maps-places-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": {
          "searchTerms": {
            "title": "Search terms",
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "description": "What to search for, up to 20 terms, for example \"coffee shop\" or \"dentist\". Each term is searched in every area. Duplicates are removed.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "maxItems": 20,
            "type": "array",
            "description": "Places to cover completely, up to 20, such as \"Jaipur\" or \"C Scheme, Jaipur\". Google Maps decides which place you mean. Cities are searched to their boundary; neighbourhoods without a published boundary are searched within Neighbourhood radius of their centre. You get the whole area, not just the first few results.",
            "items": {
              "type": "string"
            }
          },
          "neighbourhoodRadiusM": {
            "title": "Neighbourhood radius (metres)",
            "minimum": 500,
            "maximum": 10000,
            "type": "integer",
            "description": "How far from its centre to search a neighbourhood that has no published boundary. 2,000 m covers most neighbourhoods.",
            "default": 2000
          },
          "customArea": {
            "title": "Custom area",
            "type": "object",
            "description": "Optional. Your own area instead of, or as well as, the locations. Give one of: {\"geojson\": a Polygon, MultiPolygon or Feature}, {\"center\": {\"lat\": 26.91, \"lng\": 75.79}, \"radiusKm\": 3} (up to 100 km), or {\"bbox\": {\"south\": 26.9, \"west\": 75.78, \"north\": 26.93, \"east\": 75.82}}. It appears in the results as \"custom area\"."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Optional two-letter country code, for example IN, US or GB. It makes Google rank results for that country and helps read postal codes. Leave empty if unsure.",
            "default": ""
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter language code for the results, for example en, de or hi.",
            "default": "en"
          },
          "maxPlaces": {
            "title": "Max places",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "How many places you get. With filters on, only places that pass them count: the run keeps searching until this many pass, and each removed place costs only the small check fee. Your spending limit also stops the run. For a full-city marketing kit, keep this high: the kit covers only what the search found.",
            "default": 500
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only places rated at least this, from 0 to 5. Places with no rating are removed."
          },
          "minReviews": {
            "title": "Minimum reviews",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Keep only places with at least this many reviews."
          },
          "onlyUnclaimed": {
            "title": "Only unclaimed listings",
            "type": "boolean",
            "description": "Keep only places whose Google listing is not claimed by an owner. Strong local-SEO leads.",
            "default": false
          },
          "onlyWithoutWebsite": {
            "title": "Only places without a website",
            "type": "boolean",
            "description": "Keep only places that list no website. Strong web-design leads.",
            "default": false
          },
          "skipClosed": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Remove places marked closed. Google does not always show this in search results, so some closed places can remain.",
            "default": false
          },
          "minWebDesignScore": {
            "title": "Minimum web-design score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only places scoring at least this, 0 to 100. 70 and above is a hot lead. Rows say which rules fired."
          },
          "minLocalSeoScore": {
            "title": "Minimum local-SEO score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only places scoring at least this, 0 to 100. 70 and above is a hot lead."
          },
          "minReputationScore": {
            "title": "Minimum reputation score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only places scoring at least this, 0 to 100. 70 and above is a hot lead."
          },
          "includeAreaReport": {
            "title": "Area report (premium)",
            "type": "boolean",
            "description": "Adds one report per area and search term: places per km2, category mix, rating spread, share unclaimed or without a website, hot spots, under-served cells, a breakdown by postal code and market leaders. Charged once per area and search term that delivered places.",
            "default": false
          },
          "includeMarketingKit": {
            "title": "Marketing kit ($1 for 2 locations)",
            "type": "boolean",
            "description": "Adds MARKETING_KIT.html, a self-contained report you can open offline or send to a client: each city compared, competitors, under-served areas and the top 25 leads. $1 covers up to 2 locations, plus $0.25 for each extra location. City scale or smaller only; larger areas are still searched but left out of the kit. Charged only when places are delivered.",
            "default": false
          },
          "includeContacts": {
            "title": "Website contacts: emails and social links",
            "type": "boolean",
            "description": "Visits each delivered place's own website (homepage, plus up to 3 contact or about pages when the homepage has no email) and adds business emails, social profiles, whether the site loads, uses HTTPS and works on phones. Charged per place only when an email or social profile is found. Adds about 5 seconds per website, run in parallel.",
            "default": false
          },
          "includeNamedEmails": {
            "title": "Include personal-looking emails",
            "type": "boolean",
            "description": "Also deliver emails that look like a person's (jamie@, tom.smith@, a name at Gmail). You are responsible for having a lawful reason to contact people (GDPR, CAN-SPAM, India's DPDP Act).",
            "default": false
          },
          "exportFiles": {
            "title": "Export map files",
            "type": "boolean",
            "description": "Save places.geojson and places.kml in the run's key-value store, ready for Google My Maps, QGIS and kepler.gl. Free.",
            "default": true
          },
          "maxCellsPerArea": {
            "title": "Max cells per area",
            "minimum": 10,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper limit on the map cells searched for one area and search term. Dense areas are split into smaller cells; this caps the work. The coverage row tells you if it was reached.",
            "default": 1500
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 24,
            "type": "integer",
            "description": "Cells searched in parallel, 1 to 24. The default of 16 covered a whole city (Jaipur, 4,000 places) without a single blocked page; lower it only if the log shows blocked pages.",
            "default": 16
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy is strongly recommended. Datacenter is tried first; residential is used automatically after repeated 429s if your plan has it.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}