# Contact Info (`sparkling_tower/contact-info`) Actor

- **URL**: https://securitybyobscurity.apify.com/sparkling\_tower/contact-info.md
- **Developed by:** [Jan Hranicky](https://securitybyobscurity.apify.com/sparkling_tower) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

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

### What is Contact Details Scraper?

Contact Details Scraper can crawl any website and extract the listed contact information for everybody mentioned on the site.

- Extract **any contact details** from a site, such as email address, phone number, and social media accounts
- Also scrapes WhatsApp and Telegram information, as well as Snapchat, Discord, and any other communication type
- Use the **Business Leads Enrichment** add-on to add more detail, such as listed people’s job title, website, and LinkedIn
- Find scraped data in a handy table, or export it in multiple formats like **JSON, CSV, Excel, or HTML**
- Export via SDKs (Python & Node.js), use **API Endpoints**, **webhooks**, or integrate with workflows

### What data can I extract with Contact Details Scraper?

Contact Details Scraper can find contact details on almost any webpage. It will find any of the following:

<table>
<tr>
<td>📧 Email addresses</td>
<td>📞 Phone numbers</td>
<td>💼 LinkedIn profiles</td>
</tr>
<tr>
<td>🐦 Twitter handles</td>
<td>📸 Instagram profiles</td>
<td>📘 Facebook profiles/pages</td>
</tr>
<tr>
<td>▶️ YouTube accounts</td>
<td>🎵 TikTok profiles</td>
<td>📌 Pinterest profiles</td>
</tr>
<tr>
<td>🎮 Discord pages</td>
<td>👻 Snapchat profiles</td>
<td>🧵 Threads profiles</td>
</tr>
<tr>
<td>✈️ Telegram profiles/groups</td>
<td>👥 Reddit pages</td>
<td>💬 WhatsApp information</td>
</tr>
</table>

#### 👥 Lead generation

On top of this, Contact Details Scraper can use lead enrichment, which extracts detailed employee information from companies:

- Extract employee profiles, including names, job titles, departments, and contact information
- Filter results by specific departments
- Provide LinkedIn profiles, email addresses, and phone numbers
- Company information such as size, location, and industry

#### 🔍 Social media profiles enrichment

Contact Details Scraper can also enrich discovered social media URLs with detailed profile information. When enabled, this feature will:

- Extract profile data from Facebook, Instagram, YouTube, TikTok, and Twitter URLs
- Create dedicated dataset views for each social media platform for easy access

**Important Notes:**

- Social media profile enrichment requires enabling "Merge contacts" mode
- Each enriched social media profile counts as a separate billable event
- Enriched profiles are available in the **Social profiles** output view tab

### How to use Contact Details Scraper

Contact Details Scraper is designed with users in mind, even those who have never extracted data from the web before. You use it in just a few steps.

1. [Create](https://console.apify.com/actors/9Sk4JJhEma9vBKqrg/) a free Apify account using your email
2. Open [Contact Details Scraper](https://apify.com/vdrmota/contact-info-scraper)
3. Add one or more sites to scrape
4. Click the “Start” button and wait for the data to be extracted
5. View your data in the UI, or download it in JSON, XML, CSV, Excel, or HTML

We also have a video tutorial that will guide you through the process:

https://www.youtube.com/watch?v=GvuT5Zy6xhI

### Input

To get started, just enter the site URL you want to scrape, and set how many pages you want to scrape initially. Then hit “start” and the Actor will get to work.

<a href="https://console.apify.com/actors/9Sk4JJhEma9vBKqrg/">
<img src="https://github.com/apify-projects/actor-readme-images/blob/master/contact-details-scraper-input.png?raw=true" alt="Contact Details Scraper input" style="width:70%;">
</a>

#### Leads Enrichment

To use lead enrichment, set the `maximumLeadsEnrichmentRecords` parameter to a number higher than 0 to specify how many employee records to extract per company, and optionally use `leadsEnrichmentDepartments` to filter by specific departments.

To make the most of this function, we recommend you set the number of scraped pages as follows:

- Only leads enrichment, set the number of scraped pages to 1.
- For leads enrichment AND contact details scraping, set it to 2 or 3 pages.

##### Email verification

When `verifyLeadsEnrichmentEmails` is enabled, each lead's email address is verified and an `emailVerification` object is added to the lead output. Requires business leads enrichment to be active.

**Charged (decisive results):**

- `ok` – Valid, deliverable email address
- `invalid` – Invalid or non-existent email address
- `disposable` – Disposable or temporary email address

**Not charged:**

- `catch_all` – The domain accepts all addresses; individual deliverability cannot be confirmed
- `unknown` – Verification result could not be determined
- `error` – Verification encountered a technical error

```json
{
    "email": "james.hill@apify.com",
    "quality": "good",
    "result": "ok",
    "subResult": "accepted_email",
    "free": false,
    "role": false,
    "error": ""
}
````

### Output

The results will be wrapped into a dataset which you can find in the **Storage** tab. Here's an excerpt from the dataset you'd get if you apply the input parameters above:

<a href="https://console.apify.com/actors/9Sk4JJhEma9vBKqrg/">
<img src="https://github.com/apify-projects/actor-readme-images/blob/master/contact-details-scraper-output.png?raw=true" alt="Contact Details Scraper output" style="width:70%;">
</a>

Here is part of that output in JSON:

```json
[
    {
        "originalStartUrl": "https://apify.com",
        "domain": "apify.com",
        "scrapedUrls": ["https://apify.com/contact", "https://apify.com/contact-sales", "https://apify.com/"],
        "leadsEnrichment": [
            {
                "personId": "60c5b4b693b4440001970d6e",
                "firstName": "James",
                "lastName": "Hill",
                "fullName": "James Hill",
                "linkedinProfile": "http://www.linkedin.com/in/jameshill",
                "email": "james.hill@apify.com",
                "mobileNumber": null,
                "jobTitle": "Product Manager",
                "industry": "Information Technology & Services",
                "city": "Prague",
                "state": "Hlavni mesto Praha",
                "country": "Czech Republic",
                "companyId": "5a9d952ba6da98d9a159cdde",
                "companyName": "Apify",
                "companyWebsite": "apify.com",
                "companySize": null,
                "companyLinkedin": "http://www.linkedin.com/company/apifytech",
                "companyCity": null,
                "companyState": "Hlavni mesto Praha",
                "companyCountry": "Czechia",
                "companyPhoneNumber": "+18776761166",
                "headline": "Building a full-stack platform for web scraping and data for AI.",
                "departments": ["product"],
                "seniority": "senior",
                "photoUrl": "https://media.licdn.com/dms/image/D4E03AQGVYzvGHp9zhw/profile-displayphoto-shrink_200_200/0/1688982177437?e=2147483647&v=beta&t=O5O0vOrGxecs-dTwEoEKJGi-AV2QDIY_zZaajyLTshs",
                "twitter": null
            },
            {
                "personId": "59c158d1a6da9873759140ae",
                "firstName": "Michaela",
                "lastName": "Blue",
                "fullName": "Michaela Blue",
                "linkedinProfile": "http://www.linkedin.com/in/michaelablue",
                "email": "michaela.blue@apify.com",
                "mobileNumber": null,
                "jobTitle": "Product Owner",
                "industry": "Information Technology & Services",
                "city": "Prague",
                "state": "Hlavni mesto Praha",
                "country": "Czech Republic",
                "companyId": "5a9d952ba6da98d9a159cdde",
                "companyName": "Apify",
                "companyWebsite": "apify.com",
                "companySize": null,
                "companyLinkedin": "http://www.linkedin.com/company/apifytech",
                "companyCity": null,
                "companyState": "Hlavni mesto Praha",
                "companyCountry": "Czechia",
                "companyPhoneNumber": "+18776761166",
                "headline": "Product Owner",
                "departments": ["product"],
                "seniority": "senior",
                "photoUrl": "https://static.licdn.com/aero-v1/sc/h/9c8pery3andzj6ohjkjp54ma1",
                "twitter": null
            },
            {
                "personId": "57db409fa6da984c106b6227",
                "firstName": "Francis",
                "lastName": "Goodwell",
                "fullName": "Francis Goodwell",
                "linkedinProfile": "http://www.linkedin.com/in/fgoodwell",
                "email": "francis.goodwell@apify.com",
                "mobileNumber": null,
                "jobTitle": "Senior Full Stack Engineer & Team Leader",
                "industry": null,
                "city": "Prague",
                "state": "Hlavni mesto Praha",
                "country": "Czech Republic",
                "companyId": "5a9d952ba6da98d9a159cdde",
                "companyName": "Apify",
                "companyWebsite": "apify.com",
                "companySize": null,
                "companyLinkedin": "http://www.linkedin.com/company/apifytech",
                "companyCity": null,
                "companyState": null,
                "companyCountry": null,
                "companyPhoneNumber": "+18776761166",
                "headline": "Senior full-stack developer & team leader",
                "departments": ["engineering_technical"],
                "seniority": "senior",
                "photoUrl": "https://media.licdn.com/dms/image/v2/D4E03AQEI12nPbyk8VqA/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1677444613135?e=2147473647&v=beta&t=uOT8poJjY6ie22fpBbNX2_15KbY2SvesjNpObDCLIkg",
                "twitter": null
            }
        ],
        "emails": ["hello@apify.com"],
        "phones": [],
        "phonesUncertain": ["04788290", "373153700", "035500000000002", "7434378"],
        "linkedIns": ["https://www.linkedin.com/company/apify", "http://linkedin.com/company/apify"],
        "twitters": ["https://x.com/apify"],
        "instagrams": [],
        "facebooks": [],
        "youtubes": ["https://www.youtube.com/apify"],
        "tiktoks": ["https://www.tiktok.com/@apifyoffice", "https://www.tiktok.com/@apifytech"],
        "pinterests": [],
        "discords": ["https://discord.com/invite/jyEM2PRvMU"],
        "snapchats": [],
        "threads": [],
        "telegrams": [],
        "reddits": [],
        "whatsapps": [],
        "facebookProfiles": [],
        "instagramProfiles": [],
        "youtubeProfiles": [
            {
                "startUrl": "https://www.youtube.com/apify",
                "profileName": "Apify",
                "profilePictureURL": "https://yt3.googleusercontent.com/gBQONhVo1W-2YI8tJ-RQLOjYtBksDOayrsj7TiJ1SiKrApfhzjw2fnyYocBuZCb06G7kYP5RRg=s160-c-k-c0x00ffffff-no-rj",
                "location": "Czechia",
                "description": "Welcome to Apify’s official YouTube channel!\n\nApify is a web scraping and automation platform, which lets you automate anything you can do in a web browser 🚀\n\nGather data with pre-built tools we call Actors and further use it to feed generative AI or for lead generation, machine learning, market research, and a myriad of other use cases 🤖\n\nAre you a developer? Build your own Actors and publish them on Apify Store to earn passive income 💸\n\nSubscribe now for tutorials on how to use our Actors, build your own ones, utilize our open-source libraries, or learn about various web scraping technologies 📖",
                "followersCount": 10600,
                "externalProfileURL": "https://www.youtube.com/channel/UCTgwcoeGGKmZ3zzCXN2qo_A",
                "profileURL": "https://www.youtube.com/channel/UCTgwcoeGGKmZ3zzCXN2qo_A",
                "creationDate": "Jan 4, 2017",
                "coverPhoto": "https://yt3.googleusercontent.com/cdKlrmQSWEGXVgZbEr-dVN-W_GwH9ifLidL951d-Ne57qIHDthpZgjqczTKf_kEY7ucTW5wWiYc=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj",
                "accountVerificationStatus": false,
                "socialInputUrl": "https://www.youtube.com/apify",
                "channelTotalVideos": 180,
                "channelTotalViews": 827803,
                "isAgeRestricted": false,
                "id": "UCTgwcoeGGKmZ3zzCXN2qo_A",
                "username": null,
                "followingCount": null,
                "privateProfile": null
            }
        ],
        "tiktokProfiles": [
            {
                "startUrl": "https://www.tiktok.com/@apifyoffice",
                "profileName": "apifyoffice",
                "profilePictureURL": "https://p16-pu-sign-no.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/3161932a8654b0659fbbd1dca63c640a~tplv-tiktokx-cropcenter:720:720.jpeg?dr=10399&refresh_token=df0295a6&x-expires=1761912000&x-signature=GUlT0p%2Fp6pO15fNbuqVOyTw0svo%3B&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=no1a",
                "description": "🤖 web scraping and AI 🤖\n\ncheck out our open positions at ✨apify.it/jobs✨",
                "username": "apifyoffice",
                "followersCount": 157,
                "externalProfileURL": null,
                "privateProfile": false,
                "socialInputUrl": "https://www.tiktok.com/@apifyoffice",
                "videosCount": 43,
                "tiktokSeller": false,
                "authorId": "7095709566285480965",
                "followingCount": null,
                "profileURL": null,
                "creationDate": null,
                "accountVerificationStatus": null,
                "coverPhoto": null
            },
            {
                "startUrl": "https://www.tiktok.com/@apifytech",
                "profileName": "apifytech",
                "profilePictureURL": "https://p16-pu-sign-no.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/4b007abaf573cd0169af10350eb3a6c7~tplv-tiktokx-cropcenter:720:720.jpeg?dr=10399&refresh_token=ae8e06a2&x-expires=1761912000&x-signature=SKuzn%2BlQX7VIhrwDACHYKq%2FGzGY%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=no1a",
                "description": "👋 Hi, we’re Apify, and we make the web more programmable.\nMore at @apifyoffice",
                "username": "apifytech",
                "followersCount": 1015,
                "externalProfileURL": "apify.com",
                "privateProfile": false,
                "socialInputUrl": "https://www.tiktok.com/@apifytech",
                "videosCount": 31,
                "tiktokSeller": false,
                "authorId": "7353570794285417504",
                "followingCount": null,
                "profileURL": null,
                "creationDate": null,
                "accountVerificationStatus": null,
                "coverPhoto": null
            }
        ],
        "twitterProfiles": [
            {
                "startUrl": "https://x.com/apify"
            }
        ]
    }
]
```

### Deduplicate and merge contacts

Contact Details Scraper provides the contacts inside one item per scraped URL. This is good for analysis to check where was the contact found but can make it hard to process.

Fortunately, you can use [Contact Details Merge & Deduplicate](https://apify.com/lukaskrivka/contact-details-merge-deduplicate) Actor to merge and deduplicate the contacts. This Actor takes one or more dataset IDs of the Contact Details Scraper and merges all contacts deduplicated so that each domain is on one row. You can choose if contacts of one type should be in only one column or spread.

### How much will using Contact Details Scraper cost you?

Contact Details Scraper uses the pay-per-event (PPE) pricing model, so you pay for each action you perform. Check the [pricing tab](https://apify.com/vdrmota/contact-info-scraper/pricing) for details

The Free plan includes $5 of prepaid credits. With that, you could start the Actor and scrape around 2,500 pages. If you upgrade to any of our paid plans, you will get a discount, allowing you to scrape even more for the same price. Check out the [Apify pricing page](https://apify.com/pricing) for more details.

Note that lead enrichment carries an extra cost. Significant discounts are available on higher-tier plans. Please see the [Pricing tab](https://apify.com/vdrmota/contact-info-scraper/pricing) for your exact rate based on your subscription.

### Frequently asked questions

#### Can I use Contact Details Scraper to extract emails from Google Maps?

Yes, but for more precise results it's better to use a specialized scraper like [Google Maps Scraper](https://apify.com/compass/crawler-google-places).

#### Can I use integrations with Contact Details Scraper?

You can integrate Contact Details Scraper with almost any cloud service or web app. We offer integrations with **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, [and plenty more](https://docs.apify.com/integrations).

Alternatively, you could use [webhooks](https://docs.apify.com/integrations/webhooks) to carry out an action whenever an event occurs, such as getting a notification whenever Contact Details Scraper successfully finishes a run.

#### Can I use Contact Details Scraper with the Apify API?

The Apify API gives you programmatic access to the Apify platform. The API is organized around RESTful HTTP endpoints that enable you to manage, schedule, and run Apify Actors. The API also lets you access any datasets, monitor Actor performance, fetch results, create and update versions, and more.

To access the API using Node.js, use the `apify-client` [NPM package](https://apify.com/vdrmota/contact-info-scraper/api/javascript). To access the API using Python, use the `apify-client` [PyPI package](https://apify.com/vdrmota/contact-info-scraper/api/python). Check out the [Apify API reference](https://docs.apify.com/api/v2) docs for all the details.

#### Can I use Contact Details Scraper through an MCP Server?

With Apify API, you can use almost any Actor in conjunction with an MCP server. You can connect to the MCP server using clients like ClaudeDesktop and LibreChat, or even build your own. Read all about how you can [set up Apify Actors with MCP](https://blog.apify.com/how-to-use-mcp/).

For Contact Details Scraper, go to the [MCP tab](https://apify.com/vdrmota/contact-info-scraper/api/mcp) and then go through the following steps:

1. Start a Server-Sent Events (SSE) session to receive a `sessionId`
2. Send API messages using that `sessionId` to trigger the scraper
3. The message starts the Contact Details Scraper with the provided input
4. The response should be: `Accepted`

#### Is it legal to scrape contact details?

Web scraping is legal as long as you don’t scrape private data. However, you should be aware that your results might contain personal data, which is protected by GDPR in the European Union and in other laws from around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. You can read our blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for more information.

#### Your feedback

We’re always working on improving the performance of our Actors. If you have any technical feedback for Contact Details Scraper or found a bug, please create an issue in the [Issues tab](https://apify.com/vdrmota/contact-info-scraper/issues/open).

# Actor input Schema

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

The list of web pages from which the scraper will start crawling.

## `maxRequestsPerStartUrl` (type: `integer`):

The maximum number of pages that will be enqueued from each start URL you provide.

## `mergeContacts` (type: `boolean`):

Enable this option to merge all contacts and social media from every page of the same start URL into a single, clean result row.

## `maxDepth` (type: `integer`):

The maximum number of links away from the <b>Start URLs</b> that the actor will crawl. If <code>0</code>, the scraper will not follow any links. If empty or null, the scraper will follow links to an arbitrary depth.

## `maxRequests` (type: `integer`):

The maximum number of pages the scraper will load. It is always a good idea to limit the number of pages, otherwise the scraper might run infinitely or consume too many resources.

## `sameDomain` (type: `boolean`):

If set, the scraper will only follow links within the same domain as the referring page.

## `considerChildFrames` (type: `boolean`):

If set, the scraper will also extract contact information from iframes. You might not always want this (e.g. it will include data from online ads).

## `maximumLeadsEnrichmentRecords` (type: `integer`):

Enrich your results with detailed contact and company information, including employee names, job titles, emails, phone numbers, LinkedIn profiles, and key company data like industry and number of employees. <br><br> This setting allows you to set the maximum number of leads records you want to scrape per each domain found. By default, it's set to 0 which means that no leads information will be scraped. <br><br>⚠️ Note that some of the fields contain <b>personal data</b>. GDPR protects personal data in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your use case is legitimate, please consult an attorney. <br><br>To keep your leads relevant, we automatically filter out large chains and online platforms (e.g., social media, retail giants, food delivery services). <br><br>⚠️ <b>Cost warning:</b> This is a multiplier. Requesting 10 leads for 1,000 domains will attempt to find 10,000 total leads. You are only charged for leads successfully found.

## `leadsEnrichmentDepartments` (type: `array`):

You can use this filter to include only specific departments (like Sales, Marketing, or C-Suite). Note: This will only work if the ⏩ Add-on: Extract business leads information - Maximum leads per domain (maximumLeadsEnrichmentRecords) option is enabled. Please note that some job titles are sometimes miscategorized in the wrong departments.

## `verifyLeadsEnrichmentEmails` (type: `boolean`):

When enabled, verifies the email address of each lead extracted during business leads enrichment. Each lead receives an <b>emailVerification</b> object with the verification result and quality assessment.<br><br><b>Charged (decisive results):</b> valid (<code>ok</code>), invalid, and disposable email addresses.<br><b>Not charged:</b> catch-all, unknown, and error results.<br><br>⚠️ This add-on requires business leads enrichment to be enabled.

## `scrapeSocialMediaProfiles` (type: `object`):

Enable enrichment for any social media profiles found. This add-on retrieves detailed public data for each profile, including <b>profile names, follower/following counts, descriptions, post/video counts, and verification status</b>.<br><br>Pricing depends on your <b>subscription plan</b> (please see the 'Pricing' tab for details). You are charged a flat rate for the <b>total number of profiles enriched</b>, regardless of how many platforms (Facebook, Instagram, etc.) you select.<hr><b>Feature Dependency:</b><br>To use this feature, the <b>'Merge contacts'</b> option will be automatically enabled. This ensures that all enriched social media data is correctly combined with the main contact record for each domain.<br><br><b>Output:</b> Enriched profiles are available in the <b>Social profiles</b> output view tab.

## `useBrowser` (type: `boolean`):

If set, the scraper will use a browser for crawling the pages.

## `waitUntil` (type: `string`):

Select when a page should be considered loaded so that the actor can start scraping it. *Only works with the browser.*

## `proxyConfig` (type: `object`):

Proxy servers let you bypass website protections, avoid IP address blocking, and view content for other countries. Try to use a proxy if you are experiencing timeout errors.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "maxRequestsPerStartUrl": 20,
  "mergeContacts": true,
  "maxDepth": 2,
  "maxRequests": 9999999,
  "sameDomain": true,
  "considerChildFrames": true,
  "maximumLeadsEnrichmentRecords": 0,
  "leadsEnrichmentDepartments": [
    "sales",
    "marketing"
  ],
  "verifyLeadsEnrichmentEmails": false,
  "scrapeSocialMediaProfiles": {
    "facebooks": false,
    "instagrams": false,
    "youtubes": false,
    "tiktoks": false,
    "twitters": false
  },
  "useBrowser": false,
  "waitUntil": "domcontentloaded",
  "proxyConfig": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all scraped data

# 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 = {
    "startUrls": [
        {
            "url": "https://apify.com"
        }
    ],
    "maxRequestsPerStartUrl": 20,
    "mergeContacts": true,
    "maxDepth": 2,
    "maxRequests": 9999999,
    "maximumLeadsEnrichmentRecords": 0,
    "scrapeSocialMediaProfiles": {
        "facebooks": false,
        "instagrams": false,
        "youtubes": false,
        "tiktoks": false,
        "twitters": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sparkling_tower/contact-info").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 = {
    "startUrls": [{ "url": "https://apify.com" }],
    "maxRequestsPerStartUrl": 20,
    "mergeContacts": True,
    "maxDepth": 2,
    "maxRequests": 9999999,
    "maximumLeadsEnrichmentRecords": 0,
    "scrapeSocialMediaProfiles": {
        "facebooks": False,
        "instagrams": False,
        "youtubes": False,
        "tiktoks": False,
        "twitters": False,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("sparkling_tower/contact-info").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 '{
  "startUrls": [
    {
      "url": "https://apify.com"
    }
  ],
  "maxRequestsPerStartUrl": 20,
  "mergeContacts": true,
  "maxDepth": 2,
  "maxRequests": 9999999,
  "maximumLeadsEnrichmentRecords": 0,
  "scrapeSocialMediaProfiles": {
    "facebooks": false,
    "instagrams": false,
    "youtubes": false,
    "tiktoks": false,
    "twitters": false
  }
}' |
apify call sparkling_tower/contact-info --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Contact Info",
        "version": "0.0",
        "x-build-id": "CGfTXpnKmKZOzXAoE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sparkling_tower~contact-info/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sparkling_tower-contact-info",
                "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/sparkling_tower~contact-info/runs": {
            "post": {
                "operationId": "runs-sync-sparkling_tower-contact-info",
                "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/sparkling_tower~contact-info/run-sync": {
            "post": {
                "operationId": "run-sync-sparkling_tower-contact-info",
                "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",
                "required": [
                    "startUrls",
                    "proxyConfig"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "The list of web pages from which the scraper will start crawling.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxRequestsPerStartUrl": {
                        "title": "Maximum pages per start URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "The maximum number of pages that will be enqueued from each start URL you provide."
                    },
                    "mergeContacts": {
                        "title": "Merge contacts",
                        "type": "boolean",
                        "description": "Enable this option to merge all contacts and social media from every page of the same start URL into a single, clean result row.",
                        "default": true
                    },
                    "maxDepth": {
                        "title": "Maximum link depth",
                        "minimum": 0,
                        "type": "integer",
                        "description": "The maximum number of links away from the <b>Start URLs</b> that the actor will crawl. If <code>0</code>, the scraper will not follow any links. If empty or null, the scraper will follow links to an arbitrary depth."
                    },
                    "maxRequests": {
                        "title": "Maximum pages for whole scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "The maximum number of pages the scraper will load. It is always a good idea to limit the number of pages, otherwise the scraper might run infinitely or consume too many resources."
                    },
                    "sameDomain": {
                        "title": "Stay within domain",
                        "type": "boolean",
                        "description": "If set, the scraper will only follow links within the same domain as the referring page.",
                        "default": true
                    },
                    "considerChildFrames": {
                        "title": "Probe frames",
                        "type": "boolean",
                        "description": "If set, the scraper will also extract contact information from iframes. You might not always want this (e.g. it will include data from online ads).",
                        "default": true
                    },
                    "maximumLeadsEnrichmentRecords": {
                        "title": "⏩ Add-on: Extract business leads information - Maximum leads per domain ($)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Enrich your results with detailed contact and company information, including employee names, job titles, emails, phone numbers, LinkedIn profiles, and key company data like industry and number of employees. <br><br> This setting allows you to set the maximum number of leads records you want to scrape per each domain found. By default, it's set to 0 which means that no leads information will be scraped. <br><br>⚠️ Note that some of the fields contain <b>personal data</b>. GDPR protects personal data in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your use case is legitimate, please consult an attorney. <br><br>To keep your leads relevant, we automatically filter out large chains and online platforms (e.g., social media, retail giants, food delivery services). <br><br>⚠️ <b>Cost warning:</b> This is a multiplier. Requesting 10 leads for 1,000 domains will attempt to find 10,000 total leads. You are only charged for leads successfully found.",
                        "default": 0
                    },
                    "leadsEnrichmentDepartments": {
                        "title": "Leads departments selection",
                        "type": "array",
                        "description": "You can use this filter to include only specific departments (like Sales, Marketing, or C-Suite). Note: This will only work if the ⏩ Add-on: Extract business leads information - Maximum leads per domain (maximumLeadsEnrichmentRecords) option is enabled. Please note that some job titles are sometimes miscategorized in the wrong departments.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "c_suite",
                                "product",
                                "engineering_technical",
                                "design",
                                "education",
                                "finance",
                                "human_resources",
                                "information_technology",
                                "legal",
                                "marketing",
                                "medical_health",
                                "operations",
                                "sales",
                                "consulting"
                            ],
                            "enumTitles": [
                                "C-Suite",
                                "Product",
                                "Engineering & Technical",
                                "Design",
                                "Education",
                                "Finance",
                                "Human Resources",
                                "Information Technology",
                                "Legal",
                                "Marketing",
                                "Medical & Health",
                                "Operations",
                                "Sales",
                                "Consulting"
                            ]
                        }
                    },
                    "verifyLeadsEnrichmentEmails": {
                        "title": "⏩ Add-on: Email verification ($)",
                        "type": "boolean",
                        "description": "When enabled, verifies the email address of each lead extracted during business leads enrichment. Each lead receives an <b>emailVerification</b> object with the verification result and quality assessment.<br><br><b>Charged (decisive results):</b> valid (<code>ok</code>), invalid, and disposable email addresses.<br><b>Not charged:</b> catch-all, unknown, and error results.<br><br>⚠️ This add-on requires business leads enrichment to be enabled.",
                        "default": false
                    },
                    "scrapeSocialMediaProfiles": {
                        "title": "🔍 Add-on: Social media profile enrichment ($)",
                        "type": "object",
                        "description": "Enable enrichment for any social media profiles found. This add-on retrieves detailed public data for each profile, including <b>profile names, follower/following counts, descriptions, post/video counts, and verification status</b>.<br><br>Pricing depends on your <b>subscription plan</b> (please see the 'Pricing' tab for details). You are charged a flat rate for the <b>total number of profiles enriched</b>, regardless of how many platforms (Facebook, Instagram, etc.) you select.<hr><b>Feature Dependency:</b><br>To use this feature, the <b>'Merge contacts'</b> option will be automatically enabled. This ensures that all enriched social media data is correctly combined with the main contact record for each domain.<br><br><b>Output:</b> Enriched profiles are available in the <b>Social profiles</b> output view tab.",
                        "properties": {
                            "facebooks": {
                                "title": "Enable Facebook profile scraping",
                                "type": "boolean",
                                "description": "Enable scraping detailed Facebook profile information for discovered Facebook URLs. This will provide additional data like follower counts, profile pictures, and more."
                            },
                            "instagrams": {
                                "title": "Enable Instagram profile scraping",
                                "type": "boolean",
                                "description": "Enable scraping detailed Instagram profile information for discovered Instagram URLs. This will provide additional data like follower counts, profile pictures, and more."
                            },
                            "youtubes": {
                                "title": "Enable YouTube channel scraping",
                                "type": "boolean",
                                "description": "Enable scraping detailed YouTube channel information for discovered YouTube URLs. This will provide additional data like subscriber counts, channel descriptions, and more."
                            },
                            "tiktoks": {
                                "title": "Enable TikTok profile scraping",
                                "type": "boolean",
                                "description": "Enable scraping detailed TikTok profile information for discovered TikTok URLs. This will provide additional data like follower counts, profile pictures, and more."
                            },
                            "twitters": {
                                "title": "Enable X (Twitter) profile scraping",
                                "type": "boolean",
                                "description": "Enable scraping detailed Twitter profile information for discovered X (Twitter) URLs. This will provide additional data like follower counts, profile pictures, and more."
                            }
                        },
                        "default": {
                            "facebooks": false,
                            "instagrams": false,
                            "youtubes": false,
                            "tiktoks": false,
                            "twitters": false
                        }
                    },
                    "useBrowser": {
                        "title": "Use Browser for scraping",
                        "type": "boolean",
                        "description": "If set, the scraper will use a browser for crawling the pages.",
                        "default": false
                    },
                    "waitUntil": {
                        "title": "Consider page to be loaded",
                        "enum": [
                            "commit",
                            "domcontentloaded",
                            "load",
                            "networkidle"
                        ],
                        "type": "string",
                        "description": "Select when a page should be considered loaded so that the actor can start scraping it. *Only works with the browser.*",
                        "default": "domcontentloaded"
                    },
                    "proxyConfig": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy servers let you bypass website protections, avoid IP address blocking, and view content for other countries. Try to use a proxy if you are experiencing timeout errors.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
