{
  "openapi": "3.0.1",
  "info": {
    "title": "🗺️ Google Maps Scraper — Emails, Reviews & Photos",
    "description": "Extract Google Maps places with phones, websites, hours, ratings — and verified business emails automatically pulled from each place's website. Full review history, photo URLs, 7 social networks. Pay only per result, from $0.003/place. No browser, no API key.",
    "version": "1.0",
    "x-build-id": "64vIYhbm0S3IuG98E"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pro100chok~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pro100chok-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/pro100chok~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-pro100chok-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/pro100chok~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-pro100chok-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",
        "required": [
          "searchStringsArray"
        ],
        "properties": {
          "searchStringsArray": {
            "title": "🔍 Search terms",
            "minItems": 1,
            "type": "array",
            "description": "What to search on Google Maps — one term per line. Examples: `barber shop`, `coffee`, `dental clinic`.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "📍 Location (free text)",
            "type": "string",
            "description": "Where to search. Free-text like `Washington, DC` or `Berlin, Germany`. Leave empty if you fill the structured fields below."
          },
          "city": {
            "title": "🏙️ City",
            "type": "string",
            "description": "Optional — combined with state/country into a single location string."
          },
          "state": {
            "title": "🗺️ State / region",
            "type": "string",
            "description": "Optional — US state or other top-level region (e.g. `CA`)."
          },
          "country": {
            "title": "🌍 Country",
            "type": "string",
            "description": "Optional — full country name, e.g. `USA`, `Germany`."
          },
          "maxCrawledPlacesPerSearch": {
            "title": "🎯 Max places per search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper bound on results per `(search term, location)` pair. Google's UI caps at ~120; with `deepSearch` we go past that via geo-drilling.",
            "default": 100
          },
          "maxItems": {
            "title": "🧮 Max items (total)",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Global cap on the total number of places pushed across ALL search terms and locations combined. As soon as this many places are pushed, the actor stops searching and pushing immediately. Leave empty for no overall limit."
          },
          "deepSearch": {
            "title": "🌐 Deep search (geo-drilling)",
            "type": "boolean",
            "description": "When a result page saturates (≥20 items), recursively split the area into sub-areas to bypass the 120-place cap. Slower but much wider coverage.",
            "default": false
          },
          "categoryFilter": {
            "title": "🏷️ Category filter",
            "type": "string",
            "description": "Optional. Keep only places whose category contains this string (case-insensitive), e.g. `Barber shop`."
          },
          "language": {
            "title": "🗣️ Language (hl)",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "ru",
              "uk",
              "pl",
              "tr",
              "nl",
              "ja",
              "ko",
              "zh-CN"
            ],
            "type": "string",
            "description": "Google interface language for the search.",
            "default": "en"
          },
          "countryCode": {
            "title": "🚩 Country code (gl)",
            "pattern": "^[a-zA-Z]{2}$",
            "type": "string",
            "description": "Google geolocation hint — 2-letter ISO code. Affects ranking, results, and currency.",
            "default": "us"
          },
          "scrapeContactsFromWebsite": {
            "title": "📧 Scrape emails + socials from websites",
            "type": "boolean",
            "description": "For every place that has a website, fetch homepage + contact pages and extract emails plus Facebook / Instagram / X / LinkedIn / YouTube / TikTok / Telegram links.",
            "default": true
          },
          "skipPlacesWithoutEmail": {
            "title": "📭 Skip places with no email",
            "type": "boolean",
            "description": "Only push places where an email was found (useful for lead lists).",
            "default": false
          },
          "includeReviews": {
            "title": "💬 Include reviews (add-on)",
            "type": "boolean",
            "description": "Attach user reviews per place — text, rating, author, date, and attached photos. Paginates through Google's review API, so you get the full review history (up to your cap below). Billed per review extracted — see pricing.",
            "default": false
          },
          "maxReviewsPerPlace": {
            "title": "🔢 Max reviews per place",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on reviews attached to one place. The actor paginates Google's review API (~10 reviews per page) until it hits this cap or runs out of reviews.",
            "default": 20
          },
          "includeImages": {
            "title": "🖼️ Include image URLs (add-on)",
            "type": "boolean",
            "description": "Attach photo URLs to each place. Sources: 3-5 thumbnails from the search response + user-submitted photos from reviews (works only together with 💬 includeReviews). Higher review limit → more photos. Billed per image.",
            "default": false
          },
          "maxImagesPerPlace": {
            "title": "🔢 Max images per place",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap on photo URLs attached to one place.",
            "default": 20
          },
          "maxRetries": {
            "title": "🔁 Max retries per request",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "Retries on transient network failures before giving up on a request.",
            "default": 5
          },
          "concurrency": {
            "title": "⚡ Concurrent sessions",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Worker sessions running in parallel during deep search. Higher = faster but heavier load.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}