{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper - Leads, Emails & Reviews",
    "description": "Find businesses on Google Maps by type and location. Get names, addresses, phone numbers, websites, ratings and review counts where available. Export to CSV, Excel or JSON, or use the API. Duplicate listings are removed, and incomplete or blocked searches are reported. No Google API key needed.",
    "version": "0.0",
    "x-build-id": "mp1KaoImbL6k9O2A7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/overbifrost~google-maps-business-data/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-overbifrost-google-maps-business-data",
        "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/overbifrost~google-maps-business-data/runs": {
      "post": {
        "operationId": "runs-sync-overbifrost-google-maps-business-data",
        "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/overbifrost~google-maps-business-data/run-sync": {
      "post": {
        "operationId": "run-sync-overbifrost-google-maps-business-data",
        "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": {
          "search": {
            "title": "Business type or search term",
            "minLength": 1,
            "maxLength": 200,
            "type": "string",
            "description": "What businesses do you want to find on Google Maps? For example plumber, dentist, accountant, coffee shop, or auto repair. Use Location or one advanced geometry option for the area."
          },
          "location": {
            "title": "Location",
            "minLength": 1,
            "maxLength": 300,
            "type": "string",
            "description": "City, region, or area to search, for example London, UK; Austin, TX; or Sydney, Australia. Leave empty only when you use Center coordinates, Bounding box, or GeoJSON polygon below."
          },
          "maxBusinesses": {
            "title": "Maximum businesses",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum unique Google Maps businesses to return across the run. API/runtime default 100; hard maximum 5,000. This is a result cap, not a guarantee that Google Maps exposes that many matching businesses. Enabled enrichment follows this business count automatically; request/time budgets can still make very large enrichment runs partial.",
            "default": 100
          },
          "searches": {
            "title": "Multiple searches (optional)",
            "minItems": 1,
            "maxItems": 25,
            "type": "array",
            "description": "Use this instead of the Business type + Location fields above when you want several independent searches in one run. Click Add item for each search; do not enter a comma-separated list. Clear the main Business type and Location fields before using this option.",
            "items": {
              "type": "object",
              "properties": {
                "search": {
                  "title": "Search term",
                  "type": "string",
                  "description": "Business type or search term for this item, for example dentist or coffee shop.",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 200
                },
                "location": {
                  "title": "Location (optional)",
                  "type": "string",
                  "description": "Usually the easiest anchor for this search, for example London, UK. Leave empty only if you provide Center coordinates, Bounding box, or GeoJSON polygon for this item.",
                  "editor": "textfield",
                  "minLength": 1,
                  "maxLength": 300
                },
                "center": {
                  "title": "Center coordinates (optional, advanced)",
                  "type": "object",
                  "description": "Optional geometry anchor for this search item. Enter JSON like {\"latitude\":51.5,\"longitude\":-0.12}. If used, Radius can further limit the area. Do not combine with Bounding box or Polygon.",
                  "editor": "json"
                },
                "radiusKm": {
                  "title": "Radius (km, optional)",
                  "type": "number",
                  "description": "Optional radius around Center coordinates, from 0.1 to 100 km. Requires Center coordinates.",
                  "minimum": 0.1,
                  "maximum": 100,
                  "editor": "number"
                },
                "boundingBox": {
                  "title": "Bounding box (optional, advanced)",
                  "type": "object",
                  "description": "Alternative rectangular geometry anchor. Enter JSON with north, south, east, and west. Do not combine with Center or Polygon.",
                  "editor": "json"
                },
                "polygon": {
                  "title": "GeoJSON polygon (optional, advanced)",
                  "type": "object",
                  "description": "Exact WGS84 GeoJSON Polygon or MultiPolygon result fence using [longitude, latitude] coordinates. Rings must be explicitly closed. Google Maps results outside the shape are excluded; records whose coordinates cannot establish polygon membership are not silently treated as in-area. Do not combine with Center or Bounding box.",
                  "editor": "json"
                }
              },
              "required": [
                "search"
              ],
              "additionalProperties": false
            }
          },
          "placeIds": {
            "title": "Place IDs (optional)",
            "minItems": 1,
            "maxItems": 500,
            "uniqueItems": true,
            "type": "array",
            "description": "Resolve known Google Place IDs directly instead of running a text search. Click Add item and paste one Place ID per item; do not separate IDs with commas. Maximum 500.",
            "items": {
              "type": "string",
              "minLength": 4,
              "maxLength": 300,
              "pattern": "^[\\w:./+-]+$"
            }
          },
          "mapsUrls": {
            "title": "Google Maps URLs (optional)",
            "minItems": 1,
            "maxItems": 500,
            "uniqueItems": true,
            "type": "array",
            "description": "Resolve known Google Maps place URLs directly instead of running a text search. Click Add item and paste one full https Google Maps URL per item; do not separate URLs with commas. Maximum 500.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            }
          },
          "center": {
            "title": "Center coordinates (optional)",
            "required": [
              "latitude",
              "longitude"
            ],
            "type": "object",
            "description": "Alternative to Location for the simple search above. Fill both Latitude and Longitude. Add Radius below if you want a circular search area. Do not combine with Bounding box or Polygon.",
            "properties": {
              "latitude": {
                "title": "Latitude",
                "type": "number",
                "description": "Latitude from -90 to 90, for example 51.5.",
                "minimum": -90,
                "maximum": 90,
                "editor": "number"
              },
              "longitude": {
                "title": "Longitude",
                "type": "number",
                "description": "Longitude from -180 to 180, for example -0.12.",
                "minimum": -180,
                "maximum": 180,
                "editor": "number"
              }
            },
            "additionalProperties": false
          },
          "radiusKm": {
            "title": "Radius (km, optional)",
            "minimum": 0.1,
            "maximum": 100,
            "type": "number",
            "description": "Optional radius around Center coordinates, from 0.1 to 100 km. Leave empty unless Center coordinates are filled."
          },
          "boundingBox": {
            "title": "Bounding box (optional)",
            "required": [
              "north",
              "south",
              "east",
              "west"
            ],
            "type": "object",
            "description": "Alternative rectangular search area. Fill all four values. Use this instead of Center coordinates or Polygon.",
            "properties": {
              "north": {
                "title": "North latitude",
                "type": "number",
                "description": "Northern latitude boundary, -90 to 90.",
                "minimum": -90,
                "maximum": 90,
                "editor": "number"
              },
              "south": {
                "title": "South latitude",
                "type": "number",
                "description": "Southern latitude boundary, -90 to 90. Must be lower than North.",
                "minimum": -90,
                "maximum": 90,
                "editor": "number"
              },
              "east": {
                "title": "East longitude",
                "type": "number",
                "description": "Eastern longitude boundary, -180 to 180.",
                "minimum": -180,
                "maximum": 180,
                "editor": "number"
              },
              "west": {
                "title": "West longitude",
                "type": "number",
                "description": "Western longitude boundary, -180 to 180.",
                "minimum": -180,
                "maximum": 180,
                "editor": "number"
              }
            },
            "additionalProperties": false
          },
          "polygon": {
            "title": "GeoJSON polygon / territory (optional)",
            "type": "object",
            "description": "Exact WGS84 GeoJSON Polygon or MultiPolygon result fence. Coordinates use GeoJSON order [longitude, latitude], and every ring must repeat its first coordinate at the end. Useful for sales territories, neighborhoods, franchise areas, delivery zones, or irregular market-research boundaries. The Actor searches the polygon bounding region and excludes observed businesses outside the polygon before persistence and billing. Membership is never guessed when coordinates are unavailable. Do not combine with Center or Bounding box."
          },
          "filters": {
            "title": "Result filters (optional)",
            "type": "object",
            "description": "Keep only businesses matching the criteria you choose. Leave every field empty/default to keep all normalized results. Filtering happens before optional enrichment where practical.",
            "properties": {
              "includeCategories": {
                "title": "Include categories (optional)",
                "type": "array",
                "description": "Keep businesses matching any category you add. Enter one category per item; do not use a comma-separated list.",
                "editor": "stringList",
                "placeholderValue": "dentist",
                "maxItems": 50,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                }
              },
              "excludeCategories": {
                "title": "Exclude categories (optional)",
                "type": "array",
                "description": "Exclude businesses matching any category you add. Enter one category per item; do not use a comma-separated list.",
                "editor": "stringList",
                "placeholderValue": "restaurant",
                "maxItems": 50,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100
                }
              },
              "minRating": {
                "title": "Minimum rating (optional)",
                "type": "number",
                "description": "Keep businesses with at least this Google Maps rating. Leave empty for no rating filter.",
                "minimum": 0,
                "maximum": 5,
                "editor": "number"
              },
              "minReviewCount": {
                "title": "Minimum review count (optional)",
                "type": "integer",
                "description": "Keep businesses with at least this many Google Maps reviews. Leave empty for no review-count filter.",
                "minimum": 0,
                "maximum": 1000000,
                "editor": "number"
              },
              "websitePresence": {
                "title": "Website filter",
                "type": "string",
                "description": "Keep all businesses, only records with a website link, or only records where the checked Google Maps source has no website link.",
                "editor": "select",
                "enum": [
                  "ANY",
                  "REQUIRED",
                  "ABSENT"
                ],
                "enumTitles": [
                  "Any website status",
                  "Has a website link",
                  "No website link in Google Maps source"
                ],
                "default": "ANY"
              },
              "excludeBusinessStatuses": {
                "title": "Exclude business statuses (optional)",
                "type": "array",
                "description": "Optionally exclude businesses with one or more observed Google Maps statuses.",
                "editor": "select",
                "maxItems": 3,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "enum": [
                    "OPEN",
                    "CLOSED_TEMPORARILY",
                    "CLOSED_PERMANENTLY"
                  ],
                  "enumTitles": [
                    "Open",
                    "Temporarily closed",
                    "Permanently closed"
                  ]
                }
              }
            },
            "additionalProperties": false
          },
          "enrichContacts": {
            "title": "Find website emails and social links",
            "type": "boolean",
            "description": "Check listed business websites for public emails, phone numbers and social links. Each check uses the homepage and up to 2 same-site contact pages over HTTP. Off by default; no email-deliverability verification. When enabled, website admission follows Maximum businesses up to 5,000; the bounded contact phase can still stop early on its deadline and marks untouched records explicitly. A contact-enriched event is charged only when at least one public email, phone number, or social link is returned; unsuccessful checks are not charged as contact enrichment.",
            "default": false
          },
          "maxContactSites": {
            "title": "Maximum websites to check (API override)",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Backward-compatible API override. Normal runs automatically follow Maximum businesses up to 5,000 websites. Set only through JSON/API when you intentionally want a smaller contact-enrichment cap."
          },
          "enrichPlaceProfiles": {
            "title": "Enrich place profiles",
            "type": "boolean",
            "description": "Fetch richer Google Maps place-profile data such as opening hours, popular times, review distribution, categories, amenities, price range, owner information, plus code and more. Off by default; adds bounded extra requests. When enabled, the number of profiles follows Maximum businesses up to 500. Place-profile enrichment is included in the business-record price; there is no separate profile event.",
            "default": false
          },
          "maxPlaceProfiles": {
            "title": "Maximum place profiles (API override)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Backward-compatible API override. Normal runs automatically follow Maximum businesses up to 500 profiles. Set only through JSON/API when you intentionally want a smaller profile-enrichment cap."
          },
          "enrichPhotos": {
            "title": "Include photo references",
            "type": "boolean",
            "description": "Return bounded photo-reference URLs from place-profile data. Requires Enrich place profiles. Metadata only; no image files are downloaded. Photo references are included with the business/profile row and do not have a separate photo event.",
            "default": false
          },
          "maxPhotosPerBusiness": {
            "title": "Maximum photos per business",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Used only when photo references are enabled. Default 10; hard maximum 50. This controls items per business, so it remains separate from Maximum businesses.",
            "default": 10
          },
          "enrichReviews": {
            "title": "Enrich reviews",
            "type": "boolean",
            "description": "Fetch bounded Google Maps review pages per business, including observed author, rating, text, photos, and owner replies where available. Off by default. The number of businesses enriched follows Maximum businesses up to 500. Each returned review triggers one review-scraped event; failed, blocked, skipped, or empty review checks are not charged as reviews.",
            "default": false
          },
          "maxReviewsPerBusiness": {
            "title": "Maximum reviews per business",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Used only when review enrichment is enabled. Default 25; hard maximum 50. This controls reviews per business, so it remains separate from Maximum businesses.",
            "default": 25
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "MOST_RELEVANT",
              "NEWEST",
              "HIGHEST_RATING",
              "LOWEST_RATING"
            ],
            "type": "string",
            "description": "Google-native ordering used when review enrichment is enabled. Most relevant preserves the previous/default behavior. Newest is useful for fresh feedback; lowest/highest rating are useful for complaint or testimonial research.",
            "default": "MOST_RELEVANT"
          },
          "maxReviewBusinesses": {
            "title": "Maximum businesses for reviews (API override)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Backward-compatible API override. Normal runs automatically follow Maximum businesses up to 500 businesses. Set only through JSON/API when you intentionally want a smaller review-enrichment cap."
          },
          "coverageMode": {
            "title": "Coverage mode",
            "enum": [
              "SINGLE",
              "AUTO"
            ],
            "type": "string",
            "description": "Adaptive coverage (recommended) can split busy map areas into smaller cells when needed. Single viewport searches one map view per query. Keep Adaptive unless you specifically need one viewport.",
            "default": "AUTO"
          },
          "acquisitionMode": {
            "title": "Acquisition mode",
            "enum": [
              "AUTO",
              "HTTP",
              "BROWSER"
            ],
            "type": "string",
            "description": "Automatic runs HTTP acquisition first and uses bounded browser fallback when needed. HTTP only disables browser fallback. Browser only disables Maps HTTP-dependent profile, photo, and review enrichment. Website contact enrichment is independent.",
            "default": "AUTO"
          },
          "language": {
            "title": "Language / locale",
            "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$",
            "type": "string",
            "description": "Google Maps locale such as en, en-GB, nb-NO, de-DE, or fr-FR. Most users can keep en.",
            "default": "en"
          },
          "concurrency": {
            "title": "Browser fallback concurrency",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "Maximum simultaneous browser fallback work. Default 2; hard maximum 4. This does not control the normal HTTP-first path.",
            "default": 2
          },
          "proxyStrategy": {
            "title": "Proxy strategy",
            "enum": [
              "AUTO",
              "NONE",
              "APIFY_DATACENTER",
              "APIFY_RESIDENTIAL"
            ],
            "type": "string",
            "description": "Automatic uses the normal non-residential Apify proxy route. Residential is an explicit metered choice; it is never selected silently.",
            "default": "AUTO"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}