{
  "openapi": "3.0.1",
  "info": {
    "title": "Local Business Leads - AI Website Audit & Verified Emails",
    "description": "First 50 leads free. Local business leads from Google Maps with a website health audit, verified emails, the owner's name, an AI fit score and a personalised opener. Pay only for leads that qualify: $0.01 each, $0.04 with AI.",
    "version": "0.2",
    "x-build-id": "TO7vrevq6Enaclhlt"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~local-business-lead/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-local-business-lead",
        "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/rich_minds~local-business-lead/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-local-business-lead",
        "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/rich_minds~local-business-lead/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-local-business-lead",
        "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": [
          "sourceMode"
        ],
        "properties": {
          "campaignPreset": {
            "title": "Campaign preset (optional)",
            "enum": [
              "custom",
              "web-agency-no-website",
              "web-agency-redesign",
              "booking-saas",
              "paid-ads-agency",
              "reputation-management",
              "local-seo",
              "whatsapp-commerce"
            ],
            "type": "string",
            "description": "Start from a ready-made campaign: it fills the search terms, ideal customer, offer, filters and target opportunities below - anything you type yourself always wins. <b>Custom</b> = use only what you enter.",
            "default": "custom"
          },
          "sourceMode": {
            "title": "Where do the leads come from?",
            "enum": [
              "googleMaps",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>googleMaps</b> — search Google Maps for you (runs the Google Maps Scraper on your account, its usage is billed separately). <b>dataset</b> — enrich an existing Apify dataset from any Google Maps scraper run. <b>list</b> — enrich a list of businesses you paste in (name / website / phone). <b>Bring your own data:</b> pasted leads or a dataset ID, and you pay only for the analysis — the source Actor is never run.",
            "default": "googleMaps"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Business types to search on Google Maps, one per line. Example: <code>dentist</code>, <code>roofing contractor</code>, <code>yoga studio</code>. Left empty with a preset selected = the preset's terms.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, region or country to search in. Example: <code>Austin, TX</code>, <code>Chennai, India</code>, <code>Greater Manchester, UK</code>."
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search term",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "How many places to pull from Google Maps for each search term before filtering. More places = more discovery cost, more candidates.",
            "default": 60
          },
          "language": {
            "title": "Google Maps language",
            "type": "string",
            "description": "Language code for Google Maps results (affects category names).",
            "default": "en"
          },
          "skipClosedPlaces": {
            "title": "Skip closed businesses",
            "type": "boolean",
            "description": "Drop permanently or temporarily closed places.",
            "default": true
          },
          "maxReviewsPerPlace": {
            "title": "Google reviews per place (reputation audit)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Pull this many <b>lowest-rated</b> Google reviews per place (text, stars, date, whether the owner replied - no reviewer data). Enables the <code>recent_negative_reviews</code> / <code>unanswered_negative_reviews</code> flags and, with AI on, a summary of recurring complaints per lead. Needs the place detail page, so the Google Maps scraper run costs a little more. 0 = off.",
            "default": 0
          },
          "discoveryActorId": {
            "title": "Google Maps scraper Actor (advanced)",
            "type": "string",
            "description": "Actor used for discovery in <b>googleMaps</b> mode. Default is the most-used Google Maps Scraper on Apify. Any Actor that outputs Google Maps places with <code>title</code>, <code>website</code>, <code>phone</code>, <code>address</code> fields works.",
            "default": "compass/crawler-google-places"
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max discovery spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the Google Maps scraper run may charge your account in <b>googleMaps</b> mode. Leave empty for no cap. Typical: 1,000 places ≈ $1.5–4."
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode. An Apify dataset on your account containing Google Maps places (from any scraper run). Pick it here so the Actor is granted read access to it."
          },
          "leadsList": {
            "title": "Businesses to enrich",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of objects. Recognised keys: <code>name</code>, <code>website</code>, <code>phone</code>, <code>address</code>, <code>city</code>, <code>countryCode</code>, <code>category</code>, <code>rating</code>, <code>reviewCount</code>."
          },
          "defaultCountryCode": {
            "title": "Default country code",
            "type": "string",
            "description": "Two-letter country code used to normalise phone numbers when a lead has no country (dataset / list modes).",
            "default": "US"
          },
          "icpDescription": {
            "title": "Ideal customer profile",
            "type": "string",
            "description": "Describe who you want to sell to. The AI scores every lead against this. Example: <i>Independent dental clinics with 4+ stars and 20+ reviews that do not offer online booking, owner-operated, not part of a chain.</i>"
          },
          "serviceOffered": {
            "title": "What you sell",
            "type": "string",
            "description": "One or two sentences on your offer. Used to judge fit and to write the outreach opener. Example: <i>We build conversion-focused websites with online booking for local service businesses, live in 14 days.</i>"
          },
          "minRating": {
            "title": "Minimum Google rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Drop places rated below this (0 = no filter).",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Drop places with fewer reviews than this (0 = no filter).",
            "default": 0
          },
          "websiteFilter": {
            "title": "Website presence",
            "enum": [
              "any",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "Keep all places, only those with a website, or only those <b>without</b> one (great for web agencies).",
            "default": "any"
          },
          "targetFlags": {
            "title": "Target opportunities (any of)",
            "type": "array",
            "description": "Only deliver leads that have at least one of these audit findings, and rank leads with more of them higher. Leave empty to keep every lead. Available: <code>no_website</code>, <code>website_unreachable</code>, <code>no_ssl</code>, <code>no_mobile_viewport</code>, <code>slow_website</code>, <code>no_email_found</code>, <code>no_online_booking</code>, <code>no_chat_widget</code>, <code>no_whatsapp</code>, <code>no_analytics</code>, <code>no_ads_pixel</code>, <code>no_social_presence</code>, <code>weak_social_presence</code>, <code>site_builder_template</code>, <code>low_rating</code>, <code>few_reviews</code>, <code>unclaimed_listing</code>, <code>recent_negative_reviews</code>, <code>unanswered_negative_reviews</code>.",
            "items": {
              "type": "string"
            }
          },
          "requireEmail": {
            "title": "Require an email address",
            "type": "boolean",
            "description": "Only output leads with an email address (see the quality level below). Leads without a website can never pass this filter.",
            "default": false
          },
          "minEmailQuality": {
            "title": "Email quality required",
            "enum": [
              "any",
              "verified",
              "direct"
            ],
            "type": "string",
            "description": "Applies when <b>Require an email address</b> is on. <b>Any</b> - any address found. <b>Verified</b> - domain accepts mail (MX) or the mailbox verifier said valid / catch-all. <b>Direct</b> - a named person on the business's own domain (e.g. <code>jane@brightsmile.com</code>, never <code>info@</code>), verified - it reaches a person rather than a shared inbox.",
            "default": "any"
          },
          "minLeadScore": {
            "title": "Minimum lead score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Leads scoring below this are discarded and <b>not charged</b>.",
            "default": 50
          },
          "suppressionList": {
            "title": "Do-not-contact list",
            "type": "array",
            "description": "Domains, emails, phone numbers or exact business names to never output - existing customers, competitors, opt-outs. One per line. Suppressed businesses are skipped before any crawling and never charged.",
            "items": {
              "type": "string"
            }
          },
          "enrichWebsite": {
            "title": "Crawl each website for contacts & signals",
            "type": "boolean",
            "description": "Visit the business website (home + contact/about pages) for emails, phones, WhatsApp, social profiles, decision-maker names, tech stack, tracking & ad pixels, online booking, chat widgets, hiring signals and a homepage speed check. This is the digital health audit.",
            "default": true
          },
          "maxPagesPerSite": {
            "title": "Max pages per website",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Homepage plus up to this many contact/about pages.",
            "default": 3
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages the site's robots.txt disallows.",
            "default": true
          },
          "verifyEmails": {
            "title": "Verify email domains (MX check)",
            "type": "boolean",
            "description": "Check that each email's domain can actually receive mail. Cheap and removes obviously dead addresses.",
            "default": true
          },
          "emailVerifier": {
            "title": "Mailbox verification service (optional)",
            "enum": [
              "none",
              "millionverifier",
              "neverbounce"
            ],
            "type": "string",
            "description": "Mailbox-level verification with <b>your own</b> MillionVerifier or NeverBounce account, on top of the free MX check. At most 2 addresses per lead (best direct + best generic) are checked, so a lead costs you at most 2 verifier credits. Results land in <code>emails[].verification</code> (valid / invalid / catch_all / disposable / unknown).",
            "default": "none"
          },
          "emailVerifierApiKey": {
            "title": "Mailbox verifier API key",
            "type": "string",
            "description": "Required when a verification service is selected. Stored encrypted by Apify, never logged."
          },
          "excludeFreeEmailProviders": {
            "title": "Ignore free-provider emails",
            "type": "boolean",
            "description": "Drop gmail / yahoo / hotmail style addresses (useful for GDPR-conscious B2B outreach).",
            "default": false
          },
          "enableAi": {
            "title": "AI qualification & outreach opener",
            "type": "boolean",
            "description": "Score each lead against your ICP, explain why, list pain points, summarise recurring review complaints, confirm the decision-maker and write a personalised opener (+ subject line for email). Off = rule-based audit and scoring only (cheaper).",
            "default": true
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates (≈ $0.005–0.01 per lead). <b>My own key</b> — use your OpenAI / Anthropic / Gemini / Groq key instead. A free-tier key assesses 1–3 leads per run before its rate limit (the rest keep their rule score); a paid key (billing on) assesses every lead.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (Claude Haiku 4.5 — best cost/quality for this task). Apify mode takes an OpenRouter slug such as <code>anthropic/claude-haiku-4.5</code>, <code>openai/gpt-4.1-mini</code>, <code>google/gemini-3.6-flash</code>. Own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>; left empty there, the model matches your key (Gemini key → <code>google:gemini-3.5-flash-lite</code>, Groq → <code>groq:openai/gpt-oss-120b</code>, Anthropic → Claude Haiku 4.5, OpenAI → <code>openai:gpt-4.1-mini</code>)."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "outreachChannel": {
            "title": "Outreach channel",
            "enum": [
              "email",
              "sms",
              "whatsapp",
              "dm",
              "call"
            ],
            "type": "string",
            "description": "The opener is written for this channel. Email also gets a subject line. If a decision-maker was found, the opener addresses them by first name.",
            "default": "email"
          },
          "outreachTone": {
            "title": "Outreach tone",
            "enum": [
              "friendly",
              "professional",
              "direct"
            ],
            "type": "string",
            "description": "Voice of the generated opener.",
            "default": "friendly"
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (× max qualified leads)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many of the best-contactability candidates get the AI pass, as a multiple of <b>Max qualified leads</b>. 2 = assess up to 2× the cap so the score filter still has room. Higher = more thorough, slower.",
            "default": 2
          },
          "maxQualifiedLeads": {
            "title": "Max qualified leads to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results (and therefore on what you pay for). The best-scoring leads are output first.",
            "default": 100
          },
          "maxLeadsToProcess": {
            "title": "Max candidates to enrich",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many places are enriched/scored in one run (controls run time). Default = 3 × max qualified leads."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same lead twice",
            "type": "boolean",
            "description": "Remembers every lead you were charged for (in a named key-value store on your account) and skips it in future runs.",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Use different names for different campaigns.",
            "default": "local-leads-seen"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified leads are POSTed here as JSON (Zapier, Make, n8n, Smartlead, Instantly, your CRM). For Google Sheets / HubSpot / Slack you can also use Apify's built-in Integrations tab."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code> or an API-key header."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1 = one POST per lead (<code>{event: \"lead.qualified\", lead: {…}}</code>) the moment it is ready. Higher = one POST per N leads (<code>{event: \"leads.qualified\", leads: [...]}</code>).",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy for website crawling",
            "type": "object",
            "description": "Apify Proxy is recommended so website crawling is not blocked."
          },
          "crawlConcurrency": {
            "title": "Websites crawled in parallel (advanced)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many website pages are fetched at the same time. Higher = faster enrichment of large runs, but more memory; the run always stops crawling in time to deliver its leads before the timeout.",
            "default": 20
          },
          "discoveryTimeoutSecs": {
            "title": "Google Maps search timeout (seconds, API only)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "Longest the Google Maps scraper run may take before its places are read. It is always cut to leave time to crawl, assess and deliver the leads before this run's own timeout.",
            "default": 3600
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}