{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Business Scraper - Leads & Reviews",
    "description": "Scrape Google Maps for business data: names, addresses, phones, websites, ratings, reviews, opening hours, and 20+ fields. Ideal for lead generation, sales prospecting, and market research.",
    "version": "1.0",
    "x-build-id": "JLqMyg5RiMAQCj71g"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lazymac~google-maps-business-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lazymac-google-maps-business-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/lazymac~google-maps-business-scraper/runs": {
      "post": {
        "operationId": "runs-sync-lazymac-google-maps-business-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/lazymac~google-maps-business-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-lazymac-google-maps-business-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 Queries",
            "type": "array",
            "description": "List of search queries to find businesses on Google Maps. Examples: 'restaurants in New York', 'dentist near me Chicago', 'plumber Los Angeles CA'. Each query will be searched separately and results combined. For best results, include the location in the query.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Direct Google Maps URLs to scrape. Use this if you already have specific Google Maps search result URLs or individual place URLs. Supports both search URLs (google.com/maps/search/...) and place URLs (google.com/maps/place/...). Leave empty if using search queries above.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "title": "URL",
                  "type": "string",
                  "description": "Google Maps URL to scrape"
                },
                "method": {
                  "title": "HTTP Method",
                  "type": "string",
                  "description": "HTTP method for the request"
                }
              }
            }
          },
          "maxResults": {
            "title": "Maximum Results",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum number of business listings to extract per search query. Google Maps typically shows up to 120 results per search. Set to 0 for unlimited (all available results). Higher values require more compute time.",
            "default": 50
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code for Google Maps results. This affects the language of business names, addresses, and reviews. Use ISO 639-1 codes: en (English), es (Spanish), fr (French), de (German), ja (Japanese), ko (Korean), zh (Chinese), pt (Portuguese), it (Italian), etc.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country Code",
            "type": "string",
            "description": "Two-letter country code to target Google Maps for a specific country. This ensures results are localized correctly. Examples: US (United States), GB (United Kingdom), DE (Germany), FR (France), JP (Japan), KR (South Korea), BR (Brazil).",
            "default": "US"
          },
          "includeReviews": {
            "title": "Include Reviews",
            "type": "boolean",
            "description": "Extract individual reviews for each business. When enabled, the scraper will navigate to each business detail page and extract review text, author name, rating, and date. This significantly increases run time but provides valuable sentiment data.",
            "default": false
          },
          "maxReviews": {
            "title": "Maximum Reviews Per Business",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Maximum number of reviews to extract per business listing. Only applies when 'Include Reviews' is enabled. Set lower values for faster runs. Google shows most relevant reviews first.",
            "default": 5
          },
          "reviewSort": {
            "title": "Review Sort Order",
            "enum": [
              "mostRelevant",
              "newest",
              "highestRating",
              "lowestRating"
            ],
            "type": "string",
            "description": "How to sort reviews when extracting them. 'Most relevant' is Google's default ranking. 'Newest' gives most recent reviews. 'Highest rating' and 'Lowest rating' sort by star count.",
            "default": "mostRelevant"
          },
          "includePhotos": {
            "title": "Include Photo URLs",
            "type": "boolean",
            "description": "Extract URLs of business photos from their Google Maps listing. Includes cover photos and gallery images. Useful for visual verification of business listings.",
            "default": false
          },
          "maxPhotos": {
            "title": "Maximum Photos Per Business",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of photo URLs to extract per business. Only applies when 'Include Photo URLs' is enabled.",
            "default": 5
          },
          "includeOpeningHours": {
            "title": "Include Opening Hours",
            "type": "boolean",
            "description": "Extract detailed opening hours for each day of the week. Provides structured data with day name and time ranges. Useful for understanding business availability.",
            "default": true
          },
          "includePeopleAlsoSearch": {
            "title": "Include 'People Also Search For'",
            "type": "boolean",
            "description": "Extract related businesses that Google suggests in the 'People also search for' section. Useful for competitive analysis and discovering similar businesses.",
            "default": false
          },
          "includeAdditionalInfo": {
            "title": "Include Additional Business Info",
            "type": "boolean",
            "description": "Extract additional attributes like accessibility, amenities, dining options, payment methods, and other business-specific features that Google Maps displays.",
            "default": true
          },
          "filterByRating": {
            "title": "Minimum Rating Filter",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only include businesses with a rating equal to or above this value. Set to 0 to include all businesses regardless of rating. Useful for filtering out low-quality leads.",
            "default": 0
          },
          "filterByMinReviews": {
            "title": "Minimum Reviews Count",
            "minimum": 0,
            "type": "integer",
            "description": "Only include businesses with at least this many reviews. Set to 0 to include all businesses. Higher values filter for more established businesses.",
            "default": 0
          },
          "onlyWithPhone": {
            "title": "Only Businesses With Phone Number",
            "type": "boolean",
            "description": "When enabled, only include businesses that have a phone number listed. Essential for telemarketing and outreach campaigns where phone contact is required.",
            "default": false
          },
          "onlyWithWebsite": {
            "title": "Only Businesses With Website",
            "type": "boolean",
            "description": "When enabled, only include businesses that have a website URL listed. Useful for digital marketing campaigns and web-based outreach.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of pages to process in parallel. Higher values speed up the scrape but may increase the chance of being rate-limited. Recommended: 5-10 for most use cases.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings for the scraper. Using Apify's residential proxies (RESIDENTIAL group) is recommended for Google Maps to avoid blocks. The scraper automatically rotates proxies between requests.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}