# Public B2B Prospect Finder — Apollo.io Alternative (`khadinakbar/apollo-alternative`) Actor

Find public B2B prospects from role, company, industry, and location queries. Export LinkedIn profile URLs, headlines, source queries, ranks, and timestamps to build a source-linked prospect-review list.

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

## Pricing

from $20.00 / 1,000 public prospect founds

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

## Public B2B Prospect Finder — Apollo.io Alternative

Find public B2B prospects from role, company, industry, and location queries. Export LinkedIn profile URLs, headlines, source queries, ranks, and timestamps to build a source-linked prospect-review list. For sales researchers, each dataset record is a public prospect reference with a profile URL, headline, and source query.

### Workflow: put the results to work

Translate your ideal-customer profile into roles, companies, industry terms, and the appropriate search market. Review the resulting public profile links before adding approved prospects to a contact-research workflow. Discovery here does not include a verified email database or message sending.

### What this workflow replaces—and what it does not

Use this as an on-demand alternative for the **public prospect-discovery step**: turn a role/company/industry query, with a selected Google country market, into reviewable public profile links with the exact search query, source URL, rank, and collection time.

It does **not** replace Apollo's proprietary contact database, verified emails or phone numbers, buying-intent signals, CRM sync, sequences, mailbox sending, call tools, or team sales workspace. Apollo is the better choice when those broader suite features are the job. This independent Actor is not affiliated with, associated with, or endorsed by Apollo.io.

### Comparing this workflow with Apollo.io

This Actor covers source-linked public discovery and its reviewable output contract. Apollo.io covers a broader sales-intelligence and engagement suite. The pricing models differ as well: this Actor declares per-run events plus platform usage, while Apollo's public pricing presents seat and credit plans. Public discovery records keep the exact search query and collection time beside the profile URL, which helps a reviewer decide whether a candidate is current enough for the next approved workflow.

| Decision area | This Actor | Apollo.io | Practical routing |
| --- | --- | --- | --- |
| Scope | Public prospect discovery with source links and timestamps. | A broader sales-intelligence and engagement suite. | Select the tool matching the requested workflow boundary. |
| Billing | Pay per event plus platform usage; see the Pricing tab for current rates. | Public pricing presents seat and credit plans. | Budget a bounded run with `maxResults`; check the live pricing surfaces before purchase. |
| Same-job cost | A private cloud run is pending before total buyer cost is measured. | A comparable plan allocation needs the same workload assumptions. | Keep cost comparison private until both sides use the same usable-output definition. |
| Effective efficiency | Each persisted row carries a reviewable source query and collection time. | Broader-suite operator efficiency depends on selected product workflows. | Measure usable rows and active review time for the same query before choosing at scale. |
| Integrations and automation | The dataset is prepared for a separate approved API, CRM, or outreach workflow. | Apollo provides broader integration and outbound workflow features. | Use the next approved system for enrichment, CRM updates, and engagement. |
| Freshness and provenance | Each row includes `sourceSearchUrl` and `collectedAt`. | Apollo documents data enrichment and refresh capabilities. | Review provenance and collection context before acting on a discovered profile. |

This independent Actor is not affiliated, associated, or endorsed by Apollo.io.

### Best fit

Use it when you need a small, current, source-linked list to review before outreach or to pass into a separate approved enrichment workflow. Avoid it when you need verified work location, email or phone data, sales engagement, CRM operations, or a comprehensive proprietary contact database; use an approved provider that explicitly supplies those capabilities instead.

### Input

```json
{
  "jobTitles": ["Head of Growth"],
  "keywords": ["B2B SaaS"],
  "companyNames": ["ExampleCo"],
  "industry": "software",
  "location": "United States",
  "country": "US",
  "maxResults": 25
}
```

At least one of `jobTitles`, `keywords`, or `companyNames` is required. The Actor combines the supplied role, company, keyword, and industry terms into each source-visible Google query constrained to public `linkedin.com/in/` results; `country` controls the Google market, while `location` is retained as request context and is not a verified profile-location filter. DataForSEO Google Organic is the primary request route; a direct Google route through Apify Residential Proxy is retained only as a disclosed fallback. It caps role/company combinations at ten and persists no more than `maxResults` unique profile records.

### Output

One dataset item means one validated public-profile discovery, not a verified person, employment assertion, email address, or outreach permission.

| Field | Meaning |
| --- | --- |
| `profileUrl` | Canonical public LinkedIn profile URL found through public web search. |
| `displayName`, `headline`, `snippet` | Public search-result text; fields are null when not safely available. |
| `sourceQuery`, `sourceSearchUrl`, `sourceRank` | Replayable discovery context for review. |
| `selectedJobTitle`, `selectedCompany` | The input plan that produced the record. |
| `country`, `collectedAt`, `source` | Market context, collection time, and collection route (`DataForSEO Google Organic` or a disclosed direct fallback). |

```json
{
  "profileUrl": "https://www.linkedin.com/in/jordan-lee",
  "displayName": "Jordan Lee",
  "headline": "Head of Growth at ExampleCo",
  "snippet": "Growth leader in B2B SaaS.",
  "sourceQuery": "site:linkedin.com/in/ \"Head of Growth\" \"B2B SaaS\"",
  "sourceSearchUrl": "https://www.google.com/search?q=site%3Alinkedin.com%2Fin%2F",
  "sourceRank": 1,
  "selectedJobTitle": "Head of Growth",
  "selectedCompany": null,
  "country": "US",
  "collectedAt": "2026-09-07T10:00:00.000Z",
  "source": "DataForSEO Google Organic"
}
```

### From ICP to reviewed list

An SDR targeting growth leaders at B2B software companies starts with a title, industry, location, and a low `maxResults` cap. The Actor returns public profile links, preserves the search provenance, and gives the SDR a compact review queue. The team can remove mismatches, check data authority and contact preferences, then use its approved enrichment or CRM process. This keeps data collection, contact verification, and outreach as distinct, auditable steps.

### Terminal outcomes

Read `OUTPUT` or `RUN_SUMMARY` before downstream use. `COMPLETE` means every selected public-search route and validated record path completed; `PARTIAL` preserves useful records while disclosing route or write interruptions; `VALID_EMPTY` means a functioning search found no matching public profiles; `INVALID_INPUT` explains how to refine the request; and `UPSTREAM_FAILED` signals that the required public-search route needs a later retry.

Public search snippets can be stale, incomplete, personalized, or unavailable by geography. Always review `sourceSearchUrl` and `collectedAt` before treating a record as current. If `OUTPUT.outcome` is `UPSTREAM_FAILED`, retry later and inspect the route errors in `RUN_SUMMARY`; do not treat an empty dataset from a failed route as no prospects. DataForSEO is a pay-as-you-go upstream data provider that needs the Actor owner's configured API credentials; it is not an Apollo account or a source of private contact data.

### API and AI-agent use

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~apollo-alternative/runs?token=$APIFY_TOKEN" \
  -X POST -H "Content-Type: application/json" \
  -d '{"jobTitles":["Head of Growth"],"keywords":["B2B SaaS"],"country":"US","maxResults":10}'
```

AI agent prompt:

> Find up to ten public LinkedIn profiles for Heads of Growth in US B2B SaaS. Return the profile URL, headline, source query, source link, collection time, and terminal outcome. Label this dataset as public prospect discovery for human review before a separate contact-data or outreach step.

### Responsible use

Use public or authorized data for lawful research, respect applicable terms and data-protection obligations, and obtain the appropriate basis before personal outreach. This Actor intentionally does not collect private profile fields, credentials, email addresses, phone numbers, or messages.

### Builder's note

I designed the record shape to keep `sourceSearchUrl` and `collectedAt` beside every profile link. Public prospect discovery is most useful when a downstream reviewer can see exactly how a candidate was found and distinguish an observed result from a verified contact record.

### Pricing and run costs

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

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `public-prospect-found` | Public prospect found | One validated, persisted source-linked public LinkedIn profile discovery. No email, phone, or private contact data is included. |

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

## `jobTitles` (type: `array`):

One to ten job titles to match in public LinkedIn search results, such as `Head of Growth` or `VP Marketing`. Each value becomes a bounded search plan and duplicates are removed. Use this for people roles, not a list of profile URLs or an email-search request.

## `keywords` (type: `array`):

Optional role, skill, or market phrases such as `B2B SaaS` or `demand generation`. They are combined with the public LinkedIn search query and deduplicated. This is not a free-form search of Apollo's proprietary database or a Boolean-email verifier.

## `companyNames` (type: `array`):

Optional company names to pair with titles or keywords, for example `Stripe` or `HubSpot`. The Actor makes one bounded role-company query per combination, with a maximum of ten query plans. This is not a company-domain enrichment or account-intent filter.

## `industry` (type: `string`):

Optional industry phrase added to every public-search query, such as `cybersecurity` or `healthcare`. Defaults to empty and does not verify NAICS codes or buying intent. Use a short descriptive phrase rather than a location or job title.

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

Optional city, region, or country context such as `San Francisco Bay Area` or `London`. It is retained with the request context; `country` controls Google-market context. This is not a guaranteed residence or employment-location filter or verification.

## `country` (type: `string`):

Two-letter ISO country code used for public-search market context and the residential proxy, such as `US`, `GB`, or `PK`. Defaults to `US`; it does not guarantee that every profile belongs to this country. Do not enter a full country name here.

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

Hard cap on unique public prospect records persisted for this run. Defaults to 25 and accepts 1 through 100; each persisted record costs $0.02 plus platform usage. Start small to validate relevance before a larger run.

## Actor input object example

```json
{
  "jobTitles": [
    "Head of Growth"
  ],
  "keywords": [],
  "companyNames": [],
  "industry": "B2B SaaS",
  "location": "United States",
  "country": "US",
  "maxResults": 25
}
```

# Actor output Schema

## `publicProspects` (type: `string`):

One source-linked public LinkedIn profile discovery per persisted result.

## `output` (type: `string`):

Stable result counts, outcome, charges, and warnings for automation.

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

Detailed query, routing, failure, and billing 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 = {
    "jobTitles": [
        "Head of Growth"
    ],
    "industry": "B2B SaaS",
    "location": "United States",
    "country": "US",
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/apollo-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 = {
    "jobTitles": ["Head of Growth"],
    "industry": "B2B SaaS",
    "location": "United States",
    "country": "US",
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/apollo-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 '{
  "jobTitles": [
    "Head of Growth"
  ],
  "industry": "B2B SaaS",
  "location": "United States",
  "country": "US",
  "maxResults": 25
}' |
apify call khadinakbar/apollo-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/apollo-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/7chyRbD6rRl5uSvid/builds/Z2GcgjvBBbdHWgMhO/openapi.json
