# Website Lead Enricher: Emails, Phones, Socials & Tech Stack (`feedwise/website-lead-enricher`) Actor

Turn a list of websites into leads: emails (with mail-server check), phones, address, Instagram, TikTok, YouTube, LinkedIn and other social profiles, link-in-bio pages, plus the tech stack (CMS, ecommerce, analytics, chat). Also reads Linktree pages. One row per site.

- **URL**: https://apify.com/feedwise/website-lead-enricher.md
- **Developed by:** [Feedwise Data](https://apify.com/feedwise) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 website reports

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Website Lead Enricher — emails, phones, social profiles and tech stack for any website

Give it a list of websites. Get **one clean row per site** with everything you need to reach and
qualify the business:

- **Emails**, sorted best-first: addresses on the company's own domain come first, personal addresses
  (jane@) before generic ones (info@). Each email is tagged `generic` or `personal`, and checked for a
  working mail server (`domainAcceptsMail`).
- **Phone numbers** and **postal address** (from click-to-call links and structured data).
- **Social profiles**: Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Pinterest, Threads, GitHub,
  Discord, Telegram, WhatsApp, Twitch, Snapchat, plus **link-in-bio pages** (Linktree, Beacons, Stan
  and more).
- **Tech stack**: CMS or site builder (WordPress, Webflow, Wix, Squarespace…), ecommerce platform
  (Shopify, WooCommerce, Magento, BigCommerce), analytics, ad pixels (Meta, TikTok, LinkedIn, Google
  Ads), marketing automation (HubSpot, Klaviyo, Mailchimp…), live chat, payments, hosting and CDN.
- **Linktree pages** work as input too: paste a creator's `linktr.ee/name` link (for example from an
  Instagram or TikTok bio) to get all of their links, socials and contact emails.

It reads the homepage plus the most useful contact, about, imprint, team and legal pages (up to 6 by
default). **One flat price per website**, however many pages it reads.

### Who uses this

- **Sales and lead generation**: enrich a list of domains from a CRM, Google Maps export or trade-show list.
- **Agencies**: find prospects running Shopify without Klaviyo, or WordPress without analytics.
- **Influencer and creator marketing**: get the Instagram, TikTok and YouTube accounts of brands, and
  creator contact links from their link-in-bio pages.
- **Researchers**: profile the technology used across a market.

### Input

```json
{
  "websites": ["allbirds.com", "basecamp.com", "https://www.joesstonecrab.com", "https://linktr.ee/name"],
  "maxPagesPerSite": 6,
  "checkEmailDomains": true,
  "detectTechStack": true
}
```

### Output (one row per website)

```json
{
  "input": "allbirds.com",
  "status": "ok",
  "website": "https://www.allbirds.com/",
  "domain": "allbirds.com",
  "companyName": "Allbirds",
  "primaryEmail": "help@allbirds.com",
  "emails": [{ "email": "help@allbirds.com", "type": "generic", "matchesWebsite": true, "domainAcceptsMail": true }],
  "phones": [],
  "address": null,
  "instagram": "https://www.instagram.com/allbirds",
  "tiktok": "https://www.tiktok.com/@weareallbirds",
  "youtube": "https://www.youtube.com/channel/UCnGErLCau5qNJ0Xwe6uEyTw",
  "facebook": "https://www.facebook.com/weareallbirds",
  "x": "https://twitter.com/allbirds",
  "socials": { "instagram": ["…"], "pinterest": ["https://pinterest.com/weareallbirds"] },
  "cms": null,
  "ecommercePlatform": "Shopify",
  "technologies": ["Shopify", "Google Tag Manager", "OneTrust", "Cloudflare"],
  "techByCategory": { "Ecommerce": ["Shopify"], "Tag manager": ["Google Tag Manager"], "CDN": ["Cloudflare"] },
  "contactPage": null,
  "pagesScanned": ["https://www.allbirds.com/", "https://www.allbirds.com/pages/help"]
}
```

Sites that can't be loaded get a row with `status: "failed"` and the reason; sites where nothing at
all was found get `status: "empty"`. Neither is **charged**.

### Pricing

Pay per website report. Unreachable sites and empty results are free.

### FAQ

**Does it guess emails?** No. Every email was published on the website (or in its structured data).
`domainAcceptsMail` only checks that the domain has mail servers; it doesn't send anything.

**Does it work on Instagram or TikTok profile URLs?** Those sites require a login to read, so they're
not supported as input. Paste the website or the link-in-bio page from the profile instead.

**Does it run JavaScript?** It reads the HTML that the server sends, which is fast and cheap. Sites
that render everything in the browser can return fewer contacts; their tech stack is still detected.

**Is this allowed?** It reads public pages the same way a browser does, a few pages per site. Use the
contacts in line with the privacy and anti-spam rules (GDPR, CAN-SPAM) that apply to you.

# Actor input Schema

## `websites` (type: `array`):

One per line: a domain (allbirds.com), a URL (https://www.example.com) or a link-in-bio page (https://linktr.ee/name).

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

The homepage plus the most useful contact, about, imprint, team and legal pages. More pages find more contacts but take longer. The price is per site, not per page.

## `checkEmailDomains` (type: `boolean`):

Look up each email domain's mail servers (MX records) and flag addresses whose domain can't receive email.

## `detectTechStack` (type: `boolean`):

Identify the CMS, ecommerce platform, analytics, advertising pixels, chat, payments, hosting and frameworks from the pages read.

## `concurrency` (type: `integer`):

How many websites to read at the same time.

## Actor input object example

```json
{
  "websites": [
    "allbirds.com",
    "basecamp.com",
    "https://www.joesstonecrab.com"
  ],
  "maxPagesPerSite": 6,
  "checkEmailDomains": true,
  "detectTechStack": true,
  "concurrency": 10
}
```

# Actor output Schema

## `results` (type: `string`):

One row per website: emails, phones, address, social profiles, link-in-bio page and tech stack.

# 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 = {
    "websites": [
        "allbirds.com",
        "basecamp.com",
        "https://www.joesstonecrab.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("feedwise/website-lead-enricher").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 = { "websites": [
        "allbirds.com",
        "basecamp.com",
        "https://www.joesstonecrab.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("feedwise/website-lead-enricher").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 '{
  "websites": [
    "allbirds.com",
    "basecamp.com",
    "https://www.joesstonecrab.com"
  ]
}' |
apify call feedwise/website-lead-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,feedwise/website-lead-enricher"
        }
    }
}
```

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/e6jNURQL9J7ilkRD7/builds/ayutu3v4mHzXvegOP/openapi.json
