Instagram Bio Scraper — Instagram Email, Phone & Profile Stats avatar

Instagram Bio Scraper — Instagram Email, Phone & Profile Stats

Pricing

from $3.00 / 1,000 profiles

Go to Apify Store
Instagram Bio Scraper — Instagram Email, Phone & Profile Stats

Instagram Bio Scraper — Instagram Email, Phone & Profile Stats

Instagram bio scraper and full profile record for a handle or profile link: followers, following, posts, bio, category, and the email, phone and address the account publishes itself. Private accounts delivered too, and say so. From $3.00 per 1,000 profiles. An undeliverable account is never charged.

Pricing

from $3.00 / 1,000 profiles

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Paste Instagram handles or profile links and get the whole public record for each account: followers, following and post counts, bio and links, category, verification, pictures — and the email, phone and address the account publishes on its own business profile. One price for the whole row: there is no second charge for the contact fields. No login, no cookies, no proxy to configure. A private account is delivered too — its counts, bio and category are public even when its posts are not — and the row says so. An account we could not deliver is never charged, and nothing is charged for starting a run.

Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/instagram-profile-details-scraper

  • Actor id: steadyfetch/instagram-profile-details-scraper
  • Input: { "usernames": ["nasa"] } — the one field you have to set. A profile link or a numeric account id works in the same box.
  • Cap the bill: set maxTotalChargeUsd on the run (a run option, not Actor input), e.g. 0.50 — the run stops when it reaches it.
  • Price: from $3.00 per 1,000 profiles on Gold and above, $6.00 per 1,000 on the Apify free plan; the about-account panel is a flat $0.003 more, only when you ask for it. No start fee, and an account we could not deliver is never charged. Full table below.
  • How often it changes: follower, following and post counts move every day on an active account; the bio, links and contact block change only when the account holder edits them, often not for months. Weekly or monthly is what most buyers want — it is the counts that go stale, not the contact fields.

What you get

One row per account, with everything that account publishes at one price:

ColumnWhat it holds
username · userId · profileUrl · fullNamewho the account is
biography · bioLinks · externalUrl · pronounsthe bio, the link-in-bio list and the website
followerCount · followingCount · mediaCount · totalClipsCountthe audience and how much they post
isPrivate · isVerified · isBusiness · isProfessionalAccount · accountTypewhat kind of account it is
category · categoryId · accountBadgesthe label Instagram shows under the name
publicEmail · publicPhoneNumber · publicPhoneCountryCode · contactPhoneNumberthe contact details published on the profile
businessContactMethod · addressStreet · cityName · zip · latitude · longitudethe contact button and the published address
profilePicUrl · profilePicUrlHdthe profile picture, full size and thumbnail
hasHighlightReels · hasVideos · hasMusicOnProfilewhat else is on the profile
aboutCountry · aboutDateJoined · aboutFormerUsernames · aboutVerifiedthe account history, when you ask for it
charged · aboutAccountCharged · status · statusReasonwhat was billed and why, so your invoice reconciles from the dataset itself

About the contact fields. They appear only when the account holder has published them on their own profile — that is a setting they control, and most personal accounts never turn it on. When an account has not published one, the column is empty. Nothing here is inferred, enriched or looked up anywhere else: what you get is what that profile shows. Expect them on business and creator accounts, and not on ordinary personal ones.

Picture links are signed and time-limited by Instagram, so download what you need in the same session. The requesting network address is stripped out of every link before it reaches your dataset.

What a row looks like

One delivered row from a real run — the handle bluebottle, 2026-09-12. The whole record is one profile charge: the contact fields are not a second event. Profile pictures are signed and time-limited by Instagram, and the account's own outbound links are shown here as placeholders.

{
"userId": "354032059",
"username": "bluebottle",
"fullName": "Blue Bottle Coffee",
"profileUrl": "https://www.instagram.com/bluebottle/",
"biography": "Experience the best of what coffee has to offer.",
"bioLinks": [
{"title":"Brew Guides","url":"https://…"},
{"title":"Blue Bottle Membership","url":"https://…"},
{"title":"Shop Blue Bottle Coffee","url":"https://…"},
{"title":"Sustainability at Blue Bottle","url":"https://…"}
],
"externalUrl": "https://…",
"pronouns": [],
"followerCount": 516686,
"followingCount": 805,
"mediaCount": 2580,
"totalClipsCount": 1,
"mutualFollowersCount": 0,
"isPrivate": false,
"isVerified": true,
"isBusiness": true,
"isProfessionalAccount": true,
"accountType": 2,
"accountBadges": [],
"category": "Coffee shop",
"categoryId": 128673187201735,
"hasHighlightReels": true,
"hasVideos": true,
"hasMusicOnProfile": false,
"publicEmail": "support@bluebottlecoffee.com",
"publicPhoneNumber": null,
"publicPhoneCountryCode": null,
"contactPhoneNumber": null,
"businessContactMethod": "CALL",
"addressStreet": null,
"cityName": null,
"zip": null,
"latitude": null,
"longitude": null,
"instagramLocationId": "212973824",
"whatsappNumber": null,
"profilePicUrl": "https://…",
"profilePicUrlHd": "https://…",
"aboutCountry": null,
"aboutDateJoined": null,
"aboutFormerUsernames": null,
"aboutVerified": null,
"source": "instagram",
"input": "bluebottle",
"sourceIndex": 0,
"scrapedAt": "2026-09-12T10:09:01.900Z",
"charged": true,
"aboutAccountCharged": false,
"status": "delivered",
"retryable": false,
"statusReason": null,
"#k": "bluebottle",
"#ce": {"profile":1},
"#ask": {"delivered":1}
}

Price

Apify planPer accountPer 1,000 accounts
Free plan$0.006$6.00
Bronze$0.0045$4.50
Silver$0.0036$3.60
Gold and above$0.003$3.00 per 1,000

The opt-in account history is a second event, about-account, at a flat $0.003 on every plan — charged only on an account whose history record actually came back, and off unless you switch it on.

Platform usage is included in those prices — there is no separate compute bill on top, and no start fee. Set maxTotalChargeUsd on the run and it is a hard ceiling: the run stops cleanly under it and the last row says what is left.

Private accounts are delivered, not refused

Instagram publishes the account itself even when the posts behind it are private: the follower, following and post counts, the biography, the category and the picture are all public. So a private account here is a normal delivered row with isPrivate: true and a sentence saying what is and is not public about it. It is charged like any other delivered account, because it is one. Only the posts are missing, and they were never part of this actor.

Honest rows: what "not charged" actually means

Every run closes its own books. An account that was not delivered leaves an uncharged row saying which of seven things happened, and none of them is billed on either event:

  • account_not_found — Instagram has no account at that handle. It was spelled differently, deleted or renamed. A definitive answer, not a failure.
  • stopped_at_limit — your result limit, your maximum cost per run, or the run clock stopped it first. The row names which.
  • vendor_unavailable — the read did not go through. Temporary, says nothing about the account, and a re-run is the fix.
  • source_refused — Instagram refused to look that value up at all, and it refuses it the same way every time, so a re-run cannot change it. Check the handle in a browser; if it opens there, say so on the Issues tab.
  • unsupported_shape — Instagram answered in a shape this actor does not read yet. That is on us, not on the account, it says nothing about whether the account exists, and a re-run gets the same answer — tell us on the Issues tab which account it was and support for it will be added.
  • vendor_budget — this actor reached its own monthly collection allowance and stopped rather than collecting more.
  • user_input — the value was not an Instagram account this actor can look up. The row says what it looked like and what to paste instead.

The last row of every run is a receipt: delivered, asked for, how many account-history records came back, what stopped the run, and the charged totals for both events. A time limit ends the collecting, never the delivering — accounts already in hand are always written out.

How often this data changes

Follower and following counts move every day on an active account, post counts move whenever it posts, and the bio, link and contact fields change only when the account holder edits them — often not for months. So a weekly or monthly re-run is what most buyers want: it is the counts that go stale, not the contact block. This actor deliberately has no repeat memory and never hands back a remembered row, because a remembered row would hand back a stale number, and the number is the thing you are buying. Every run reads the account fresh.

Limits and good manners

Max accounts and Max run seconds take any number you type: this actor delivers at most 5,000 accounts in one run and runs for at most an hour (and for at least 30 seconds), so a bigger ask runs at the ceiling instead of being refused, and one uncharged row says what was asked for and what was used.

Only what Instagram publishes is returned: there is no private data here, and nothing behind a login. A contact field the account holder has not published is empty rather than guessed. This actor may stop working if Instagram changes how the data is served; if it does, accounts that could not be delivered are never charged.

Reliability

The accounts come from a licensed data feed rather than from scraping Instagram's own web pages, which is why there is nothing to log into and nothing to configure. When that feed cannot answer, the run says so on an uncharged row and finishes successfully — a failed read is never billed and never dressed up as a missing account.

Support

Something off, or a column you need that is not here? Open an issue on the Issues tab — we usually reply within a couple of hours.

If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.