Instagram Followers & Following Scraper
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
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, orboth. Defaultfollowers. Afollowinglist 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 ownproxyUrlsare 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.
| Field | Type | What it is |
|---|---|---|
ok | boolean | true on a genuine data row, false on an uncharged diagnostic row. |
recordType | string | Always relationship_profile for a data row. |
id | string | Numeric Instagram account ID of the follower / followed account. |
username | string | Their Instagram handle. |
fullName | string | null | Display name. null when the account has none. |
isPrivate | boolean | Whether their account is private. |
isVerified | boolean | Whether their account carries the blue check. |
profilePicUrl | string | null | Profile picture URL. Instagram CDN links expire — download promptly. |
sourceUsername | string | The profile you asked about. |
sourceProfileId | string | Numeric ID of the profile you asked about. |
listType | string | followers or following — which list this row came from. |
profileUrl | string | https://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 thesessionidvalue. 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
followingsupport. - 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.
maxRunSecondscaps the run at 180 seconds. Everything already collected is delivered and correct, and one unchargedPARTIALrow 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 hitPARTIALrepeatedly, lowermaxItemsPerProfileor raisemaxRunSecondsrather than expecting the next run to resume. fullNameandprofilePicUrlcan benull. They arenullwhen 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
RESIDENTIALorGOOGLE_SERPare 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:
| Actor | What it returns | Price |
|---|---|---|
| Instagram Profile Scraper | Profile stats and account flags, full payload | $0.70 / 1,000 |
| Instagram Profile Scraper | Profile stats and account flags, lean payload | $0.55 / 1,000 |
| Instagram Mentions Scraper | Posts that tagged or mentioned an account | $0.44 / 1,000 |
| Instagram Comments Scraper | Comments on a specific post or reel | $0.40 / 1,000 |
| Instagram Scraper | Profiles, posts and reels from usernames or URLs — the general-purpose one | $0.45 / 1,000 |
| Instagram Post Scraper | A single post by URL, full payload | $0.18 / 1,000 |
| Instagram Post Scraper | A single post by URL, lean payload | $0.09 / 1,000 |
| Instagram Reel Scraper | A single reel by URL, full payload | $0.35 / 1,000 |
| Instagram Reel Scraper | A single reel by URL, lean payload | $0.18 / 1,000 |
| Instagram Reels Search | Reels found by keyword or hashtag search | $0.40 / 1,000 |
| Instagram Hashtag Scraper | Posts under any hashtag, top feed | $0.40 / 1,000 |
| Instagram Location Scraper | Posts tagged at a place, ranked and recent tabs | $0.40 / 1,000 |
| Instagram Stories Scraper | Stories a public account has live right now | $0.40 / 1,000 |
| Instagram Transcript Scraper | Spoken-word transcript of a reel or video | $2.50 / 1,000 |
| Instagram Reel Uploader | Publishes a reel to your own account | $100.00 / 1,000 |