# Website Contact & Tech Stack Scanner (`wishful_knowledge/website-contact-tech-scanner`) Actor

Find B2B website leads with public business emails, social links, tech stack signals, and outreach scores from domain lists.

- **URL**: https://apify.com/wishful\_knowledge/website-contact-tech-scanner.md
- **Developed by:** [sanfeng zhang](https://apify.com/wishful_knowledge) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Website Contact & Tech Stack Scanner

Find B2B website leads with public business emails, social links, website technology signals, and outreach scores from a list of domains or URLs.

This Actor is built for prospecting workflows where a plain email extractor is not enough. It fetches public homepage/contact/about/support pages, keeps conservative business-email defaults, detects platform and marketing stack signals, and returns an opportunity score with suggested outreach angles.

### Best for

- B2B lead enrichment from seed website lists
- Agency prospecting
- SaaS sales research
- Ecommerce service prospecting
- Tech stack based segmentation
- CRM cleanup and contact enrichment

### What it extracts

- Public business role emails such as `info@`, `hello@`, `support@`, and `sales@`
- Optional public phone and WhatsApp numbers
- Public social profile links
- Website platform signals such as Shopify, WooCommerce, WordPress, Webflow, Wix, Squarespace, BigCommerce, and Magento
- Analytics and ad pixels such as Google Tag Manager, Google Analytics, Meta Pixel, TikTok Pixel, Pinterest Tag, and LinkedIn Insight
- Marketing/support signals such as Klaviyo, Mailchimp, HubSpot, Intercom, Drift, Zendesk, and Hotjar
- Contact/about/support links
- Outreach score, reasons, pain points, and suggested angles

### Quality defaults

- `requireBusinessEmail=true`: only save contactable leads by default.
- `includePersonalEmails=false`: filter individual-looking emails by default.
- `includePhones=false`: phone extraction is off by default.
- `respectRobotsTxt=true`: skip disallowed paths when enabled.
- `minOpportunityScore=40`: avoid charging users for very weak results.

### Pricing

Suggested launch pricing: USD 0.01 per saved contactable website lead in the default dataset.

Websites that fail the email or score filter are counted in `RUN_SUMMARY`, but are not saved as paid dataset leads by default.

### Local run

```powershell
node .\src\main.js --input .\sample-input.json
````

### Keywords

website contact scraper, business email finder, B2B email finder, tech stack detector, B2B lead enrichment, website technology scanner, domain enrichment, contact extractor, lead scoring, agency prospecting, SaaS prospecting, ecommerce lead enrichment.

# Actor input Schema

## `queries` (type: `array`):

Search terms used to discover candidate websites when search discovery is enabled.

## `startUrls` (type: `array`):

Known websites or domains to analyze directly.

## `includeSearchDiscovery` (type: `boolean`):

When enabled, the Actor uses best-effort HTML search pages to find candidate websites from the search queries.

## `includePhones` (type: `boolean`):

When enabled, extracts public phone and WhatsApp numbers shown on website pages.

## `includePersonalEmails` (type: `boolean`):

When disabled, keeps only generic business role emails such as info@, support@, sales@, and hello@.

## `requireBusinessEmail` (type: `boolean`):

When enabled, only websites with at least one public business role email are saved to the dataset.

## `minOpportunityScore` (type: `integer`):

Only records with this score or higher are saved to the dataset.

## `maxSites` (type: `integer`):

Maximum number of unique website domains to analyze.

## `maxSearchResultsPerQuery` (type: `integer`):

Maximum candidate URLs to collect from each query.

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

Maximum public pages to fetch from each website, including homepage, contact, about, support, and policy pages.

## `requestDelayMs` (type: `integer`):

Delay between requests, in milliseconds.

## `timeoutSecs` (type: `integer`):

Timeout for each HTTP request.

## `respectRobotsTxt` (type: `boolean`):

Skips paths disallowed for generic crawlers by robots.txt when enabled.

## `userAgent` (type: `string`):

HTTP User-Agent header used for requests.

## Actor input object example

```json
{
  "queries": [
    "shopify agencies email",
    "saas companies contact"
  ],
  "startUrls": [
    "https://www.allbirds.com",
    "https://www.notion.so"
  ],
  "includeSearchDiscovery": false,
  "includePhones": false,
  "includePersonalEmails": false,
  "requireBusinessEmail": true,
  "minOpportunityScore": 40,
  "maxSites": 25,
  "maxSearchResultsPerQuery": 10,
  "maxPagesPerSite": 5,
  "requestDelayMs": 750,
  "timeoutSecs": 15,
  "respectRobotsTxt": true,
  "userAgent": "Mozilla/5.0 (compatible; WebsiteContactTechScanner/0.1; +https://apify.com/)"
}
```

# Actor output Schema

## `leads` (type: `string`):

Websites that passed the opportunity score and business email filters.

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

Counts, filtering decisions, and cost-control information for the run.

# 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 = {
    "queries": [
        "shopify agencies email",
        "saas companies contact"
    ],
    "startUrls": [
        "https://www.allbirds.com",
        "https://www.notion.so"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wishful_knowledge/website-contact-tech-scanner").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 = {
    "queries": [
        "shopify agencies email",
        "saas companies contact",
    ],
    "startUrls": [
        "https://www.allbirds.com",
        "https://www.notion.so",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("wishful_knowledge/website-contact-tech-scanner").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "shopify agencies email",
    "saas companies contact"
  ],
  "startUrls": [
    "https://www.allbirds.com",
    "https://www.notion.so"
  ]
}' |
apify call wishful_knowledge/website-contact-tech-scanner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=wishful_knowledge/website-contact-tech-scanner",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Contact & Tech Stack Scanner",
        "description": "Find B2B website leads with public business emails, social links, tech stack signals, and outreach scores from domain lists.",
        "version": "0.1",
        "x-build-id": "FV5IoU51bNixpBpmk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/wishful_knowledge~website-contact-tech-scanner/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-wishful_knowledge-website-contact-tech-scanner",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/wishful_knowledge~website-contact-tech-scanner/runs": {
            "post": {
                "operationId": "runs-sync-wishful_knowledge-website-contact-tech-scanner",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/wishful_knowledge~website-contact-tech-scanner/run-sync": {
            "post": {
                "operationId": "run-sync-wishful_knowledge-website-contact-tech-scanner",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Search terms used to discover candidate websites when search discovery is enabled.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Seed website URLs",
                        "type": "array",
                        "description": "Known websites or domains to analyze directly.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeSearchDiscovery": {
                        "title": "Discover URLs from search",
                        "type": "boolean",
                        "description": "When enabled, the Actor uses best-effort HTML search pages to find candidate websites from the search queries.",
                        "default": false
                    },
                    "includePhones": {
                        "title": "Include public phone and WhatsApp numbers",
                        "type": "boolean",
                        "description": "When enabled, extracts public phone and WhatsApp numbers shown on website pages.",
                        "default": false
                    },
                    "includePersonalEmails": {
                        "title": "Include individual-looking emails",
                        "type": "boolean",
                        "description": "When disabled, keeps only generic business role emails such as info@, support@, sales@, and hello@.",
                        "default": false
                    },
                    "requireBusinessEmail": {
                        "title": "Require business email for saved leads",
                        "type": "boolean",
                        "description": "When enabled, only websites with at least one public business role email are saved to the dataset.",
                        "default": true
                    },
                    "minOpportunityScore": {
                        "title": "Minimum opportunity score",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only records with this score or higher are saved to the dataset.",
                        "default": 40
                    },
                    "maxSites": {
                        "title": "Max sites",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Maximum number of unique website domains to analyze.",
                        "default": 25
                    },
                    "maxSearchResultsPerQuery": {
                        "title": "Max search results per query",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum candidate URLs to collect from each query.",
                        "default": 10
                    },
                    "maxPagesPerSite": {
                        "title": "Max pages per site",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Maximum public pages to fetch from each website, including homepage, contact, about, support, and policy pages.",
                        "default": 5
                    },
                    "requestDelayMs": {
                        "title": "Request delay",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between requests, in milliseconds.",
                        "default": 750
                    },
                    "timeoutSecs": {
                        "title": "Request timeout",
                        "minimum": 5,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Timeout for each HTTP request.",
                        "default": 15
                    },
                    "respectRobotsTxt": {
                        "title": "Respect robots.txt",
                        "type": "boolean",
                        "description": "Skips paths disallowed for generic crawlers by robots.txt when enabled.",
                        "default": true
                    },
                    "userAgent": {
                        "title": "User agent",
                        "type": "string",
                        "description": "HTTP User-Agent header used for requests.",
                        "default": "Mozilla/5.0 (compatible; WebsiteContactTechScanner/0.1; +https://apify.com/)"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
