{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Leads & Email Finder (with Website Audit)",
    "description": "Find local businesses on Google Maps and turn them into outreach-ready leads: emails and social profiles from each website, a website audit (HTTPS, mobile, analytics, booking), and filters for rating, reviews, no-website prospects and more.",
    "version": "1.0",
    "x-build-id": "u9HURvEWa2n7drpVn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/optirefine~google-maps-leads-email-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-optirefine-google-maps-leads-email-finder",
        "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/optirefine~google-maps-leads-email-finder/runs": {
      "post": {
        "operationId": "runs-sync-optirefine-google-maps-leads-email-finder",
        "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/optirefine~google-maps-leads-email-finder/run-sync": {
      "post": {
        "operationId": "run-sync-optirefine-google-maps-leads-email-finder",
        "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": [
          "searchQueries",
          "locations"
        ],
        "properties": {
          "searchQueries": {
            "title": "What businesses to find",
            "type": "array",
            "description": "Kinds of business, the way a customer would search Google Maps: 'roofers', 'dentists', 'Italian restaurants'. Each one is searched in every location.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Where",
            "type": "array",
            "description": "Cities, neighbourhoods or regions. Include the state, province or country so Google knows which one you mean: 'Houston, TX', 'Whitby, ON', 'Manchester, UK'.",
            "items": {
              "type": "string"
            }
          },
          "maxLeads": {
            "title": "Number of leads",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "The run stops once this many leads have been saved — after all your filters. Only businesses that pass every filter count.",
            "default": 100
          },
          "searchMode": {
            "title": "Coverage",
            "enum": [
              "standard",
              "deep"
            ],
            "type": "string",
            "description": "Standard runs one Google Maps search per query and location; Google usually stops returning results somewhere between 120 and 260 businesses. Deep splits the location into a grid and searches each cell, zooming into dense areas, to find far more (several times more in a big city). Deep mode costs more Google requests but no more per lead.",
            "default": "standard"
          },
          "maxPlacesPerSearch": {
            "title": "Businesses to examine per search",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "How many businesses to look at for each query × location, before filters. This is your main cost control: raise it when strict filters (for example 'must have an email') leave you short of leads.",
            "default": 200
          },
          "enrichWebsites": {
            "title": "Find emails and social profiles on websites",
            "type": "boolean",
            "description": "Visit each business's website (homepage plus its contact, about and team pages) to find emails, extra phone numbers and social profiles, and to audit the site. Charged per website visited. Turn off for Google Maps data only.",
            "default": true
          },
          "maxPagesPerWebsite": {
            "title": "Pages to visit per website",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Homepage included. 4 covers the homepage, contact page and about/team pages on almost every small-business site; more pages rarely find more emails.",
            "default": 4
          },
          "checkEmailMx": {
            "title": "Check that email domains can receive mail",
            "type": "boolean",
            "description": "Looks up each email domain's MX records. An address whose domain cannot receive mail is never chosen as the lead's main email. This is a DNS check, not a mailbox verification.",
            "default": true
          },
          "scrapePlaceDetails": {
            "title": "Get review counts, full opening hours and descriptions",
            "type": "boolean",
            "description": "One extra Google request per business. Google leaves review counts out of about half of its search results, so without this many leads will have no review count. Required for the review-count filters.",
            "default": true
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep businesses rated at least this (decimals allowed, e.g. 4.5). Leave empty to keep everyone. Any value — even 0 — removes businesses nobody has rated yet."
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep businesses with at least this many reviews. Leave empty to keep everyone."
          },
          "maxReviews": {
            "title": "Maximum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep businesses with at most this many reviews — useful for finding small or new businesses that need marketing help. Leave empty for no limit."
          },
          "websiteFilter": {
            "title": "Website",
            "enum": [
              "any",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "'Without a website' keeps businesses whose listing has no website or only a Facebook/Instagram page, link-in-bio or directory listing — the classic prospect list for web designers.",
            "default": "any"
          },
          "skipClosed": {
            "title": "Skip permanently closed businesses",
            "type": "boolean",
            "description": "Google marks businesses that have closed for good. They are skipped unless you untick this.",
            "default": true
          },
          "requirePhone": {
            "title": "Only businesses with a phone number",
            "type": "boolean",
            "description": "Skip listings that show no phone number.",
            "default": false
          },
          "includeCategories": {
            "title": "Only these Google categories",
            "type": "array",
            "description": "Keep a business only if one of its Google categories contains one of these words (case-insensitive). 'roof' matches 'Roofing contractor'. Leave empty to keep all.",
            "items": {
              "type": "string"
            }
          },
          "excludeCategories": {
            "title": "Skip these Google categories",
            "type": "array",
            "description": "Drop a business if any of its Google categories contains one of these words, e.g. 'supplier' to skip roofing-supply shops in a roofers search.",
            "items": {
              "type": "string"
            }
          },
          "onePerWebsite": {
            "title": "One lead per website",
            "type": "boolean",
            "description": "Chains and multi-location businesses list the same website (and email) on every branch. Tick this to keep only the first branch found per website domain. Duplicates are dropped before their website is visited, so they cost nothing.",
            "default": false
          },
          "emailRequirement": {
            "title": "Email",
            "enum": [
              "none",
              "anyEmail",
              "companyEmail"
            ],
            "type": "string",
            "description": "'Must have an email' keeps only businesses where an email was found. 'Must have a company-domain email' also requires it to be on the business's own domain (info@acmeroofing.com, not acmeroofing@gmail.com). Needs website enrichment.",
            "default": "none"
          },
          "requiredSocials": {
            "title": "Must have these social profiles",
            "type": "array",
            "description": "Keep only businesses whose website links to every profile selected here.",
            "items": {
              "type": "string",
              "enum": [
                "facebook",
                "instagram",
                "linkedin",
                "twitter",
                "youtube",
                "tiktok",
                "pinterest",
                "yelp"
              ],
              "enumTitles": [
                "Facebook",
                "Instagram",
                "LinkedIn",
                "X (Twitter)",
                "YouTube",
                "TikTok",
                "Pinterest",
                "Yelp"
              ]
            }
          },
          "requiredWebsiteIssues": {
            "title": "Must have at least one of these website issues",
            "type": "array",
            "description": "Keep only businesses whose website has at least one of the selected problems — the ones your service fixes. For example, pick 'No mobile layout' and 'No HTTPS' to build a list of sites that need a rebuild.",
            "items": {
              "type": "string",
              "enum": [
                "NO_WEBSITE",
                "NO_OWN_WEBSITE",
                "FREE_SUBDOMAIN",
                "WEBSITE_UNREACHABLE",
                "WEBSITE_HTTP_ERROR",
                "PARKED_DOMAIN",
                "NO_HTTPS",
                "INVALID_SSL_CERTIFICATE",
                "NO_MOBILE_VIEWPORT",
                "NO_ANALYTICS",
                "NO_CONTACT_FORM",
                "NO_ONLINE_BOOKING",
                "OUTDATED_COPYRIGHT",
                "SLOW_HOMEPAGE"
              ],
              "enumTitles": [
                "No website at all",
                "Only a social profile, directory or link-in-bio page",
                "Free builder subdomain (e.g. acme.wixsite.com)",
                "Website unreachable",
                "Website returns an error page",
                "Domain parked or for sale",
                "No HTTPS",
                "Invalid SSL certificate",
                "No mobile layout (viewport tag)",
                "No analytics installed",
                "No contact form",
                "No online booking",
                "Copyright notice 2+ years old",
                "Homepage takes 5+ seconds"
              ]
            }
          },
          "proxyConfiguration": {
            "title": "Proxy for Google",
            "type": "object",
            "description": "Google Maps rate-limits a single IP quickly, so residential proxies are recommended — and cheap here: a search page of 20 businesses is about 24 KB. Google requests go out through US exits unless you pick a country: results depend on the searched location, not the proxy country, and US exits avoid the consent wall Google shows EU visitors.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "websiteProxyConfiguration": {
            "title": "Proxy for business websites",
            "type": "object",
            "description": "Business websites are fetched directly by default, which is fast and adds no proxy cost. Enable a proxy only if many sites block the crawler; residential proxy traffic is billed per GB.",
            "default": {
              "useApifyProxy": false
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code for Google's result text, e.g. 'en', 'de', 'es', 'pt-BR'.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country for Google formatting (optional)",
            "type": "string",
            "description": "Two-letter country code (US, GB, CA…) that tells Google how to format addresses. Results do not depend on it: Google Maps is searched by location, not by your IP's country. Leave empty."
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Websites visited in parallel. Google requests are always capped at 8 in parallel regardless.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}