{
  "openapi": "3.0.1",
  "info": {
    "title": "AI-Verified Local Business Lead",
    "description": "a\"Stop paying for rows — start paying for leads that answer the phone.\" AI audits each business (website, speed, booking, reviews), verifies decision-maker contacts, scores them against your ideal customer profile, and drafts a personalised opener. Pay only for qualifying leads — first 50 free.",
    "version": "0.0",
    "x-build-id": "ZvCda77Zh4HVybLw3"
  },
  "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).",
            "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.",
            "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>."
          },
          "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."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}