# Instagram Email Scraper (`insights_data/instagram-email-scraper`) Actor

Find public emails of Instagram accounts by niche and location, @username or profile link. Get email, phone, WhatsApp, website, social links, bio and followers, with a lead score for each account. Export to CSV or Excel. No login or cookies needed.

- **URL**: https://apify.com/insights_data/instagram-email-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### 📮 Instagram email scraper: what is Instagram Email Scraper?

**Instagram Email Scraper** helps marketers, agencies, sales teams and brands with Instagram lead generation and influencer outreach by turning a niche and a city into a list of Instagram accounts that show a public contact email. Type a niche such as *fitness coach*, add a place such as *Miami* or paste @usernames, click **Start**, and get one lead per account with email, email type, phone, website, social links, bio and follower stats, with no Instagram login or cookies.

Free plan runs have no extra limits: they work the same as runs on paid plans, and the $5 monthly Apify credit pays for the result charges and the platform usage. The easiest way to try it: keep the prefilled search (*fitness coach* in *Miami*) and click **Start**. The default run saves up to 10 leads.

- 🤳 **Influencer outreach and creator outreach:** find creators in your niche who publish a contact address, and see the Instagram influencer email next to followers, verified badge and bio before you pitch.
- 🏪 **Local business leads:** search a niche plus a city, such as *yoga studio* in *Austin*, and get studios, coaches, salons and shops that list an email, a website or a phone.
- 🏢 **B2B leads:** set **Email type** to business emails only to keep Instagram accounts whose public email is on their own company domain, with website, phone and a lead score.
- 🤝 **Brand partnerships and PR:** build a shortlist of accounts for brand partnerships, sponsorships and PR, and sort it by followers or lead score.
- ➕ **Lead enrichment:** paste a list of @usernames or profile links and add the public email, phone and website of each account.
- 📈 **Sales prospecting:** send the leads to Google Sheets or your CRM and work them like any other prospect list.

#### What can Instagram Email Scraper do?

- 🔍 **Mix niches, @usernames and profile links in one list.** Use a keyword to find influencers by niche, or look up the accounts you already know. Duplicates are removed.
- 📍 **Add a city or country to every niche search.** This is how you find Instagram influencers by location, or local shops in one town. The place words are added to the search, so you get accounts that match the niche and mention the place; the Actor does not verify where an account is based.
- 🎯 **Filter the emails:** any email, business emails only, free emails only (Gmail, Outlook, iCloud and similar) or one specific domain (which replaces the email type), plus a minimum follower count.
- 🌐 **Check linked websites:** when the bio has no matching email, it opens the account's website or link-in-bio page to look for emails, phones, WhatsApp and social links.
- 📬 **Check the mail domain:** every email passes format checks, and `email_valid` tells you whether its domain can receive mail. This is not mailbox verification: it does not prove that the inbox exists.
- ⭐ **Score each lead** from 0 to 100 with `lead_score`, a rule-of-thumb (heuristic) score, not a guarantee. It is in the Emails table only.
- ⚡ **Live results:** this Instagram email extractor saves every lead as soon as it is found, so the table fills while the run is going.
- 📦 **Export** to JSON, CSV, Excel, XML or HTML, or run it by API, on a schedule and with integrations.

***

### 🗂️ What data can Instagram Email Scraper extract?

Every lead is one row of Instagram contact details: who the account is, how to reach it and how big it is. As an Instagram contact scraper, it reads only what any visitor can see: the public profile and the account's own linked pages.

| Field | What you get |
|---|---|
| 👤 `username` | Instagram username (handle) |
| 🔗 `profile_url` | Link to the Instagram profile |
| 🔖 `full_name` | Display name on the profile |
| 📧 `email` | Best matching public email for your filter |
| 🏷️ `email_type` | `free` (Gmail, Outlook and similar), `business` (own domain) or `disposable` (a throwaway mail service). `disposable` is an output flag only: there is no input filter for it, so remove those rows after export if you do not want them |
| 📬 `email_valid` | `true` when the email domain can receive mail, `false` when it cannot, `null` when not checked or unknown. A domain check, not mailbox verification |
| 📨 `other_emails` | Other public emails found for the account |
| ☎️ `phone` | First phone found in the bio or on the linked website |
| 📱 `whatsapp` | WhatsApp number found on a linked page |
| 🌐 `website` | Main website of the account owner |
| 🧷 `socials` | Other social profiles found on linked pages: YouTube, TikTok, Facebook, X (Twitter), LinkedIn, Telegram |
| 🔑 `matched_keywords` | Words from your searches and location found in the bio, name or handle |
| 📝 `bio` | Profile biography text |
| 👥 `followers` | Follower count |
| 👣 `following` | Number of accounts the profile follows |
| 🖼️ `posts` | Number of posts |
| 🎖️ `is_verified` | Whether the profile has the verified badge |
| 🔒 `is_private` | Whether the profile is private |
| ⭐ `lead_score` | 0 to 100 rule-of-thumb estimate of how worth contacting the lead is (mail domain accepts email, business domain, reach, extra channels). In the Emails table only, not in the main table |

> **Note:** Linked websites are opened only when the bio has no email that matches your filter. So `whatsapp`, `socials` and a phone from the website appear mostly for accounts whose email came from their website. Well-known free providers such as Gmail get `email_valid: true`. `email_valid: true` does not prove that the mailbox exists. Name, bio and follower fields can be `null` when Instagram shows only part of a profile.

#### Phone numbers, websites and social links

- ☎️ As an Instagram phone number scraper, it returns the first phone in international format (with a `+`) from the bio, or a phone link from the linked website.
- 🌐 Link-in-bio pages and short links are not counted as the `website`; the account's own site is.
- 🧷 Social links are taken from the linked pages, one per network.

#### What data can't Instagram Email Scraper extract?

- ❌ Emails that are not public: private data, direct messages, or an address that is not written in the bio or on the linked pages.
- ❌ The email behind a profile's Contact button. You get the public email shown on the account or its linked site.
- ❌ Mailbox checks. `email_valid` checks the domain, not the inbox.
- ❌ Posts, Reels, comments and follower lists. For posts, use [Fast Instagram Post Scraper](https://apify.com/insights_data/fast-instagram-post-scraper).
- ❌ Engagement rate and latest posts. For full profile data, use [Instagram Profile Scraper](https://apify.com/insights_data/instagram-profile-scraper).
- ❌ Sending emails or messages. The Actor collects leads; it does not contact anyone.

***

### 🧭 How to scrape Instagram emails

Instagram Email Scraper is designed for an easy start, even if you have never extracted data from the web before. Here is how to extract emails from Instagram accounts in a few clicks.

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [Instagram Email Scraper](https://apify.com/insights_data/instagram-email-scraper). To just try it, skip to step 5: the form is already filled with `fitness coach`, `Miami` and 10 leads.
3. In **Searches**, add one entry per row of the list: a niche such as `yoga studio`, an @username such as `@evaafit_`, or a profile link.
4. Set **Location** (for example `Austin`, or clear it to search anywhere), **Max leads** (for example `10`) and, if you want, **Email type** (start with any email) and **Min followers**.
5. Click **Start**. Each lead appears in the table and in the log as soon as it is found.
6. Open **Storage**, then **Datasets**, then **Export** to download the leads in JSON, CSV, Excel, XML or HTML. Export the **Email leads** table first; it has every lead.

#### Words used in this README

- **Actor:** an app on the Apify platform, such as this scraper.
- **Dataset:** the results table of a run. **Key-value store:** a small file store of the run, used here for the run totals.
- **Pay-per-event:** you pay per event, here per lead saved, plus a small start fee.
- **Platform usage:** the computing time and memory a run uses on Apify, plus any Apify Proxy traffic (Apify's network of connections for reaching websites).
- **Maximum charge limit:** a cap on the result charges you set in the run options when you start a run.
- **Task:** a saved input you can run again. **Schedule:** runs a task at set times. **Webhook:** a message Apify sends to another app when a run finishes.
- **MCP:** a standard way to connect AI assistants such as Claude to tools like this Actor.

***

### 💲 Instagram email scraper pricing: how much does it cost?

Instagram Email Scraper uses a **pay-per-event** model: you pay for each lead saved, plus a small start fee per run. Your bill has three parts:

1. **Results:** one result is charged for every lead saved to the main Email leads table. The price depends on your Apify plan, as in the table below.
2. **Start fee:** $0.00005 (a twentieth of a cent) per run at the default memory of 1 GB. It is the same on every plan.
3. **Platform usage:** the compute used by the run, billed at your Apify plan's own rates. If Apify Proxy is used during the run, its traffic is part of platform usage too.

| Plan | Price per result | Price per 1,000 results |
|---|---|---|
| 🆓 Free | $0.005 | $5.00 |
| 🌱 Starter | $0.0045 | $4.50 |
| 🚀 Scale | $0.004 | $4.00 |
| 🏛️ Business and higher | $0.0035 | $3.50 |

The plan discount applies to the result price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

**Example:** 1,000 leads on the Free plan cost 1,000 x $0.005 = $5.00 in result charges, plus $0.00005 for the start fee, plus platform usage. On Business that is 1,000 x $0.0035 = $3.50 in result charges. The default run (up to 10 leads) is at most 10 x $0.005 = $0.05 on the Free plan, plus the start fee and platform usage.

There is no typical platform usage figure here, because it depends on your searches and filters. Do a small test run (for example 10 leads) and read the total cost on the run page before you scale up.

What is not charged: rows saved with **Keep profiles without email**, the copies of each lead in the Contacts, Profiles and Emails tables, and accounts that were filtered out or skipped. A run that ends with 0 leads has no result charges. A run that stops early or fails is charged only for the leads it saved. The start fee and the platform usage the run used apply in both cases. See the [pricing tab](https://apify.com/insights_data/instagram-email-scraper/pricing) for the full price list.

#### Is there a free Instagram email finder?

You can start for free. The Free plan includes a $5 monthly credit that pays for result charges and platform usage, and Free plan runs have the same features and limits as paid runs. How far the credit goes depends on how many leads you save and the platform usage of your run, so do a small test run first and read the cost on the run page. You can also set a **maximum charge limit** in the run options when you start a run. The run stops cleanly when the result charges reach it, with every lead found so far saved. Platform usage is billed on top.

***

### ⬇️ Input

You need one thing: **Searches**, a list of niches, @usernames or profile links. Set the input in Apify Console or send it as JSON through the API.

#### Settings most people change

- 🔍 **Searches** (`urls`): one per line. A niche or keyword such as `fitness coach`, an @username such as `@evaafit_`, or a profile link. Required. Duplicates are removed. Used with @usernames, it works as an Instagram email finder by username.
- 📍 **Location** (`location`): a city or country added to every niche search, for example `Miami` or `Germany`. It applies to niche searches only: @usernames and profile links are looked up as they are, whatever the location. In Apify Console the field is prefilled with `Miami`, so clear it to search anywhere. API runs that leave it out search anywhere.
- 🏁 **Max leads** (`maxItems`, default 10): stop after this many leads. `0` means no cap (as many as can be found). If you type a number, it can be up to 100,000.
- 🏷️ **Email type** (`emailFilter`, default any): any email, business emails only, or free emails only. Business emails only keeps a public email on the account's own domain, sometimes called an Instagram business email, rather than a Gmail address. There is no option for `disposable` emails; they show up only as an `email_type` value in the output.
- 🔤 **Specific email domain** (`customEmailDomain`): keep only emails on one domain, for example `brand.com` or `@gmail.com`. When filled, it replaces **Email type**.
- 👥 **Min followers** (`minFollowers`, default 0): skip accounts with fewer followers.

Four more fields are rarely needed:

- 🙈 **Keep profiles without email** (`includeNoEmail`, default off): also save accounts where no email was found. These rows have `email: null`, do not count toward **Max leads** and are not charged.
- 🌐 **Check linked websites** (`crawlWebsite`, default on): open the website or link-in-bio page when the bio has no matching email.
- 📬 **Check mail domain** (`checkMx`, default on): fill `email_valid`. When it is off, `email_valid` is `null`.
- 🛡️ **Proxy configuration** (`proxyConfiguration`): optional and off by default. The Actor uses Apify Proxy when needed.

Here is a small example that looks for fitness coaches in Miami and stops at 10 leads:

```json
{
  "urls": ["fitness coach"],
  "location": "Miami",
  "maxItems": 10
}
```

See the [input tab](https://apify.com/insights_data/instagram-email-scraper/input-schema) for a full description of all fields.

#### Searches

Each line is read as one of three things: a niche or keyword, an @username, or a profile link. To use it as an Instagram contact info finder for accounts you already know, paste their usernames or profile links. Post and Reel links, and @handles that are not valid usernames, are skipped with a warning in the log.

- ✅ Good: `fitness coach`, `@evaafit_`, `https://www.instagram.com/evaafit_/`
- ❌ Bad: `https://www.instagram.com/p/<post-id>/` (a post link)

> ⚠️ With @usernames and profile links, an account without a public email is dropped unless **Keep profiles without email** is on.

#### Specific email domain

When this field is filled, it replaces **Email type**. A leading `@` is fine, and subdomains match too. A value without a dot is ignored, with a warning in the log.

- ✅ Good: `brand.com` or `@gmail.com`
- ❌ Bad: `brand`

#### Min followers

When a minimum is set, accounts whose follower count cannot be read are skipped as well, because they cannot prove they meet it.

> ⚠️ Every saved lead is one billed result. With **Max leads** set to `0` on a broad niche, set a **maximum charge limit** when you start the run.

***

### ⬆️ Output

Results are stored in datasets. In Apify Console, open **Storage**, then **Datasets**, then **Export** to download them in JSON, CSV, Excel, XML or HTML, with only the fields you need. Each run gives you an Instagram email list you can open in Excel or Google Sheets.

The run has four tables. Most people need only the first one:

| Table | What is in it | When to open it |
|---|---|---|
| 📋 **Email leads** (main) | Every lead with all fields. Views: *Email leads* (the key columns) and *All fields* | Export this one for your outreach list. It is the only charged table |
| 📇 **Contacts** | `username`, `email`, `other_emails`, `phone`, `whatsapp`, `website`, `socials` | When you only want contact columns |
| 🆔 **Profiles** | `username`, `profile_url`, `full_name`, `bio`, `followers`, `following`, `posts`, `is_verified`, `is_private`, `matched_keywords` | When you only want profile columns |
| ⭐ **Emails** | `username`, `email`, `email_type`, `email_valid`, `lead_score` | When you want to sort by `lead_score`, which is only in this table |

Contacts, Profiles and Emails are optional splits of the same leads, not extra data. You find all four in the run's **Output** tab and under **Storage**, then **Datasets**. The status line on the run page shows how many leads were found so far.

#### JSON example

Results for the input example above, shortened to one lead:

```json
[
  {
    "username": "evaafit_",
    "profile_url": "https://www.instagram.com/evaafit_/",
    "full_name": "Eva Mitchell | Fitness & Wellness Coach",
    "email": "elevatewithevaa@gmail.com",
    "email_type": "free",
    "email_valid": true,
    "other_emails": [],
    "phone": null,
    "whatsapp": null,
    "website": "https://www.elevatewithevacoaching.com",
    "socials": {},
    "matched_keywords": ["fitness", "coach", "miami"],
    "bio": "Helping women build muscle & find balance ...",
    "followers": 104461,
    "following": 459,
    "posts": 917,
    "is_verified": true,
    "is_private": false
  }
]
```

#### Emails table example

The same lead in the Emails table, with its lead score:

```json
{
  "username": "evaafit_",
  "email": "elevatewithevaa@gmail.com",
  "email_type": "free",
  "email_valid": true,
  "lead_score": 85
}
```

#### Run totals (optional)

You do not need this for a normal run. If you want the numbers behind a run, open **Storage**, then **Key-value stores**, and the **Run summary** record (key `RUN_SUMMARY`). It counts the leads saved and charged, the accounts with no matching email, the accounts under your follower minimum, the profiles that could not be read and the run time. It also says whether the run stopped at the maximum charge limit (`spend_limit_reached`) or the run timeout (`time_limit_reached`).

***

### 💡 Tips and recurring runs

#### How many leads can you get with Instagram Email Scraper?

**Max leads** goes up to 100,000, and `0` means no cap. The real number depends on how many accounts in your niche and location publish an email, on your email type, domain and follower filters, and on whether Instagram shows profile pages during the run. Like any Instagram leads scraper, it can only return accounts that publish a contact address. Used as an Instagram leads finder for a narrow niche in a small town, a run can end with fewer leads than you asked for. The best way to know for your use case is a small test run.

If the run gets close to its timeout, it stops a little early and ends with every lead found so far saved. Raise the timeout in the run options to collect more.

#### Run it on a schedule

A weekly Instagram outreach list for one niche and city:

1. Set up your input in Apify Console, for example `wedding photographer`, **Location** `Chicago`, **Max leads** `100` and **Email type** business emails only.
2. Click **Save as a new task** so the input is stored.
3. Open **Schedules**, create a schedule (for example every Monday) and attach the task.
4. After each run, compare it with the previous one in your spreadsheet. Match leads by `username`, keep the new ones, and check whether `email` or `followers` changed.

The Actor does not track changes between runs by itself. The `username` match is a step you do in your own sheet or tool, and it is what finds the new accounts.

#### How to get cheaper, more focused results

- 💡 Use a clear niche plus a city, and set **Max leads** to what you need.
- 💡 Add **Min followers** or **Email type** to skip accounts you would not contact.
- 💡 Turn off **Check linked websites** if the bio email is enough for you. You get fewer phones and social links.
- 💡 Set a **maximum charge limit** when you start a run.

#### If a run ends with 0 leads or fails

A run with 0 leads still ends as succeeded, with the status "No leads found" and a next step in the log. Try these in order:

1. Open the log and look for skipped entries, such as post or Reel links. Replace them with the @username.
2. Clear **Location**, or try a broader niche such as `coach` instead of `online fitness coach for moms`.
3. Set **Email type** to any email, empty **Specific email domain** and lower **Min followers**.
4. If the log says Instagram is not showing profile pages, or that the search found no profiles right now, run it again later or add @usernames directly.

A run fails right away when the input has a problem, for example a **Max leads** or **Min followers** value that is not a whole number of 0 or more. The status message says which fields to fix. If many requests in a row cannot connect, the run stops early, and the leads found so far stay saved. A failed or stopped run is charged only for the leads it saved, plus the start fee and its platform usage. If a run keeps failing, open an issue on the Issues tab with the run link.

#### Known issues

- ⚠️ The Actor reads Instagram without logging in, which is why you need no account. The trade-off is that Instagram sometimes shows only part of a profile to visitors who are not logged in.
- ⚠️ Some profiles show only basic stats without a bio or links. Their emails can be missed, and the log says so.
- ⚠️ If Instagram does not show profile pages for a while, the run continues with less detail. Try again later.
- ⚠️ If a search finds nothing at that moment, add @usernames directly or run it again later.

***

### 🔌 Instagram email scraper API and integrations

#### Can I use Instagram Email Scraper as an Instagram email API?

Yes. The [Apify API](https://docs.apify.com/api/v2) gives you programmatic access: start runs, schedule them and fetch results. Use the `apify-client` [NPM package](https://apify.com/insights_data/instagram-email-scraper/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/instagram-email-scraper/api/python) for Python. See the [API tab](https://apify.com/insights_data/instagram-email-scraper/api) for ready-to-use code.

#### Instagram email scraper Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/instagram-email-scraper").call(run_input={
    "urls": ["fitness coach"],
    "location": "Miami",
    "maxItems": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["username"], item["email"], item["followers"])
```

#### Can I integrate it with other apps?

Yes. Connect it through [Apify integrations](https://apify.com/integrations) to Google Sheets, Slack, Make, Zapier, n8n and more. Workflows that fit this Actor:

- 📊 **Influencer email list in Google Sheets:** save your niche and city as a task, schedule it weekly, and send each finished run's dataset to a Google Sheet that your team works from.
- 🗃️ **Leads into your CRM:** in Make or Zapier, start the task, read the dataset items and create a contact for each new `username` with its email, phone and website.
- 🔔 **Slack alert:** add a webhook on the task that fires when a run succeeds, and post the lead count and a dataset link to a Slack channel.
- 🔧 **n8n:** use the Apify node to run the Actor, then pass the leads to a sheet, a database or an AI step.

This is the Instagram outreach automation part: the Actor collects and delivers fresh leads on a schedule. It sends no emails or messages; writing and sending your outreach happens in your own email or outreach tools. Use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger any of these when a run finishes.

#### Can I use Instagram Email Scraper with AI agents (MCP)?

Yes. Connect it to Claude and other AI assistants through the Apify MCP server, then ask the assistant to find leads for a niche and city. Open the [MCP tab](https://apify.com/insights_data/instagram-email-scraper/api/mcp) for setup steps.

***

### 🧩 Other Instagram scrapers

These Actors cover the Instagram data this one does not, and two more help with lead lists outside Instagram. If you need a general Instagram data scraper for profiles, posts or search, start here:

- 🆔 [Instagram Profile Scraper](https://apify.com/insights_data/instagram-profile-scraper): bio, followers, following, posts, verified status, emails and phones from the bio, engagement rate and latest posts.
- 🔍 [Instagram Search Scraper](https://apify.com/insights_data/instagram-search-scraper): search Instagram by keyword, @username or link and get profiles, places, posts and reels.
- 🧬 [Instagram Related Profiles Scraper](https://apify.com/insights_data/instagram-related-profiles-scraper): the similar and suggested accounts Instagram shows for a public profile, useful for influencer discovery.
- 🖼️ [Fast Instagram Post Scraper](https://apify.com/insights_data/fast-instagram-post-scraper): the latest public posts of a profile with captions, likes, comments and Reel views.
- 🗺️ [Google Map Scraper](https://apify.com/insights_data/google-map-scraper): places by keyword with phone, website, rating and lead flags such as no website.
- 💼 [LinkedIn Company Employees Scraper](https://apify.com/insights_data/linkedin-company-employees-scraper): public employees of a company with title, seniority and optional work emails.

***

### ❓ FAQ

#### Is it legal to scrape Instagram?

Web scraping is generally legal if you extract publicly available data, and this Actor collects only what any visitor can see. Emails and phone numbers are personal data, though. **Respect personal data** rules such as GDPR, have a legitimate reason to collect and use the data, follow anti-spam laws such as CAN-SPAM before you send emails, and take Instagram's [Terms of Use](https://www.instagram.com/legal/terms/) into account. This is not legal advice.

#### How does Instagram Email Scraper work?

It works like a visitor browsing public profiles. For each niche it looks for public Instagram accounts that match your words, adding your location words when you set one. So results match the niche and mention the place; they are not checked against where the account is based. @usernames and profile links skip this step and are read directly. It reads each profile and takes the email from the public bio, because an Instagram bio email is the most common way accounts share a contact address. When the bio has no matching email, it opens the account's own website or link-in-bio page. Then it applies your filters, checks the mail domain and saves the lead at once.

#### How to find email on Instagram?

Check the bio first, then the links in the bio, such as a website or a link-in-bio page. That works for one account. To find Instagram account emails in bulk, add a niche (optionally with a city) or a list of usernames to this Actor and it does the same checks for every account.

#### How to find email from Instagram username?

Add the username with the `@` (for example `@evaafit_`), or the profile link, to **Searches**. Without the `@`, a plain word is treated as a niche search, not as a username. The Actor reads that profile and its linked pages and returns the public email if there is one. If none is found, the account is dropped unless **Keep profiles without email** is on.

#### How is it different from an Instagram email finder tool you use by hand?

| | Checking profiles by hand | Instagram Email Scraper |
|---|---|---|
| Accounts per session | One at a time | A whole niche, city or list per run |
| Linked websites | You open each one | Opened when the bio has no matching email |
| Filters | None | Email type, specific domain, min followers |
| Output | Copy and paste | Table with JSON, CSV and Excel export |
| Recurring lists | Repeat by hand | Saved task plus a schedule |

#### How is Instagram Email Scraper different from Instagram Profile Scraper?

Instagram Email Scraper builds lead lists; [Instagram Profile Scraper](https://apify.com/insights_data/instagram-profile-scraper) gives you full data for profiles you already know.

| | Instagram Email Scraper | Instagram Profile Scraper |
|---|---|---|
| Input | Niche + location, @usernames or profile links | Usernames or profile links |
| Finds new accounts by niche | ✅ | ❌ (you list the profiles) |
| Emails and phones | From the bio and the account's linked website or link-in-bio page | From the bio |
| Lead tools | Email type and domain filters, `email_valid`, `lead_score` | Not part of its description |
| Engagement rate and latest posts | ❌ | ✅ |
| What is charged | One result per lead with an email | See its pricing tab |

Use this Actor to find who to contact, and Instagram Profile Scraper to study the accounts in more depth.

#### Does it return the email behind the Contact button?

No. It returns the public email shown on the account or its linked site, meaning an address written in the public bio, or on the account's own website or link-in-bio page. An Instagram business contact email that appears only behind the profile's Contact button is not part of the output.

#### Can I get an Instagram creator email from a private account?

Only if it is public. A private account's bio is still visible, and `is_private` shows that the account is private, but the Actor never sees anything that requires following the account.

#### Why scrape Instagram emails?

- 🤳 **Influencer marketing:** shortlist creators by niche, followers and verified badge, with a way to contact them.
- 🏪 **Local sales:** build city-by-city lists of studios, coaches and shops for your service.
- 🤝 **Partnerships:** find brands and creators for co-marketing and sponsorships.
- 🗃️ **CRM upkeep:** refresh the contact details of accounts you already work with.

#### Why am I getting fewer leads than expected?

- Only accounts with a public email that matches your filters count as leads. Try **Email type** any.
- Remove **Location** or try a broader niche.
- Lower **Min followers**.
- Check the log for skipped inputs such as post links.
- If the log says Instagram is not showing profile pages, run it again later.

#### Do I need an Instagram account or cookies?

No. There is no field for an account or cookies, and the Actor reads only public pages.

***

### 💌 Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/instagram-email-scraper/issues/open).

Need a **custom solution** or more data? Contact us at hello.insights.data@gmail.com.

Built and maintained by [insights_data](https://apify.com/insights_data).

# Actor input Schema

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

One per line: a niche or keyword (for example fitness coach), an @username, or an Instagram profile link. Duplicates are removed.

## `location` (type: `string`):

City or country added to every search, for example Miami or Germany. Leave empty to search anywhere.

## `maxItems` (type: `integer`):

Stop after this many leads. 0 means as many as can be found.

## `emailFilter` (type: `string`):

Any keeps every email. Business keeps emails on a company domain. Free keeps Gmail, Outlook, iCloud and similar.

## `customEmailDomain` (type: `string`):

Optional. Keep only emails on this domain, for example @gmail.com or brand.com. When filled it replaces the email type above.

## `minFollowers` (type: `integer`):

Skip accounts with fewer followers. 0 means no minimum.

## `includeNoEmail` (type: `boolean`):

Also save profiles where no email was found. These rows are not counted as leads and are not charged.

## `crawlWebsite` (type: `boolean`):

Open the website or link-in-bio page of a profile to find more emails, phones and social links.

## `checkMx` (type: `boolean`):

Check that the email domain can receive mail. This does not prove that the mailbox itself exists.

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

By default no proxy is used. If a request is refused, the Actor switches to a stronger proxy automatically and keeps using it.

## Actor input object example

```json
{
  "urls": [
    "fitness coach"
  ],
  "location": "Miami",
  "maxItems": 10,
  "emailFilter": "",
  "customEmailDomain": "",
  "minFollowers": 0,
  "includeNoEmail": false,
  "crawlWebsite": true,
  "checkMx": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per lead.

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

Emails, phones, websites and social links.

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

Profile stats and bio.

## `emails` (type: `string`):

Email type, mail-domain check and lead score.

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

Counts and timing of the run.

# 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": [
        "fitness coach"
    ],
    "location": "Miami",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/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 = {
    "urls": ["fitness coach"],
    "location": "Miami",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/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 '{
  "urls": [
    "fitness coach"
  ],
  "location": "Miami",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/instagram-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/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/ZgvbMzJ7RMUgOQbQO/builds/f0KJPnPawRN7WxP3o/openapi.json
