{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper: Places, Phones, Emails, Reviews",
    "description": "Scrape Google Maps places by keyword and location: name, address, phone, website, rating, review count, hours, categories, coordinates, place URL. Optional website emails and socials, up to 5 reviews. No login. $1.50 per 1,000 places.",
    "version": "0.1",
    "x-build-id": "dau92rSSOWNU9JKKH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/transparent_meteorite~google-maps-places-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-transparent_meteorite-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/transparent_meteorite~google-maps-places-scraper/runs": {
      "post": {
        "operationId": "runs-sync-transparent_meteorite-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/transparent_meteorite~google-maps-places-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-transparent_meteorite-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": {
          "searchStringsArray": {
            "title": "Search terms",
            "type": "array",
            "description": "What to search for, like you would type it into Google Maps: \"dentist\", \"coffee shop\", \"roofing contractor\". Each term is searched in every location below. Leave empty with no URLs to run a small demo search.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "Location",
            "type": "string",
            "description": "City, county, state, ZIP or address, for example \"Austin, TX\" or \"Manchester, UK\". Added to each search as \"<term> in <location>\". Leave empty if your search terms already contain a place."
          },
          "locations": {
            "title": "More locations",
            "type": "array",
            "description": "Extra cities or neighborhoods to cover. Each one runs every search term again (Google returns up to 120 places per search, so split big cities into neighborhoods or ZIP codes to get more).",
            "items": {
              "type": "string"
            }
          },
          "postalCodes": {
            "title": "ZIP / postal codes",
            "type": "array",
            "description": "ZIP or postal codes to search, one per line. Works like extra locations.",
            "items": {
              "type": "string"
            }
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Optional. Structured location, same as the market leader: city, county, state and postal code are joined into one area (for example \"Austin, TX\"). Leave empty to use the fields above."
          },
          "county": {
            "title": "County",
            "type": "string",
            "description": "Optional. Joined with city/state/postal code into one location."
          },
          "state": {
            "title": "State or region",
            "type": "string",
            "description": "Optional. For example \"TX\" or \"Ontario\"."
          },
          "postalCode": {
            "title": "Postal code",
            "type": "string",
            "description": "Optional. One postal code, joined with the fields above. For many ZIP codes use \"ZIP / postal codes\" instead (each becomes its own search)."
          },
          "maxCrawledPlacesPerSearch": {
            "title": "Max places per search",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How many places to take from each search (term x location). Google Maps shows at most 120 results per search.",
            "default": 20
          },
          "maxCrawledPlaces": {
            "title": "Max places in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stop the whole run after this many places. 0 = no overall limit (the per-search limit and your max charge still apply).",
            "default": 0
          },
          "startUrls": {
            "title": "Google Maps URLs",
            "type": "array",
            "description": "Paste Google Maps search URLs (https://www.google.com/maps/search/...) or place URLs (https://www.google.com/maps/place/... or ?cid=...).",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "placeIds": {
            "title": "Place IDs",
            "type": "array",
            "description": "Google place IDs (ChIJ...) to look up directly, for example to refresh a list you already have.",
            "items": {
              "type": "string"
            }
          },
          "skipPlaces": {
            "title": "Skip these places (never delivered, never charged)",
            "type": "array",
            "description": "Place IDs (ChIJ...), CIDs or Google Maps URLs you already have. They are dropped before delivery, so you are not charged for them.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code for names, categories and hours, for example en, de, es, fr.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code that biases results, for example us, gb, ca, au, de.",
            "default": "us"
          },
          "categoryFilterWords": {
            "title": "Only these categories",
            "type": "array",
            "description": "Keep only places whose category contains one of these words, for example \"dentist\" drops the dental lab and the pharmacy next door.",
            "items": {
              "type": "string"
            }
          },
          "searchMatching": {
            "title": "Name must match search",
            "enum": [
              "all",
              "only_includes",
              "only_exact"
            ],
            "type": "string",
            "description": "Use this when you search for a brand name and want to drop unrelated nearby places.",
            "default": "all"
          },
          "placeMinimumStars": {
            "title": "Minimum rating",
            "enum": [
              "two",
              "twoAndHalf",
              "three",
              "threeAndHalf",
              "four",
              "fourAndHalf"
            ],
            "type": "string",
            "description": "Skip places rated below this. Leave empty for any rating."
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Skip places with fewer reviews than this.",
            "default": 0
          },
          "website": {
            "title": "Website",
            "enum": [
              "allPlaces",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "\"Without a website\" is the classic web-design lead list.",
            "default": "allPlaces"
          },
          "onlyWithPhone": {
            "title": "Only places with a phone number",
            "type": "boolean",
            "description": "Skip places that list no phone number.",
            "default": false
          },
          "skipClosed": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Skip places Google marks as closed (permanently or temporarily). On by default. Closed places carry permanentlyClosed / temporarilyClosed flags when you turn this off.",
            "default": true
          },
          "skipClosedPlaces": {
            "title": "Skip closed places (old name)",
            "type": "boolean",
            "description": "Old name of skipClosed, still accepted. skipClosed wins when both are set."
          },
          "scrapeContacts": {
            "title": "Find emails and social profiles on the website",
            "type": "boolean",
            "description": "Visits each place's own website (home page plus up to 2 contact/about pages) and adds emails, extra phones and Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest and Yelp links. Charged per place only when at least one email or social profile is found.",
            "default": false
          },
          "maxReviews": {
            "title": "Reviews per place (0-5)",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Adds up to 5 of the most relevant reviews per place (stars, text, reviewer, date). Google shows 5 on the public place page without login; this actor does not go past that. Charged per review delivered.",
            "default": 0
          },
          "scrapePlaceDetailPage": {
            "title": "Open each place page",
            "type": "boolean",
            "description": "Opens each place page to add the star histogram (reviewsDistribution), the place description and the full attribute list (accessibility, payments, service options). On by default; turn off for faster, search-only rows. No extra charge.",
            "default": true
          },
          "maxImages": {
            "title": "Image URLs per place",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "0 = off. Adds imageUrls (full-size photo links Google ships with the place; usually 1-10 from search, more with the detail page). Free; no extra event.",
            "default": 0
          },
          "scrapeOrderOnline": {
            "title": "Order-online links (restaurants)",
            "type": "boolean",
            "description": "Adds orderBy: the \"Order online\" links Google shows for restaurants and cafes. Free; no extra event.",
            "default": false
          },
          "reviewsSort": {
            "title": "Review order",
            "enum": [
              "mostRelevant",
              "newest",
              "highestRanking",
              "lowestRanking"
            ],
            "type": "string",
            "description": "Order of the reviews returned with each place (applied to the reviews Google embeds in the place page).",
            "default": "mostRelevant"
          },
          "reviewsStartDate": {
            "title": "Only reviews newer than",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2})?$",
            "type": "string",
            "description": "Optional. Drops reviews published before this date (YYYY-MM-DD). Dropped reviews are not charged."
          },
          "reviewsFilterString": {
            "title": "Only reviews containing",
            "type": "string",
            "description": "Optional keyword. Keeps only reviews whose text contains it (case-insensitive). Dropped reviews are not charged."
          },
          "onlyNew": {
            "title": "Only new places (monitor mode)",
            "type": "boolean",
            "description": "Remembers which places earlier runs already returned (same searches, or the same monitor key) and returns and charges only places that are new. Schedule it daily or weekly to catch newly opened businesses.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Optional name for the remembered list, so different schedules with the same searches keep separate lists."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy is on by default. If Google rate limits an exit, the actor rotates sessions and moves to residential proxy automatically.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}