{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper - Business Leads & Emails",
    "description": "Scrape Google Maps places by keyword and location, URL or Place ID: name, address, phone, website, rating, review count, hours, categories, coordinates. Whole cities are split into map cells for full coverage. Optional emails and socials from websites. Free filters. No login, no API key.",
    "version": "0.1",
    "x-build-id": "BfcJxAgnrMLOp9iAa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/eiv~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-eiv-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/eiv~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-eiv-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/eiv~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-eiv-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": {
          "searchStringsArray": {
            "title": "🔍 Search terms",
            "type": "array",
            "description": "What you would type into Google Maps: \"dentist\", \"coffee shop\", \"plumber\". One term per line; each is searched in every location below. Different trades find different places; plural variants of one word (\"plumber\", \"plumbers\") mostly find the same ones again. A business name works too (\"Joe's Pizza\").",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "📍 Location",
            "type": "string",
            "description": "Where to search: a city, district, region or country, as \"City, Country\" (\"Austin, Texas, USA\"). One per line to search several. The whole area is covered: it is split into map cells, so a city returns far more than Google's ~120 results per search. Leave empty to let Google go by the search words alone."
          },
          "maxCrawledPlacesPerSearch": {
            "title": "💯 Places per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop each search (one term in one location) after this many places. You pay per place, so this is your main cost lever. 100 is a quick list; a large city holds thousands for a broad term like \"restaurant\". Places a filter drops do not count.",
            "default": 100
          },
          "maxItems": {
            "title": "Max places in total",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Optional cap for the whole run, across all searches, URLs and Place IDs. Empty = no cap beyond \"Places per search\" and your maximum charge per run."
          },
          "language": {
            "title": "🌍 Language",
            "enum": [
              "en",
              "af",
              "ar",
              "bg",
              "bn",
              "ca",
              "cs",
              "da",
              "de",
              "el",
              "en-GB",
              "es",
              "es-419",
              "et",
              "fa",
              "fi",
              "fil",
              "fr",
              "fr-CA",
              "gu",
              "he",
              "hi",
              "hr",
              "hu",
              "hy",
              "id",
              "is",
              "it",
              "ja",
              "ka",
              "kk",
              "km",
              "kn",
              "ko",
              "lt",
              "lv",
              "mk",
              "ml",
              "mn",
              "mr",
              "ms",
              "my",
              "ne",
              "nl",
              "no",
              "pa",
              "pl",
              "pt",
              "pt-BR",
              "pt-PT",
              "ro",
              "ru",
              "si",
              "sk",
              "sl",
              "sq",
              "sr",
              "sv",
              "sw",
              "ta",
              "te",
              "th",
              "tr",
              "uk",
              "ur",
              "uz",
              "vi",
              "zh-CN",
              "zh-HK",
              "zh-TW",
              "zu"
            ],
            "type": "string",
            "description": "The language Google answers in: category names, opening hours, editorial summaries. Place names and addresses stay as the business wrote them.",
            "default": "en"
          },
          "countryCode": {
            "title": "🗺 Country",
            "enum": [
              "af",
              "ax",
              "al",
              "dz",
              "as",
              "ad",
              "ao",
              "ai",
              "aq",
              "ag",
              "ar",
              "am",
              "aw",
              "au",
              "at",
              "az",
              "bs",
              "bh",
              "bd",
              "bb",
              "by",
              "be",
              "bz",
              "bj",
              "dy",
              "bm",
              "bt",
              "bo",
              "ba",
              "bw",
              "bv",
              "br",
              "io",
              "vg",
              "bn",
              "bg",
              "bf",
              "hv",
              "bi",
              "kh",
              "cm",
              "ca",
              "cv",
              "bq",
              "ky",
              "cf",
              "td",
              "cl",
              "cn",
              "cx",
              "cc",
              "co",
              "km",
              "cg",
              "cd",
              "zr",
              "ck",
              "cr",
              "ci",
              "hr",
              "cu",
              "cw",
              "cy",
              "cz",
              "dk",
              "dj",
              "dm",
              "do",
              "ec",
              "eg",
              "sv",
              "gq",
              "er",
              "ee",
              "sz",
              "et",
              "fk",
              "fo",
              "fj",
              "fi",
              "fr",
              "fx",
              "gf",
              "pf",
              "tf",
              "ga",
              "gm",
              "ge",
              "dd",
              "de",
              "gh",
              "gi",
              "gr",
              "gl",
              "gd",
              "gp",
              "gu",
              "gt",
              "gg",
              "gn",
              "gw",
              "gy",
              "ht",
              "hm",
              "hn",
              "hk",
              "hu",
              "is",
              "in",
              "id",
              "ir",
              "iq",
              "ie",
              "im",
              "il",
              "it",
              "jm",
              "jp",
              "je",
              "jo",
              "kz",
              "ke",
              "ki",
              "kw",
              "kg",
              "la",
              "lv",
              "lb",
              "ls",
              "lr",
              "ly",
              "li",
              "lt",
              "lu",
              "mo",
              "mg",
              "mw",
              "my",
              "mv",
              "ml",
              "mt",
              "mh",
              "mq",
              "mr",
              "mu",
              "yt",
              "mx",
              "fm",
              "md",
              "mc",
              "mn",
              "me",
              "ms",
              "ma",
              "mz",
              "bu",
              "mm",
              "na",
              "nr",
              "np",
              "nl",
              "nc",
              "nz",
              "ni",
              "ne",
              "ng",
              "nu",
              "nf",
              "kp",
              "mk",
              "mp",
              "no",
              "om",
              "pk",
              "pw",
              "ps",
              "pa",
              "pg",
              "py",
              "pe",
              "ph",
              "pn",
              "pl",
              "pt",
              "pr",
              "qa",
              "re",
              "ro",
              "ru",
              "su",
              "rw",
              "ws",
              "sm",
              "st",
              "sa",
              "sn",
              "cs",
              "rs",
              "yu",
              "sc",
              "sl",
              "sg",
              "sx",
              "sk",
              "si",
              "sb",
              "so",
              "za",
              "gs",
              "kr",
              "ss",
              "es",
              "lk",
              "bl",
              "sh",
              "kn",
              "lc",
              "mf",
              "pm",
              "vc",
              "sd",
              "sr",
              "sj",
              "se",
              "ch",
              "sy",
              "tw",
              "tj",
              "tz",
              "th",
              "tl",
              "tp",
              "tg",
              "tk",
              "to",
              "tt",
              "tn",
              "tr",
              "tm",
              "tc",
              "tv",
              "um",
              "vi",
              "ug",
              "ua",
              "ae",
              "gb",
              "uk",
              "us",
              "uy",
              "uz",
              "nh",
              "vu",
              "va",
              "ve",
              "vd",
              "vn",
              "wf",
              "eh",
              "yd",
              "ye",
              "zm",
              "rh",
              "zw"
            ],
            "type": "string",
            "description": "Optional. With no Location set, searches the whole country (or the state, county, city or postal code below). With a Location, keeps that location inside this country and ranks results for it."
          },
          "state": {
            "title": "State",
            "type": "string",
            "description": "Optional: a state or region, e.g. \"Massachusetts\". Used when \"Location\" is empty."
          },
          "county": {
            "title": "County",
            "type": "string",
            "description": "Optional: a county or district, e.g. \"New York County\". Used when \"Location\" is empty."
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Optional: a city, e.g. \"Pittsburgh\" (state and country go in their own fields). Used when \"Location\" is empty."
          },
          "postalCode": {
            "title": "Postal code",
            "type": "string",
            "description": "Optional: one postal code, e.g. \"10001\". Combine it with Country. Used when \"Location\" is empty."
          },
          "customGeolocation": {
            "title": "🛰 Custom search area",
            "type": "object",
            "description": "An exact area instead of a named place, as GeoJSON with [longitude, latitude] pairs: a Polygon, MultiPolygon, Feature(Collection), or a Point with \"radiusKm\", e.g. {\"type\":\"Point\",\"coordinates\":[-74.006,40.7128],\"radiusKm\":2}. Draw one at geojson.io. Overrides Location and the fields above."
          },
          "startUrls": {
            "title": "🔗 Google Maps URLs",
            "type": "array",
            "description": "Google Maps links, one per line. A place (…/maps/place/…, share links maps.app.goo.gl/…, ?cid=…) is scraped as that one place; a search page (…/maps/search/coffee/@60.17,24.94,13z) is scraped as that search in that map view.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "placeIds": {
            "title": "🗃 Place IDs",
            "type": "array",
            "description": "Place IDs from the Places API or an earlier run (\"ChIJreV9aqYWdkgROM_boL6YbwA\"), one per line. CIDs (\"7838756667406262025\") and feature ids (\"0x89c3…:0x6cc8…\") work too.",
            "items": {
              "type": "string"
            }
          },
          "categoryFilterWords": {
            "title": "Only these categories",
            "type": "array",
            "description": "Keep only places whose Google category contains one of these words: \"dentist\" keeps \"Dentist\" and \"Cosmetic dentist\". Case and accents do not matter. Empty = all categories.",
            "items": {
              "type": "string"
            }
          },
          "searchMatching": {
            "title": "Name must match the search term",
            "enum": [
              "all",
              "only_includes",
              "only_exact"
            ],
            "type": "string",
            "description": "Keep only places whose name contains, or equals, the search term. Handy for every branch of a chain (\"Starbucks\"). Case, accents and punctuation do not matter.",
            "default": "all"
          },
          "placeMinimumStars": {
            "title": "Minimum rating",
            "enum": [
              "",
              "two",
              "twoAndHalf",
              "three",
              "threeAndHalf",
              "four",
              "fourAndHalf"
            ],
            "type": "string",
            "description": "Keep only places rated at least this many stars. Places without a rating are dropped when this is set.",
            "default": ""
          },
          "website": {
            "title": "Website",
            "enum": [
              "allPlaces",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "Keep places with a website (for contact enrichment) or without one (leads for web design and marketing).",
            "default": "allPlaces"
          },
          "skipClosedPlaces": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Drop places Google marks as permanently or temporarily closed.",
            "default": false
          },
          "onlyInsideArea": {
            "title": "Only places inside the location",
            "type": "boolean",
            "description": "Drop places outside the location's boundary (from OpenStreetMap), such as the next town that falls inside the map rectangle. Turn off to keep them; each row says insideSearchArea true or false.",
            "default": true
          },
          "scrapePlaceDetailPage": {
            "title": "📋 Place details ($)",
            "type": "boolean",
            "description": "One extra request per place for the 1-5 star breakdown, review topics with counts, the top reviews Google shows, the business's own description, plus code, hotel class and the full week of hours. Charged per place where the details loaded.",
            "default": false
          },
          "scrapeContacts": {
            "title": "📇 Contacts from website ($)",
            "type": "boolean",
            "description": "Visits each place's own website for emails, phone numbers and social profiles (Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest): the homepage, then up to two contact pages. Never a crawl. Charged only where it finds at least one contact.",
            "default": false
          },
          "maxImages": {
            "title": "Image URLs per place",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "How many photo URLs to list per place in imageUrls (the main photo is always in imageUrl). Search results carry a few; with Place details on, more. Free.",
            "default": 0
          },
          "scrapeReviewsPersonalData": {
            "title": "Include reviewer names",
            "type": "boolean",
            "description": "With Place details on: include each review author's name, profile link, photo and review count. Turn off to collect reviews without personal data (GDPR).",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave empty: the Actor picks the address itself, starting with the run's own (free) and moving to Apify datacenter proxy when Google hides review counts from it. Set a proxy only to force your own; then only that one is used."
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many searches, URLs or Place IDs are processed at the same time.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for one response before giving up on it.",
            "default": 30
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Retries for blocked, rate-limited or failed requests. Timeouts are not retried.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}