{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Leads Scraper — unlimited volume, no 120 cap",
    "description": "Google caps every Maps search at ~120 results. This one tiles the search area and subdivides until it has them all - 783 businesses where a single search returns 140. Phone, website, rating, category, full address, coordinates per row. Optional emails and web-platform detection.",
    "version": "0.0",
    "x-build-id": "Fw8RgvKYHbvP0R9BA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~google-maps-leads-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-google-maps-leads-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/memo23~google-maps-leads-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-google-maps-leads-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/memo23~google-maps-leads-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-google-maps-leads-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": [
          "searchTerms"
        ],
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords to search on Google Maps, one per line. Every term is searched in every location below.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, regions, or countries to search, one per line. Each is paired with every search term. A city name alone works ('Austin'); add state or country for precision ('Austin, TX').",
            "items": {
              "type": "string"
            }
          },
          "exhaustiveCoverage": {
            "title": "Exhaustive coverage (go past Google's ~120 result limit)",
            "type": "boolean",
            "description": "Costs more requests than a single search — bound it with the tile budget below.",
            "default": false
          },
          "tileRadiusKm": {
            "title": "Starting tile radius (km)",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Size of the initial search tiles. Smaller tiles cost more requests but need less subdividing. 8 km suits a city; drop to 2-3 km for a dense downtown.",
            "default": 8
          },
          "maxTilesPerSearch": {
            "title": "Tile budget per search",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Hard cap on tiles searched for each search term and location pair. This is the run's main cost control: a dense metro can otherwise subdivide for a long time. When the budget runs out, the run logs how much of the area it covered.",
            "default": 40
          },
          "defaultRadiusKm": {
            "title": "Fallback radius (km)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Area radius used when a location name cannot be resolved to a boundary.",
            "default": 25
          },
          "searchCircle": {
            "title": "Search circle (lat / lng / radius miles)",
            "type": "object",
            "description": "Limit the search to a circular area: { \"lat\": <number>, \"lng\": <number>, \"radiusMiles\": <number> }. Replaces the Locations field when set. Places outside the circle are dropped without charge."
          },
          "searchPolygon": {
            "title": "Search polygon (GeoJSON ring)",
            "type": "array",
            "description": "Limit the search to an arbitrary shape: an array of [lng, lat] pairs (GeoJSON order; first and last point may match). Takes precedence over the search circle. Places outside the polygon are dropped without charge."
          },
          "minRating": {
            "title": "Minimum rating (1-5)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Skip places rated below this."
          },
          "hasWebsite": {
            "title": "Only places with a website",
            "type": "boolean",
            "description": "Skip listings that have no website.",
            "default": false
          },
          "placeIdsToSkip": {
            "title": "Place IDs to skip",
            "type": "array",
            "description": "Feature IDs or CIDs you already collected. Skipped without charge. Paste many at once: one per line, or comma-separated.",
            "items": {
              "type": "string"
            }
          },
          "includeWebsiteEmails": {
            "title": "Find emails on each business website",
            "type": "boolean",
            "description": "Visit each business's own website and harvest public contact emails and phone numbers. Adds one request per business that has a website.",
            "default": false
          },
          "maxEmailsPerPlace": {
            "title": "Max emails per business",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Cap on emails kept per business, best-ranked first.",
            "default": 3
          },
          "detectWebHost": {
            "title": "Detect web platform (WordPress, Shopify, ...)",
            "type": "boolean",
            "description": "Fetch each business website once and report what it is built on (platform) and what it runs behind (hosting/CDN). Useful for B2B segmentation by tech stack.",
            "default": false
          },
          "webHostFilter": {
            "title": "Only keep these web platforms",
            "type": "array",
            "description": "Keep only businesses whose site runs one of these. Turns detection on automatically. Non-matching leads are dropped before billing. Useful if you are an agency that only works with one stack.",
            "items": {
              "type": "string",
              "enum": [
                "WordPress",
                "WordPress.com",
                "Shopify",
                "Wix",
                "Squarespace",
                "Webflow",
                "Ghost",
                "Drupal",
                "Joomla",
                "Magento",
                "BigCommerce",
                "HubSpot CMS",
                "Duda",
                "Weebly",
                "Jimdo",
                "Google Sites",
                "WP Engine",
                "Kinsta",
                "Pantheon",
                "Vercel",
                "Netlify",
                "GitHub Pages",
                "Cloudflare Pages",
                "AWS Amplify",
                "Heroku",
                "AWS / CloudFront",
                "Cloudflare",
                "Fastly",
                "Akamai"
              ]
            }
          },
          "enableLeadScoring": {
            "title": "Score each lead (0 to 100)",
            "type": "boolean",
            "description": "Add a 0-100 score computed from signals already on the row: email on the company's own domain, business vs free mailbox, phone, website, rating, socials, description, images, attributes, complete address. Free, no extra requests.",
            "default": false
          },
          "leadScoreWeights": {
            "title": "Lead score weights (override defaults)",
            "type": "object",
            "description": "Override any subset of the defaults: emailDomainMatch (25), phonePresent (12), socialAny (10), emailPresent (8), websitePresent (8), ratingAtLeast4 (8), addressComplete (8), emailProviderBusiness (6), descriptionPresent (5), imagePresent (5), additionalInfoPopulated (5). Keys you omit keep their default."
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search term",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on places returned for each search term and location pair.",
            "default": 200
          },
          "maxResults": {
            "title": "Max results (whole run)",
            "minimum": 1,
            "type": "integer",
            "description": "Cap across the entire run.",
            "default": 1000
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google Maps interface language, which affects the text returned.",
            "default": "en"
          },
          "country": {
            "title": "Country bias",
            "type": "string",
            "description": "Two-letter country code biasing the search session.",
            "default": "us"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Parallel website-enrichment lookups.",
            "default": 8
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Google Maps blocks datacenter traffic quickly. Residential proxies are strongly recommended.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}