We had a list of a few hundred Instagram handles in one niche and needed, for each: is it a business, what category does it show, what is its website, and is there a public email or phone. The manual version is opening every profile and copying from the contact button into a sheet.
How we solved it
We built the PRO Instagram Posts & Reels Scraper on Apify (disclosure: it's ours). Every post it returns carries the account's profile fields, so one post per account is enough for one lead row, with no Instagram login. The input, one post per account:
{
"usernames": ["redbull", "dennikn", "heineken"],
"maxPostsPerAccount": 1
}
maxPostsPerAccount gives every handle its own allowance, so the whole list is one run. Plain maxPosts: 1 would deliver one post in total: maxPosts is one budget per run, spent account by account in input order.
from apify_client import ApifyClient
import pandas as pd
client = ApifyClient("YOUR_APIFY_TOKEN")
COLS = ["username", "owner_account_type", "owner_category", "follower_count",
"owner_website", "owner_public_email", "owner_public_phone"]
run = client.actor("intropix/instagram-posts-reels-scraper-pro").call(
run_input={"usernames": ["redbull", "dennikn", "heineken"], "maxPostsPerAccount": 1})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
leads = pd.DataFrame(rows, columns=COLS)
leads = leads[leads["owner_account_type"].isin(["business", "creator"])]
leads.to_csv("instagram_leads.csv", index=False)
What came out
One row per account. The Red Bull row, from a real item on 17-10-2026:
{
"username": "redbull",
"owner_account_type": "business",
"owner_category": null,
"follower_count": 34172188,
"owner_website": "https://onein.bio/redbull",
"owner_public_email": "info@redbull.com",
"owner_public_phone": null
}
owner_bio_links, owner_post_count, owner_city and owner_address are there too if you want them.
Cost
Each handle is $0.002 + $0.0039 = $0.0059, plus $0.005 once for the run, so 200 handles in one run are $0.005 + 200 x $0.0059 = $1.185. Handles that do not resolve cost nothing. A run holds up to 1,000 posts on a paid plan (10 on the free plan), so split a longer list into several runs.
The caveat
Contact fields are only what the profile shows publicly. An account that hides its email gets null even if Instagram stores one, so expect plenty of nulls. A business with no posts gives no row, because the row rides on a post.
Responsible use
A public business email can still belong to a named person. You are the data controller for what you collect, so you need your own lawful basis, worked out for your use case. Our Terms limit the actor to business, creator and brand accounts, prohibit using delivered contacts to reach private individuals or for unsolicited marketing where the recipient's country requires consent, and ask you to keep results only as long as the purpose needs (30 days as a guideline). Say where you found the address, and honour opt-outs. This is not legal advice.
To try it without code, the Instagram business account details and contacts task runs the PRO Instagram Posts & Reels Scraper on one account (run one account per run for a list). If captions, likes, comments, views and dates are all you need, without the account details, the standard Instagram Posts & Reels Scraper returns those at $1.90 per 1,000 posts.
Field list, pricing and n8n or MCP setup are in the PRO actor overview.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.