B2b Lookalike Generator avatar

B2b Lookalike Generator

Pricing

Pay per usage

Go to Apify Store
B2b Lookalike Generator

B2b Lookalike Generator

Turns one seed company into a ranked list of "lookalike" businesses, with contact details for each. Under the hood it pipelines Google search, the Website Content Crawler, an LLM comparison, and the Contact Details Scraper.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Fabian Maume

Fabian Maume

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Share

What does B2B Lookalike Generator do?

B2B Lookalike Generator turns one seed company into a ranked list of "lookalike" businesses plus contact leads at each qualifying one. Give it your own company's name and website, and it returns two datasets: a scored list of similar companies (0–100 similarity), and a set of enriched contact leads at the strongest matches, filtered to a target department (sales, marketing, C-suite, engineering, ...).

Under the hood it pipelines Google search, the Website Content Crawler, an LLM comparison via the Apify OpenRouter Actor, and vdrmota's Contact Info Scraper. Because it runs on the Apify platform you get an API, scheduling, integrations, and result storage without hosting anything yourself.

Why use B2B Lookalike Generator?

  • Outbound prospecting — feed a single seed URL and get a decision-maker list in one Run. No LinkedIn scraping, no CRM cross-referencing.
  • Total addressable market sizing — see who else sells to your customers and how many of them there are.
  • Account-based marketing — build a warm target account list, pre-annotated with the LLM's similarity reasoning so reps understand why each account is on the list.
  • Competitor sales-team intelligence — target the sales orgs at your top competitors specifically by picking "sales" as the target department.

How to use B2B Lookalike Generator

  1. Open the Actor in Apify Console and click Try for free.
  2. Fill in the Company or product name and Reference website URL on the Input tab.
  3. Pick a Target department (default Sales) and set Leads per company (default 3).
  4. Optionally tune the Filtering threshold — competitors scored below this value are dropped before contact scraping.
  5. Click Start. The Actor runs Google Search Scraper, Website Content Crawler, an LLM scoring step, and finally the contact scraper on every company that clears the threshold.
  6. Open the Dataset tab for the scored competitors. Then open the SUB_DATASETS key-value record for a link to the leads dataset — the enriched decision-maker output.

Input

The Actor takes a small JSON input:

FieldTypeRequiredDefaultNotes
companyNamestringyesUsed to build the queries "<name> alternative" and "vs <name>".
websiteUrlstringyesThe reference product's homepage. Crawled once and used as the LLM baseline.
maxPagesPerQueryintegerno10Number of Google SERP pages fetched per query.
maxCompetitorsintegerno200Cap on candidate URLs sent to the crawler after dedup and blocklist.
openRouterModelstringnoopenai/gpt-4o-miniAny model available on the Apify OpenRouter Actor.
filteringThresholdinteger (0–100)no60Competitors scored below this are dropped before contact scraping. score: null rows are always dropped.
targetDepartmentstring enumnosalesDepartment to enrich leads from. One of: c_suite, product, engineering_technical, design, education, finance, human_resources, information_technology, legal, marketing, medical_health, operations, sales, consulting.
leadsPerCompanyinteger (1–25)no3Max enriched leads per qualifying company (passed as maximumLeadsEnrichmentRecords).

Total cost cap is a Run option, not an input field. Set Max total charge in the Apify Console when starting the Actor (Advanced → Max total charge), or pass maxTotalChargeUsd on POST /v2/acts/{actorId}/runs. The orchestrator reads that value at startup and splits it evenly across the four sub-Actor steps (search, crawl, LLM, contacts).

Example input:

{
"companyName": "Notion",
"websiteUrl": "https://notion.so",
"maxPagesPerQuery": 10,
"maxCompetitors": 30,
"filteringThreshold": 70,
"targetDepartment": "sales",
"leadsPerCompany": 3
}

Output

The Actor produces two datasets:

1. Scored competitors (default dataset)

One item per scored competitor, sorted by descending score. This is the same shape as the upstream Competitor Finder Actor:

{
"url": "https://www.coda.io/",
"domain": "coda.io",
"title": "Coda — the all-in-one collaborative workspace",
"serpRank": 2,
"serpQuery": "Notion alternative",
"score": 88,
"reasoning": "Coda targets the same knowledge-work audience with docs, databases, and automations in a single collaborative workspace.",
"contentSnippet": "Coda brings words, data, and teams together..."
}

2. Enriched leads (named dataset leads-<runId>)

One item per company that cleared the filtering threshold. Each row is a merged contact-info-scraper output enriched with the source competitor's score and reasoning:

{
"domain": "coda.io",
"originalStartUrl": "https://www.coda.io/",
"emails": ["press@coda.io", "sales@coda.io"],
"phones": ["+1-415-555-0134"],
"linkedIns": ["https://linkedin.com/company/coda-io"],
"leadsEnrichment": [
{
"fullName": "Jane Doe",
"email": "jane.doe@coda.io",
"jobTitle": "VP of Sales",
"linkedinProfile": "https://linkedin.com/in/janedoe"
}
],
"sourceCompetitor": {
"domain": "coda.io",
"url": "https://www.coda.io/",
"score": 88,
"reasoning": "Coda targets the same knowledge-work audience..."
},
"targetDepartment": "sales"
}

The dataset URL is exposed under the SUB_DATASETS key-value record — click through from the Run's Output tab.

You can download either dataset in JSON, HTML, CSV, or Excel from the Apify Console.

Data table (leads dataset)

FieldMeaning
domainRegistrable domain of the qualifying company.
emails, phones, linkedInsContact endpoints discovered on the company's pages.
leadsEnrichment[]One object per person: fullName, email, jobTitle, linkedinProfile.
sourceCompetitor.scoreThe 0–100 similarity score assigned in Step 4 (LLM).
sourceCompetitor.reasoningShort LLM justification for the score.
targetDepartmentWhich department this Run enriched (matches your input).

Pricing / cost estimation

Costs come from four sub-Actors:

  • Google Search Scraper — 4 queries × maxPagesPerQuery pages.
  • Website Content Crawler — 1 reference page + maxCompetitors candidate pages, maxCrawlDepth: 0.
  • OpenRouter — one chat completion per candidate.
  • vdrmota/contact-info-scraper — pay-per-event (pages scraped + enriched leads + verified emails). Bounded per company by maxRequestsPerStartUrl: 20, maxDepth: 1, and leadsPerCompany.

Set Max total charge on the Run to hard-cap the total. The orchestrator reads that value and splits it evenly across the four cost-spending steps — each gets maxTotalChargeUsd / 4. Cumulative spend is tracked between steps; the next step throws before launch if the running total exceeds the cap. The LLM step also short-circuits once its share is projected to be hit (estimated from OpenRouter token usage, ±20% accuracy).

If Max total charge is left unset, the orchestrator runs uncapped and no cap is passed to sub-Actors.

Tips & advanced options

  • Tune the filter, not the crawl cap. Raise filteringThreshold (e.g. from 60 to 80) rather than lowering maxCompetitors — you keep broad candidate discovery cheap in Steps 1–3 and only pay the contact-scraper price on high-confidence matches.
  • Pick c_suite or sales for outbound; pick engineering_technical or product for competitive intelligence.
  • Increase maxPagesPerQuery if the target product is well-established (more pages → deeper competitor coverage).
  • Swap openRouterModel to anthropic/claude-sonnet-4-5 for higher-quality reasoning at a higher cost.
  • Domains from wikipedia.org, capterra.com, g2.com, and other review/directory sites are always filtered out.
  • Each of the four steps gets exactly maxTotalChargeUsd / 4. If contact scraping dominates for your target audience, raise Max total charge so its slice is enough.

FAQ, disclaimers, and support

Is this legal? Public web scraping is widely done in aggregate, but confirm with your legal team that your use case complies with the target sites' terms and applicable privacy law (GDPR, CCPA, etc.) before running at scale — especially since this Actor extracts personal contact data.

Why is a competitor scored null? Its page could not be fetched, or the LLM call failed. Those rows are always dropped before contact scraping.

Why is the leads dataset smaller than the competitors dataset? Only competitors with score >= filteringThreshold are sent to the contact scraper. Lower the threshold to include more companies (at higher cost).

Where do I report an issue? Open one from the Actor's Issues tab in Apify Console.