{
  "openapi": "3.0.1",
  "info": {
    "title": "Local Business Leads",
    "description": "Local business leads by category and city: MX-verified business emails, phones, lead score. Dentist leads, chiropractor, med spa, salon, roofing, plumber, law firm and restaurant leads. Lead gen scraper, business email search, small business leads. Local business email scraper from website lists.",
    "version": "0.1",
    "x-build-id": "jrigNlnLnaLSxuaPe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/flash_scraper~local-business-leads/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-flash_scraper-local-business-leads",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/flash_scraper~local-business-leads/runs": {
      "post": {
        "operationId": "runs-sync-flash_scraper-local-business-leads",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/flash_scraper~local-business-leads/run-sync": {
      "post": {
        "operationId": "run-sync-flash_scraper-local-business-leads",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "category",
          "location"
        ],
        "properties": {
          "category": {
            "title": "Custom category",
            "type": "string",
            "description": "Business type in plain English, e.g. medspa or HVAC contractor; a comma list = several. Unmapped terms fall back to a name match. No match: 0 rows, no leads billed. categorySelect/categories win.",
            "default": "dentist"
          },
          "location": {
            "title": "Custom location",
            "type": "string",
            "description": "City with region or country, e.g. Austin, Texas or Lyon, France; case and commas are forgiving. Use locations for several cities. Not found: 0 rows, no leads billed. citySelect/locations win.",
            "default": "Austin, Texas"
          },
          "maxItems": {
            "title": "Max businesses",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Businesses to deliver and bill, 1 to 10,000, shared across categories and cities. Form starts at 25; omitted = 100. No-email rows bill unless an email filter is on. ~1,300-2,000 per hour; more is cut.",
            "default": 100
          },
          "onlyWithEmail": {
            "title": "Email required",
            "type": "boolean",
            "description": "Deliver and bill only businesses with a found email; a guessed email_guess never counts. Over-fetches 6-24x maxItems (max 30,000 candidates) to fill maxItems: that bounds the crawl, not your bill.",
            "default": false
          },
          "requireAnyContact": {
            "title": "At least one way to contact them",
            "type": "boolean",
            "description": "Drop businesses with no phone, no email and no social profile, before billing (about half of an unfiltered run). On unless you send false; the Console form pre-ticks it."
          },
          "onlyNewBusinesses": {
            "title": "Only new businesses since the last run",
            "type": "boolean",
            "description": "For schedules: the first run of a watch (same search and filters) is the baseline and delivers all; later runs deliver and bill only businesses not delivered before. Memory: 90 days, 50,000 per watch.",
            "default": false
          },
          "websiteList": {
            "title": "Your own website list",
            "type": "array",
            "description": "Your domains or URLs, no map discovery: each is crawled, verified and scored, one billed row per domain with a contact. Raise maxItems for long lists. No usable entry: run stops, no leads billed.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Multiple cities",
            "type": "array",
            "description": "Several cities, each crossed with every category; maxItems is shared. Over 25 category x city pairs: run stops, no leads billed. Send a JSON array; a string splits on ; or newlines, never commas.",
            "items": {
              "type": "string"
            }
          },
          "countryCode": {
            "title": "Country code",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 code(s) that pin the city lookup, e.g. ma, us or gb,ie (Rabat is in Morocco and Malta). Empty = worldwide. A city not found inside the pin: 0 rows, no leads billed."
          },
          "keyword": {
            "title": "Name keyword",
            "type": "string",
            "description": "Keep only businesses whose name, OSM cuisine or healthcare:speciality tag contains this text, case-insensitive, e.g. sushi; address, website and email are never matched. Empty = every business."
          },
          "expandNearby": {
            "title": "Widen to nearby areas when the city runs out (recommended)",
            "type": "boolean",
            "description": "If the city has fewer businesses than maxItems, widen in rings up to ~150 km; widened rows are labelled in query_location. Off by default for API callers; the Console form switches it on.",
            "default": false
          },
          "onlyWithWebsite": {
            "title": "Website required (recommended)",
            "type": "boolean",
            "description": "Keep only businesses that list a website; the rest are dropped before billing. Recommended: without one, almost none has contacts. Off by default for API callers; the Console form switches it on.",
            "default": false
          },
          "onlyWithoutWebsite": {
            "title": "Businesses with no website",
            "type": "boolean",
            "description": "Keep only businesses with NO website (name, address, coordinates, rarely a phone). Others are dropped before billing. Mutually exclusive with onlyWithWebsite: both on stops the run, bills no leads.",
            "default": false
          },
          "verifyEmails": {
            "title": "Email verification",
            "type": "boolean",
            "description": "Free MX check of each email's domain; flags role and disposable addresses. On: email_status deliverable, risky, undeliverable or missing, plus email_provider. Off: found or missing. No SMTP probe.",
            "default": true
          },
          "onlyVerifiedEmail": {
            "title": "Verified email required",
            "type": "boolean",
            "description": "Keep only rows whose email_status is deliverable or risky; no-email rows go too, before billing. Turns verifyEmails on if off. Over-fetches like onlyWithEmail (6-24x maxItems, max 30,000).",
            "default": false
          },
          "requirePhone": {
            "title": "Phone number required",
            "type": "boolean",
            "description": "Drop businesses with no phone, before billing. A number in phone (OpenStreetMap) or phones (tel: links on its own site) passes; with extractPhonesFromSite off, only map numbers count.",
            "default": false
          },
          "requireSocial": {
            "title": "Social profile required",
            "type": "boolean",
            "description": "Drop businesses with no Facebook, Instagram, LinkedIn, X/Twitter or YouTube profile, before billing. Needs the website crawl (or an OSM social tag): with crawling off, almost all are dropped.",
            "default": false
          },
          "excludeKeywords": {
            "title": "Excluded name keywords",
            "type": "array",
            "description": "Drop businesses whose name contains any of these, e.g. Aspen Dental (case-insensitive; only the name, never address, website or email). Matches are dropped before billing. Empty = nothing excluded.",
            "items": {
              "type": "string"
            }
          },
          "excludeChains": {
            "title": "Independents only (no chains)",
            "type": "boolean",
            "description": "Drop chain outlets (OSM brand or brand:wikidata tag, is_chain true) before billing. websiteList/startUrls rows (is_chain null) are never dropped. Joins the onlyNewBusinesses watch key only when on.",
            "default": false
          },
          "onePerBusiness": {
            "title": "One row per business",
            "type": "boolean",
            "description": "Keep only the first location of a business whose branches share one website (6 branches = 1 row); folded ones cost nothing. On unless you send false; the Console form pre-ticks it."
          },
          "skipClosed": {
            "title": "Skip closed businesses",
            "type": "boolean",
            "description": "Drop places mapped as closed (disused:/abandoned:/was: tags, opening_hours=closed, shop=vacant); only name-match searches reach them. Off by default for API callers; the Console form switches it on.",
            "default": false
          },
          "minScore": {
            "title": "Minimum lead score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep leads scoring at least this, 0-100; 0 = off. Data-completeness score, not a rating: email up to 40, phone 20, website 15, socials up to 10, signals up to 15. Grades A 80+, B 65+, C 50+, D 35+.",
            "default": 0
          },
          "maxScore": {
            "title": "Maximum lead score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep leads scoring at or below this, 0-100; empty = no limit. A low score means a thin web presence, the redesign pitch list: try 45. Set below minScore, the run stops at once and bills no leads."
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "number",
            "description": "Keep businesses whose own site publishes a star rating at or above this, 1-5. OpenStreetMap has no reviews: only about 3-8% publish one and the unrated are DROPPED, so few survive. Empty = off."
          },
          "minReviewCount": {
            "title": "Minimum review count",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Keep businesses whose own site publishes a review count at or above this, 1-100,000. Only about 3-8% publish one and the rest are DROPPED, so expect very few rows. Empty = no filter."
          },
          "crawlEmails": {
            "title": "Website crawl",
            "type": "boolean",
            "description": "Visit each business website for email, socials, phones, platform, tech and any star rating; included in the price. Off = no website is visited and every website-derived column stays empty.",
            "default": true
          },
          "crawlSocialProfiles": {
            "title": "Social profiles",
            "type": "boolean",
            "description": "Fill the facebook, instagram, linkedin, twitter and youtube columns from crawled pages (share buttons, pixels and embeds filtered out). Off = they stay empty, except links OpenStreetMap carries.",
            "default": true
          },
          "extractPhonesFromSite": {
            "title": "Phone numbers from websites",
            "type": "boolean",
            "description": "Collect every tel: number on crawled pages into phones; phone is only ever the OpenStreetMap number. requirePhone, has_phone and the score count either column. Off = phones stays empty.",
            "default": true
          },
          "emailPatternGuess": {
            "title": "Guessed info@ address",
            "type": "boolean",
            "description": "Put a GUESSED info@ address on the site's domain in email_guess when no email is published; email_guess_confidence: mx_ok, no_mx or unchecked. A guess never fills email, scores or meets email filters.",
            "default": false
          },
          "maxPagesPerSite": {
            "title": "Max pages per website",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Pages read per website looking for an email, 1-8 (default 3): contact paths plus up to 4 contact/about/team links from its menu. Higher finds more emails and takes longer; same price per business.",
            "default": 3
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Websites crawled in parallel, 1-50 (default 8). Raise it for big orders (10,000 needs well above 8 to fit the run timeout); lower it if sites refuse connections. Max 2 requests per site either way.",
            "default": 8
          },
          "searchRadiusKm": {
            "title": "Search radius",
            "minimum": 1,
            "maximum": 100,
            "type": "number",
            "description": "Search a circle of 1-100 km around centerLat/centerLon instead of a city; it REPLACES location/locations (no geocoding, so country stays empty) and expandNearby. Empty = search by city."
          },
          "centerLat": {
            "title": "Centre latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Latitude of the radius centre, -90 to 90, e.g. 30.2672 (downtown Austin). Needs searchRadiusKm and centerLon; set without searchRadiusKm, the run stops and bills no leads."
          },
          "centerLon": {
            "title": "Centre longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Longitude of the radius centre, -180 to 180, e.g. -97.7431 (downtown Austin). Needs searchRadiusKm and centerLat; set without searchRadiusKm, the run stops and bills no leads."
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Alias of websiteList for integrations that send startUrls; behaves identically. Both lists merge and dedupe by domain: example.com and www.example.com/contact are one business, billed once.",
            "items": {
              "type": "string"
            }
          },
          "outputFields": {
            "title": "Output columns",
            "type": "array",
            "description": "Columns to keep, e.g. name, email, lead_grade; empty = all 73 (details in the README). name and attribution always stay. Unknown names are ignored; if NONE is valid the run stops, no leads billed.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "score_desc",
              "name_asc",
              "review_count_desc",
              "rating_desc"
            ],
            "type": "string",
            "description": "Row order: score_desc (default), name_asc, review_count_desc or rating_desc. Sorting never removes a row. Rows missing the sort value go last, and most rows have no rating or review count.",
            "default": "score_desc"
          },
          "webhookUrl": {
            "title": "Alert webhook URL (Slack, Discord, n8n, Make, Zapier…)",
            "type": "string",
            "description": "Optional. After a run delivers rows, POSTs a digest (Slack/Discord message, else JSON with the first 20 rows). Quiet runs send nothing. Pair with onlyNewBusinesses. A failure never fails the run."
          },
          "preset": {
            "title": "Use-case preset",
            "enum": [
              "",
              "cold_email",
              "web_design",
              "call_list",
              "full_enrichment"
            ],
            "type": "string",
            "description": "Fills only options left at default; never raises the bill. cold_email: deliverable or risky email. web_design: score 45 or less plus a contact. call_list: phone. full_enrichment: 6 pages, email_guess.",
            "default": ""
          },
          "categorySelect": {
            "title": "Business category",
            "enum": [
              "",
              "dentist",
              "plumber",
              "electrician",
              "roofing contractor",
              "restaurant",
              "cafe",
              "gym",
              "hair salon",
              "auto repair",
              "lawyer",
              "doctor",
              "pharmacy",
              "veterinary",
              "hotel",
              "real estate agency",
              "dry cleaner",
              "landscaper",
              "pest control",
              "photographer",
              "moving company"
            ],
            "type": "string",
            "description": "Form quick pick: one of 20 categories with verified OpenStreetMap tags. Overrides category; categories overrides it. Empty (Custom) = use category, which maps 200+ terms.",
            "default": ""
          },
          "categories": {
            "title": "Multiple categories",
            "type": "array",
            "description": "Several categories in one run, e.g. dentist and orthodontist, crossed with every city; a business found twice is billed once. Overrides category and categorySelect. Max 25 category x city pairs.",
            "items": {
              "type": "string"
            }
          },
          "citySelect": {
            "title": "City",
            "enum": [
              "",
              "New York, NY",
              "Los Angeles, CA",
              "Chicago, IL",
              "Houston, TX",
              "Phoenix, AZ",
              "Philadelphia, PA",
              "San Antonio, TX",
              "San Diego, CA",
              "Dallas, TX",
              "Austin, TX",
              "Miami, FL",
              "Atlanta, GA",
              "Boston, MA",
              "Seattle, WA",
              "Denver, CO",
              "London, United Kingdom",
              "Paris, France",
              "Berlin, Germany",
              "Madrid, Spain",
              "Amsterdam, Netherlands",
              "Toronto, Canada",
              "Sydney, Australia",
              "Dubai, United Arab Emirates",
              "Casablanca, Morocco",
              "Rabat, Morocco"
            ],
            "type": "string",
            "description": "Form quick pick: one of 25 geocode-verified metros. Overrides location; locations overrides it. Empty (Custom) = use location, which takes any city on earth.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}