{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Leads & Emails Scraper (Website Check)",
    "description": "Scrape Google Maps business leads with phone, address, website, rating, reviews and opening hours. Each site is checked (missing, dead, parked, no HTTPS, not mobile-ready) and scored with reasons, and optional business emails and socials come from its own site. No login. $1.50 per 1,000 places.",
    "version": "0.1",
    "x-build-id": "FMGrLir5aCOsjAVCe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/locaihost~google-maps-leads/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-locaihost-google-maps-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/locaihost~google-maps-leads/runs": {
      "post": {
        "operationId": "runs-sync-locaihost-google-maps-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/locaihost~google-maps-leads/run-sync": {
      "post": {
        "operationId": "run-sync-locaihost-google-maps-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",
        "properties": {
          "searchTerms": {
            "title": "What to search for",
            "type": "array",
            "description": "Business types to search on Google Maps, e.g. \"dentist\", \"plumber\", \"law firm\". Every term is searched in every location below.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Where to search",
            "type": "array",
            "description": "Towns, cities or areas, e.g. \"Austin, TX\", \"Leeds, UK\". Each is looked up on Google Maps first.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerQuery": {
            "title": "Max businesses per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Google stops at about 120 results for one search in one place. To cover a big city, split it into several smaller locations.",
            "default": 10
          },
          "checkWebsites": {
            "title": "Check each business's website ($)",
            "type": "boolean",
            "description": "Fetch each website and report HTTPS, mobile-readiness, speed, CMS, footer copyright year, SSL expiry, DMARC and email provider. This is what produces the lead score. Businesses with no website are never charged a check.",
            "default": true
          },
          "websiteCheckSample": {
            "title": "Price first: check only a random sample of websites",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "0 (the default) checks every website. Set 10–500 to check only that many websites, picked at random (the same search always picks the same ones). The run then returns and charges ONLY those businesses, one place plus one website check each, so its price is known before it starts. It reports how many of them are hits, the estimated hits in the whole list and what the full run would cost. Businesses with no website or only a social page are counted, not returned. Needs website checks on; onlyNew is ignored.",
            "default": 0
          },
          "sampleSeed": {
            "title": "Sample seed (optional)",
            "type": "string",
            "description": "Leave empty and the same search always picks the same random sample. Enter any word or number to draw a different random sample of the same search; the same seed always gives the same sample again."
          },
          "includeContacts": {
            "title": "Add contact details from each business's own website ($)",
            "type": "boolean",
            "description": "Off by default. Needs website checks on. Reads the homepage the check already fetched plus at most 2 more pages on the same site (the contact page, then the about page, found from its links; robots.txt is respected) and adds emails (shared business mailboxes such as info@ or bookings@ only; addresses that look like a person's are dropped), Facebook, Instagram, LinkedIn company, X, TikTok and YouTube links, and the contact page URL. Charged as one contact-details event per business, only when its website gives at least one email or social profile.",
            "default": false
          },
          "leadProfile": {
            "title": "Score leads for",
            "enum": [
              "web-design",
              "seo",
              "email-security",
              "local-marketing"
            ],
            "type": "string",
            "description": "Which problems count as a reason to call. The same business scores differently for different sellers: a missing DMARC record matters to an IT provider and not to a web designer.",
            "default": "web-design"
          },
          "websiteFilter": {
            "title": "Only return businesses whose website is…",
            "enum": [
              "any",
              "none",
              "has",
              "problem"
            ],
            "type": "string",
            "description": "\"A problem\" covers no website, social-only, unreachable, parked, broken or no HTTPS — the ones worth calling.",
            "default": "any"
          },
          "maxReviewsPerPlace": {
            "title": "Reviews per business",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Also return up to this many Google reviews for each business, one row each (charged per review), and add a review summary to its row: star breakdown, review topics, owner reply rate and the average rating of the last 90 days. 0 (the default) reads no reviews and leaves every row exactly as before. Up to 5,000.",
            "default": 0
          },
          "reviewsSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "most-relevant",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "Which reviews come first. Newest first suits \"since\" dates and schedules.",
            "default": "newest"
          },
          "reviewsSince": {
            "title": "Only reviews since (optional)",
            "type": "string",
            "description": "A date like 2026-01-31, or a span like \"30 days\", \"3 months\" or \"1 year\". With newest first, reading stops at the first older review, so you pay for nothing older."
          },
          "reviewRatings": {
            "title": "Only these star ratings (optional)",
            "type": "array",
            "description": "e.g. 1 and 2 for complaints only. Leave empty for every rating. Pair with \"Lowest rating first\" so reading stops at the first higher rating.",
            "items": {
              "type": "string"
            }
          },
          "includeReviewerNames": {
            "title": "Include reviewer display names",
            "type": "boolean",
            "description": "Off by default: review rows carry no reviewer name. On adds the public display name only, never profile links or photos.",
            "default": false
          },
          "minRating": {
            "title": "Minimum Google rating (optional)",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Leave out businesses rated below this many stars, e.g. 4.5. Businesses with no rating yet are left out too. Applied before any website is checked, so a business it drops costs nothing."
          },
          "categoryFilter": {
            "title": "Only these categories (optional)",
            "type": "array",
            "description": "Keep only businesses with a Google category containing one of these words, e.g. \"dentist\" keeps \"Dentist\" and \"Cosmetic dentist\" but not \"Dental clinic\". Not case-sensitive. Google returns nearby businesses of other kinds for many searches; this drops them before any website is checked, so they cost nothing.",
            "items": {
              "type": "string"
            }
          },
          "skipClosed": {
            "title": "Skip permanently closed businesses",
            "type": "boolean",
            "description": "Closed businesses are never a lead.",
            "default": true
          },
          "onlyNew": {
            "title": "Only businesses new since the last run",
            "type": "boolean",
            "description": "Remembers what this saved task already returned, so a daily or weekly schedule becomes a new-business radar. Off by default so the first run returns everything.",
            "default": false
          },
          "excludePlaceIds": {
            "title": "Already have these places (optional)",
            "type": "array",
            "description": "Businesses you already have: they are never returned and never charged. Accepts Google place IDs (\"ChIJ…\"), CIDs and feature IDs (\"0x…:0x…\"). Paste the placeId or cid column of an earlier export.",
            "items": {
              "type": "string"
            }
          },
          "excludeUrls": {
            "title": "Already have these Google Maps links (optional)",
            "type": "array",
            "description": "Google Maps place links for businesses you already have (google.com/maps/place/… with a data part, or ?cid=… links). Never returned, never charged. Short maps.app.goo.gl links need a lookup to read, so use place IDs for those.",
            "items": {
              "type": "string"
            }
          },
          "skipPreviouslyReturned": {
            "title": "Skip businesses any earlier run returned",
            "type": "boolean",
            "description": "Remembers every business this run returns under the memory name below and skips them in later runs, whatever those runs searched for. Works across tasks that share the memory name, so overlapping lists never charge you twice. Off by default.",
            "default": false
          },
          "memoryName": {
            "title": "Memory name",
            "type": "string",
            "description": "Runs with the same name share one list of returned businesses. Leave empty to use one shared list called \"default\".",
            "default": "default"
          },
          "placeIds": {
            "title": "Place IDs (optional)",
            "type": "array",
            "description": "Look up these exact businesses instead of, or as well as, searching. Accepts Google place IDs (\"ChIJ…\"), CIDs (the number in a ?cid= link) and feature IDs (\"0x…:0x…\"). Each place is checked and scored like a search result and charged the same. A place Google has no listing for is skipped and not charged.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Google Maps place links (optional)",
            "type": "array",
            "description": "Links to businesses on Google Maps, as copied from the browser or the Share button (google.com/maps/place/…, maps.app.goo.gl/…, ?cid=… links). Search links (google.com/maps/search/…) are not read: put the words in \"What to search for\" and the area in \"Where to search\" instead.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "language": {
            "title": "Results language",
            "type": "string",
            "description": "Two-letter language code used for Google's result text.",
            "default": "en"
          },
          "countryCode": {
            "title": "Search from country",
            "type": "string",
            "description": "Two-letter country code Google searches from, e.g. \"us\", \"gb\", \"sg\". Affects which results are shown.",
            "default": "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}