{
  "openapi": "3.0.1",
  "info": {
    "title": "Lead Finder for Google Maps",
    "description": "Find local businesses on Google Maps and get CRM-ready leads: phone, website, verified company emails, socials, a 0-100 lead score and optional AI enrichment. Personal data off by default. $0.005 per lead plus platform usage. Not affiliated with, endorsed by or sponsored by Google.",
    "version": "1.0",
    "x-build-id": "FkTe3F7i6Fl3UDfyA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/entranced_gelato~google-maps-lead-engine/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-entranced_gelato-google-maps-lead-engine",
        "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/entranced_gelato~google-maps-lead-engine/runs": {
      "post": {
        "operationId": "runs-sync-entranced_gelato-google-maps-lead-engine",
        "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/entranced_gelato~google-maps-lead-engine/run-sync": {
      "post": {
        "operationId": "run-sync-entranced_gelato-google-maps-lead-engine",
        "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": "Search terms",
            "type": "array",
            "description": "Business queries to search on Google Maps, e.g. <code>dentist</code>, <code>roofing contractor</code>. Each term is searched against the location below.",
            "items": {
              "type": "string"
            }
          },
          "locationQuery": {
            "title": "Location",
            "type": "string",
            "description": "City, region, postal area, or country, e.g. <code>Malmö, Sweden</code> or <code>Austin, TX</code>. Required when using search terms."
          },
          "maxPlaces": {
            "title": "Max places",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of unique Google Maps places to open and process in this run (cost control). Filters are applied to these places, so you can get fewer leads than this. You pay only for leads saved to the dataset: $0.005 per lead on the Free plan ($0.0045 Bronze, $0.004 Silver, $0.0035 Gold and above).",
            "default": 100
          },
          "startUrls": {
            "title": "Direct Google Maps URLs (optional)",
            "type": "array",
            "description": "Google Maps search or place URLs only: <code>https://www.google.&lt;tld&gt;/maps/search/...</code> or <code>https://www.google.&lt;tld&gt;/maps/place/...</code>. Other URLs are ignored, and every Google Maps URL is checked against Google's robots.txt before it is opened. Note: a single Maps search URL may be capped at ~120 results by Google; structured location search covers more.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Skip places rated below this value (0 = no filter).",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Skip places with fewer reviews (0 = no filter).",
            "default": 0
          },
          "skipClosed": {
            "title": "Skip closed businesses",
            "type": "boolean",
            "description": "Exclude permanently or temporarily closed businesses.",
            "default": true
          },
          "categoryFilters": {
            "title": "Category filters",
            "type": "array",
            "description": "Keep only places whose Google Maps category contains one of these strings (case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "excludeCategories": {
            "title": "Exclude categories",
            "type": "array",
            "description": "Drop places whose category contains one of these strings.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Preferred results locale (hl parameter), e.g. <code>en</code>, <code>sv</code>, <code>de</code>.",
            "default": "en"
          },
          "crawlWebsite": {
            "title": "Crawl business websites",
            "type": "boolean",
            "description": "Visit each first-party business website to extract emails, phones, forms, socials, and quality signals.",
            "default": true
          },
          "maxWebsitePages": {
            "title": "Max pages per website",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Pages fetched per business website: the page from Google Maps plus the most contact-relevant pages (contact, about, imprint). 4 is enough for most small businesses; more pages cost more time.",
            "default": 4
          },
          "contactPagePriority": {
            "title": "Contact page keywords",
            "type": "array",
            "description": "Path keywords crawled first, in priority order.",
            "default": [
              "contact",
              "about",
              "team",
              "impressum",
              "kontakt"
            ],
            "items": {
              "type": "string"
            }
          },
          "discoverEmails": {
            "title": "Discover emails",
            "type": "boolean",
            "description": "Extract emails from mailto links, visible text, obfuscations, and JSON-LD.",
            "default": true
          },
          "verifyEmails": {
            "title": "Verify emails",
            "type": "boolean",
            "description": "Verify discovered emails (syntax, disposable-domain and MX checks). Included in the per-lead price.",
            "default": true
          },
          "extractSocialLinks": {
            "title": "Extract social links",
            "type": "boolean",
            "description": "Capture LinkedIn, Facebook, Instagram, YouTube, TikTok, and X profiles.",
            "default": true
          },
          "extractContactForms": {
            "title": "Extract contact forms",
            "type": "boolean",
            "description": "Capture contact form URLs as a fallback outreach path.",
            "default": true
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Obey each business website's robots.txt (recommended): the rules for <code>AIDevsBot</code> apply if the site has them, otherwise those for all crawlers, and disallowed pages are never fetched. A robots.txt that answers 401/403, or can't be read (429, server error, timeout), counts as \"disallow everything\" for the run. Turn this off only for sites you own or have permission to crawl. Google Maps URLs are always checked against Google's robots.txt, whatever this setting. Sites that answer with a CAPTCHA, login wall or block page are always skipped, never worked around.",
            "default": true
          },
          "includePersonalData": {
            "title": "Include personal data (named people)",
            "type": "boolean",
            "description": "Off by default: you get company contacts only (role-based emails such as info@, sales@ or kontakt@, phones, contact forms and company social profiles). Turn on to also get named people's details: personal-looking emails (e.g. firstname.lastname@ or initials), names from team and imprint pages or structured data, and personal LinkedIn profiles. GDPR: only turn this on if you have a lawful basis to process personal data (e.g. legitimate interest), and respect opt-outs and objections. The output always shows how many personal emails were found.",
            "default": false
          },
          "enableAiEnrichment": {
            "title": "Enable AI enrichment",
            "type": "boolean",
            "description": "Off by default. Adds niche, website quality, opportunity tags, a personalization hook and an AI lead score to each lead; with \"Built-in heuristics\" this is rule-based and free. AI output is labelled with <code>aiGenerated</code>, <code>aiModel</code>, <code>aiGeneratedAt</code>, <code>aiDigitalSourceType</code> and <code>aiNotice</code> (EU AI Act: AIDevs is the provider of this AI feature, you are the deployer); keep the label if you publish AI text. While personal data is off, email addresses and phone numbers are masked before any text is sent to an AI model.",
            "default": false
          },
          "aiProvider": {
            "title": "AI provider",
            "enum": [
              "none",
              "anthropic",
              "openai",
              "openrouter",
              "apify"
            ],
            "type": "string",
            "description": "Who writes the enrichment. Built-in heuristics: free rule-based scoring, nothing leaves the run. Anthropic, OpenAI or OpenRouter: your own key; the text goes straight to that provider and this Actor charges nothing for AI. Apify AI gateway: no key; the text goes to Apify's OpenRouter Actor, then OpenRouter, then the model provider, and Apify may bill the model's usage to your Apify account separately at OpenRouter's rates (free-plan accounts pay more and may be blocked). The gateway's \"AI-enriched lead\" price starts after Apify's 14-day notice (the start date is shown in the Pricing tab); until then this option uses the free built-in rules and says so. If you choose a model, you also accept that model provider's terms and acceptable-use policy.",
            "default": "none"
          },
          "aiModel": {
            "title": "AI model",
            "type": "string",
            "description": "Model id. Apify AI gateway: only <code>openai/...</code> and <code>anthropic/...</code> models, no <code>:free</code> or stealth variants; anything else falls back to the default <code>openai/gpt-4o-mini</code> with a status message. Your own key: the provider's model id, e.g. <code>gpt-4o-mini</code>, <code>claude-haiku-4-5-20251001</code> or, for OpenRouter, <code>anthropic/claude-haiku-4.5</code>. Leave empty for the default. If you choose a model, you also accept that model provider's terms and acceptable-use policy."
          },
          "aiApiKey": {
            "title": "Your AI provider API key",
            "type": "string",
            "description": "Only for Anthropic, OpenAI or OpenRouter: an Anthropic Console API key (not a Claude.ai login), an OpenAI key (use a dedicated OpenAI project key with a spending limit) or an OpenRouter key. It's used only inside your run, sent only to that provider, and never stored or logged; you're responsible for following the provider's terms. Not needed for the built-in heuristics or the Apify AI gateway."
          },
          "aiPromptProfile": {
            "title": "Enrichment profile",
            "enum": [
              "sales-outreach",
              "local-seo",
              "market-research",
              "generic"
            ],
            "type": "string",
            "description": "Tunes AI outputs to your use case.",
            "default": "sales-outreach"
          },
          "maxAiEnrichments": {
            "title": "Max AI enrichments per run",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of AI model calls per run (cost control). Further leads get the free built-in heuristics.",
            "default": 500
          },
          "includeAiRationale": {
            "title": "Include AI score rationale",
            "type": "boolean",
            "description": "Include the reasoning behind lead quality scores in output.",
            "default": true
          },
          "requireWebsite": {
            "title": "Require website",
            "type": "boolean",
            "description": "Keep only businesses that have a website.",
            "default": false
          },
          "requireEmailOrForm": {
            "title": "Require email or contact form",
            "type": "boolean",
            "description": "Keep only businesses with at least one direct outreach path.",
            "default": false
          },
          "minLeadQualityScore": {
            "title": "Minimum lead quality score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Drop leads scoring below this composite score (0 = keep all).",
            "default": 0
          },
          "excludeDomains": {
            "title": "Exclude domains",
            "type": "array",
            "description": "Skip businesses whose website is on these domains (chains, directories, aggregators).",
            "items": {
              "type": "string"
            }
          },
          "batchId": {
            "title": "Batch ID",
            "type": "string",
            "description": "Optional identifier for multi-run orchestration; echoed on every record."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POSTs the run summary JSON (counts and status, no leads) here when the run finishes. Stored encrypted like a password, because webhook URLs often contain tokens."
          },
          "includeRawHtml": {
            "title": "Include raw HTML samples",
            "type": "boolean",
            "description": "Keep raw page text samples for debugging (increases output size).",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies for Google Maps and website crawling. Uses Apify's standard datacenter proxies. Residential and custom proxies aren't supported.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}