# Website Contact & Tech Stack Finder — Emails, Phones, Socials (`storesignal/website-contact-tech-finder`) Actor

Enrich a list of website domains with public contact emails, phone numbers, social profiles and the detected platform and technologies. Pay only for successfully analyzed sites.

- **URL**: https://apify.com/storesignal/website-contact-tech-finder.md
- **Developed by:** [StoreSignal](https://apify.com/storesignal) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 site analyzeds

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 Contact & Tech Stack Finder: Emails, Phones, Socials and Platform

Give this Actor a list of website domains and it returns one record per site: public contact emails, phone numbers, social profiles, and the detected platform and technologies. It is built for sales teams and agencies that enrich domain lists before outreach. It reads only public pages (the homepage and a few contact-like pages), with no browser and no login.

### What you get

- **Emails:** public addresses found on the homepage and contact-like pages, same-domain addresses first (max 15), plus `primaryEmail`, the best guess (prefers `info@`, `contact@`, `hello@`, `sales@`, `support@` on the site's own domain).
- **Phones:** numbers from `tel:` links (max 5).
- **Socials:** Instagram, Facebook, TikTok, X/Twitter, YouTube, Pinterest, LinkedIn. Share and intent links are ignored.
- **Platform:** one of Shopify, WooCommerce, WordPress, Magento, BigCommerce, PrestaShop, Wix, Squarespace, Webflow, Drupal, Joomla, Ghost, HubSpot CMS, Framer, OpenCart, or null.
- **Technologies:** analytics, chat, payments, marketing and framework tools detected on the homepage, plus `technologyCount`.
- **Page basics:** title, meta description, language, final URL, contact page URL.

### Who it's for

1. **Sales teams:** turn a list of company domains into contactable leads with a platform and tech profile for segmentation.
2. **Agencies:** find sites on a given platform or without a given tool (chat, analytics, consent banner) and pitch them.
3. **Researchers and data teams:** enrich domain lists with consistent, structured fields.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | string\[] | required | Domains or URLs in any form. Normalized to the origin and deduplicated. |
| `maxPagesPerSite` | integer | 5 | Homepage plus contact-like pages fetched per site (1 to 15). |
| `maxConcurrency` | integer | 10 | Sites processed in parallel (1 to 50). |
| `proxyConfiguration` | object | Apify Proxy (datacenter) | Recommended on the platform; many sites refuse requests from cloud IPs without it. |

```json
{
  "urls": ["www.beardbrand.com", "basecamp.com", "www.deathwishcoffee.com"],
  "maxPagesPerSite": 5,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

One dataset item per input site. `status` is `ok`, `unreachable` or `blocked`. A failure on one site never fails the run; the record carries the status and an `error` message.

Real record from a local test run (no proxy):

```json
{
  "inputUrl": "www.beardbrand.com",
  "domain": "www.beardbrand.com",
  "finalUrl": "https://www.beardbrand.com/",
  "status": "ok",
  "error": null,
  "title": "Beard Products – Beardbrand",
  "description": "Simplify your grooming routine. Versatile beard, hair, and skin products for men. Invest in yourself and Keep on Growing.",
  "language": "en",
  "emails": ["support@beardbrand.com"],
  "primaryEmail": "support@beardbrand.com",
  "phones": [],
  "socials": {
    "instagram": "https://www.instagram.com/beardbrand",
    "facebook": "https://www.facebook.com/beardbrand",
    "tiktok": "https://www.tiktok.com/@beardbrand",
    "twitter": "https://www.twitter.com/beardbrand",
    "youtube": null,
    "pinterest": null,
    "linkedin": null
  },
  "contactPageUrl": "https://www.beardbrand.com/pages/contact",
  "platform": "Shopify",
  "technologies": ["Cloudflare", "Google Ads Conversion", "jQuery", "Judge.me", "Klaviyo", "Recharge", "Shopify Shop App"],
  "technologyCount": 7,
  "pagesFetched": 4,
  "scrapedAt": "2026-11-12T17:44:24.590Z"
}
```

### Pricing

Pay per event: **$0.004 per successfully analyzed site** (event `site-analyzed`), which is $4 per 1,000 analyzed sites. Only sites with status `ok` are charged. Unreachable and blocked sites are free.

### Limitations

- **Public pages only.** Emails and phones come from the homepage and contact-like pages (contact, about, team, impressum, legal, support). Addresses shown only after JavaScript runs, in images, or behind forms are not found.
- **Client-rendered sites** return little: the Actor does not run a browser, so single-page apps may yield no emails or links.
- **No bot-protection evasion, by design.** No residential proxy logic and no CAPTCHA solving. Sites that refuse requests are returned as `blocked` or `unreachable` and are not charged. Secondary pages are tried once, without retries.
- **Platform and technology detection is signature based** on the homepage HTML and response headers. A site can be on a platform that shows no signature, in which case `platform` is null.
- Phones come from `tel:` links only. Email addresses found on a site may belong to third parties; same-domain addresses are listed first.

### Guides

- [Turn a list of domains into qualified e-commerce leads](https://dev.to/storesignalhq/turn-a-list-of-domains-into-qualified-e-commerce-leads-emails-platform-installed-apps-1p53): a step-by-step example that combines this Actor with the other StoreSignal Actors.
- [Build a targeted list of Shopify stores by country, niche and installed apps](https://dev.to/storesignalhq/build-a-targeted-list-of-shopify-stores-by-country-niche-and-installed-apps-38mj): from a country and a keyword to a segment such as "uses Klaviyo, has no subscription app".
- [How many Shopify stores sell coffee? Size a niche per country with one free API](https://dev.to/storesignalhq/how-many-shopify-stores-sell-coffee-size-a-niche-per-country-with-one-free-api-36ok): count the stores in a niche per country with a short Python script and the REST version of this database.

### FAQ

**Is it legal and ethical?** The Actor reads only public pages that any visitor can open. You are responsible for using the data in compliance with the rules that apply to you, such as GDPR and CAN-SPAM for outreach, and with the terms of the sites you analyze.

**How is `primaryEmail` chosen?** Same-domain addresses are preferred; among them `info@`, `contact@`, `hello@`, `sales@` and `support@` come before personal-looking addresses. If none exist, the first address found is used, or null if there are none.

**Which pages are visited?** The homepage, then links on the same registered domain whose path or link text matches contact, about, team, impressum, legal, support or help (contact-like first), then well-known paths such as `/contact` and `/about`, up to `maxPagesPerSite` pages.

**Does it bypass blocking?** No. Blocked sites are reported with status `blocked`.

# Actor input Schema

## `urls` (type: `array`):

Domains or URLs in any form. They are normalized to the origin and deduplicated.

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

Homepage plus contact-like pages fetched per site (successful HTTP 200 pages).

## `maxConcurrency` (type: `integer`):

Number of sites processed in parallel.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy is recommended on the platform; many sites refuse requests from cloud IPs without it.

## Actor input object example

```json
{
  "urls": [
    "www.beardbrand.com",
    "basecamp.com",
    "www.deathwishcoffee.com"
  ],
  "maxPagesPerSite": 5,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `sites` (type: `string`):

One record per input site: status, emails, phones, socials, platform and technologies.

# 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 = {
    "urls": [
        "www.beardbrand.com",
        "basecamp.com",
        "www.deathwishcoffee.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("storesignal/website-contact-tech-finder").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 = {
    "urls": [
        "www.beardbrand.com",
        "basecamp.com",
        "www.deathwishcoffee.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("storesignal/website-contact-tech-finder").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 '{
  "urls": [
    "www.beardbrand.com",
    "basecamp.com",
    "www.deathwishcoffee.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call storesignal/website-contact-tech-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,storesignal/website-contact-tech-finder"
        }
    }
}
```

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/cEGMqjdaWngj80wAn/builds/VSjWFP2lVRh0gLico/openapi.json
