Instagram Followers & Following Scraper avatar

Instagram Followers & Following Scraper

Pricing

Pay per event

Go to Apify Store
Instagram Followers & Following Scraper

Instagram Followers & Following Scraper

Scrape Instagram followers and following lists from public profiles. Extract username, full name, verified and private flags, profile picture and profile URL. No login, no cookie, no app review. Export JSON/CSV/Excel. $0.60 per 1,000 rows.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Share

Extract follower and following profile rows from public Instagram accounts. Give it up to five usernames, @handles or profile URLs and it returns one clean row per relationship profile — account ID, username, full name, private and verified flags, profile picture and profile URL — ready to export as JSON, CSV, Excel or XML, or to pull straight from the Apify API.

Follower lists run with no setup: no login, no cookie, no app review.

What people use it for

  • Building an audience list for a creator, brand or competitor account.
  • Finding the overlap between two accounts' follower lists.
  • Filtering an audience down to verified accounts, or excluding private ones.
  • Tracking audience growth by running on a schedule and diffing the datasets.
  • Feeding usernames into the Instagram Profile Scraper to enrich each follower with bio, counts and category.

Input

  • profiles: up to five usernames, handles, or Instagram profile URLs.
  • listType: followers, following, or both. Default followers. A following list needs your own account cookie — see Coverage and limits.
  • maxItemsPerProfile: 1–1,000 rows per source profile and list; default 100.
  • sessionCookies: optional. Your own Instagram account cookie.
  • proxyConfiguration: proxy configuration. Your own proxyUrls are used exactly as supplied; metered Apify groups (RESIDENTIAL, GOOGLE_SERP) are not offered and are replaced with rotating datacenter addresses, with a warning in the log and run status.
  • maxAttempts: 1–12 bounded attempts; default 8.
  • requestTimeoutSeconds: 5–30 seconds per request.
  • maxRunSeconds: 20–180 second run deadline; default 120.

Minimal input:

{
"profiles": ["nasa"],
"listType": "followers",
"maxItemsPerProfile": 100
}

Empty profiles returns one clearly labeled _sample row and makes no request, proxy connection, or billing event.

Output

One row per relationship profile.

FieldTypeWhat it is
okbooleantrue on a genuine data row, false on an uncharged diagnostic row.
recordTypestringAlways relationship_profile for a data row.
idstringNumeric Instagram account ID of the follower / followed account.
usernamestringTheir Instagram handle.
fullNamestring | nullDisplay name. null when the account has none.
isPrivatebooleanWhether their account is private.
isVerifiedbooleanWhether their account carries the blue check.
profilePicUrlstring | nullProfile picture URL. Instagram CDN links expire — download promptly.
sourceUsernamestringThe profile you asked about.
sourceProfileIdstringNumeric ID of the profile you asked about.
listTypestringfollowers or following — which list this row came from.
profileUrlstringhttps://www.instagram.com/<username>/

Sample output

Values below are illustrative, but the shape and field names are exactly what a real run writes to the dataset:

{
"ok": true,
"recordType": "relationship_profile",
"id": "1783412996",
"username": "aurora.makes",
"fullName": "Aurora Bennett",
"isPrivate": false,
"isVerified": false,
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/379204118_1122_n.jpg",
"sourceUsername": "nasa",
"sourceProfileId": "528817151",
"listType": "followers",
"profileUrl": "https://www.instagram.com/aurora.makes/"
}

Coverage and limits

Everything here is worth knowing, and none of it is hidden behind a silent empty result: every constraint below arrives in the dataset as a labeled, uncharged row carrying an errorCode and a plain-English details field.

Follower lists work out of the box. Instagram serves relationship lists only to a signed-in caller, so this actor reads them through a licensed data source. You supply nothing.

following lists need your own cookie. The licensed source covers follower lists only. Ask for a following list without supplying a cookie and you get an uncharged PROVIDER_UNSUPPORTED row explaining exactly that — never a silent empty result, and never a charge:

{
"ok": false,
"errorCode": "PROVIDER_UNSUPPORTED",
"error": "When no Instagram session is available this Actor falls back to a paid data source that can return follower lists only. To collect a following list, supply your own account cookie in sessionCookies.",
"_notice": "This record is diagnostic only and is never charged.",
"sourceUsername": "nasa",
"sourceProfileId": "528817151",
"listType": "following"
}

To unlock following, or to run on your own account's rate limit rather than a shared one, put your own cookie in sessionCookies:

  • In Chrome: F12 → Application → Cookies → https://www.instagram.com → copy the sessionid value. Pasting the whole cookie string works too.
  • Your cookie takes priority over everything else. The run uses it and nothing else, which is the point — you are buying isolation and full following support.
  • Use an account you own and are authorized to automate.

Cookie values, proxy URLs, and request headers are never logged or written to output. Logs contain only slot numbers, counts, retry reasons, and result totals.

Other limits, stated plainly:

  • Private source accounts. If the account you ask about is private, its relationship lists are not available to this actor and you get an uncharged diagnostic row instead of rows.
  • Five profiles per run, 1,000 rows per profile and list. Both are hard schema ceilings. Split larger jobs across runs.
  • The run deadline can stop a large collection early. maxRunSeconds caps the run at 180 seconds. Everything already collected is delivered and correct, and one uncharged PARTIAL row records that it stopped and why. There is no cross-run cursor, so a re-run starts the list again from the top — if you hit PARTIAL repeatedly, lower maxItemsPerProfile or raise maxRunSeconds rather than expecting the next run to resume.
  • fullName and profilePicUrl can be null. They are null when the data source does not carry them for that account — not silently dropped, and not invented.
  • No follower counts, bios, emails or post history here. This actor returns the relationship list itself. Enrich the usernames with the profile actor linked at the bottom of this page.
  • Metered proxy groups are not offered. Requests for RESIDENTIAL or GOOGLE_SERP are replaced with rotating datacenter addresses and the substitution is announced in the log and run status.
  • Ordering is Instagram's, not ours. Rows arrive in the order the source returns them; duplicate accounts across pages are removed within a run.

What you are charged for

You are charged per delivered follower row, once each, and for nothing else.

Every other outcome is free and clearly labeled. Sample rows, unresolvable profiles, unsupported following requests, and runs that stop early all arrive as uncharged diagnostic rows carrying an errorCode and a plain-English details field. A run that returns nothing costs nothing.

If a run stops before reaching your requested limit, everything it already collected is delivered and correct, and one uncharged row tells you it stopped and why.

How it works

The source username is resolved from the public, logged-out profile endpoint first, because that answers a guest request and costs nothing. Only if Instagram gates that lookup is a paid resolution used. The relationship list itself has no logged-out route, so it is read from the licensed source, or from your cookie when you supply one.

Failures are named for what they are rather than flattened into one generic error: a rate limit reads as a rate limit, an upstream outage as an upstream outage, and a problem on our side is never reported as a problem on yours.

FAQ

Is it legal to scrape Instagram? We can't give legal advice, so here is exactly what the actor does and does not do. It reads relationship lists for the public accounts you name, through a licensed data source. It does not break, bypass or brute-force any login, it does not crack private accounts, and it does not reach anything gated behind a follow request or a friendship approval. What it returns is profile-level information — handle, display name, public flags, picture URL. Whether you may collect and store that data is a question about your jurisdiction, your purpose, and your relationship to those people: follower lists are personal data, so GDPR, CCPA and Instagram's own terms apply to how you use them. That responsibility is yours, and if the use case is at all sensitive, ask a lawyer rather than a README.

Do I need an Instagram account or cookie? Not for follower lists — those run with nothing from you at all. You only need a cookie for following lists, or if you want a private rate limit instead of a shared one. See Coverage and limits.

How much does it cost, and what am I charged for? $0.60 per 1,000 delivered rows, charged once per unique relationship profile actually written to your dataset. Samples, diagnostics, unsupported following requests and early stops are never charged.

What happens if it returns nothing? You pay nothing, and you get a labeled row telling you why: NO_RESULTS when the list itself came back empty, NOT_FOUND when the username could not be resolved to an account, PROVIDER_UNSUPPORTED for a following request with no cookie, PARTIAL when the run ran out of time or budget. A silent empty dataset is the one outcome this actor is built never to produce.

Can I actually get a following list? Yes — with your own account cookie in sessionCookies. Without one, the answer is no, and you get the uncharged PROVIDER_UNSUPPORTED row shown above rather than an empty result. This is the actor's single real constraint and it is stated plainly rather than discovered at run time.

Can I scrape a private account's followers? No. If the source profile is private, its relationship lists are not available and you get an uncharged diagnostic row. There is no setting that changes this.

How many followers can I pull in one run? Up to 1,000 per profile per list, across up to five profiles. Large pulls can hit the maxRunSeconds deadline first; when that happens you keep everything collected plus one uncharged PARTIAL row.

What can I put in profiles? Bare usernames (nasa), handles (@nasa), or full profile URLs (https://www.instagram.com/nasa/). All three are accepted and normalised. Anything unparseable comes back as an uncharged BAD_INPUT row identifying which input index was wrong.

Do I need to bring a proxy? No. The actor manages its own egress. If you supply proxyUrls, they are used exactly as given. Metered Apify groups (RESIDENTIAL, GOOGLE_SERP) are not selectable and are swapped for rotating datacenter addresses, with a warning in the run status.

Is my cookie stored or logged anywhere? No. Cookie values, proxy URLs and request headers are never written to the log or the dataset. Logs carry only slot numbers, counts, retry reasons and totals.

Are the profile picture URLs permanent? No — Instagram CDN links expire. If you need the images, download them soon after the run rather than storing the URL for later.

Can I run it on a schedule or from my own code? Yes. It is a standard Apify actor: run it from the API, the JS/Python clients, the CLI, an Apify schedule, or any of the platform integrations, and export the dataset as JSON, CSV, Excel or XML.

Need other Instagram data?

This actor is built for the follower and following lists behind a public profile. If you need a different Instagram surface, use the dedicated actor for it:

ActorWhat it returnsPrice
Instagram Profile ScraperProfile stats and account flags, full payload$0.70 / 1,000
Instagram Profile ScraperProfile stats and account flags, lean payload$0.55 / 1,000
Instagram Mentions ScraperPosts that tagged or mentioned an account$0.44 / 1,000
Instagram Comments ScraperComments on a specific post or reel$0.40 / 1,000
Instagram ScraperProfiles, posts and reels from usernames or URLs — the general-purpose one$0.45 / 1,000
Instagram Post ScraperA single post by URL, full payload$0.18 / 1,000
Instagram Post ScraperA single post by URL, lean payload$0.09 / 1,000
Instagram Reel ScraperA single reel by URL, full payload$0.35 / 1,000
Instagram Reel ScraperA single reel by URL, lean payload$0.18 / 1,000
Instagram Reels SearchReels found by keyword or hashtag search$0.40 / 1,000
Instagram Hashtag ScraperPosts under any hashtag, top feed$0.40 / 1,000
Instagram Location ScraperPosts tagged at a place, ranked and recent tabs$0.40 / 1,000
Instagram Stories ScraperStories a public account has live right now$0.40 / 1,000
Instagram Transcript ScraperSpoken-word transcript of a reel or video$2.50 / 1,000
Instagram Reel UploaderPublishes a reel to your own account$100.00 / 1,000