# Google Maps AI Leads | Score + Outreach (`rohit_rathi/scored-local-leads-maps`) Actor

Google Maps AI lead generator: scrape local businesses, score HOT/WARM/COLD by ICP, get Claude outreach. Multi-city. Phones, websites, ratings. AI off $3/1k · AI on $5/1k. Sales-ready B2B leads—not a raw Maps dump.

- **URL**: https://apify.com/rohit\_rathi/scored-local-leads-maps.md
- **Developed by:** [Rohit](https://apify.com/rohit_rathi) (community)
- **Categories:** AI, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 scored leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps AI Leads | Score + Outreach

**Google Maps AI lead generator** for sales teams and agencies: **scrape Google Maps businesses**, **score local leads** HOT/WARM/COLD by ICP, and write **Claude Sonnet 5 outreach** in one run.

Extract **names, phones, websites, ratings, review counts, addresses**, then get a **lead score**, **tier**, **reason**, and **ready-to-send outreach** — multi-city, not a raw field dump.

| | |
|---|---|
| **AI off** | Scored leads **$3 / 1,000** |
| **AI on** | Score + Claude outreach **$5 / 1,000** |
| **AI model** | **Claude Sonnet 5** (Terra fallback) |
| **Best for** | B2B local leads, no-website agency lists, multi-city prospecting |

Search this Actor as: *Google Maps AI leads*, *Google Maps lead extractor*, *scored local leads*, *Google Maps outreach*.

***

### What is Google Maps AI Leads?

This **Google Maps scraper for lead generation** finds businesses by keyword + city (e.g. *dentists in Austin*, *plumbers Dallas*), pulls public listing data, then ranks who to call first.

Unlike a classic **Google Maps data extractor** that only dumps places, this Actor is built for **sales-ready B2B leads**:

| Use case | How this helps |
|---|---|
| **Any product outbound** | Default ranking: phone + rating + reviews (website OK) |
| **Web / digital agencies** | ICP mode: **no website** = HOT; has website = COLD |
| **Multi-city lead gen** | Many queries × many locations in **one run** |
| **AI outreach** | Claude Sonnet 5 drafts research-backed messages |
| **CRM / automation** | Export JSON/CSV/Excel; API, Make, Zapier, Sheets |

It is **not** a full clone of mega Maps scrapers (every review photo, hotels, Q\&A). Use those for raw dumps. Use **this** for **who to contact and what to say**.

***

### ✨ What you get per lead

#### Core Maps fields (always when found)

| | Field |
|---|---|
| 🔗 | Place name, category / categories, place ID, Maps URL |
| 📍 | Address, city, state, postal code, country, lat/lng |
| ☎️ | Phone number |
| 🌐 | Website (and `hasWebsite` boolean) |
| ⭐️ | Average rating + review count |
| 🧑‍🍳 | Opening hours (when available) |
| 🔒 | Business status (open / temporarily closed / permanently closed) |
| 🏷 | Claimed status (when available) |
| 🔎 | `searchQuery` + `locationQuery` that produced the row |
| 🕒 | `scrapedAt` timestamp |

#### Lead intelligence (default on)

| | Field |
|---|---|
| 🎯 | **`leadScore` / `icpFitScore`** 0–100 (fit for your sales mode) |
| 📊 | **`qualityScore`** — universal business quality (rating, reviews, phone) |
| 🔥 | **`leadTier`** — `HOT` / `WARM` / `COLD` |
| 🏷 | **`icpTags`** + **`icpPresetUsed`** |
| 🧠 | **`leadReason`** — why this lead ranks (**Claude Sonnet 5** when AI on) |
| ✉️ | **`outreachMessage`** — research-backed outreach draft |
| 📈 | `contactScore`, `aiConfidence`, `aiModel` when AI ran |

#### Optional enrichment (off by default)

| | Field |
|---|---|
| 📧 | Public emails from the business website |
| 📱 | Public social links (Instagram, Facebook, LinkedIn, Twitter/X) when found on site |
| 📈 | End-of-run **market report** row (`recordType: "market_report"`) |

***

### 🚀 Abilities that matter for lead gen

- **Multi-query × multi-location** in a single run — e.g. `["dentists", "orthodontists"]` × `["Austin, TX", "Dallas, TX"]`
- **ICP ranking modes** (two-layer score: quality + fit):
  - `sales_general` (**default**) — any product: phone + reputation
  - `agency_no_website` — web agencies: no website = HOT
  - `franchise_expansion` — market density: high reviews + rating
- **AI modes that map to price** (powered by **Claude Sonnet 5**, Terra fallback — see Pricing):
  - `off` — rules score only → **$3/1k**
  - `all` — AI outreach on every saved lead → **$5/1k**
  - `hot` — AI only on HOT leads → **~$3–5/1k** (pay AI only when used)
- **Extract modes for speed vs depth**:
  - `list` (default) — search cards only; fastest for volume
  - `hybrid` — list first; open detail only if phone/website/rating missing
  - `detail` — full place page every time; richest, slowest
- **Hard caps** — `maxPlacesPerLocation` + `maxPlacesTotal` so runs stay predictable
- **Quality filters** — `minRating`, `minReviews`, `mustHavePhone`, `websiteFilter`, `excludeClosed`, `onlyOutputMinScore`
- **Proxy-ready** — Apify Proxy on by default for platform runs
- **Budget-safe PPE** — charges per saved lead (and per AI outreach when written); respects max total charge

***

### 💰 Pricing — cheapest on Apify for AI quality leads

**The best value among Apify Maps / lead Actors** — especially if you want **AI for quality leads**, not a raw field dump.

Most competitors either:

- charge **more per 1,000 places** for basic scrape data, or
- stack **base scrape + AI summary + AI score + enrichment** into a much higher effective bill

We keep one clear story:

| Mode | Input | What you get | Face price |
|---|---|---|---|
| **AI mode OFF** | `aiMode: "off"` | Scored lead (fields + score + tier + tags) | **$3 / 1,000 leads** |
| **AI mode ON** | `aiMode: "all"` | Everything above + **Claude Sonnet 5** reason + outreach | **$5 / 1,000 leads** |

That’s **full AI quality leads (score + Claude Sonnet 5 reason + outreach) at $5/1k** — typically the **lowest all-in AI lead price** you’ll find on the Store for this use case.

#### How events map (pay-per-event)

| Event name | Console title | Unit | When charged |
|---|---|---|---|
| `place-scraped` | Scored lead | **$0.003** | Every lead saved to the dataset |
| `lead-intelligence` | AI outreach | **$0.002** | Only when AI actually wrote `outreachMessage` for that lead |

**Quick math**

| Run | Approx face\* |
|---|---|
| 1,000 leads · AI off | **$3.00** |
| 1,000 leads · AI on (all) | **$5.00** |
| 100 leads · AI on (all) | **$0.50** |
| 1,000 leads · AI hot (~30% HOT get outreach) | ~**$3.60** |

\*Face list price before your Apify Store plan discount. Platform also applies a tiny synthetic start fee and compute units (CU) separately. Optional website enrichment / market report are **not** part of the two main prices (default off).

**Publisher note:** In Console Monetization, configure the same event names and prices. Prefer synthetic `apify-actor-start`. Do **not** also enable synthetic default-dataset-item billing if you charge `place-scraped` (that double-bills each row).

***

### ⬇️ Input

Provide at least one **search query** and one **location**. You can set this in the Actor UI or programmatically via API / `apify-client`.

#### Minimal example

```json
{
  "searchQueries": ["dentists"],
  "locations": ["Austin, TX"]
}
```

#### Recommended lead-gen example

```json
{
  "searchQueries": ["dentists", "orthodontists"],
  "locations": ["Austin, TX", "Dallas, TX"],
  "maxPlacesPerLocation": 50,
  "maxPlacesTotal": 200,
  "extractMode": "list",
  "enableLeadIntelligence": true,
  "aiMode": "hot",
  "icpPreset": "sales_general",
  "customIcpNotes": "We sell commercial cleaning to local service businesses.",
  "onlyOutputMinScore": 60,
  "minRating": 4,
  "minReviews": 10,
  "mustHavePhone": true,
  "excludeClosed": true,
  "enableContactEnrichment": false,
  "enableMarketReport": false,
  "useApifyProxy": true,
  "maxConcurrency": 5
}
```

#### Search queries

Use **distinct** terms that match how people search Maps.

| Good | Bad |
|---|---|
| `["restaurant", "bar", "cafe", "bakery"]` | `["restaurant", "restaurants", "chinese restaurant"]` (near-duplicates, slower, little extra coverage) |
| `["plumber", "emergency plumber", "drain cleaning"]` | One mega-phrase only when you need breadth |

Slight category overlap is fine; long lists of synonyms usually only add runtime.

#### Locations

- City / metro: `"Austin, TX"`, `"Berlin, Germany"`
- Neighborhood or address-level strings work when Maps resolves them
- Multiple locations = one run (no orchestrator required for normal multi-city jobs)

#### Key input fields

| Field | Default | Purpose |
|---|---|---|
| `searchQueries` | required | Keywords / categories to search |
| `locations` | required | Areas to search |
| `maxPlacesPerLocation` | `50` | Cap per city/area after dedup |
| `maxPlacesTotal` | `100` | Cap for whole run |
| `extractMode` | `list` | `list` · `hybrid` · `detail` |
| `enableLeadIntelligence` | `true` | Score + optional AI |
| `aiMode` | `hot` | `off` · `hot` · `all` (drives pricing) |
| `llmMinScore` | `60` | Skip LLM below this score |
| `onlyOutputMinScore` | `0` | Drop low-score rows from output |
| `icpPreset` | `agency_no_website` | Scoring profile |
| `customIcpNotes` | `""` | Extra context for outreach (public business only) |
| `minRating` / `minReviews` | `0` | Quality filters |
| `mustHavePhone` | `false` | Require phone |
| `websiteFilter` | `any` | `any` · `has` · `missing` |
| `excludeClosed` | `true` | Drop permanently closed |
| `enableContactEnrichment` | `false` | Crawl site for public email/social |
| `enableMarketReport` | `false` | One market summary at end |
| `skipTileExpansion` | `true` | Faster; set `false` to expand geo tiles when lists plateau |
| `maxConcurrency` | `5` | Parallel browser pages (more = faster, more CU) |
| `useApifyProxy` | `true` | Recommended on platform |
| `language` | `en` | Maps UI language (`hl`) |

#### Speed tips

1. Prefer **`extractMode: "list"`** for large lead lists
2. Use **`aiMode: "hot"`** so you only pay AI on top leads
3. Raise `maxConcurrency` carefully (memory / CU)
4. Keep `skipTileExpansion: true` unless you need deeper geographic coverage
5. Filter early (`onlyOutputMinScore`, `websiteFilter`, `minReviews`) so you don’t store noise

***

### ⬆️ Output

Results land in the run **Dataset** (Output / Storage tab). Export as JSON, CSV, Excel, XML, or HTML. The **Leads overview** view highlights the columns sales teams care about first.

#### Sample lead row

```json
{
  "placeId": "ChIJ…",
  "name": "Example Dental",
  "address": "123 Main St, Austin, TX 78701",
  "city": "Austin",
  "state": "Texas",
  "postalCode": "78701",
  "countryCode": "US",
  "phone": "+15125550123",
  "website": null,
  "hasWebsite": false,
  "category": "Dentist",
  "categories": ["Dentist", "Dental clinic"],
  "rating": 4.8,
  "reviewCount": 142,
  "businessStatus": "OPEN",
  "isClaimed": true,
  "latitude": 30.2672,
  "longitude": -97.7431,
  "mapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ…",
  "openingHours": [
    "Monday: 8 AM – 5 PM",
    "Tuesday: 8 AM – 5 PM"
  ],
  "searchQuery": "dentists",
  "locationQuery": "Austin, TX",
  "scrapedAt": "2026-04-08T12:00:00.000Z",
  "leadScore": 88,
  "leadTier": "HOT",
  "leadReason": "Strong ratings and review volume with no website — strong fit for agency outreach.",
  "outreachMessage": "Hey — saw Example Dental has solid reviews on Maps but no site yet. curious if you ever thought about a simple page for bookings? happy to share what other dentists do if useful",
  "icpTags": ["no_website", "high_rating", "agency_fit"],
  "contactScore": 72,
  "aiConfidence": 0.82,
  "aiModel": "claude-sonnet-5",
  "recordType": "place"
}
```

#### Dataset views

| View | Best for |
|---|---|
| **Leads overview** | Sorting by score / tier; calling list with phone + outreach |
| Full dataset / JSON | Automation, CRM import, custom fields |

#### Metrics

Each run also writes a **`METRICS`** object to the default key-value store (places found/output/filtered, intelligence success/fail, charges, early stop flags). Useful for debugging cost and coverage.

***

### 🤖 AI outreach — Claude Sonnet 5

This Actor uses **Anthropic Claude Sonnet 5** (`claude-sonnet-5`) for lead intelligence when AI mode is on.

| | |
|---|---|
| **Primary model** | **Claude Sonnet 5** — reasons + humanized outreach |
| **API** | Anthropic Messages · `POST {base}/messages` |
| **Fallback** | GPT‑5.6 Terra (`gpt-5.6-terra`) via OpenAI `POST {base}/chat/completions` — only if Claude fails after retries |
| **On the row** | `aiModel` is set to `claude-sonnet-5` (or the fallback model if used) |

**What Claude Sonnet 5 writes per lead**

- **`leadReason`** — 1–2 sentences on why the lead is HOT/WARM/COLD for your ICP
- **`outreachMessage`** — short, humanized outreach (light natural grammar, not robotic) from public Maps signals
- **`aiConfidence`** + **`icpTags`** when returned

#### How it works

1. Rules engine scores every place (ICP weights, rating, reviews, website presence, etc.).
2. Tier is assigned: **HOT / WARM / COLD**.
3. If `aiMode` is `hot` or `all` and the lead clears `llmMinScore`, the Actor calls **Claude Sonnet 5** first (end users don’t paste API keys).
4. Claude returns `leadReason` + `outreachMessage` grounded in **public listing signals** — it does not invent private contacts.
5. If Claude is down, the run automatically retries on **Terra**, then continues.
6. PPE event **AI outreach** is charged only when outreach was actually written.

If both providers fail, the Actor still returns **rule-based scores and tiers** (no fake outreach).

#### Owner LLM gateway (Actor publisher)

Set these as **Actor environment variables** (keys = **Secret**):

| Variable | Purpose |
|---|---|
| `LLM_GATEWAY_BASE_URL` | Shared base, e.g. `https://api.contactboxtools.me/v1` |
| `LLM_CLAUDE_API_KEY` | **Primary** Claude Sonnet 5 key |
| `LLM_CLAUDE_MODEL` | **`claude-sonnet-5`** |
| `LLM_OPENAI_API_KEY` | Fallback GPT key |
| `LLM_OPENAI_MODEL` | `gpt-5.6-terra` |

End users of the Store Actor never paste their own keys for core scoring/outreach.

***

### 🔌 Integrate with other tools

Because this is a normal Apify Actor, you can:

- Schedule recurring multi-city lead pulls
- Send dataset rows to **Google Sheets**, **Make**, **Zapier**, webhooks, or your CRM
- Call it from **Node** or **Python** with `apify-client`
- Chain with other Actors (enrichment, email tools, Slack alerts) after a successful run

Use webhooks to notify your stack when a run succeeds or fails.

#### API sketch (Node)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('USERNAME/scored-local-leads-maps').call({
  searchQueries: ['dentists'],
  locations: ['Austin, TX'],
  maxPlacesTotal: 50,
  aiMode: 'hot',
  icpPreset: 'agency_no_website',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

***

### ❓ FAQ

#### How is this different from a classic Google Maps scraper?

Classic scrapers maximize **fields per place** (reviews, photos, amenities, hotels…). This Actor maximizes **sales actionability**: score, tier, reason, outreach, multi-city, simple **AI on / AI off** pricing.

#### Do I need categories lists with 100 synonyms?

No. Start with a few clear **search queries** and locations. Use filters (`websiteFilter`, `minRating`, `onlyOutputMinScore`) to shape the list. Over-specifying synonym categories is usually unnecessary here.

#### Why not more than ~120 results per area?

Google Maps UI search is finite per map view. Use multiple **locations** (or disable `skipTileExpansion` for neighbor tiles) and sensible query splits to cover larger metros. Always set `maxPlacesPerLocation` / `maxPlacesTotal` for cost control.

#### Can I extract full review text / reviewer profiles?

Not in the current product focus. You get **rating + review count** for scoring. For full review NLP, pair with a dedicated reviews Actor if needed.

#### Can I get emails from the business website?

Yes — turn on optional website contact enrichment to collect public emails and social links from the company site. Core AI outreach uses listing signals (rating, website presence, category, etc.) and does not invent private contacts.

#### Is this really cheaper than other Apify Maps Actors?

Yes for **quality lead output**. At **$3/1k scored** or **$5/1k with AI outreach**, you avoid the usual pattern of paying a higher base scrape rate *plus* separate AI / enrichment add-ons. For teams that care about **who to call and what to say**, this is the **cheapest AI quality-leads option on Apify**.

#### What happens if I hit my max charge limit?

Billable work already saved stays in the dataset. The crawl aborts cleanly when the PPE budget limit is reached so you don’t keep spending compute with no billing headroom.

#### List vs hybrid vs detail — which should I pick?

| Goal | Mode |
|---|---|
| Max leads / min time | `list` |
| Need phone/website when list card is thin | `hybrid` |
| Deepest place page fields every time | `detail` |

#### Is website enrichment free?

No — when enabled and successful it can charge the optional enrichment event. It is **off by default** and **not** part of the two main AI prices. Prefer filters + AI score first.

***

### 🛠 Local development (publishers / contributors)

```bash
npm install
cp .env.example .env   # LLM gateway secrets — never commit
apify run -p           # uses storage/key_value_stores/default/INPUT.json
npm test
npm run build
apify push             # deploy build to Apify
```

**Stack:** TypeScript, Crawlee `PlaywrightCrawler`, Apify SDK · Docker image `apify/actor-node-playwright-chrome` with Playwright pinned for the image.

**Hot-fix surface:** Google changes DOM often — update `src/config/selectors.json` and re-test small runs after Maps UI shifts.

***

### 🗺 Why teams pick this over other Apify Maps Actors

| | Typical Maps scraper on Apify | **This Actor** |
|---|---|---|
| Primary output | Huge place JSON | **Scored quality lead** |
| Who to call first | DIY in sheets | `leadScore` / `leadTier` |
| What to say | Blank | **`outreachMessage` via Claude Sonnet 5** |
| AI model | Often mini / generic | **Claude Sonnet 5** (+ Terra fallback) |
| Pricing | Higher base + AI / enrich add-ons | **Cheapest: $3/1k or $5/1k AI** |
| Multi-city | Often many runs | First-class `locations[]` |
| Focus | Every field on the page | **Sales-ready quality leads** |

***

### 📣 Feedback

Found a Maps UI break, a scoring miss, or a pricing/docs gap? Open an issue on the Actor’s **Issues** tab with a short input sample and the run ID.

***

**Google Maps AI Local Leads** — multi-city Maps → score, tier, and **Claude Sonnet 5** outreach.\
**AI model: Claude Sonnet 5** · **Cheapest AI quality-leads on Apify: $3/1k · $5/1k with AI.**

# Actor input Schema

## `searchQueries` (type: `array`):

Business categories or keywords to search (e.g. dentists, coffee shops).

## `locations` (type: `array`):

Cities, addresses, or areas. Multiple locations run in a single Actor run.

## `maxPlacesPerLocation` (type: `integer`):

Hard cap of places accepted per location (after dedup).

## `maxPlacesTotal` (type: `integer`):

Hard cap across the whole run.

## `language` (type: `string`):

Google Maps UI language code (hl parameter).

## `minRating` (type: `number`):

Drop places below this star rating (0 = no filter).

## `minReviews` (type: `integer`):

Drop places with fewer reviews.

## `mustHavePhone` (type: `boolean`):

Only keep places with a phone number.

## `websiteFilter` (type: `string`):

Filter by website presence.

## `excludeClosed` (type: `boolean`):

Exclude permanently closed

## `enableLeadIntelligence` (type: `boolean`):

Compute scores and (if gateway configured) AI reason + outreach. Uses owner LLM gateway secrets.

## `onlyOutputMinScore` (type: `integer`):

When intelligence is on, drop leads below this score (0 = keep all scored).

## `icpPreset` (type: `string`):

Two-layer score: qualityScore (universal) + icpFitScore/leadScore (this mode). Default = any product (phone + reviews). Use web-agency mode only if you sell websites. Expansion = market density by review volume.

## `customIcpNotes` (type: `string`):

Describe your product/offer. Shapes outreach + leadReason (e.g. commercial cleaning for restaurants, POS for cafes). Does not replace ranking mode above.

## `enableContactEnrichment` (type: `boolean`):

Opt-in: crawl business websites for public emails and social links.

## `enableMarketReport` (type: `boolean`):

Opt-in: end-of-run market summary (uses LLM when gateway configured).

## `maxConcurrency` (type: `integer`):

Parallel browser pages. Higher = faster (uses more memory/CU). Default 5.

## `useApifyProxy` (type: `boolean`):

Use Apify Proxy

## `proxyGroups` (type: `array`):

Apify proxy groups (e.g. RESIDENTIAL). Empty = default.

## `skipTileExpansion` (type: `boolean`):

Faster. Only expand search tiles when disabled and results plateau below max.

## `aiMode` (type: `string`):

Two main prices: off = $3/1k scored leads only; all = $5/1k with Sol outreach on every lead; hot = $3–5/1k (AI charged only on HOT leads that get outreach).

## `llmMinScore` (type: `integer`):

Skip LLM below this score (saves time/cost). Used with aiMode hot/all.

## `extractMode` (type: `string`):

list=search cards only (fastest). hybrid=list + detail when phone/site missing. detail=open every place page (slowest, richest).

## Actor input object example

```json
{
  "searchQueries": [
    "dentists"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlacesPerLocation": 50,
  "maxPlacesTotal": 100,
  "language": "en",
  "minRating": 0,
  "minReviews": 0,
  "mustHavePhone": false,
  "websiteFilter": "any",
  "excludeClosed": true,
  "enableLeadIntelligence": true,
  "onlyOutputMinScore": 0,
  "icpPreset": "sales_general",
  "customIcpNotes": "We sell [your product] to local businesses. Mention [angle] when relevant.",
  "enableContactEnrichment": false,
  "enableMarketReport": false,
  "maxConcurrency": 5,
  "useApifyProxy": true,
  "proxyGroups": [],
  "skipTileExpansion": true,
  "aiMode": "hot",
  "llmMinScore": 60,
  "extractMode": "list"
}
```

# Actor output Schema

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

Scored leads in the default dataset — name, phone, score, tier, outreach, and more.

## `results` (type: `string`):

Full default dataset (every field, including market reports if enabled).

# 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 = {
    "searchQueries": [
        "dentists"
    ],
    "locations": [
        "Austin, TX"
    ],
    "customIcpNotes": "We sell [your product] to local businesses. Mention [angle] when relevant."
};

// Run the Actor and wait for it to finish
const run = await client.actor("rohit_rathi/scored-local-leads-maps").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 = {
    "searchQueries": ["dentists"],
    "locations": ["Austin, TX"],
    "customIcpNotes": "We sell [your product] to local businesses. Mention [angle] when relevant.",
}

# Run the Actor and wait for it to finish
run = client.actor("rohit_rathi/scored-local-leads-maps").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 '{
  "searchQueries": [
    "dentists"
  ],
  "locations": [
    "Austin, TX"
  ],
  "customIcpNotes": "We sell [your product] to local businesses. Mention [angle] when relevant."
}' |
apify call rohit_rathi/scored-local-leads-maps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rohit_rathi/scored-local-leads-maps"
        }
    }
}

```

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/6JduVPrE3Fj1D5NK1/builds/zalPRlAvM0Al5ycLb/openapi.json
