B2b Lookalike Generator
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
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
- Open the Actor in Apify Console and click Try for free.
- Fill in the Company or product name and Reference website URL on the Input tab.
- Pick a Target department (default
Sales) and set Leads per company (default3). - Optionally tune the Filtering threshold — competitors scored below this value are dropped before contact scraping.
- 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.
- Open the Dataset tab for the scored competitors. Then open the
SUB_DATASETSkey-value record for a link to the leads dataset — the enriched decision-maker output.
Input
The Actor takes a small JSON input:
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
companyName | string | yes | — | Used to build the queries "<name> alternative" and "vs <name>". |
websiteUrl | string | yes | — | The reference product's homepage. Crawled once and used as the LLM baseline. |
maxPagesPerQuery | integer | no | 10 | Number of Google SERP pages fetched per query. |
maxCompetitors | integer | no | 200 | Cap on candidate URLs sent to the crawler after dedup and blocklist. |
openRouterModel | string | no | openai/gpt-4o-mini | Any model available on the Apify OpenRouter Actor. |
filteringThreshold | integer (0–100) | no | 60 | Competitors scored below this are dropped before contact scraping. score: null rows are always dropped. |
targetDepartment | string enum | no | sales | Department 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. |
leadsPerCompany | integer (1–25) | no | 3 | Max 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
maxTotalChargeUsdonPOST /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)
| Field | Meaning |
|---|---|
domain | Registrable domain of the qualifying company. |
emails, phones, linkedIns | Contact endpoints discovered on the company's pages. |
leadsEnrichment[] | One object per person: fullName, email, jobTitle, linkedinProfile. |
sourceCompetitor.score | The 0–100 similarity score assigned in Step 4 (LLM). |
sourceCompetitor.reasoning | Short LLM justification for the score. |
targetDepartment | Which department this Run enriched (matches your input). |
Pricing / cost estimation
Costs come from four sub-Actors:
- Google Search Scraper — 4 queries ×
maxPagesPerQuerypages. - Website Content Crawler — 1 reference page +
maxCompetitorscandidate 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, andleadsPerCompany.
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. from60to80) rather than loweringmaxCompetitors— you keep broad candidate discovery cheap in Steps 1–3 and only pay the contact-scraper price on high-confidence matches. - Pick
c_suiteorsalesfor outbound; pickengineering_technicalorproductfor competitive intelligence. - Increase
maxPagesPerQueryif the target product is well-established (more pages → deeper competitor coverage). - Swap
openRouterModeltoanthropic/claude-sonnet-4-5for 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.


