# Local Lead Engine: Business Leads with Buying Signals (`emeraldnerds/local-lead-engine`) Actor

Local business leads for any US city, county or state (and worldwide): 110 categories, MX-checked emails and valid phones, ad-spend and reputation signals, chain filtering. Only qualified leads are charged: from $4 per 1,000 (phone), $7 (email), $15 (buying-signal leads); lower on paid Apify plans.

- **URL**: https://apify.com/emeraldnerds/local-lead-engine.md
- **Developed by:** [Emerald Nerds](https://apify.com/emeraldnerds) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Local Lead Engine: Business Leads with Buying Signals

Leads for local businesses in **any city, county, state, province or country**. There are 110 categories across 15 verticals. Every lead is checked before you pay: an open business, plus a valid phone number or an email whose domain accepts mail.

- **Pay only for qualified leads.** Duplicates, closed businesses, skipped chains and unreachable listings are free, and the hard cap is always honored. See [Pricing](#pricing).
- **Any market on Earth.** Type `98250`, `Austin, Texas, USA`, `Ontario, Canada` or `Germany`. Countries are processed state by state. Turn on **Sweep every town** to tag every lead with its town and, with a Google key, search town by town.
- **More than a listing.** The engine reads each business website (homepage plus contact and about pages) to collect:
  - emails (mailto links, page text, obfuscated `[at]` addresses, Cloudflare-protected addresses, JSON-LD)
  - phones, social profiles and booking tools
  - tech stack (WordPress, Wix, Squarespace, Shopify, GoDaddy, Housecall Pro, Jobber and about 40 more)
  - an **outdated website** flag (no mobile layout, no HTTPS, or a copyright notice more than 3 years old)
- **Agency-ready filters.** `no-website` finds reachable businesses with no site or a dead one. `outdated-website` finds sites that need a redesign. `running-ads` and `no-ads` find ad spenders and non-spenders. `reputation` finds businesses with review problems. `email` and `phone` require that channel.
- **Monitor mode.** Schedule weekly with **Only new leads** on. Leads delivered before are skipped for free, so you pay only for businesses that newly opened or newly listed.
- **Free delivery** to Google Sheets (upsert by `leadId`), Airtable or a signed webhook (Zapier, Make, n8n, CRM).
- **A coverage report** for every run: found, duplicates, with website, with email, with phone, qualified and charged, per market (`COVERAGE_REPORT` in the key-value store).

### Sample results

Real output from three runs on November 3, 2026 (19 qualified leads, $0.23 in total at Free-tier prices). These columns are the **Best opportunities** view, which lists the strongest prospects first.

**Austin, Texas plumbers, `running-ads` filter**

| Business | Score | Best pitch | Evidence |
|---|---|---|---|
| O & M Plumbing Services (Pflugerville) | 99 hot | Improve ad results | started a new Facebook ad on Oct 30; 6 active Facebook ads; Google Ads tag |
| Abacus Plumbing, Air Conditioning & Electrical | 95 hot | Improve ad results | started a new Facebook ad on Oct 28; 30 active Facebook ads |
| Austin's Greatest Plumbing | 77 hot | Improve ad results | call tracking on the website; no contact form or online booking for ad traffic |

**Phoenix, Arizona dentists, `reputation` filter (`minReputationScore` 15)**

| Business | Score | Best pitch | Evidence |
|---|---|---|---|
| Primary Care Dentistry | 75 hot | Grow and manage Google reviews | 13 Google reviews vs a median of 433 for local dentists |
| Arizona Dental | 64 warm | Grow and manage Google reviews | rated 4.6 vs a 4.9 median; 67 reviews vs a median of 433 |
| Westwind Dental Phoenix | 60 warm | Grow and manage Google reviews | rated 4.2 vs a 4.9 median for local dentists |

**Atlanta, Georgia roofers, `no-website` filter**

| Business | Score | Best pitch | Evidence |
|---|---|---|---|
| Complete Precision Roofing | 63 warm | Fix or rebuild the website | 5.0 stars from 42 reviews; its website domain no longer resolves |
| Atlanta Roofing Construction | 61 warm | Build a website | no website, while 91 of 97 local roofers have one |
| Roof Rejuvenate of Georgia | 60 warm | Fix or rebuild the website | its site-builder page returns HTTP 402 (subscription lapsed) |

Every row also includes the phone, MX-checked email where found, rating and reviews, competitor context, other office locations and a fact-only opening line. Sites that block automated visits are marked `blocked`, not "down", and listings that look fake (keyword-stuffed names or throwaway domains) are skipped for free.

### Pricing

You're charged once per qualified lead, at the single event that fits it, never more than one event per lead. Prices are per 1,000 leads.

| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Qualified lead (valid phone or contact; also no-website leads) | $4.00 | $3.50 | $3.00 | $2.50 |
| Lead with MX-checked email | $7.00 | $6.00 | $5.00 | $4.00 |
| Signal lead (`running-ads`, `no-ads`, `reputation`, `outdated-website`) | $15.00 | $13.00 | $11.00 | $9.00 |
| Run start (charged once per run by Apify) | $0.005 | $0.005 | $0.005 | $0.005 |

**Google Maps and Facebook ad checks are included.** The built-in lookup engine searches Google Maps and the public Meta Ad Library itself, so there is nothing else to pay. If you prefer the Apify helper Actors (compass/crawler-google-places and apify/facebook-ads-scraper), set `lookupEngine` to `apify-actors`; they then run in your own Apify account at their prices, capped by `maxSubActorSpendUsd` (default $5).

### Sources

| Source | When it's used | Cost to you |
|---|---|---|
| OpenStreetMap | Always on (worldwide open data, ODbL) | Included |
| Google Maps (built-in engine) | **Auto**: home services, construction, health and professional services (lawyers, accountants), where OpenStreetMap covers only 1–19% of US businesses. Set `googleMaps` to `always` for every category or `off` to disable | Included. Gives name, address, phone, website, categories, rating and review count. With `lookupEngine: apify-actors` it runs compass/crawler-google-places in your account instead (about $0.50 per 100 places in our tests) |
| Google Places API (New), optional | If you add your own key | Google bills you per search |

When sources overlap, the same business is merged into one lead and charged once.

### Buying signals

Every lead carries signals that show why a business might buy now. Filter on them with `leadFilter`.

**Ad spend (`adSignals`, filter `running-ads` or `no-ads`)**

- Website tags: Google Ads conversion tag, Microsoft Ads, Meta and TikTok pixels, LinkedIn Insight, and call tracking (CallRail, CallTrackingMetrics, WhatConverts, Invoca).
- Paid Google Maps listing.
- Optional `checkFacebookAds`: counts the business's active ads in the public Meta Ad Library, matched to its Facebook page or exact name. Included with the built-in engine.
- `running-ads` requires strong evidence: an ad-conversion tag, call tracking, a paid listing, active Facebook ads, or both Meta and TikTok pixels. A Meta pixel alone doesn't count.
- `no-ads` finds businesses with a working website and no ad tracking. These are prospects for ads agencies.

**Reputation (`reviewSignals`, filter `reputation`)**

- Rating, review count, and the category median for that market.
- Helper-Actor engine only: unanswered 1–3 star reviews among the newest `reviewsPerPlace` reviews, owner response rate, days since the last review, unclaimed profile. Since 2026-09-30 Google hides review text from signed-out visitors, so the built-in engine scores rating and review volume only.
- **Reputation score (0–100):** a weighted score combining:
  - rating: under 3.5 adds 35, under 4.0 adds 25, under 4.3 adds 10
  - 15 per unanswered negative review, up to 30
  - 10 if the owner replies to under 20% of recent reviews
  - 20 for under 10 reviews, or 15 for under a quarter of the market median
  - 25 for an unclaimed profile
  - 10 if there's been no new review in 180 days
- The `reputation` filter keeps businesses at or above `minReputationScore` (default 50, which is about 1 in 4 businesses in our tests). Each lead shows its score and reasons.

### Lead intelligence (included in every lead)

Most lead tools hand you raw rows. Every lead here also tells you what to sell, why now, and how it compares with its local competitors, using only data the run collects:

- **`marketContext`**: how the business compares with the other businesses of its category found in the same market. It includes:
  - the number of competitors;
  - the local median rating and review count;
  - its review rank;
  - how many of the 10 most-reviewed competitors run ads;
  - plain-English `gaps`, for example "rated 3.9 vs a 4.7 median for local plumbers" or "7 of the 9 most-reviewed local plumbers run ads; this business shows none".
- **New-ad trigger:** `adSignals.facebookNewestAdStart` and `facebookAdsStartedRecently` flag businesses whose newest active Facebook ad started in the last 30 days, a sign of fresh marketing budget.
- **`bestPitch`**: the service to lead with (website, reviews, ads, or improving existing ad results), with the evidence behind it. It favors the theme of your filter.
- **`opener`**: a one-line cold opener that states only facts from the lead record.
- **`opportunityScore` (0–100) and `opportunityTier` (hot, warm, cool)** combine four parts:

  - the strength of the pitch;
  - reachability (a named email scores above a role inbox, which scores above phone only);
  - size and budget signals (review volume, ads already running);
  - timing (a recently started ad).

  Leads in each batch are delivered best-first, so a hard cap is spent on the strongest ones.

These fields are computed with fixed rules, not an AI model, so the same data always gives the same result. A **Best opportunities** table view shows them side by side.

### Chains and franchises

Every lead has a `chain` field. A location is flagged when its name matches a known brand (Roto-Rooter, Mr. Rooter, Aspen Dental, State Farm, Jiffy Lube and about 150 more), when 3 or more locations share its website, or when it has its own location page on a shared website.

- With `chains: auto` (the default), chain locations are skipped for free under the agency filters (`running-ads`, `no-ads`, `reputation`, `no-website` and `outdated-website`). A franchise location rarely buys its own marketing.
- They are kept for the other filters.
- When a chain location is kept, its Facebook ad count is marked `facebookAdsScope: brand`, because the count covers the whole brand rather than the local office.

### Categories

Use any id, a whole group, or `all`. With a Google key, words that aren't in the catalog become free-text searches.

| Group | Category ids |
|---|---|
| `home-services` (Home services) | `plumber`, `electrician`, `hvac`, `roofer`, `painter`, `landscaper`, `cleaning`, `pest-control`, `locksmith`, `handyman`, `carpenter`, `flooring`, `windows-doors`, `pool-spa`, `moving`, `appliance-repair`, `chimney`, `solar`, `septic`, `tree-service` |
| `construction` (Construction) | `general-contractor`, `architect`, `engineer`, `surveyor`, `stonemason`, `metal`, `hardware` |
| `health` (Health care) | `dentist`, `doctor`, `chiropractor`, `physiotherapist`, `optician`, `pharmacy`, `psychotherapist`, `alternative-medicine`, `hearing`, `medical-supply` |
| `beauty` (Beauty and personal care) | `hair-salon`, `beauty-salon`, `spa`, `tattoo`, `tanning` |
| `food` (Food and drink) | `restaurant`, `cafe`, `bar`, `fast-food`, `bakery`, `brewery`, `grocery`, `catering`, `ice-cream` |
| `auto` (Auto and marine) | `car-repair`, `car-dealer`, `car-wash`, `tyres`, `auto-parts`, `towing`, `fuel`, `car-rental`, `boat` |
| `professional` (Professional services) | `lawyer`, `accountant`, `insurance`, `financial`, `it-services`, `marketing`, `notary`, `consulting`, `employment`, `travel-agency`, `funeral` |
| `real-estate` (Real estate) | `real-estate`, `property-management`, `mortgage` |
| `retail` (Retail) | `florist`, `clothing`, `furniture`, `jewelry`, `gift`, `books`, `sports-shop`, `electronics`, `cannabis`, `second-hand`, `music-shop`, `toys`, `vape-tobacco`, `tailor` |
| `fitness` (Fitness and recreation) | `gym`, `yoga`, `martial-arts`, `golf`, `outdoor-recreation` |
| `hospitality` (Lodging) | `hotel`, `bnb`, `campground` |
| `education` (Education and childcare) | `childcare`, `driving-school`, `tutoring`, `school` |
| `pets` (Pets) | `veterinary`, `pet-shop`, `pet-grooming` |
| `events` (Events and arts) | `photographer`, `event-venue`, `party-supplies`, `arts-venue` |
| `community` (Community and nonprofits) | `place-of-worship`, `nonprofit`, `coworking` |

### Output (one row per lead)

`leadId`, `name`, `category`, `market`, `address` (street, city, region, postcode, country), `lat`/`lon`, `phoneE164`, `phoneType`, `email` and `emails[]` (each with source, MX result, same-domain, role and free-mail flags), `website`, `websiteStatus`, `socials`, `techStack`, `siteSignals` (https, mobile layout, copyright year, outdated, contact form, booking links), `rating`, `reviewCount`, `openingHours`, `sources`, `sourceUrls`, `sourceUpdatedAt`, `fetchedAt`, `qualifiedReason`, `chargedEvent`, `adSignals`, `reviewSignals`, `marketContext`, `bestPitch`, `opener`, `opportunityScore` and `opportunityTier`.

### How it compares

| | Local Lead Engine | Google Maps scrapers | Apollo / ZoomInfo |
|---|---|---|---|
| Charged for | Qualified leads only | Every place returned | Seats plus credits, including empty lookups |
| Small local businesses | Yes (OpenStreetMap and Google, worldwide) | Yes | Weak coverage |
| Email verified | MX checked; unreachable emails dropped | Usually not | Partly |
| Outdated-website and no-website filters | Yes | No | No |
| Only-new monitoring | Built in, repeats are free | No | No |
| Competitor context, best pitch, opener, opportunity score | Included in every lead | No | Partly (intent scores for B2B) |
| "Started advertising recently" trigger | Yes (Meta Ad Library start dates) | No | No |

### Responsible use

Data comes from public business listings and businesses' own websites. Personal profiles and social networks are not collected. You are responsible for complying with CAN-SPAM, GDPR/ePrivacy, CASL and TCPA when you contact businesses.

# Actor input Schema

## `markets` (type: `array`):

Any place on Earth: postcode, town, city, county, state/province or country, e.g. "Austin, Texas, USA", "Ontario, Canada", "Germany", "98250". Countries are processed state by state.

## `categories` (type: `array`):

Category ids (plumber, dentist, restaurant, real-estate…), whole groups (home-services, construction, health, beauty, food, auto, professional, real-estate, retail, fitness, hospitality, education, pets, events, community) or "all". Unknown words become Google searches when you add a Google key. Full list in the README.

## `sweepTowns` (type: `boolean`):

For counties, states and countries: list every city, town and village inside and tag each lead with its town. With a Google key, each town is searched separately (far more coverage).

## `includeVillages` (type: `boolean`):

Include villages and small places in the town sweep.

## `minPopulation` (type: `integer`):

Skip towns smaller than this in the sweep (0 = all; towns without population data are skipped when this is above 0).

## `maxTownsPerMarket` (type: `integer`):

Upper limit on towns swept per market (largest first).

## `radiusKm` (type: `integer`):

Used when a market has no boundary, such as a postcode or a point-only place.

## `customOsmTags` (type: `array`):

Advanced: extra key=value tags to include, e.g. "craft=boatbuilder" or "shop=~^(farm|garden_centre)$".

## `useOpenStreetMap` (type: `boolean`):

Open data with global coverage. Coverage is best in Europe and in North American cities.

## `googleMaps` (type: `string`):

Adds Google Maps places. OpenStreetMap covers only 1–19% of US trades, dentists and lawyers, so Auto adds Google Maps for those niches. With the built-in engine this costs nothing extra.

## `lookupEngine` (type: `string`):

Built-in: our own Google Maps search and Meta Ad Library check, with no extra charges in your account. It returns rating and review count but not review text, because Google now hides review text from signed-out visitors. Apify helper Actors: compass/crawler-google-places and apify/facebook-ads-scraper run in your account at their own prices (capped by maxSubActorSpendUsd).

## `maxPlacesPerSearch` (type: `integer`):

Upper bound of Google Maps places per category for each market (or town in a sweep).

## `maxGoogleMapsSearches` (type: `integer`):

How many markets/towns are searched on Google Maps per run (one sub-run each).

## `reviewsPerPlace` (type: `integer`):

Apify helper Actors engine only: newest Google reviews to read per place (0 = automatic: 10 for the reputation filter). Reviews cost extra in your account. The built-in engine scores reputation from rating and review volume.

## `checkFacebookAds` (type: `boolean`):

For leads with a Facebook page, count active ads in the public Meta Ad Library. Built-in engine: no extra cost (about 2–4 seconds per page). Helper-Actor engine: apify/facebook-ads-scraper at its own price.

## `maxSubActorSpendUsd` (type: `number`):

Apify helper Actors engine only: hard cap on what compass/crawler-google-places and apify/facebook-ads-scraper may charge in your account during this run.

## `googlePlacesApiKey` (type: `string`):

Your own Google Maps Platform key with Places API (New) enabled. Adds Google listings, ratings and review counts. Google bills your key for each search; you are responsible for Google's terms.

## `customQueries` (type: `array`):

Free-text searches run in every market with a Google key, e.g. "kitchen remodeling", "dog daycare".

## `maxGoogleQueries` (type: `integer`):

Protects your Google bill: each search returns up to 60 places.

## `leadFilter` (type: `string`):

Which businesses count as billable leads. Ad and reputation filters work best with Google Maps on; Facebook ad verification needs checkFacebookAds.

## `minReputationScore` (type: `integer`):

0–100 score from rating, unanswered negative reviews, owner reply rate, review volume vs market, unclaimed profile and review recency. 50 flags about 1 in 4 businesses in our tests; raise it for only the strongest prospects. When review text isn't available (built-in Google lookups), half this value is used because only rating, review volume and claim status can be scored.

## `chains` (type: `string`):

Detects franchise brands (Roto-Rooter, Aspen Dental, State Farm…), domains shared by 3+ locations and location pages. Each lead gets a chain field either way.

## `crawlWebsites` (type: `boolean`):

Reads the homepage and up to two contact or about pages for emails, phones, social links and tech stack.

## `maxPagesPerSite` (type: `integer`):

Pages read per website (homepage first).

## `checkEmailMx` (type: `boolean`):

Emails whose domain cannot receive mail are discarded.

## `includeUnqualified` (type: `boolean`):

Adds businesses that failed the filter, uncharged, with the reason.

## `onlyNewLeads` (type: `boolean`):

Schedule this run weekly: leads delivered before are skipped for free, so you only pay for newly opened or newly listed businesses.

## `monitorId` (type: `string`):

Optional name for the only-new history. Defaults to a hash of markets, categories and filter.

## `maxLeads` (type: `integer`):

Hard cap. The run stops once this many qualified leads are charged.

## `concurrency` (type: `integer`):

Websites checked at once.

## `overpassUrl` (type: `string`):

Optional: your own Overpass API endpoint (e.g. https://my-overpass.example.com/api/interpreter) for faster, unthrottled OpenStreetMap queries on very large sweeps.

## `spreadsheet` (type: `string`):

Upserts by leadId so repeat runs update rows. Share the sheet with your service account as Editor.

## `sheetName` (type: `string`):

Sheet tab.

## `serviceAccountJson` (type: `string`):

Google service account key (JSON).

## `airtableBaseId` (type: `string`):

Airtable base ID.

## `airtableTable` (type: `string`):

Airtable table.

## `airtableToken` (type: `string`):

Airtable token.

## `webhookUrl` (type: `string`):

Receives the charged leads as JSON.

## `webhookSecret` (type: `string`):

HMAC-SHA256 signature in X-Signature.

## Actor input object example

```json
{
  "markets": [
    "Austin, Texas, USA"
  ],
  "categories": [
    "home-services"
  ],
  "sweepTowns": false,
  "includeVillages": true,
  "minPopulation": 0,
  "maxTownsPerMarket": 200,
  "radiusKm": 10,
  "useOpenStreetMap": true,
  "googleMaps": "auto",
  "lookupEngine": "built-in",
  "maxPlacesPerSearch": 100,
  "maxGoogleMapsSearches": 25,
  "reviewsPerPlace": 0,
  "checkFacebookAds": false,
  "maxSubActorSpendUsd": 1,
  "maxGoogleQueries": 200,
  "leadFilter": "contactable",
  "minReputationScore": 50,
  "chains": "auto",
  "crawlWebsites": true,
  "maxPagesPerSite": 3,
  "checkEmailMx": true,
  "includeUnqualified": false,
  "onlyNewLeads": false,
  "maxLeads": 25,
  "concurrency": 10,
  "sheetName": "Local leads"
}
```

# Actor output Schema

## `opportunities` (type: `string`):

No description

## `leads` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "markets": [
        "Austin, Texas, USA"
    ],
    "categories": [
        "home-services"
    ],
    "maxSubActorSpendUsd": 1,
    "maxLeads": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("emeraldnerds/local-lead-engine").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "markets": ["Austin, Texas, USA"],
    "categories": ["home-services"],
    "maxSubActorSpendUsd": 1,
    "maxLeads": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("emeraldnerds/local-lead-engine").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "markets": [
    "Austin, Texas, USA"
  ],
  "categories": [
    "home-services"
  ],
  "maxSubActorSpendUsd": 1,
  "maxLeads": 25
}' |
apify call emeraldnerds/local-lead-engine --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,emeraldnerds/local-lead-engine"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OvvXaZ8N1O2gpUfBL/builds/XK1atuWp7oGgWPnTS/openapi.json
