Instagram Followers / Following Scraper
Pricing
from $0.30 / 1,000 profiles
Instagram Followers / Following Scraper
Scrape a seed account's followers or following list — one lightweight row per profile. No posts by default. Pay per delivered profile only, single flat price. Requires the user's own Instagram session token, because Instagram requires a login for followers/following lists.
Pricing
from $0.30 / 1,000 profiles
Rating
0.0
(0)
Developer
Arishma
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
NEW, separate Actor. Do not confuse it with the existing Instagram Profile & Posts Scraper, and do not overwrite, republish or change that Actor. Do not merge any existing Instagram PR into this project.
What it does
Input a seed Instagram username or URL, choose followers or following, set a limit (default 200, range 1–1,000 per seed). Output is one lightweight row per follower/following profile:
- username, full name, profile URL
- is_private, is_verified, profile picture URL
- followerCount / followingCount / biography — filled by default
(one small detail request per profile, see below). They are null
only if that detail request fails, or if you set
includeProfileDetails: falsefor the fast lightweight run — the list payload itself does not carry them.
No posts by default. Post scraping is an explicit opt-in flag
(includePosts, default false) and is not part of the core job.
Per-profile detail enrichment is ON by default
(includeProfileDetails, default true) since 2026-10-26.
How it stays cheap
- API-style HTTP list pages (50 profiles per page), no browser.
- Session required for the list: the user running the Actor
supplies their own Instagram session token (
sessionTokeninput). Instagram requires a login for followers/following lists, even for public accounts — without a session the run stops withlogin_required. - Pagination with cursor, dedupe across pages (by user id, else username), hard stop at the limit.
- Charge event
profileis fired only for a row actually pushed to the dataset. Failed, duplicate and gated rows are never charged. - Charge event
proxy-trafficis fired ONLY when the client uses Apify Proxy, at $0.0008 per full 100 KB of response body (same rate as the Instagram and LinkedIn Actors). No Apify Proxy = no proxy charge. A run under 100 KB charges 0 proxy units. - On a hard stop (429 rate limit, login gate, seed not resolvable), the run keeps the partial rows it already delivered and logs the reason, instead of failing the whole run and losing them.
Honest limitation
Instagram's followers endpoints are undocumented and can change, rate-limit or gate accounts without warning. This Actor is built to fail cleanly and partially, not to guarantee a complete list for every seed, especially large or private accounts. That limitation is NOT proved by the local tests, which use sample payloads only — see Live test status below.
Files
src/instagram.js— pure parser / pagination / dedupe (tested locally)src/main.js— Apify Actor entry point (not run locally).actor/input_schema.json— input: seeds, listType, limit, two opt-in flags, proxy.actor/output_schema.json— one row per profile.actor/actor.json— Actor metadata
Local tests (no Apify credit, no network, no login)
npm test # node --test test/instagram.test.jsnpm run sample # sample run against test/fixtures/*.json
Result on 2026-10-26, after the follower-count fix: 17/17 tests pass,
sample run returns 5 unique profiles from 2 pages (3 + 3 rows minus
1 duplicate), stopped = no_more_pages, partial = false.
Pricing
- $0.30 per 1,000 delivered profiles, flat — one single price, no tiers, no discounts.
- Plus proxy-traffic at $0.0008 per 100 KB ONLY if the client uses Apify Proxy (same rate as the Instagram and LinkedIn Actors). Client total: $0.30 without proxy, $0.3032 base / $0.3304 stress with proxy per 1,000.
- Actor start: $0.00005 per run.
Live test status (2026-10-25, updated 2026-10-26)
- Session test with seed
natgeo, followers: delivered rows (username, full name, profile URL, user id, private/verified, picture). The session path works, and the list IS followers. - Old default run: followerCount / followingCount / biography were null, because the list payload does not carry them. That was the bug reported 2026-10-26 (e.g. quinn92752 has 48 followers / 542 following on its own page, null in the dataset).
- Fix: detail mode is now ON by default — one small extra request per profile fills those three fields. Local tests pass (17/17, including quinn92752's 48/542 shape and geetaksh06's 3/7 user-info shape); a live detail-mode test with a real session is still pending — test with limit 10 first before running large jobs.
- FIX 2026-10-27: live limit-3 run 0bY6HSf2xfHRau75M proved web_profile_info alone fails for every profile (detail ok=0, failed=3, listSource=web) even with a session — so details now fall back to users/{id}/info (web, then mobile) and the log now reports detail sources and failure reasons. Re-test with limit 3 and read the detail sources/reasons line from the log.
Session token (required for followers/following lists, Oct 2026)
Instagram returns 401 require_login for followers/following lists without a
session, even for public accounts (verified live 2026-10-25: GraphQL 400,
mobile 400, web 401, all logged-out). Seed resolution works logged-out
(profile page HTML), but the list itself does not.
So the Actor now takes an optional sessionToken input: the user running
the Actor supplies their own Instagram sessionid value (or a cookie
string containing sessionid=...). It is sent only to instagram.com as a
Cookie for that run, never logged, and never stored in the dataset.
Without it, a followers/following run is expected to stop with
login_required. Do not paste a session token in chat or anywhere else
except the Actor's input in Apify Console.
Follower counts (why they were null, and how they are filled now)
The followers/following list payload Instagram returns carries username, full name, picture, private/verified flags and user id — but NOT each profile's own follower count, following count or biography. So the old default run delivered those three fields as null.
FIX 2026-10-26: profile details are now ON by default. The Actor makes
one small web_profile_info request per profile (with your sessionToken),
paced ~0.8s apart, and fills the three fields before pushing the row.
Set includeProfileDetails: false only for the fast lightweight run
with null counts. If a detail request fails for a profile, that row
keeps nulls and the run logs how many profiles failed, instead of
failing the whole run.