Instagram Profile Scraper avatar

Instagram Profile Scraper

Pricing

from $0.05 / actor start

Go to Apify Store
Instagram Profile Scraper

Instagram Profile Scraper

Extracts public profile data from [Instagram](https://www.instagram.com) by username — including follower and following counts, biography, external links, business contact details, verification status, and the latest posts.

Pricing

from $0.05 / actor start

Rating

0.0

(0)

Developer

Tin

Tin

Maintained by Community

Actor stats

0

Bookmarked

45

Total users

9

Monthly active users

2 months ago

Last modified

Share

Instagram Profile Scraper extracts public profile data from Instagram by username — including follower and following counts, biography, external links, business contact details, verification status, and the latest posts with their engagement metrics. Just provide one or more usernames and get clean, structured JSON back. It scrapes publicly viewable profiles with no setup, and can optionally use a logged-in session to reach login-gated accounts. Try it now with the default example username, no setup required.

Running on the Apify platform, this scraper gives you API access, scheduled runs, integrations (Make, Zapier, Google Drive, Slack, and more), automatic proxy rotation, and run monitoring out of the box.

Why use Instagram Profile Scraper?

Instagram profiles hold valuable public data for marketing, research, and competitive analysis. This Actor turns that data into a structured dataset you can analyze or pipe into your own tools. Common use cases include:

  • Influencer marketing — vet creators by follower counts, engagement on recent posts, verification, and business category before partnering.
  • Competitor monitoring — track follower growth and posting activity of competing brands over time with scheduled runs.
  • Lead generation — collect public business emails, phone numbers, and external links from professional accounts.
  • Audience and market research — gather profile metadata across a list of accounts for analysis.
  • Social media management — keep a refreshed snapshot of the profiles you manage or watch.

How to use Instagram Profile Scraper

  1. Click Try for free (or open the Actor in Apify Console).
  2. In the Input tab, add the Instagram usernames you want to scrape (without the @ symbol). You can paste a full profile URL too — the Actor extracts the username automatically.
  3. (Optional) Paste your Instagram cookies (or just a sessionid) to unlock login-gated profiles (see Scraping login-gated accounts below). Leave both empty to scrape only publicly viewable profiles.
  4. Click Start and wait for the run to finish.
  5. Open the Output tab to preview results, or download the dataset as JSON, CSV, Excel, or HTML — or fetch it via the Apify API.

Input

The Actor accepts the following input parameters, configurable through the visual editor in Apify Console or as a JSON object via the API.

FieldTypeDescription
usernamesarrayRequired. List of Instagram usernames to scrape, without the @ symbol (e.g. zoebrownstone). Full profile URLs are also accepted and normalized.
sessionidstring (secret)Optional. The sessionid cookie from a logged-in instagram.com browser session. Used only as a fallback for login-gated accounts that Instagram hides from logged-out visitors. Public profiles never use it. See Scraping login-gated accounts.
cookiesstring (secret)Optional, recommended over a bare sessionid. The full cookie set exported from the same logged-in browser session — either a JSON export (e.g. from the Cookie-Editor extension) or a raw name=value; name2=value2 Cookie header. Including mid, ig_did, datr, rur, and csrftoken alongside sessionid makes the authenticated session look like the browser it came from, which greatly reduces rate-limit blocks.

Input example

{
"usernames": ["zoebrownstone", "natgeo"]
}

Output

Each scraped profile is stored as one item in the dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Output example

{
"scrapeSucceeded": true,
"username": "zoebrownstone",
"fullName": "Zoe Brownstone",
"userId": "1234567890",
"biography": "Photographer & traveler 📷\nLA based",
"bioLinks": [{ "title": "", "url": "https://example.com" }],
"externalUrl": "https://example.com",
"followersCount": 15234,
"followingCount": 412,
"mediaCount": 387,
"highlightReelCount": 5,
"isPrivate": false,
"isVerified": false,
"isBusinessAccount": true,
"isProfessionalAccount": true,
"categoryName": "Photographer",
"businessCategoryName": "Creators & Celebrities",
"businessEmail": "hello@example.com",
"businessPhoneNumber": null,
"profilePicUrl": "https://instagram.com/.../profile.jpg",
"profilePicUrlHd": "https://instagram.com/.../profile_hd.jpg",
"profileUrl": "https://www.instagram.com/zoebrownstone/",
"hasClips": true,
"latestMedia": [
{
"id": "3210000000000000000",
"shortcode": "C1aBcDeFgHi",
"type": "GraphImage",
"isVideo": false,
"takenAt": "2026-05-20T14:32:11.000Z",
"caption": "Golden hour 🌅",
"likeCount": 842,
"commentCount": 37,
"displayUrl": "https://instagram.com/.../image.jpg",
"thumbnailSrc": "https://instagram.com/.../thumb.jpg",
"postUrl": "https://www.instagram.com/p/C1aBcDeFgHi/"
}
],
"scrapedAt": "2026-05-30T09:15:00.000Z"
}

Usernames that could not be scraped are also written to the dataset (so nothing fails silently), with scrapeSucceeded: false and a reason:

{
"username": "someprivatehandle",
"scrapeSucceeded": false,
"error": "login_required",
"scrapedAt": "2026-05-30T09:15:00.000Z"
}

Possible error values: login_required (account hidden from logged-out visitors — supply a sessionid to scrape it), not_found (username does not exist), or http_<status> for other rejections.

Data fields

FieldDescription
scrapeSucceededtrue for a successfully scraped profile; false on a failure record (see error).
usernameAccount handle.
fullNameDisplay name on the profile.
userIdInternal Instagram user ID.
biographyProfile bio text.
bioLinksArray of links shown in the bio.
externalUrlPrimary external website link.
followersCountNumber of followers.
followingCountNumber of accounts followed.
mediaCountTotal number of posts.
highlightReelCountNumber of story highlight reels.
isPrivateWhether the account is private.
isVerifiedWhether the account is verified (blue badge).
isBusinessAccountWhether it is a business account.
isProfessionalAccountWhether it is a professional account.
categoryName / businessCategoryNameProfile category labels.
businessEmail / businessPhoneNumberPublic business contact details, when available.
profilePicUrl / profilePicUrlHdProfile picture URLs (standard and HD).
profileUrlFull URL to the profile.
hasClipsWhether the account has Reels.
latestMediaArray of the most recent posts with shortcode, type, caption, like/comment counts, media URLs, timestamp, and post URL.
scrapedAtISO timestamp when the profile was scraped.

Note: Private accounts return profile metadata (followers, bio, etc.) but not post details, since posts are not publicly available.

How much does it cost to scrape Instagram profiles?

Cost depends on the number of profiles and the platform compute resources used. Because each profile requires a headless browser to load and capture Instagram's profile API response, scraping is metered in Apify compute units. Small batches of a few profiles typically cost a fraction of a compute unit. New Apify accounts include free monthly platform credits, so you can test the Actor at no cost. To estimate your own cost, run a small batch first and check the compute units reported on the run's overview.

Tips and advanced options

  • Batch usernames. Pass many usernames in a single run to amortize startup cost rather than running the Actor once per profile.
  • Schedule recurring runs. Use Apify Schedules to refresh profile snapshots daily or weekly and track changes over time.
  • Deduplication is automatic. The Actor lowercases, validates, and de-duplicates usernames, and skips invalid entries (logged as warnings).

Scraping login-gated accounts

Instagram serves some profiles (age-restricted, sensitive, or otherwise hidden from logged-out visitors) only to authenticated sessions. For these, the anonymous request returns no data and the Actor records error: "login_required".

To scrape them, provide the browser's cookies. The best option is the cookies field:

  1. Log in to instagram.com in a browser.
  2. Export the site's cookies as JSON (e.g. with the Cookie-Editor extension: Export → JSON), or copy them from DevTools → Application/Storage → Cookies → https://www.instagram.com.
  3. Paste the export into the Actor's cookies input field. A raw name=value; name2=value2 Cookie header works too.

Alternatively, paste just the sessionid cookie value into the sessionid field. This works, but a bare session with none of its companion cookies (mid, ig_did, datr, rur, csrftoken) is easier for Instagram to flag and rate-limit, so prefer the full export.

The Actor scrapes anonymously by default and only uses this session as a fallback for gated profiles — public profiles never touch it, minimizing exposure of the account. Authenticated requests go through a single sticky IP and back off automatically if Instagram rate-limits the session, protecting the account from escalating blocks.

Use a throwaway account, not your main one. Automated use of a session can get the associated account rate-limited, flagged, or blocked by Instagram. Treat the sessionid as a secret credential — anyone holding it can act as that logged-in account.

FAQ, disclaimers, and support

Is it legal to scrape Instagram? This Actor only collects publicly available data from Instagram profiles. Scraping public data is generally legal, but how you use the data is your responsibility. Do not collect or process personal data in violation of applicable laws (such as GDPR or CCPA) or Instagram's Terms of Service. Consult legal counsel if you are unsure. This tool is intended for legitimate research, marketing, and analytics purposes.

Why are some fields empty? Fields like businessEmail, businessPhoneNumber, or externalUrl are only present when the account publishes them. Private accounts will not return post-level data.

A profile failed to scrape — why? Check the failure record's error field in the dataset. login_required means the account is hidden from logged-out visitors — provide cookies to scrape it (see Scraping login-gated accounts). not_found means the username does not exist. An http_* value usually indicates temporary rate-limiting — smaller batches reduce this. auth_http_401, auth_http_429, and auth_rate_limited mean Instagram rate-limited the supplied logged-in session — wait a while, then re-run the failed usernames (a full cookie export instead of a bare sessionid makes these blocks much rarer). Every attempted username is recorded in the dataset, so nothing fails silently.

Support and feedback. Found a bug or have a feature request? Open an issue in the Issues tab of this Actor. Custom scraping solutions are also available on request.