{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper — Local Leads & Emails",
    "description": "Google Maps scraper for local lead generation: phone, address, rating, hours and Maps URL. Optional website emails and decision-maker enrichment. Country sweep (IT, FR, DE, ES, GB, NL, BE, PT, US). Pay per business; contacts billed only when found. No proxy setup.",
    "version": "0.1",
    "x-build-id": "XJ3ecGLOAsex0gDRx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pequod-labs~google-maps-local-leads/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pequod-labs-google-maps-local-leads",
        "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/pequod-labs~google-maps-local-leads/runs": {
      "post": {
        "operationId": "runs-sync-pequod-labs-google-maps-local-leads",
        "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/pequod-labs~google-maps-local-leads/run-sync": {
      "post": {
        "operationId": "run-sync-pequod-labs-google-maps-local-leads",
        "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",
            "maxItems": 20,
            "type": "array",
            "description": "Business types or keywords to find on Maps — e.g. <code>restaurants</code>, <code>idraulico</code>, <code>dental clinic</code>. Up to 20 terms per run; each term is searched across the grid covering your area.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "Location (city or address)",
            "type": "string",
            "description": "Human-readable area to search — e.g. <code>Milan, Italy</code> or <code>Alba CN, Italy</code>. Use this <b>or</b> latitude/longitude below, not both."
          },
          "latitude": {
            "title": "Latitude",
            "type": "number",
            "description": "Center latitude when you already have coordinates. Requires <code>longitude</code> too."
          },
          "longitude": {
            "title": "Longitude",
            "type": "number",
            "description": "Center longitude when you already have coordinates. Requires <code>latitude</code> too."
          },
          "radiusKm": {
            "title": "Search radius (km)",
            "minimum": 0.1,
            "maximum": 50,
            "type": "number",
            "description": "Radius around the center point. Larger areas need more upstream queries; capped at 50 km.",
            "default": 5
          },
          "countryCode": {
            "title": "Country",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter ISO country for Maps results (e.g. <code>it</code>, <code>de</code>, <code>us</code>).",
            "default": "it"
          },
          "languageCode": {
            "title": "Language (optional)",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter interface language for Maps (e.g. <code>it</code>, <code>en</code>). Defaults from country when omitted."
          },
          "maxPlaces": {
            "title": "Max businesses to deliver",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper bound on billable businesses pushed to the dataset.",
            "default": 100
          },
          "queryBudgetMultiplier": {
            "title": "Query budget multiplier",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Raises the upstream Maps query cap for a given maxPlaces (1–10). Queries within the default allowance (multiplier 3) are covered by place-scraped. Extra Maps searches above that allowance bill a maps-query event. Does NOT change place-scraped billing. If RUN_SUMMARY.queryBudgetExhausted is true, rerun with queryBudgetMultiplier = RUN_SUMMARY.suggestedQueryBudgetMultiplier (same input otherwise — a sweep resumes from the saved cursor).",
            "default": 3
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Skip businesses below this Google rating (0–5). Leave empty for no filter."
          },
          "websiteFilter": {
            "title": "Website filter",
            "enum": [
              "any",
              "has",
              "none"
            ],
            "type": "string",
            "description": "<b>any</b>: all businesses. <b>has</b>: only with a website listed on Maps. <b>none</b>: only businesses <i>without</i> a website — ideal for web agencies prospecting shops that need a site.",
            "default": "any"
          },
          "excludeNameKeywords": {
            "title": "Exclude name keywords",
            "type": "array",
            "description": "Drop listings whose name contains any of these keywords (case-insensitive substring). Excluded places are <b>not billed</b> — no <code>place-scraped</code> event. Example: academy, software.",
            "items": {
              "type": "string"
            }
          },
          "excludeDomains": {
            "title": "Exclude website domains",
            "type": "array",
            "description": "Drop listings whose website host matches any of these domains (or a subdomain). Excluded places are <b>not billed</b> — no <code>place-scraped</code> event. Example: dsv.com, ups.com, postnl.nl.",
            "items": {
              "type": "string"
            }
          },
          "excludeCategories": {
            "title": "Exclude Maps categories",
            "type": "array",
            "description": "Drop listings whose Maps category matches any of these keywords (case-insensitive substring on <code>category</code> and each item in <code>categories</code>). Excluded places are <b>not billed</b> — no <code>place-scraped</code> event. Example: software, grocery delivery, logistics. Use this when the name does not contain the unwanted word (e.g. a listing typed as Softwarebedrijf).",
            "items": {
              "type": "string"
            }
          },
          "enrichWebsiteContacts": {
            "title": "Extract website contacts",
            "type": "boolean",
            "description": "When enabled, visits each business website and extracts public emails, phone numbers, and social profile links (socialLinks). Billed as an extra event per business only when an email or phone is found (in addition to the place-scraped event); social links alone are free.",
            "default": false
          },
          "findDecisionMaker": {
            "title": "Find the decision maker",
            "type": "boolean",
            "description": "When enabled, runs the decision-maker waterfall on each business website (up to <code>maxDecisionMakers</code> sites with a website). Expect <b>~30–60 seconds per business</b> — much slower than listing-only mode. Each attempt bills <code>dm-lookup</code>; a named decision maker with a verified contact email also bills <code>decision-maker</code>. Requires server-side API keys configured on the actor.",
            "default": false
          },
          "targetPersona": {
            "title": "Target persona (optional)",
            "maxLength": 120,
            "type": "string",
            "description": "Persona preset for decision-maker search, e.g. <code>founder_ceo</code>, <code>sales_leader</code>, <code>ops_logistics</code>. Defaults to founder/CEO when omitted."
          },
          "maxDecisionMakers": {
            "title": "Max decision-maker lookups",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap on how many businesses with a website receive a decision-maker lookup this run (max 500). Each attempt bills <code>dm-lookup</code>. Businesses beyond the cap are still delivered without DM fields.",
            "default": 50
          },
          "countrySweep": {
            "title": "Country sweep mode",
            "type": "boolean",
            "description": "When enabled, scrapes an entire supported country locality-by-locality using bundled GeoNames data. Do not set locationQuery or coordinates. Optionally restrict the sweep with <code>sweepRegions</code>, <code>sweepProvinces</code>, and/or <code>sweepLocalities</code> (union: a locality matches if it hits any selected value). Each run delivers up to maxPlaces; progress is saved in a named key-value store so the next run with the same searchTerms, country, and geographic selection resumes without double-charging previously delivered places.",
            "default": false
          },
          "sweepRegions": {
            "title": "Sweep regions (admin1)",
            "maxItems": 100,
            "type": "array",
            "description": "Optional GeoNames admin1 / region names to include (e.g. <code>[\"Lombardy\", \"Tuscany\"]</code> or native names like <code>[\"Lombardia\", \"Toscana\"]</code> for Italy, <code>[\"California\"]</code> for the US). Matching is case- and accent-insensitive; native official names are accepted alongside GeoNames labels. Combined with provinces and localities as a <b>union</b>. Requires <code>countrySweep=true</code>. Each distinct selection keeps its own resumable state store.",
            "items": {
              "type": "string"
            }
          },
          "sweepProvinces": {
            "title": "Sweep provinces / counties (admin2)",
            "maxItems": 100,
            "type": "array",
            "description": "Optional GeoNames admin2 names — Italian provinces/metropolitan cities (e.g. <code>[\"Milano\"]</code> or <code>[\"Città metropolitana di Milano\"]</code>, <code>[\"Cuneo\"]</code> for Provincia di Cuneo) or US counties (e.g. <code>[\"Los Angeles\"]</code> or <code>[\"Los Angeles County\"]</code>). Administrative prefixes and trailing <code>County</code> are ignored during matching. Case- and accent-insensitive. Union semantics with regions and localities. Requires <code>countrySweep=true</code>.",
            "items": {
              "type": "string"
            }
          },
          "sweepLocalities": {
            "title": "Sweep municipalities / towns",
            "maxItems": 100,
            "type": "array",
            "description": "Optional locality (municipality) names from the bundled GeoNames dataset (e.g. <code>[\"Alba\", \"Bra\"]</code>). Homonyms are all included. Matching is case- and accent-insensitive. Union semantics with regions and provinces. Requires <code>countrySweep=true</code>.",
            "items": {
              "type": "string"
            }
          },
          "startFromLocality": {
            "title": "Start from locality",
            "type": "string",
            "description": "Optional locality name to jump the sweep cursor to (case-insensitive match against the active locality list, after any geo filters). When set, always overrides the saved cursor for this run — useful to retry or prioritize a town without waiting for earlier ones."
          },
          "sweepStateName": {
            "title": "Sweep state store name (optional)",
            "maxLength": 20,
            "type": "string",
            "description": "Optional label (1–20 chars: lowercase letters, digits, hyphens; must start alphanumeric) appended to the named key-value store id. Use this to start a sweep from scratch WITHOUT deleting the key-value store by hand; a new store name resets charge-dedup and already-delivered places will be re-billed if rediscovered. Requires <code>countrySweep=true</code>. Leave empty to resume the default store for your searchTerms, country, and geo selection. To RESUME (not restart) a sweep — including after queryBudgetExhausted — rerun with the same input; do not change sweepStateName."
          },
          "sweepMinPopulation": {
            "title": "Minimum locality population",
            "minimum": 500,
            "maximum": 1000000,
            "type": "integer",
            "description": "Skip localities below this population threshold during country sweep.",
            "default": 1000
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}