Instagram Public Contact Scraper avatar

Instagram Public Contact Scraper

Pricing

Pay per event

Go to Apify Store
Instagram Public Contact Scraper

Instagram Public Contact Scraper

Extract owner-published emails, phones, biography, external URL, categories, identity, and public counters from supplied Instagram profile URLs.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Extract owner-published contact details and current public profile data from supplied Instagram profile URLs.

Instagram Public Contact Scraper turns each successfully resolved public profile into one normalized dataset record. It reads public email and phone fields when Instagram returns them, scans the profile biography for owner-published contact strings, and includes identity, biography, external URL, category, account flags, and public counters.

No Instagram login or buyer cookie is required.

What does this Instagram scraper do?

Provide one or more public Instagram profile URLs and receive structured records ready for prospect research, creator evaluation, spreadsheets, CRMs, scheduled snapshots, or data pipelines.

The Actor:

  • accepts explicit public profile URLs;
  • rejects post, reel, story, explore, and non-Instagram URLs;
  • deduplicates usernames case-insensitively;
  • extracts only public profile and biography data;
  • streams one record per successful profile;
  • charges only for records that are successfully saved;
  • fails visibly when any requested profile cannot be resolved, while preserving successful rows.

It does not search Instagram for accounts, scrape followers, follow link-in-bio pages, access private content, or require login credentials.

Who is it for?

Lead generation teams can refresh owner-published contact fields for a known list of business or creator profiles.

Influencer and partnership teams can combine public identity, biography, categories, counters, and contact details in one table.

Researchers and analysts can schedule snapshots and compare profile metadata over time.

Developers and data engineers can send normalized records to a database, spreadsheet, webhook, CRM, or warehouse through Apify integrations and APIs.

Use this Actor when you already know the profile URLs. Choose a discovery-focused Actor when your first job is finding profiles by keyword, hashtag, or post.

Why use this Actor?

  • Focused output: one stable record type for public profile contact research.
  • No buyer login: the supported workflow does not ask for an Instagram password or session cookie.
  • Owner-published provenance: emails and phones come from public profile fields or biography text.
  • Useful even without contact fields: identity, biography, link, categories, flags, and counters remain available.
  • Batch-safe input: duplicate profiles are removed and maxProfiles stops work in input order.
  • Explicit failure behavior: unresolved inputs do not silently disappear and are not charged as results.
  • Cost-aware requests: the lower-cost SHADER proxy is the tested default; residential routing remains user-selectable.

What Instagram data is extracted?

FieldDescription
instagramUserIdStable public Instagram user identifier
usernameCurrent public username
fullNameOwner-published profile display name
biographyOwner-published biography
emailsDeduplicated public emails from profile fields or biography
phonesDeduplicated public phones from profile fields or biography
externalUrlPublic external link shown on the profile
categoryInstagram profile category when available
businessCategoryHuman-readable business category when available
profileUrlCanonical Instagram profile URL
isVerifiedWhether Instagram marks the account verified
isPrivateWhether the profile is private
isBusinessAccountWhether Instagram marks it as a business account
isProfessionalAccountWhether Instagram marks it as a professional account
followersCountCurrent public follower count
followingCountCurrent public following count
postsCountCurrent public post count
profilePicUrlPublic profile image URL
scrapedAtUTC extraction timestamp

Instagram does not publish every field for every profile. Optional text fields may be null, and contact arrays may be empty.

How to scrape public Instagram profile contacts

  1. Open the Actor input page.
  2. Add complete profile URLs such as https://www.instagram.com/nasa/.
  3. Set maxProfiles if only the first part of the list should run.
  4. Keep the default SHADER proxy for normal batches, or choose another proxy route when needed.
  5. Click Start.
  6. Open the Instagram contacts dataset view.
  7. Export results as JSON, CSV, Excel, XML, or another supported dataset format.
  8. For recurring research, save the input as an Apify Task and attach a schedule or integration.

Input parameters

profileUrls

Required array of 1 to 1,000 public Instagram profile URLs.

Accepted example:

https://www.instagram.com/nasa/

Post, reel, story, explore, account, API, and non-Instagram URLs are rejected before scraping begins.

maxProfiles

Optional integer from 1 to 1,000. The Actor processes at most this many unique profiles in input order. The default is 100.

proxyConfiguration

The tested default uses Apify's SHADER proxy group. You can select residential proxy for stricter routing or disable Apify Proxy for tiny direct tests.

Direct requests can work for small inputs but Instagram may challenge repeated requests from one IP. The Actor uses bounded retries and a fresh coherent proxy session after retryable upstream responses.

Example input

{
"profileUrls": [
"https://www.instagram.com/nasa/",
"https://www.instagram.com/instagram/"
],
"maxProfiles": 2,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["SHADER"]
}
}

Duplicate URLs and username casing differences are collapsed before the limit is applied.

Example output

A current record has this shape; volatile counters and media URLs are shortened here:

{
"instagramUserId": "528817151",
"username": "nasa",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"emails": [],
"phones": [],
"externalUrl": "https://www.nasa.gov/",
"category": "GOVERNMENT_ORGANIZATION",
"businessCategory": "Government Agencies",
"profileUrl": "https://www.instagram.com/nasa/",
"isVerified": true,
"isPrivate": false,
"isBusinessAccount": true,
"isProfessionalAccount": true,
"followersCount": 104249366,
"followingCount": 92,
"postsCount": 4871,
"profilePicUrl": "https://scontent.cdninstagram.com/...",
"scrapedAt": "2026-08-06T20:06:55.076Z"
}

The default dataset contains only successful profile records. A failed input is described in the run log and terminal error, not emitted as a paid placeholder row.

How much does it cost to extract Instagram profile contacts?

Pay-per-event pricing has two parts:

  • Start: $0.005 once per valid run.
  • Profile contact record: tiered per successfully saved record; BRONZE is $0.005 per profile.

At BRONZE pricing, example Actor charges are:

Successful profilesBRONZE calculation
1$0.005 start + 1 × $0.005 profile
10$0.005 start + 10 × $0.005 profiles
100$0.005 start + 100 × $0.005 profiles

Failed profiles have no per-record charge. Proxy and platform usage treatment follows your Apify plan and the active pricing shown in Console. Tier prices decrease at higher customer tiers; Console is the source of truth for the tier active on your account.

Tips for reliable contact research

  • Supply canonical profile URLs rather than post or share URLs.
  • Keep the default proxy for repeated or scheduled batches.
  • Start with a small representative list before running hundreds of profiles.
  • Treat empty emails or phones arrays as a valid result: many owners publish no contact string.
  • Use scrapedAt as the snapshot timestamp when comparing scheduled runs.
  • Store the stable instagramUserId as the entity key because usernames can change.
  • Inspect externalUrl manually or with a separate authorized workflow; this Actor does not crawl external websites.
  • Avoid treating follower counters as perfectly synchronized; Instagram can update public counters between requests.

Limits and failure behavior

Instagram can rate-limit, challenge, remove, rename, or restrict profiles without notice.

The Actor makes three bounded attempts for retryable 400, 401, 403, 429, and server-error responses. It rotates the request session between attempts instead of repeating an identical blocked request indefinitely.

A missing or unavailable profile fails that input. If a batch contains both successful and failed profiles, successful rows remain in the dataset and are charged, failed rows are not charged, and the overall run fails so incomplete coverage is visible.

Private profiles may expose only the public metadata Instagram chooses to return. This Actor does not bypass privacy settings.

The Actor processes profiles sequentially to reduce challenge rates and uses 256 MB of memory. Very large batches can take longer than tiny tests.

Integrations and recurring workflows

Spreadsheet or CRM enrichment

Run a saved Task from a list of known profile URLs, then export the default dataset to Google Sheets, Airtable, Salesforce, HubSpot, or another integration supported by Apify.

Scheduled profile snapshots

Create a Task, attach a daily or weekly schedule, and store each run's dataset. Compare emails, phones, biography, externalUrl, categories, and counters using instagramUserId plus scrapedAt.

Webhook pipeline

Attach a run-succeeded webhook and fetch the default dataset from the run payload. A failed mixed batch still preserves successful rows, so error handlers can inspect and retry only unresolved URLs.

Dataset API export

Use the dataset API to request JSON, CSV, Excel, or XML without changing the Actor's output contract.

Run with the Apify API

Replace APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~instagram-contact-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": ["https://www.instagram.com/nasa/"],
"maxProfiles": 1
}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/instagram-contact-scraper').call({
profileUrls: ['https://www.instagram.com/nasa/'],
maxProfiles: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("automation-lab/instagram-contact-scraper").call(run_input={
"profileUrls": ["https://www.instagram.com/nasa/"],
"maxProfiles": 1,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

For asynchronous workflows, start the run without waiting and poll the run status or use a webhook.

Use with Apify MCP

Claude Code

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/instagram-contact-scraper"

Claude Desktop, Cursor, and VS Code

Claude Desktop, Cursor, VS Code, and other HTTP MCP clients can use equivalent JSON:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/instagram-contact-scraper"
}
}
}

Example prompts:

  • “Extract public contact and profile data from these Instagram profile URLs.”
  • “Run the saved Instagram prospect snapshot and summarize which records publish emails.”
  • “Export the resulting public Instagram contact records as CSV.”

MCP clients still use your Apify authorization and the same Actor input, pricing, and output contract.

Responsible use and legality

This Actor extracts data that Instagram exposes publicly for supplied profiles. Public availability does not remove your legal or ethical responsibilities.

  • Follow applicable privacy, data protection, marketing, anti-spam, and platform rules.
  • Use contact details only for a lawful purpose.
  • Respect opt-outs, suppression lists, and communication consent requirements.
  • Do not use output for harassment, discrimination, stalking, or sensitive profiling.
  • Do not attempt to access private content or circumvent account restrictions.
  • Minimize retention and secure exported personal data.

You are responsible for deciding whether your use case and jurisdiction permit collection and processing.

Troubleshooting

Why did the run reject my URL?

Only a single Instagram profile path is accepted. Use https://www.instagram.com/username/, not a post, reel, story, explore page, shortened link, or URL with extra path segments.

Why are emails and phones empty?

The profile owner may not publish contact data, or Instagram may not return dedicated contact fields for that profile. The Actor also scans the biography, but it does not infer private contacts or crawl external sites.

Why did some profiles succeed but the run fail?

This is deliberate. Successful records remain available and are charged; failed profiles are not charged. The failed status prevents incomplete batches from looking complete. Inspect the log for each unresolved username.

What should I do after 400, 403, or 429 errors?

Keep proxy routing enabled, retry only the unresolved profiles, and avoid immediately repeating a large identical batch. A residential proxy can be selected if your chosen route is challenged, but it may have higher platform cost.

Why did a profile counter change between runs?

Follower, following, and post counts are live public values. Changes between requests are normal.

Use this Actor for focused owner-published contact and profile snapshots; use the related Actors only when the additional scope is genuinely required.

FAQ

Does it require an Instagram account?

No. The supported public-profile workflow does not accept or require an Instagram password, cookie, or session token.

Can it discover profiles by keyword or hashtag?

No. Supply profile URLs you already know. This keeps output provenance and pricing predictable.

No. externalUrl is returned as profile data, but external domains are not crawled.

Does one profile produce multiple paid rows?

No. Each successfully resolved profile produces one dataset row and one item charge event. Biography, emails, phones, counters, categories, and flags are included in that row with no separate event charge.

Can I schedule it?

Yes. Save the input as an Apify Task, attach a schedule, and use instagramUserId plus scrapedAt to compare snapshots.

What happens to duplicate URLs?

They are deduplicated by lowercase username before the profile limit is applied, so duplicates do not produce extra output records.