# Prospect Buddy for HighLevel (`jarid_orgeron/prospect-buddy`) Actor

Local businesses from Google Maps with the owner, a checked email and Do Not Call-checked phones. Pay only for what’s found. Saves to HighLevel.

- **URL**: https://apify.com/jarid_orgeron/prospect-buddy.md
- **Developed by:** [Jarid Orgeron](https://apify.com/jarid_orgeron) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 business researcheds

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/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

## Prospect Buddy for HighLevel

**Not a list of businesses: the owner, a checked email, Do Not Call-checked numbers, and 2 team contacts free. You pay only for what we find, and never twice.**

Pick a niche and a city. Prospect Buddy finds the local businesses on Google Maps, reads each one's website with AI to
find the owner and the team, checks every email and phone number before you see them (including the Do Not Call
lists), and shows what each business is missing that your offer fixes. Results go straight into your GoHighLevel CRM,
or anywhere else as JSON, CSV or Excel.

### What you get for every business

| | |
|---|---|
| 🏢 **Business profile** | name, address, Google rating and reviews (and how they rank in the area), hours, website, category, the site's builder, and the general business email |
| 📞 **Every phone number, checked** | cell, landline or internet phone, and the National and state Do Not Call lists plus known TCPA litigators |
| 🤖 **The owner** | found by AI across the website (up to 30 pages) and Google's business records, with their role |
| 🤖 **The owner's email** | found by AI and checked with a real mailbox test; one that bounces is never delivered |
| 👥 **Up to 2 team contacts, free** | names, roles and checked emails of other staff, such as an office manager or a partner |
| 🔎 **What they're missing** | 36 checks in 7 areas (reviews, calls and hours, website, chat and booking, Google profile, email and texting, social media), each with the evidence, and the best opportunity for what you sell |

### Over half the numbers we find are on a Do Not Call list

In our 200-business test (roofers, HVAC contractors, dentists and landscapers in 4 US cities, October 2026), 55% of
the phone numbers we found were on a Do Not Call list. A small business's main line is often the owner's cell.
That's why **every number is checked, the check can't be turned off, and a number we couldn't check is never
shown**. A business with no number you can cold call and no email is flagged ⚠️ and listed last.

### Pricing: pay for what we find

| What | Price | Charged |
|---|---|---|
| Business profile | $0.01 | per business |
| Line check (cell or landline) | $0.01 | per phone number |
| Do Not Call check | $0.01 | per phone number |
| 🤖 Owner found | $0.02 | only when we find the owner |
| 🤖 Owner email found | $0.03 | only when we find it and its mailbox check passes |
| Email verified | $0.01 | per owner email that passes its mailbox check |
| 👥 Team contacts (up to 2) | **free** | |

- **Catch-all emails aren't charged as owner emails.** When the owner's email is on a mail server that accepts any
  address (so no check can confirm it), you pay only the $0.01 check. An email the check can't decide costs nothing.
- **About $0.05 a business on average** (our 200-business test: $5.35 per 100). From $0.03 for a business with just
  its main number, up to about $0.15 for one with three numbers and a verified owner email.
- **Paid on your Apify account, which also pays:** Google Maps (`compass/crawler-google-places`, about $0.02 a
  business and $0.40 to list an area of 100) and the email checker (`bounceverify/bounceverify-email-verifier`, about
  $0.0008 an email).
- **A quote before every search** (the likely cost from your own past searches, and the most it can cost), and the
  search stops itself before going over the limit you set.
- **Never paid twice:** every business researched is remembered in your own Apify account (a storage named
  `prospect-buddy-history`). Searching an area again picks up where you stopped and skips businesses researched in the
  last 90 days.

### Apify free plan

Prospect Buddy works on Apify's free plan with these limits:

- **25 businesses a run and 500 a month.**
- **50 phone checks in all.** After that, numbers come back **not checked**: each card warns you, and HighLevel gets
  Do Not Call Status "Not checked" and the tag `prospect-buddy-dnc-not-checked`. Check those numbers yourself before
  you call or text.
- **The Google Maps people lookup is off** (it costs $0.10 a person on the free plan), so fewer people are found.

On a paid Apify plan there are no limits from us.

### How it works

1. **List the area** on Google Maps (city limits, or 15 or 25 miles from downtown). The list is kept, so continuing
   an area never pays for it again.
2. **Research in rounds of 10:** Google Maps details, reviews and people; then the whole website, read with plain
   requests, a real browser when a site needs one, and a residential proxy when a bot check blocks us.
3. **AI sorts the people** (owners, founders, managers, staff) and matches emails to the right person.
4. **Check everything:** every email gets a mailbox check, and every phone number a line type and Do Not Call check.
5. **Audit and score:** 36 checks, and the best offer for each business, favouring gaps that are rare in that market.
6. **Deliver:** a plain-words card per business, saved into your HighLevel CRM.

Set a **goal** ("10 owner emails") and it keeps researching in rounds until it has them, or until the spending cap.

### Straight into GoHighLevel

Add a HighLevel Private Integration token and your sub-account ID, and each business is saved as:

- a Business record;
- up to 3 contacts (decision makers first);
- tags, and 17 custom fields (Google Star Rating, phone type, Do Not Call Status, best offer and more);
- the card as a note;
- optionally an opportunity in your pipeline.

It never duplicates, never overwrites what's there, and never messages anyone. A business that can't be cold-called,
texted or emailed is saved with Do Not Disturb on, so no workflow contacts it. Every search is logged in a Prospect
Buddy menu in HighLevel.

**The Prospect Buddy agent for HighLevel** (free) runs all of this from a chat: ask for a niche and a city, see the
quote, review results 10 at a time, and type the numbers to save. You pay only for what the searches find.

### Your responsibility when you contact these businesses

Prospect Buddy gives you information to help you prospect carefully. **It isn't legal advice, and a "not on a Do Not
Call list" result isn't permission to call or text.** You're responsible for how you contact anyone you find here.

- **Do Not Call results are as of the day of the search.** The lists change every day. The Telemarketing Sales Rule
  expects you to check the National Registry within 31 days before a sales call, so re-check numbers older than that.
- **Business-to-business calls aren't a free pass.** Many B2B calls are exempt from the National Do Not Call rules,
  but a small business's number is often the owner's personal cell. The TCPA restricts autodialed and prerecorded
  calls and texts to cell phones without prior consent, and some states have stricter telemarketing laws of their own.
- **Cold email has rules too** (CAN-SPAM in the US): an honest subject line, your physical address, and a working
  opt-out that you honour.
- **"Do not contact" businesses** (every number on a Do Not Call list and no email) are flagged; the card suggests
  in-person or their own contact form instead.

If you run campaigns at volume, have a lawyer who knows telemarketing law look at your process.

### Input highlights

| Field | What it does |
|---|---|
| `searchTerms`, `location` | the niche and the city (US and Canada) |
| `area` | city limits, or 15 or 25 miles from downtown |
| `maxBusinesses` | the most to research this run |
| `goal`, `goalCount` | keep going until you have, say, 10 owner emails |
| `alsoRequire` | more things a business must have to count, e.g. a valid email and a phone not on Do Not Call |
| `maxCostUsd` | the spending cap: the run stops before going over it |
| `checkPhones` | owners' and main numbers (default), or every number found |
| `offers` | what you sell, so the best opportunity fits it |
| `highlevelToken`, `highlevelLocationId` | save straight into a HighLevel sub-account |
| `quoteOnly` | see the quote without researching anything |

### Output

One item per business: the card (`card.text`, plain words), the people with their emails and phone checks, the
business emails, every check with its evidence, the best offer, flags (no website, do not contact, already uses
HighLevel, chain), and the search it came from. The **Overview** tab shows the main fields as a table.

### Questions

- **Why did it skip businesses?** They were researched in the last 90 days, in any search on your account. Set
  `recheckAfterDays` to change that.
- **It stopped early.** The status says why (your spending cap, your Apify usage limit, a service that stopped
  responding) and searching again continues where it stopped.
- **Canada?** Yes for search, and Canadian numbers get the line check. The Do Not Call lists checked are the US ones
  (National and state), not Canada's National DNCL, so check Canadian numbers there yourself before calling.

# Changelog

This Actor's version history is a separate document: https://apify.com/jarid_orgeron/prospect-buddy/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

As you'd type into Google Maps, e.g. roofer, electrician, med spa.

## `location` (type: `string`):

City and state, e.g. Omaha, NE. Searches the city limits.

## `datasetId` (type: `string`):

Use the results of a Google Maps Scraper run you already have instead of a new search.

## `area` (type: `string`):

City limits is the boundary Google Maps draws for the city. The circles take in the suburbs around downtown.

## `areaListSize` (type: `integer`):

A new area is listed first (name, rating, website only; about $0.004 each) so later runs can continue where this one stopped. Fewer than this means every business in the area was found.

## `areaListDatasetId` (type: `string`):

The list dataset of an earlier run (the Prospect Buddy log's Dataset ID). Researches the next businesses from it instead of searching again. If it's gone, the area is listed again.

## `areaStart` (type: `integer`):

Position in the list to continue from (the log's Next Offset).

## `goal` (type: `string`):

With a goal, the actor researches the area in rounds of 10 until the goal is met, the area runs out, or Max businesses is reached. Every business researched is returned, met or not.

## `alsoRequire` (type: `array`):

More things a business must have to count toward the goal, e.g. Goal = valid emails and Also require = Phone not on Do Not Call. A business counts only when it has all of them. Every business researched is still returned.

## `goalCount` (type: `integer`):

N for the goal above.

## `roundSize` (type: `integer`):

With a goal: how many to research before checking the goal again. Smaller rounds stop closer to the goal; larger ones are a little faster.

## `excludeDatasetIds` (type: `array`):

Results datasets of earlier runs. Businesses in them are skipped (not researched or charged again), e.g. when a search grows from city limits to a 15-mile circle.

## `recheckAfterDays` (type: `integer`):

Every business a run researches, and every area list, is remembered in a named store in your own Apify account (prospect-buddy-history), which never expires. Later runs skip businesses researched within this many days, in any area or niche, so you never pay to research the same business twice; an area listed within this many days is not listed again. 0 turns the memory off. Left empty, it's 90. (The page pre-fills 0 so Apify's daily health check can re-run the same 2 businesses.)

## `maxBusinesses` (type: `integer`):

The most to research this run (with a goal, the spending cap): from the top of the area's list, or from where the last run stopped (Continue an area). Free Apify plans are limited to 25 per run and 500 a month.

## `maxCostUsd` (type: `number`):

The most this search may cost you in Apify charges (this actor, Google Maps, email checks). The search stops before going over it. Prospect Buddy sets it to the quote's maximum.

## `quoteOnly` (type: `boolean`):

Don't search: return what this search would cost (a maximum and a likely figure from your earlier searches) in a few seconds.

## `offers` (type: `array`):

The HighLevel services you sell. Every business is scored against all of them; these come first and pick the best offer. Leave empty for all.

## `peopleAddon` (type: `integer`):

Names, titles and work emails from the Maps scraper's people add-on, merged with the website. Billed by the Maps scraper to your account: about $0.005 a person on paid plans ($0.10 on free, so it's off on free plans). Search mode only.

## `reviewsToCheck` (type: `integer`):

For the review checks (owner replies, last review date, complaints about not calling back). Billed by the Maps scraper: about $0.0005 a review plus $0.002 a business for details. Search mode only.

## `checkPhones` (type: `string`):

Every phone number is checked before you see it: line type (mobile, landline, VoIP), carrier, and Do Not Call status (Federal and State DNC lists, known TCPA litigators), US and Canada numbers. It can't be turned off: a number that couldn't be checked is never shown or saved. Charged per number checked (phone-checked). The checks are included in the price of each business researched. On Apify's free plan: 50 phone checks in all; after that, numbers come back unchecked with a warning on each to check it before calling.

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

Pages linked from the homepage. Most local sites have fewer.

## `useProxyForBlocked` (type: `boolean`):

Only for sites that refuse a normal browser.

## `aiModel` (type: `string`):

Model that sorts contacts.

## `excludeCategories` (type: `array`):

e.g. supply, wholesale. Matched against the Google categories.

## `onePerWebsite` (type: `boolean`):

Chains list the same website on every branch; keep only the first.

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

Skip businesses rated below this.

## `maxRating` (type: `number`):

Skip businesses rated above this (e.g. 4.3 to find reputation prospects).

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

Skip businesses with fewer reviews.

## `maxReviews` (type: `integer`):

Skip businesses with more reviews.

## `requireOwnerEmail` (type: `boolean`):

Keep only businesses where an owner or decision maker was found with a verified or found email.

## `onlyFitFor` (type: `array`):

Keep only businesses that score A or B for at least one of these offers.

## `highlevelToken` (type: `string`):

Sub-account → Settings → Private Integrations → Create. Scopes: View/Edit Contacts, View/Edit Businesses, View/Edit Custom Fields, View/Edit Objects (the search log), and View/Edit Opportunities if you pick a pipeline. Stored encrypted.

## `highlevelLocationId` (type: `string`):

Sub-account → Settings → Business Profile, or the ID in the sub-account's URL after /location/.

## `highlevelTags` (type: `array`):

Added to every contact, next to prospect-buddy, prospect-buddy-<niche>, prospect-buddy-<city>, prospect-buddy-run-<date>, prospect-buddy-fit-a/b/c and prospect-buddy-offer-<best offer>.

## `highlevelPipelineId` (type: `string`):

Also add each new business as an open opportunity in this pipeline.

## `highlevelStageId` (type: `string`):

Stage for new opportunities; the pipeline's first stage if empty.

## `highlevelCreateFields` (type: `boolean`):

Creates 16 contact fields in a Prospect Buddy folder if the sub-account doesn't have them: dropdowns (Fit Band, Best Offer, Decision Maker, Email Status, Website Platform, Uses HighLevel), checkboxes (Lead Gaps, Good Fit Offers), numbers (Fit Score, Google Rating, Google Reviews, Days Since Last Review, Owner Reply Rate) and text (Job Title, Gap Details, Google Maps Link), so smart lists and workflows can filter on them.

## `highlevelLogSearches` (type: `boolean`):

Keeps one record per search term and city (found, owners, owner emails, saved, dataset ID) in a Prospect Buddy custom object, shown as Prospect Buddy in the sub-account's menu. Creates the object if missing and creating fields is on.

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

Each result is also POSTed here as JSON, e.g. a HighLevel workflow's Inbound Webhook trigger (a premium trigger, about $0.01 a run), Zapier or Make.

## `saveDatasetId` (type: `string`):

The dataset of an earlier run of this actor. When set, the actor only saves; search and research inputs are ignored.

## `savePlaceIds` (type: `string`):

The place_id of each business to save, separated by commas, or "all".

## Actor input object example

```json
{
  "searchTerms": [
    "roofer"
  ],
  "location": "Omaha, NE",
  "area": "city",
  "areaListSize": 20,
  "goal": "none",
  "roundSize": 10,
  "recheckAfterDays": 0,
  "maxBusinesses": 2,
  "quoteOnly": false,
  "peopleAddon": 5,
  "reviewsToCheck": 10,
  "checkPhones": "owners",
  "maxPagesPerSite": 30,
  "useProxyForBlocked": true,
  "aiModel": "gpt-6-luna",
  "onePerWebsite": true,
  "requireOwnerEmail": false,
  "highlevelCreateFields": true,
  "highlevelLogSearches": true
}
```

# Actor output Schema

## `businesses` (type: `string`):

One item per business: the owner, checked emails and phone numbers, gaps and the best offer.

# 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 = {
    "searchTerms": [
        "roofer"
    ],
    "location": "Omaha, NE",
    "areaListSize": 20,
    "recheckAfterDays": 0,
    "maxBusinesses": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("jarid_orgeron/prospect-buddy").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 = {
    "searchTerms": ["roofer"],
    "location": "Omaha, NE",
    "areaListSize": 20,
    "recheckAfterDays": 0,
    "maxBusinesses": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("jarid_orgeron/prospect-buddy").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 '{
  "searchTerms": [
    "roofer"
  ],
  "location": "Omaha, NE",
  "areaListSize": 20,
  "recheckAfterDays": 0,
  "maxBusinesses": 2
}' |
apify call jarid_orgeron/prospect-buddy --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jarid_orgeron/prospect-buddy"
        }
    }
}
```

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/4OVVmVdIUdTitDQlG/builds/3QhQraEhXHNI02ge7/openapi.json
