# Instagram Leads Scraper - Emails & Contacts (`scrapesage/instagram-leads-scraper`) Actor

Turn public Instagram creator and business profiles into contactable lead rows: emails and phones from the bio and the creator's own linked website, resolved website domain, classified socials, follower stats and a 0-100 lead score. Measured 45% contactable on real business handles.

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

## Pricing

from $6.00 / 1,000 lead profile scrapeds

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 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 Leads Scraper - Emails & Contacts

Turn **public Instagram creator and business profiles into contactable lead rows**: emails and phone numbers, the creator's real website domain, classified social profiles, follower stats and a **0-100 lead score**. No login.

### Read this first: where the contacts actually come from

**Instagram does not expose a business email, phone or category to logged-out callers.** Its logged-out profile payload has 23 fields and not one of them is a contact field - I probed it directly. Any tool claiming "Instagram emails, no login" is either logged in or guessing.

So this actor uses the two places creators publish contact details **on purpose**:

1. **The bio text** - creators routinely write "email: hello@studio.com" or a WhatsApp number.
2. **Their own linked website** - the bio link is resolved (including link-in-bio hubs like Linktree and Beacons) and one page is read for `mailto:` / `tel:` addresses and social profiles.

Nothing is inferred, pattern-guessed, or read from a private field.

### Measured yield (not a promise - an actual measurement)

Tested on **20 real small-business handles** discovered from business-intent hashtags (#weddingphotographer, #personaltrainer, #realtorlife) on 2026-07-30:

| | Result |
|---|---|
| Website domain found | **18 / 20 (90%)** |
| Social profiles classified | **14 / 20 (70%)** |
| Email found | **8 / 20 (40%)** |
| Phone found | 2 / 20 (10%) |
| **Contactable (email or phone)** | **9 / 20 (45%)** |
| Average lead score | 42 |

Set **`requireContact: true`** and you receive only rows that actually have an email or phone - so you never pay for a blank.

Note that mega-brands are the *worst* case for this job: their sites are app shells with no `mailto:`. Independent operators - photographers, trainers, coaches, studios, agencies - are where this actor pays for itself.

### What you get per lead

`profileUrl` · `username` · `userId` · `fullName` · `biography` · `followersCount` · `followingCount` · `postsCount` · `isVerified` · `looksBusinessAccount` · **`emails[]`** · **`primaryEmail`** · **`phones[]`** · `primaryPhone` · `hasContactInfo` · `contactSource` · **`websiteUrl`** · **`websiteDomain`** · `websiteReachable` · `websiteTitle` · `linkHubUrl` · `bioLinks[]` · **`socials{}`** (linkedin, twitter/x, facebook, youtube, tiktok, pinterest, threads, whatsapp, telegram) · `socialCount` · `threadsUsername` · `threadsProfileUrl` · `hasLinkedFacebook` · `profilePicUrl` · **`leadScore`** · `scrapedAt`
Plus, with `includeEngagement`: `avgReelPlays` · `medianReelPlays` · `avgReelLikes` · `avgReelComments` · `avgReelEngagementRate` · `reelEngagementPerFollower`

### Input

```json
{
  "usernames": ["belle_art_photography", "lyons_media_production"],
  "crawlWebsites": true,
  "requireContact": true,
  "minFollowers": 1000,
  "includeEngagement": false,
  "maxResults": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

| Field | What it does |
|---|---|
| `usernames` | Public creator/business handles - any number |
| `crawlWebsites` | Resolve the bio link and read one page for contacts + socials (this is where most emails come from) |
| `requireContact` | Only return rows that actually have an email or phone |
| `onlyBusinessAccounts` | Keep to accounts with 2+ business signals (on by default) |
| `minFollowers` | Audience floor, applied **before** any crawling |
| `skipPrivate` | Skip private accounts (on by default) |
| `includeEngagement` | Add a Reel-based engagement snapshot to qualify as well as contact |
| `maxResults` | Cap. `0` = no limit |

### Personal data - the line this actor holds

- **Business and creator accounts only.** `onlyBusinessAccounts` is **on by default**, and private accounts are skipped by default. This actor is for reaching businesses that publish contact details to be contacted.
- **Only deliberately published details.** Contacts come from the bio the creator wrote and the website they linked. There is no email *guessing* (no `first.last@domain` permutation), no scraping of follower lists, and no access to anything behind a login.
- **You remain the data controller.** If you are in the EU/UK, B2B outreach still requires a lawful basis under GDPR/PECR, and you must honour opt-outs. Please do not use this for consumer/personal accounts.
- Fields the source does not publish come back **null** rather than filled with a guess.

### Pricing (pay per event, no start fee)

| Event | Price | What it covers |
|---|---|---|
| `profile` | **$0.006** | One lead row: follower stats, bio, website domain, classified socials, lead score |
| `contactVerified` | **$0.012** | Charged **only when an email or phone was actually found** |

That means blanks are cheap and hits cost more - you are billed for the enrichment only when it worked. Rows are billed before they are written.

### Use with AI assistants (MCP)

Works as an LLM tool via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) - ask an assistant to "find contact details for these 40 photographers" and it can call this actor directly.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Integrations

[Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://apify.com/integrations/slack), [Google Drive](https://apify.com/integrations/google-drive), [Airbyte](https://apify.com/integrations/airbyte), [GitHub](https://apify.com/integrations/github), the [Apify API](https://docs.apify.com/api/v2), [Schedules](https://docs.apify.com/platform/schedules) and [Webhooks](https://docs.apify.com/platform/integrations/webhooks).

### FAQ

**Do I need a login or cookies?** No.

**Why does a profile have no email?** Because that creator published none. See the measured yield above - 45% of representative business accounts are contactable. Use `requireContact: true` to receive only those.

**Do you guess emails?** No. No permutation, no pattern-matching against a domain. Only addresses actually published in the bio or on the linked site.

**How do I find handles to feed in?** Pair this with [Instagram Hashtag Scraper](https://apify.com/scrapesage/instagram-hashtag-scraper) - search a business-intent hashtag, take the `ownerUsername` column, feed it here. That is exactly how this actor's yield was measured.

### Related scrapers by scrapesage

- [Instagram Hashtag Scraper](https://apify.com/scrapesage/instagram-hashtag-scraper) - find the handles to enrich
- [Instagram Profile Scraper](https://apify.com/scrapesage/instagram-profile-scraper) - bulk profile stats and engagement
- [Instagram Reels Scraper](https://apify.com/scrapesage/instagram-reels-scraper) - play counts and Reel analytics
- [Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper) - contact extraction across any website

# Actor input Schema

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

Public creator or business handles (or profile URLs) to turn into lead rows. Any number.

## `crawlWebsites` (type: `boolean`):

Resolves the bio link (including link-in-bio hubs like Linktree) and reads ONE page of the creator's own website for mailto:/tel: addresses and social profiles. This is where most emails come from - Instagram itself does not expose them without a login.

## `requireContact` (type: `boolean`):

Drop profiles where no email or phone could be found, so every row you receive is contactable.

## `onlyBusinessAccounts` (type: `boolean`):

Keeps the output to accounts showing at least two business signals (contact details, a website, a Threads or Facebook link, verification, or a real audience). On by default - this actor is not intended for personal accounts.

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

Skip accounts below this follower count. Applied before any crawling, so filtered profiles cost you nothing.

## `skipPrivate` (type: `boolean`):

Private accounts publish nothing useful for lead-gen and are skipped by default.

## `includeEngagement` (type: `boolean`):

Adds recent-Reel average/median plays, likes, comments and engagement per follower, so you can qualify a creator as well as contact them.

## `maxResults` (type: `integer`):

Total leads to return. 0 means no limit (the run's time budget stops it safely).

## `concurrency` (type: `integer`):

Parallel profiles. Keep at 3 or below - each lead may also fetch an external website.

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

RESIDENTIAL is the tested default and strongly recommended.

## Actor input object example

```json
{
  "usernames": [
    "natgeo"
  ],
  "crawlWebsites": true,
  "requireContact": false,
  "onlyBusinessAccounts": true,
  "minFollowers": 0,
  "skipPrivate": true,
  "includeEngagement": false,
  "maxResults": 100,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every lead with emails, phones, resolved website domain, classified social profiles, follower stats and a 0-100 lead score as JSON items in the default dataset.

# 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": [
        "natgeo",
        "nike"
    ],
    "crawlWebsites": true,
    "onlyBusinessAccounts": true,
    "skipPrivate": true,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/instagram-leads-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": [
        "natgeo",
        "nike",
    ],
    "crawlWebsites": True,
    "onlyBusinessAccounts": True,
    "skipPrivate": True,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/instagram-leads-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": [
    "natgeo",
    "nike"
  ],
  "crawlWebsites": true,
  "onlyBusinessAccounts": true,
  "skipPrivate": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/instagram-leads-scraper --silent --output-dataset

```

## MCP server setup

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