# Sales Prospect Finder & Enricher — PhantomBuster Alternative (`khadinakbar/phantombuster-alternative`) Actor

Find and enrich public sales prospects across LinkedIn, Instagram, X, YouTube, and Google. Export people, companies, profiles, activity, and search records with source links and optional outreach drafts for human review.

- **URL**: https://apify.com/khadinakbar/phantombuster-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Lead generation, Automation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $80.00 / 1,000 completed workflow requests

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?

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

## Sales Prospect Finder & Enricher — PhantomBuster Alternative

Find and enrich public sales prospects across LinkedIn, Instagram, X, YouTube, and Google. Export people, companies, profiles, activity, and search records with source links and optional outreach drafts for human review. For sales operations, each accepted dataset row is a normalized prospecting or profile result with a record type and workflow identifier.

### Workflow: put the results to work

Choose a discovery workflow to find the relevant people, companies, or public activity, then enrich selected profile URLs. Review normalized records with their source evidence before qualification or CRM import. Optional outreach remains a draft marked for human review; no messages or invitations are sent.

### Supported workflows

| Goal | Workflow | Input | Result |
| --- | --- | --- | --- |
| Find people | `linkedinPeopleSearch` | Query, optional company/title/location | Person prospects |
| Enrich people | `linkedinProfile` | LinkedIn profile URLs | Detailed person profiles |
| Find companies | `linkedinCompanySearch` | Query and optional location | Company prospects |
| Enrich companies | `linkedinCompany` | LinkedIn company URLs | Detailed company profiles |
| Find warm leads | `linkedinPostEngagers` | LinkedIn post URLs | Commenter and reactor records |
| Track person activity | `linkedinProfilePosts` | LinkedIn profile URLs | Recent public posts |
| Track company activity | `linkedinCompanyPosts` | LinkedIn company URLs | Recent public posts |
| Find hiring signals | `linkedinJobSearch` | Query and optional location | Public job records |
| Find intent content | `linkedinPostSearch` | Query and freshness | Public post records |
| Find service providers | `linkedinServiceSearch` | Query and optional location | Public service-profile records |
| Enrich creators | `instagramProfile`, `xProfile`, `youtubeChannel` | Public profile/channel URLs | Detailed social profiles |
| Research the open web | `googleSearch` | Query, region, and freshness | Public search results |

### From public search to a reviewed lead

A sales operations analyst starts with `linkedinPeopleSearch` and a specific market, role, and location. The Actor returns normalized people records with source URLs and collection times. Next, the analyst selects relevant profiles and runs `linkedinProfile` for richer public context. The accepted rows can then be passed to a CRM import, qualification model, or review queue. When drafts are enabled, every draft stays labeled for human review and can be edited before a separately authorized outreach step.

### Quick start

Find LinkedIn people:

```json
{
  "workflow": "linkedinPeopleSearch",
  "query": "B2B SaaS founders",
  "location": "United States",
  "maxResults": 25,
  "responseFormat": "concise"
}
```

Enrich known profiles and prepare drafts for review:

```json
{
  "workflow": "linkedinProfile",
  "targetUrls": [
    { "url": "https://www.linkedin.com/in/example/" }
  ],
  "maxResults": 10,
  "includeOutreachDraft": true,
  "outreachGoal": "compare sales workflow priorities",
  "senderName": "Alex"
}
```

### Output

Every accepted dataset row uses the same core contract:

- Identity: `recordId`, `recordType`, `fullName`, `profileUrl`
- Work context: `jobTitle`, `companyName`, `companyUrl`, `location`
- Public contact fields: `website`, `publicEmails`, `publicPhones`
- Sales signals: `summary`, `engagementType`, `publishedAt`, follower/connection/employee counts
- Provenance: `workflow`, `sourcePlatform`, `sourceUrl`, `query`, `collectedAt`
- Optional review queue: `outreachDraft`, `reviewStatus`, `actionStatus`

Use `responseFormat: "detailed"` when you also need a bounded public source-data object. Private routing, credentials, and service-billing metadata are removed from that object.

Example:

```json
{
  "recordId": "015bfeaa54bd846b89d0d8ef",
  "recordType": "person",
  "workflow": "linkedinPeopleSearch",
  "sourcePlatform": "linkedin",
  "sourceUrl": "https://www.linkedin.com/in/example/",
  "fullName": "Example Person",
  "jobTitle": "Founder",
  "companyName": "Example Company",
  "location": "London, United Kingdom",
  "publicEmails": [],
  "publicPhones": [],
  "collectedAt": "ISO 8601 collection timestamp",
  "provenance": "public_web_data"
}
```

The example illustrates the schema only and is not a real lead.

### Best results and workflow guidance

Provide a focused query or canonical public HTTPS target URL, start with a small result cap, and confirm that the returned source URLs match your intended market. Use concise output for routing and qualification; use detailed output for a bounded research record. For fresher intent signals, pair company or person activity with post-engager collection and keep `collectedAt` alongside any downstream score. A `VALID_EMPTY` outcome is a useful result: refine the query, verify the public target, and continue with the next specific segment.

### Outcome contract

Read `OUTPUT` for a compact result and `RUN_SUMMARY` for exact request, row, charge, warning, build, and anonymous route-attempt counts.

- `COMPLETE`: accepted records were returned with no unexpected request or validation failures.
- `PARTIAL`: useful records were returned, with at least one target or record requiring another pass.
- `VALID_EMPTY`: the public request completed correctly and found no matching records.
- `INVALID_INPUT`: the workflow/input combination is invalid.
- `UPSTREAM_FAILED`: no configured data route returned usable public data.

A green Apify run is not the only proof: downstream automation should reconcile `itemsPushed`, the dataset count, `chargedEventCounts`, and the terminal outcome.

### AI agent and MCP prompt

> Run `linkedinPeopleSearch` for B2B SaaS founders in Canada with a 25-result scope. Read back the dataset and `OUTPUT`, report the terminal outcome and charged event counts, preserve each source URL and collection time, and return only records with a public profile URL. Prepare drafts for human review and keep every action status as `not_sent`.

### Builder's note

I designed the workflow catalog around the jobs that repeatedly matter in prospecting: find a market, inspect the person or company, capture activity and engagement signals, and hand a stable record to the next system. In my testing, the most useful design choice was keeping one normalized dataset contract across every source while preserving optional detailed public fields for deeper review.

### How it compares with PhantomBuster

PhantomBuster is a broad sales-automation workspace with subscription plans, automation slots, execution-hour allowances, lead lists, enrichment credit pools, scheduling, integrations, and authenticated outreach. This Actor is a focused, API-first alternative for teams that want bounded public-data prospecting jobs and Apify-native outputs.

| Decision | This Actor | PhantomBuster |
| --- | --- | --- |
| Billing | Dynamic completed-request and accepted-result events | Subscription plans with slots, execution time, and separate credit pools |
| Same-job cost | Announces a calculable event-charge cap from requests and accepted rows | Allocates the job against shared monthly workspace capacity |
| Effective efficiency | One normalized dataset contract across every workflow | Lead lists and automation-specific outputs inside an integrated workspace |
| LinkedIn research | People, profiles, companies, engagers, activity, jobs, posts, and services | Larger catalog with authenticated and scheduled LinkedIn workflows |
| Other sources | Instagram, X, YouTube, and Google profile/search workflows | Broader automation catalog across 15+ platforms |
| Output | One normalized dataset contract plus machine-readable terminal records | Workspace lead lists and automation-specific exports |
| Outreach | Reviewable drafts only; nothing is sent | Authenticated invitations, messages, and follow-up sequences |
| Automation surface | One API-first Actor that can be scheduled or chained on Apify | Full dashboard workspace, extension-based account connections, and team features |

Choose PhantomBuster when authenticated social actions, its workspace UI, or its complete automation catalog is the requirement. Choose this Actor when the job is public prospect discovery/enrichment with explicit cost caps and normalized Apify data.

PhantomBuster is a trademark of its owner. This independent Actor is not affiliated, associated, sponsored, or endorsed by PhantomBuster.

### API

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/phantombuster-alternative').call({
  workflow: 'linkedinPeopleSearch',
  query: 'AI agency founders',
  maxResults: 25
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Responsible use

Collect only public data you are authorized to process. Follow applicable platform terms, privacy and employment laws, data-minimization rules, opt-outs, and retention requirements. Public contact details are not proof of accuracy, consent, current employment, or permission to contact someone. Review every draft and establish a lawful basis before any outreach in another system.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/phantombuster-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `workflow-request` | Completed workflow request | One target URL or search page completed through a usable public-data route, including valid requests with no matching rows. |
| `prospect-found` | Prospecting result | One validated discovery, activity, engager, job, service, content, or search-result record persisted to the dataset. |
| `prospect-enriched` | Enriched prospect profile | One validated detailed person, company, Instagram, X, or YouTube profile persisted to the dataset. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

# Actor input Schema

## `workflow` (type: `string`):

Choose the prospecting task. Search workflows use Query; profile, post-engager, and activity workflows use Target URLs.

## `query` (type: `string`):

Required for search workflows. Example: B2B SaaS founders. Ignored by URL-based workflows.

## `targetUrls` (type: `array`):

Required for URL-based workflows. Supply 1 to 20 public URLs matching the selected platform and workflow, such as a LinkedIn profile, company, or post URL.

## `maxResults` (type: `integer`):

Hard cap across the run. Accepts 1 to 100 and defaults to 25. The Actor announces the maximum event-charge amount before collection begins.

## `page` (type: `integer`):

Page number for supported discovery and activity workflows. Accepts 1 to 10 and defaults to 1.

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

Optional location filter where the selected workflow supports it, for example United States.

## `region` (type: `string`):

Optional two-letter country code for Google search, for example US, GB, or CA.

## `company` (type: `string`):

Optional current-company filter for LinkedIn people search.

## `jobTitle` (type: `string`):

Optional job-title filter for LinkedIn people search.

## `postedWithin` (type: `string`):

Optional freshness filter for supported post and job searches.

## `responseFormat` (type: `string`):

Concise returns stable normalized sales fields. Detailed also includes a bounded public source-data object with private routing and billing metadata removed.

## `includeOutreachDraft` (type: `boolean`):

When enabled, eligible people records include a restrained message draft marked requires\_human\_review and not\_sent. This Actor never sends invitations, comments, follows, or messages.

## `outreachGoal` (type: `string`):

Optional sentence fragment used only in the reviewable draft, for example discuss a co-marketing partnership.

## `senderName` (type: `string`):

Optional signature for reviewable drafts. No account credentials or session cookies are accepted.

## Actor input object example

```json
{
  "workflow": "linkedinPeopleSearch",
  "query": "B2B SaaS founders",
  "targetUrls": [],
  "maxResults": 25,
  "page": 1,
  "responseFormat": "concise",
  "includeOutreachDraft": false
}
```

# Actor output Schema

## `prospects` (type: `string`):

Validated normalized prospect, company, content, engager, job, service, social-profile, or search-result rows.

## `compactOutput` (type: `string`):

Outcome, workflow, accepted-result counts, anonymous fallback state, warnings, and charged events for agents and automations.

## `runSummary` (type: `string`):

Detailed request, result, anonymous route, charge, build, and no-send boundary diagnostics.

# 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 = {
    "workflow": "linkedinPeopleSearch",
    "query": "B2B SaaS founders",
    "targetUrls": [],
    "maxResults": 25,
    "page": 1,
    "responseFormat": "concise",
    "includeOutreachDraft": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/phantombuster-alternative").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 = {
    "workflow": "linkedinPeopleSearch",
    "query": "B2B SaaS founders",
    "targetUrls": [],
    "maxResults": 25,
    "page": 1,
    "responseFormat": "concise",
    "includeOutreachDraft": False,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/phantombuster-alternative").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 '{
  "workflow": "linkedinPeopleSearch",
  "query": "B2B SaaS founders",
  "targetUrls": [],
  "maxResults": 25,
  "page": 1,
  "responseFormat": "concise",
  "includeOutreachDraft": false
}' |
apify call khadinakbar/phantombuster-alternative --silent --output-dataset

```

## MCP server setup

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

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/Ck4pDATTfx9rIkdzf/builds/vrlmlrNY9yN1vgCCp/openapi.json
