# Instagram Email Scraper — Business Contact Finder (`inovaflow/instagram-email-scraper`) Actor

Find public emails and phone numbers of Instagram profiles: from the bio, WhatsApp links, the link-in-bio page and the linked website. Paste usernames or search by keyword (bakery Brooklyn, yoga studio Austin). Followers, category, bio links and every email's source. No login, no cookies.

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

## Pricing

from $2.00 / 1,000 profiles

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

**Find the public email and phone behind any Instagram profile — from the bio, the link-in-bio page and the website it links to.**

If you've ever built an outreach list from Instagram, you know the routine: open a profile, squint at the bio, tap the Linktree, open the website, hunt for a contact page, copy the email into a sheet… and repeat that two hundred times. Half the profiles hide the email one click deeper than you'd expect, and the other half don't list one at all.

We had the same list to build, so we made this for ourselves first — and now we're sharing it. Paste usernames (or type a niche and a city, like *wedding photographer london*), and for every profile it reads the bio, the WhatsApp and contact links, opens the link-in-bio page and the website, and brings back every public email and phone it finds — each one tagged with **where** it was found. No login, no cookies, no Instagram account at risk.

### Who it's for

- **Agencies and freelancers** prospecting local businesses: *"which yoga studios in Austin have an email I can write to?"*
- **Influencer and partnership teams** building creator lists: *"what's the collab email of these 300 creators?"*
- **Sales teams** enriching a list of brand handles with website, category, followers and contact.
- **AI agents** that need a flat, reliable contact row per handle — one call, dataset only.

### What you get per profile

`username`, `fullName`, `category`, `isBusiness`, `followers`, `following`, `posts`, `biography`, **`email`** (best one), **`emails`** (all), **`emailSources`** (each email with its source: `bio`, `link-in-bio`, `website`, `instagram-contact` or `search-snippet`, plus the page it came from), **`phone`** / `phones` (bio, WhatsApp link, website), `externalUrl`, `bioLinks`, `linkInBioUrl`, `website`, `websiteDomain`, `whatsapp`, `tiktok`, `youtube`, `facebook`, `twitter`, `linkedin`, `isVerified`, `isPrivate`, `discoveredBy` and `profileUrl`.

Two table views are built in: **Contacts** (the lead list) and **Profiles** (bio, links and audience).

### Options

- **Instagram profiles** — usernames, @handles or profile links. A post or reel link works too (its author is checked).
- **Find profiles by keyword** — a niche + place per line (`wedding photographer london`). A web search (`site:instagram.com`) finds matching Instagram profiles; set how many per keyword. *Prefer profiles that show an email* (on by default) nudges the search toward profiles with an email in their bio.
- **Scan the link-in-bio page and website** — opens Linktree / Beacons / Stan-style pages and the linked website (home, contact and about pages) for emails and phones. This is where most business emails are. Off = bio and contact links only (faster, cheaper).
- **Only profiles with an email** — skip (and don't pay for) profiles where nothing was found.
- **Keep emails quoted by the search engine** — for keyword searches, keep emails the result snippet shows from the profile or its posts.

### How to set it up

1. Paste a few usernames, or a keyword like `bakery brooklyn`.
2. Leave **Scan the link-in-bio page and website** on.
3. Click **Start**. Rows arrive as each profile finishes; download them as CSV, Excel or JSON.

And that's it.

### Pricing

Pay per result: **$0.002 per profile** delivered, plus **$0.004 when at least one email is found** for it (so a profile with an email costs $0.006, a profile without one $0.002). Profiles that don't exist or can't be read are free.

> **Tip:** turn on **Only profiles with an email** when you only want contactable leads — you pay only for rows with an email.

### Notes

- **What "email" means here.** Instagram hides the *Email* contact button from logged-out visitors, and this Actor never logs in. It collects the emails a profile **publishes** — in its bio, on its link-in-bio page, on its website, or in Google's snippet of it — and says where each one came from. The `businessEmail` column is filled only on the rare profiles where Instagram still shows that contact publicly.
- **What to expect.** In our tests with the website scan on, we found at least one public email for about **7 in 10 small-business profiles** found by keyword and **4 in 10 big brands and creators**. Most come from the website; bios alone rarely have one.
- For some business categories Instagram's app API fails; those profiles are read from the public profile page instead (bio, links, followers and following — `category` and `posts` may then be empty).
- Only publicly available data is collected. You are responsible for using it in line with Instagram's terms and privacy laws such as GDPR and CAN-SPAM.
- Missing a field or a source? Open an issue in the **Issues** tab — we read them and add what's asked for.

# Actor input Schema

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

Usernames, @handles or profile URLs, one per line. A post or reel URL also works — its author is checked.

## `searchKeywords` (type: `array`):

Niche + place, one per line — `bakery brooklyn`, `yoga studio austin`, `wedding photographer london`. A web search (`site:instagram.com`, DuckDuckGo with Google as the fallback) finds matching Instagram profiles.

## `maxProfilesPerKeyword` (type: `integer`):

How many profiles to collect for each keyword (about 6–10 per result page).

## `searchEmailHint` (type: `boolean`):

Adds the word `email` to the search so the profiles found are more likely to list an e-mail in their bio.

## `scanWebsite` (type: `boolean`):

Opens the profile's link-in-bio page (Linktree, Beacons, Stan…) and its website (home, contact and about pages) and collects the e-mails and phones listed there. Most business e-mails are found this way. Off = bio, contact fields and WhatsApp links only.

## `onlyWithEmail` (type: `boolean`):

Deliver (and pay for) only the profiles where at least one e-mail was found.

## `includeSnippetEmails` (type: `boolean`):

For keyword searches: keep e-mails that the search result's snippet quotes from the profile or its posts (source `search-snippet`).

## `maxWebsitePages` (type: `integer`):

Pages read on the linked website (home + contact/about pages).

## `searchCountry` (type: `string`):

Two-letter country code for the Google fallback search (`us`, `gb`, `de`…).

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

Profiles processed at the same time. Lower it if the log shows many rate-limit retries.

## `residentialFallback` (type: `boolean`):

Read the profile page on a residential IP when Instagram's API errors for a profile or keeps refusing datacenter IPs. Needed for many business profiles.

## Actor input object example

```json
{
  "usernames": [
    "mkbhd",
    "https://www.instagram.com/fentybeauty/"
  ],
  "searchKeywords": [
    "bakery brooklyn",
    "yoga studio austin"
  ],
  "maxProfilesPerKeyword": 20,
  "searchEmailHint": true,
  "scanWebsite": true,
  "onlyWithEmail": false,
  "includeSnippetEmails": true,
  "maxWebsitePages": 4,
  "searchCountry": "us",
  "maxConcurrency": 4,
  "residentialFallback": true
}
```

# Actor output Schema

## `contacts` (type: `string`):

One row per profile: e-mail, all e-mails, phone, website, followers, category and profile link.

## `profiles` (type: `string`):

Profile details: bio, bio links, link-in-bio page, followers, following, posts, business flags and socials.

## `summary` (type: `string`):

Counts, searches and request statistics.

# 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": [
        "mkbhd",
        "fentybeauty"
    ],
    "scanWebsite": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/instagram-email-scraper").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": [
        "mkbhd",
        "fentybeauty",
    ],
    "scanWebsite": True,
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/instagram-email-scraper").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": [
    "mkbhd",
    "fentybeauty"
  ],
  "scanWebsite": true
}' |
apify call inovaflow/instagram-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,inovaflow/instagram-email-scraper"
        }
    }
}
```

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/xdvlgMu2OCz3W8lk0/builds/rJ7MMSVvfeH3bXURj/openapi.json
