{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper",
    "description": "Google Maps Scraper extracts business data from locations, keywords, categories, URLs, GPS coordinates, and place IDs. Collect names, addresses, phones, websites, ratings, reviews, hours, coordinates, attributes, emails, social links, and team contacts in structured output.",
    "version": "0.1",
    "x-build-id": "QR0FfG9gXrdicz8hQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapedrift~google-maps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapedrift-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/scrapedrift~google-maps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapedrift-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/scrapedrift~google-maps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapedrift-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": {
          "locations": {
            "title": "📍 Cities, regions or neighborhoods",
            "type": "array",
            "description": "🏙️ One or more place names, e.g. *New York*, *Texas*, *Downtown Chicago*. Every location is combined with every keyword/category below.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "🔎 Search keywords",
            "type": "array",
            "description": "☕ What you're looking for — *coffee shops*, *dentists*, *coworking spaces*, *hotels near airport*. Add several to multiply your search coverage in one run.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "🔗 Google Maps search links",
            "type": "array",
            "description": "🌐 Bulk-friendly list of Google Maps search-result URLs — handy for reusing searches you've already bookmarked.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "🎯 Results to collect",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "🔢 Total unique places to collect across every location, keyword/category, URL and place ID combined (duplicates are merged automatically). ✨ Start small for a quick test, then raise it for a full export.",
            "default": 20
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "🎛️ Optional Apify Proxy. Leave off for quick, light runs; switch on for heavier jobs or picky networks."
          },
          "scrapeContacts": {
            "title": "📇 Find emails, phones & socials",
            "type": "boolean",
            "description": "📮 Turn this Actor into a Google Maps email scraper and lead-finder: visits each place's own website and pulls contact details from it. Turn off to run exactly like a base Maps-only scraper.",
            "default": true
          },
          "onlyWithWebsite": {
            "title": "🚫 Require a website",
            "type": "boolean",
            "description": "🔗 Skip places with no website on file — there's nothing for the email/contact finder to visit, so this keeps results limited to businesses that could actually be enriched.",
            "default": false
          },
          "onlyWithEmail": {
            "title": "📧 Require an email match",
            "type": "boolean",
            "description": "✅ Keep only places where at least one email address was actually found on their website — useful when you want a ready-to-contact lead list and nothing else.",
            "default": false
          },
          "contactFetchTimeoutSecs": {
            "title": "⌛ Website fetch timeout",
            "minimum": 1,
            "maximum": 60,
            "type": "integer",
            "description": "⏲️ How many seconds to wait when fetching a single business's website during contact enrichment before giving up on that site.",
            "default": 15
          },
          "placeIds": {
            "title": "🆔 Place IDs or place URLs",
            "type": "array",
            "description": "🆔 One entry per exact place — a raw Google place ID (e.g. `ChIJn7B6JQVRW4YRkgk-CShaqNQ`) or a full Google Maps place-page URL (not a search-results URL — those go in the link list above). Each is fetched precisely, with no location or keyword search needed.",
            "items": {
              "type": "string"
            }
          },
          "lat": {
            "title": "📡 Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "🎯 Search around this exact GPS coordinate instead of geocoding a place name. Pair with Longitude below, plus at least one keyword or category."
          },
          "lng": {
            "title": "📐 Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "🎯 Pairs with Latitude above to pin the exact center point of a GPS-based search."
          },
          "radiusKm": {
            "title": "📏 Search radius (km)",
            "minimum": 0.1,
            "maximum": 50,
            "type": "number",
            "description": "⭕ How far out from the Latitude/Longitude point to search. Only applies when both Latitude and Longitude are set.",
            "default": 5
          },
          "categories": {
            "title": "🏷️ Business categories",
            "type": "array",
            "description": "🗂️ Business types to search for — *restaurant*, *hair salon*, *auto repair* — searched together with (or instead of) the keywords above. ℹ️ Google's own search always needs some text to work with, so there's no true zero-input \"browse everything nearby\" mode — pick or type categories here if you'd rather not compose a keyword phrase, and leave Keywords empty.",
            "items": {
              "type": "string"
            }
          },
          "openNowOnly": {
            "title": "🚦 Prefer open-now places",
            "type": "boolean",
            "description": "🕐 Best-effort nudge toward currently-open places by adding \"open now\" to the search text. NOT a guaranteed hard filter — it's Google's own ranking call — so always cross-check the `hours` field for anything time-sensitive.",
            "default": false
          },
          "includePlaceAttributes": {
            "title": "📌 Include accessibility & amenities",
            "type": "boolean",
            "description": "♿ Include accessibility, service-option and amenity details (e.g. wheelchair access, delivery, outdoor seating) already present in Google's own response — free, no extra requests.",
            "default": true
          },
          "includePhotos": {
            "title": "🖼️ Include a cover photo",
            "type": "boolean",
            "description": "📷 Fetch each place's cover photo URL. Adds one real extra request per place (same cost as the contact finder) — off by default.",
            "default": false
          },
          "maxPhotosPerPlace": {
            "title": "🔢 Max photos per place",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "🖼️ Cap on photo URLs returned per place when photos are on. In practice this surfaces the business's own cover photo, not the full user-submitted gallery.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}