# Instagram Email & Phone Contact Enricher (`fetchfinch/instagram-email-phone-contact-enricher`) Actor

Enrich Instagram profiles with public emails, phone numbers, WhatsApp links, and contacts found across bios and linked websites.

- **URL**: https://apify.com/fetchfinch/instagram-email-phone-contact-enricher.md
- **Developed by:** [Fetch Finch](https://apify.com/fetchfinch) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 profile 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Instagram Bio & Link-in-Bio Contact Enricher

Turn Instagram usernames or profile URLs into structured, public contact leads.

The Actor extracts public Instagram profile metadata, scans visible bio content for contact details, and can follow a bounded number of pages from the profile's link in bio. This is useful for creator research, influencer partnerships, PR list building, local-business prospecting, recruiting research, and agency lead enrichment.

### Try the public examples

- [Find Creator Emails and Phone Numbers](https://apify.com/fetchfinch/instagram-email-phone-contact-enricher/examples/find-creator-emails-and-phones) — creator and public-figure profile enrichment with link-in-bio scanning.
- [Scan Instagram Bios for Contact Details](https://apify.com/fetchfinch/instagram-email-phone-contact-enricher/examples/scan-instagram-bios-for-contacts) — fast profile-only scanning.
- [Enrich Business Leads from Instagram](https://apify.com/fetchfinch/instagram-email-phone-contact-enricher/examples/enrich-business-leads-from-instagram) — business profile enrichment with a small linked-page limit.

### How it works

For each profile, the Actor:

1. Fetches publicly accessible Instagram profile data using the selected cost/reliability mode.
2. Extracts display name, biography, category, follower count, following count, post count, verification status, privacy status, and public profile links.
3. Finds public emails, phone numbers, WhatsApp links, and contact links in the profile content.
4. Optionally fetches the link in bio and relevant public pages such as contact, about, press, booking, and business pages.
5. Returns source evidence for every discovered contact and keeps one result row per requested profile.

The Actor is intentionally public-only. It does not require Instagram login cookies, does not use a bundled account session, and does not click private or authenticated contact controls. This keeps runs safer, easier to operate commercially, and predictable for customers.

### Input

The only required input is a list of Instagram usernames or profile URLs:

```json
{
  "usernames": ["garyvee", "nasa", "https://www.instagram.com/natgeo/"],
  "scrapeLinkInBio": true,
  "maxLinkedPages": 3,
  "defaultCountry": "US"
}
```

#### Main options

- `usernames` — Instagram usernames or profile URLs. Duplicate profiles are processed once.
- `scrapeLinkInBio` — scan the public external website listed on the profile. Enabled by default.
- `maxLinkedPages` — maximum external pages fetched per profile, including the bio URL. The default is 3; lower values are faster and cheaper.
- `defaultCountry` — optional two-letter country code used to normalize local phone numbers, for example `US` or `GB`.
- `instagramFetchStrategy` — defaults to `public_http_residential_fallback`: it tries the lowest-cost direct HTTP request first, then retries blocked public pages through a residential browser. `public_http` uses direct HTTP only, while `residential_browser` uses the browser for every profile.
- `linkedProxyMode` — route linked websites directly, through a datacenter proxy, or through the same proxy as Instagram. Direct is the default and is usually appropriate for normal external websites.
- `expandPublicLinks` — in browser modes, click only the public `and N more` link to reveal additional profile links. Enabled by default; it has no effect in HTTP-only mode.

The default fallback mode starts with direct public requests and only uses residential proxy traffic when Instagram blocks or limits the direct request. Residential fallback can increase run cost, while `blockBrowserResources` is enabled by default to reduce browser traffic when it is needed.

Advanced controls include retries, request timeout, request delay, browser fallback, public-link expansion, phone country handling, and proxy settings.

### Output

Each input produces one dataset item. The most useful fields are:

- `username`, `profileUrl`, `displayName`, `biography`, and `category`
- `followers`, `following`, `posts`, `isVerified`, and `isPrivate`
- `externalUrl` and `profileLinks` — public links found on the Instagram profile
- `emails`, `phones`, and `whatsappUrls`
- `contactSources` — source URL, contact type, value, and confidence for each contact
- `pagesScanned` and `childLinks` — useful for auditing link-in-bio enrichment
- `status` and `error` — processing outcome and explanation when access is unavailable

Example result:

```json
{
  "username": "examplebrand",
  "status": "ok",
  "displayName": "Example Brand",
  "biography": "Contact us at hello@examplebrand.com",
  "followers": 125000,
  "externalUrl": "https://linktr.ee/examplebrand",
  "emails": ["hello@examplebrand.com", "press@examplebrand.com"],
  "phones": ["+12125550100"],
  "whatsappUrls": [],
  "contactSources": [
    {
      "value": "hello@examplebrand.com",
      "type": "email",
      "source": "instagram_bio",
      "sourceUrl": "https://www.instagram.com/examplebrand/",
      "confidence": "high"
    }
  ],
  "pagesScanned": ["https://linktr.ee/examplebrand"]
}
```

Possible statuses include `ok`, `metadata_only`, `private`, `blocked`, `not_found`, `partial`, and `invalid_input`. A failed profile remains in the dataset so batch results are easy to reconcile.

### Why use this Actor

- Combines public Instagram metadata with bounded link-in-bio enrichment.
- Finds contacts in both visible profile content and relevant linked pages.
- Produces source-level evidence instead of an unexplained list of contacts.
- Normalizes phone numbers and handles common obfuscated email formats.
- Keeps crawl depth and proxy usage under your control.

### Notes for best results

Coverage depends on what Instagram and linked websites make publicly accessible at the time of the run. Some profiles do not publish contact details, and public access can vary by profile, region, and time. For the best cost/coverage balance, keep the default fallback mode and a small linked-page limit. Use `public_http` for the lowest possible cost, or `residential_browser` when consistent browser rendering is more important than cost.

Review contact results before outreach and follow applicable privacy, marketing, and platform rules.

# Actor input Schema

## `usernames` (type: `array`):

Usernames or profile URLs. You can include or omit the @ sign. One output record is produced for each unique profile.

## `scrapeLinkInBio` (type: `boolean`):

Fetch the profile website and relevant contact pages to find additional public contact details.

## `maxLinkedPages` (type: `integer`):

Maximum number of external pages fetched per profile, including the bio URL. Lower values are faster and cheaper.

## `maxRetries` (type: `integer`):

Retries for transient network errors and rate limits.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each Instagram or website request.

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

Small pause between requests to reduce rate-limit pressure. Increase this for large runs.

## `useBrowserProfileFetch` (type: `boolean`):

Allow Chromium when a residential fallback or residential browser strategy is selected. This improves public-page rendering but uses more compute and proxy traffic.

## `instagramFetchStrategy` (type: `string`):

Choose the reliability/cost tradeoff for public Instagram pages. Economy mode uses direct HTTP only. Residential traffic is used only by the two residential modes.

## `linkedProxyMode` (type: `string`):

Proxy routing for external websites found in the bio. Direct is usually sufficient for normal websites and avoids residential traffic.

## `blockBrowserResources` (type: `boolean`):

Skip images, video, fonts, and stylesheets during the Instagram browser fetch to reduce residential data usage. Profile HTML and API data remain enabled.

## `expandPublicLinks` (type: `boolean`):

In browser modes, dismiss public overlays and click only the visible “and N more” link to reveal additional public profile links. Does not click Contact, login, signup, or private controls.

## `defaultCountry` (type: `string`):

Optional two-letter ISO country code used to interpret local phone numbers, for example US or GB.

## `proxySettings` (type: `object`):

Optional proxy settings for the public reliability modes. The economy mode does not use a proxy unless you select a mode that supports one.

## Actor input object example

```json
{
  "usernames": [
    "nixtioagency",
    "ronas_it"
  ],
  "scrapeLinkInBio": true,
  "maxLinkedPages": 3,
  "maxRetries": 2,
  "requestTimeoutSecs": 20,
  "requestDelayMs": 300,
  "useBrowserProfileFetch": true,
  "instagramFetchStrategy": "public_http_residential_fallback",
  "linkedProxyMode": "direct",
  "blockBrowserResources": true,
  "expandPublicLinks": true,
  "proxySettings": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The dataset containing one public bio and link-in-bio enrichment record per requested Instagram profile.

# 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 = {
    "usernames": [
        "nixtioagency",
        "ronas_it"
    ],
    "proxySettings": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchfinch/instagram-email-phone-contact-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 = {
    "usernames": [
        "nixtioagency",
        "ronas_it",
    ],
    "proxySettings": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("fetchfinch/instagram-email-phone-contact-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 '{
  "usernames": [
    "nixtioagency",
    "ronas_it"
  ],
  "proxySettings": {
    "useApifyProxy": false
  }
}' |
apify call fetchfinch/instagram-email-phone-contact-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetchfinch/instagram-email-phone-contact-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/L6CLAyz36o72apQpl/builds/HrhMwKsr4SUBai06N/openapi.json
