{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper ⚡ Places + Emails & Leads",
    "description": "Scrape Google Maps businesses: name, address, phone, website, rating, reviews, opening hours and images. Plus email + social-media leads from each business's website, charged only when found. Simple input, no hidden add-ons.",
    "version": "0.1",
    "x-build-id": "PJGsCCbPBYIfi3NU8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/analytics_tupiniquim~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-analytics_tupiniquim-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/analytics_tupiniquim~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-analytics_tupiniquim-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/analytics_tupiniquim~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-analytics_tupiniquim-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": "Search terms like 'restaurant', 'dentist', 'hotel'. Use distinct terms for best results. Each term is combined with every location below.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "📍 Location",
            "type": "string",
            "description": "Location to search in. Examples: 'New York, USA', 'São Paulo, Brasil', 'London, UK'. Supports MULTIPLE locations separated by || (e.g. 'São Paulo, Brasil || Rio de Janeiro, Brasil')."
          },
          "maxCrawledPlacesPerSearch": {
            "title": "💯 Max places per search term",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of places to scrape per search term (per location). Leave empty for all available.",
            "default": 100
          },
          "language": {
            "title": "🌍 Language",
            "enum": [
              "en",
              "pt-BR",
              "es",
              "fr",
              "de",
              "it",
              "ja",
              "ko",
              "zh-CN",
              "ar",
              "ru",
              "nl",
              "pl",
              "tr"
            ],
            "type": "string",
            "description": "Language for results. Default: English.",
            "default": "en"
          },
          "maxReviews": {
            "title": "⭐ Max reviews per place",
            "minimum": 0,
            "type": "integer",
            "description": "Number of reviews to extract per place. Set 0 for no reviews. Set 99999 for all reviews. Charged at $0.30/1K reviews.",
            "default": 0
          },
          "reviewsSort": {
            "title": "📊 Sort reviews by",
            "enum": [
              "newest",
              "mostRelevant",
              "highestRanking",
              "lowestRanking"
            ],
            "type": "string",
            "description": "How to sort reviews before extracting.",
            "default": "newest"
          },
          "reviewsStartDate": {
            "title": "📅 Reviews after date",
            "type": "string",
            "description": "Only scrape reviews posted after this date. Format: YYYY-MM-DD or relative like '3 months'."
          },
          "maxImages": {
            "title": "📸 Max images per place",
            "minimum": 0,
            "type": "integer",
            "description": "Number of images to extract per place. Set 0 for no extra images. Charged at $0.30/1K images.",
            "default": 0
          },
          "scrapeContacts": {
            "title": "📧 Scrape emails & social profiles",
            "type": "boolean",
            "description": "When a place has a website, visit it and extract contact emails plus Instagram/Facebook/LinkedIn/X/YouTube/TikTok/WhatsApp links. HTTP-only, no browser. Charged only for places where something is found.",
            "default": true
          },
          "skipClosedPlaces": {
            "title": "⏩ Skip closed places",
            "type": "boolean",
            "description": "Skip places marked as temporarily or permanently closed.",
            "default": false
          },
          "categoryFilterWords": {
            "title": "🎯 Category filter",
            "type": "array",
            "description": "Only include places whose category matches one of these words. Leave empty for all categories.",
            "items": {
              "type": "string"
            }
          },
          "placeMinimumStars": {
            "title": "⭐ Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only scrape places with this minimum average rating (0-5)."
          },
          "restrictToSearchedCity": {
            "title": "🏙 Only the searched city",
            "type": "boolean",
            "description": "Google Maps mixes in nearby towns when ranking by distance. When enabled (default), keeps ONLY places located in the city you searched (matched against each place's address). Turn OFF to also include neighbouring towns. Ignored for direct URLs, place IDs and custom GeoJSON areas.",
            "default": true
          },
          "startUrls": {
            "title": "🔗 Google Maps URLs",
            "type": "array",
            "description": "Optional. Direct Google Maps URLs to scrape (place URLs or search URLs). Leave empty when using search terms + location above — these URLs are scraped IN ADDITION to your search, so a leftover value here mixes in unrelated results.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "placeIds": {
            "title": "🗂 Place IDs",
            "type": "array",
            "description": "List of Google Place IDs (format: ChIJ...). Use Bulk edit to paste a list.",
            "items": {
              "type": "string"
            }
          },
          "countryCode": {
            "title": "🗺 Country",
            "type": "string",
            "description": "Country code (e.g., US, BR, GB) for geolocation search."
          },
          "city": {
            "title": "🌆 City",
            "type": "string",
            "description": "City name for geolocation search. Do not include state or country."
          },
          "state": {
            "title": "State",
            "type": "string",
            "description": "State/province for geolocation (mainly for US)."
          },
          "postalCode": {
            "title": "📮 Postal code",
            "type": "string",
            "description": "Postal/ZIP code. Combine only with Country, never with City."
          },
          "customGeolocation": {
            "title": "🛰 Custom search area (GeoJSON)",
            "type": "object",
            "description": "Optional. Custom polygon/circle for the search area. Use geojson.io to create. Coordinates order: [longitude, latitude]. Example: { \"type\": \"Point\", \"coordinates\": [-46.6333, -23.5505], \"radiusKm\": 5 }. Leave empty unless you need a precise custom area — it is combined with your search terms."
          },
          "scrapeReviewsPersonalData": {
            "title": "🧑 Include reviewer personal data",
            "type": "boolean",
            "description": "Include reviewer name, ID, URL, and photo. ⚠️ Subject to GDPR — only enable if you have a legitimate reason.",
            "default": true
          },
          "maxConcurrency": {
            "title": "⚙️ Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Maximum number of browsers running in parallel. Keep low (3-5) to avoid Google blocks.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "🔒 Proxy configuration",
            "type": "object",
            "description": "Datacenter proxy (the default) is low-cost and works for Google Maps. Switch to Residential only if you hit blocks on very large runs — note residential transfer is far more expensive.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}